mirror of
https://github.com/201206030/novel-front-web.git
synced 2025-04-27 07:50:50 +00:00
feat: 小说高级检索功能
This commit is contained in:
parent
f8fe50654c
commit
5b9c2c918b
@ -1,5 +1,9 @@
|
|||||||
import request from '../utils/request'
|
import request from '../utils/request'
|
||||||
|
|
||||||
|
export function listCategorys(params) {
|
||||||
|
return request.get('/book/categoryList', { params });
|
||||||
|
}
|
||||||
|
|
||||||
export function searchBooks(params) {
|
export function searchBooks(params) {
|
||||||
return request.get('/book/search', { params });
|
return request.get('/book/search', { params });
|
||||||
}
|
}
|
||||||
|
@ -24,4 +24,52 @@ export const getLocal = (name) => {
|
|||||||
|
|
||||||
export const setLocal = (name, value) => {
|
export const setLocal = (name, value) => {
|
||||||
localStorage.setItem(name, value)
|
localStorage.setItem(name, value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export const addDay = (days) => {
|
||||||
|
//创建date
|
||||||
|
let nowDate = new Date();
|
||||||
|
//添加天数
|
||||||
|
nowDate.setDate(nowDate.getDate() + days);
|
||||||
|
//返回
|
||||||
|
return nowDate
|
||||||
|
}
|
||||||
|
|
||||||
|
export const addMonth= (months) => {
|
||||||
|
//创建date
|
||||||
|
let nowDate = new Date();
|
||||||
|
//添加周数
|
||||||
|
nowDate.setMonth(nowDate.getMonth() + months);
|
||||||
|
//返回
|
||||||
|
return nowDate
|
||||||
|
}
|
||||||
|
|
||||||
|
export const addYear= (years) => {
|
||||||
|
//创建date
|
||||||
|
let nowDate = new Date();
|
||||||
|
//添加年数
|
||||||
|
nowDate.setMonth(nowDate.getYear() + years);
|
||||||
|
//返回
|
||||||
|
return nowDate
|
||||||
|
}
|
||||||
|
|
||||||
|
export const dateFormat = (fmt, date) => {
|
||||||
|
let ret;
|
||||||
|
const opt = {
|
||||||
|
"Y+": date.getFullYear().toString(), // 年
|
||||||
|
"m+": (date.getMonth() + 1).toString(), // 月
|
||||||
|
"d+": date.getDate().toString(), // 日
|
||||||
|
"H+": date.getHours().toString(), // 时
|
||||||
|
"M+": date.getMinutes().toString(), // 分
|
||||||
|
"S+": date.getSeconds().toString() // 秒
|
||||||
|
// 有其他格式化字符需求可以继续添加,必须转化成字符串
|
||||||
|
};
|
||||||
|
for (let k in opt) {
|
||||||
|
ret = new RegExp("(" + k + ")").exec(fmt);
|
||||||
|
if (ret) {
|
||||||
|
fmt = fmt.replace(ret[1], (ret[1].length == 1) ? (opt[k]) : (opt[k].padStart(ret[1].length, "0")))
|
||||||
|
};
|
||||||
|
};
|
||||||
|
return fmt;
|
||||||
|
}
|
||||||
|
|
||||||
|
@ -5,125 +5,174 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="main box_center cf">
|
<div class="main box_center cf">
|
||||||
<!--<div class="channelWrap classTable cf">
|
<div class="channelWrap classTable cf">
|
||||||
<div class="so_tag">
|
<div class="so_tag">
|
||||||
<ul class="list">
|
<ul class="list">
|
||||||
<li class="so_pd" id="workDirection">
|
<li class="so_pd" id="workDirection">
|
||||||
<span class="tit">作品频道:</span>
|
<span class="tit">作品频道:</span>
|
||||||
<a
|
<a
|
||||||
filter-value="0"
|
filter-value="0"
|
||||||
href="javascript:listBookCategory();search(1,20)"
|
href="javascript:void(0)"
|
||||||
class="on"
|
@click="loadCategoryList(0)"
|
||||||
|
:class="`${workDirectionOn == 0 ? 'on' : ''}`"
|
||||||
>男频</a
|
>男频</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
filter-value="1"
|
filter-value="1"
|
||||||
href="javascript:listBookCategory();search(1,20)"
|
href="javascript:void(0)"
|
||||||
|
@click="loadCategoryList(1)"
|
||||||
|
:class="`${workDirectionOn == 1 ? 'on' : ''}`"
|
||||||
>女频</a
|
>女频</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li id="idGirl" class="so_class">
|
<li id="idGirl" class="so_class">
|
||||||
<span class="tit">作品分类:</span>
|
<span class="tit">作品分类:</span>
|
||||||
<span class="so_girl" id="girlCategoryList" style="display: none">
|
|
||||||
<a href="javascript:search(1,20)" class="on">不限</a>
|
|
||||||
<a filter-value="7" href="javascript:search(1,20)"
|
|
||||||
>女生频道</a
|
|
||||||
></span
|
|
||||||
>
|
|
||||||
<span class="so_boy" id="boyCategoryList">
|
<span class="so_boy" id="boyCategoryList">
|
||||||
<a href="javascript:search(1,20)" class="on">不限</a>
|
<a
|
||||||
<a filter-value="1" href="javascript:search(1,20)">玄幻奇幻</a>
|
href="javascript:void(0)"
|
||||||
<a filter-value="2" href="javascript:search(1,20)">武侠仙侠</a>
|
:class="`${categoryOn == 0 ? 'on' : ''}`"
|
||||||
<a filter-value="3" href="javascript:search(1,20)">都市言情</a>
|
@click="changeCategory(0)"
|
||||||
<a filter-value="4" href="javascript:search(1,20)">历史军事</a>
|
>不限</a
|
||||||
<a filter-value="5" href="javascript:search(1,20)">科幻灵异</a>
|
>
|
||||||
<a filter-value="6" href="javascript:search(1,20)"
|
<a
|
||||||
>网游竞技</a
|
v-for="(item, index) in bookCategorys"
|
||||||
></span
|
:key="index"
|
||||||
>
|
href="javascript:void(0)"
|
||||||
|
:class="`${categoryOn == item.id ? 'on' : ''}`"
|
||||||
|
@click="changeCategory(item.id)"
|
||||||
|
>{{ item.name }}</a
|
||||||
|
>
|
||||||
|
</span>
|
||||||
</li>
|
</li>
|
||||||
<li class="so_free">
|
|
||||||
<span class="tit">是否免费:</span>
|
|
||||||
<a href="?b=0&s=0&wb=0&wd=0&up=0&fr=0&so=0&ms=2" class="on">不限</a>
|
|
||||||
<a href="?b=0&s=0&wb=0&wd=0&up=0&fr=1&so=0&ms=2" class="">免费作品</a>
|
|
||||||
<a href="?b=0&s=0&wb=0&wd=0&up=0&fr=2&so=0&ms=2" class="">收费作品</a>
|
|
||||||
</li>
|
|
||||||
<li class="so_progress">
|
<li class="so_progress">
|
||||||
<span class="tit">是否完结:</span>
|
<span class="tit">是否完结:</span>
|
||||||
<a href="javascript:search(1,20)" class="on">不限</a>
|
<a
|
||||||
<a filter-value="0" href="javascript:search(1,20)" class=""
|
href="javascript:void(0)"
|
||||||
|
:class="`${bookStatusOn == null ? 'on' : ''}`"
|
||||||
|
@click="changeBookStatus(null)"
|
||||||
|
>不限</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
filter-value="0"
|
||||||
|
href="javascript:void(0)"
|
||||||
|
:class="`${bookStatusOn == 0 ? 'on' : ''}`"
|
||||||
|
@click="changeBookStatus(0)"
|
||||||
>连载中</a
|
>连载中</a
|
||||||
>
|
>
|
||||||
<a filter-value="1" href="javascript:search(1,20)" class=""
|
<a
|
||||||
|
filter-value="1"
|
||||||
|
href="javascript:void(0)"
|
||||||
|
:class="`${bookStatusOn == 1 ? 'on' : ''}`"
|
||||||
|
@click="changeBookStatus(1)"
|
||||||
>已完结</a
|
>已完结</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="so_words">
|
<li class="so_words">
|
||||||
<span class="tit">作品字数:</span>
|
<span class="tit">作品字数:</span>
|
||||||
<a href="javascript:search(1,20)" class="on">不限</a>
|
<a
|
||||||
<a filter-value-max="300000" href="javascript:search(1,20)" class=""
|
href="javascript:void(0)"
|
||||||
|
:class="`${wordCountOn == null ? 'on' : ''}`"
|
||||||
|
@click="changeWordCount(null, null)"
|
||||||
|
>不限</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
filter-value-max="300000"
|
||||||
|
href="javascript:void(0)"
|
||||||
|
:class="`${wordCountOn == 0 ? 'on' : ''}`"
|
||||||
|
@click="changeWordCount(0, 300000)"
|
||||||
>30万字以下</a
|
>30万字以下</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
filter-value-min="300000"
|
filter-value-min="300000"
|
||||||
filter-value-max="500000"
|
filter-value-max="500000"
|
||||||
href="javascript:search(1,20)"
|
href="javascript:void(0)"
|
||||||
class=""
|
:class="`${wordCountOn == 300000 ? 'on' : ''}`"
|
||||||
|
@click="changeWordCount(300000, 500000)"
|
||||||
>30-50万字</a
|
>30-50万字</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
filter-value-min="500000"
|
filter-value-min="500000"
|
||||||
filter-value-max="1000000"
|
filter-value-max="1000000"
|
||||||
href="javascript:search(1,20)"
|
href="javascript:void(0)"
|
||||||
class=""
|
:class="`${wordCountOn == 500000 ? 'on' : ''}`"
|
||||||
|
@click="changeWordCount(500000, 1000000)"
|
||||||
>50-100万字</a
|
>50-100万字</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
filter-value-min="1000000"
|
filter-value-min="1000000"
|
||||||
href="javascript:search(1,20)"
|
href="javascript:void(0)"
|
||||||
class=""
|
:class="`${wordCountOn == 1000000 ? 'on' : ''}`"
|
||||||
|
@click="changeWordCount(1000000, null)"
|
||||||
>100万字以上</a
|
>100万字以上</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="so_update">
|
<li class="so_update">
|
||||||
<span class="tit">更新时间:</span>
|
<span class="tit">更新时间:</span>
|
||||||
<a href="javascript:search(1,20)" class="on">不限</a>
|
<a
|
||||||
<a filter-value="3" href="javascript:search(1,20)" class=""
|
href="javascript:void(0)"
|
||||||
|
:class="`${updateTimeOn == null ? 'on' : ''}`"
|
||||||
|
@click="changeUpdateTime(null)"
|
||||||
|
>不限</a
|
||||||
|
>
|
||||||
|
<a
|
||||||
|
filter-value="3"
|
||||||
|
href="javascript:void(0)"
|
||||||
|
:class="`${updateTimeOn == 3 ? 'on' : ''}`"
|
||||||
|
@click="changeUpdateTime(3)"
|
||||||
>三日内</a
|
>三日内</a
|
||||||
>
|
>
|
||||||
<a filter-value="7" href="javascript:search(1,20)" class=""
|
<a
|
||||||
|
filter-value="7"
|
||||||
|
href="javascript:void(0)"
|
||||||
|
:class="`${updateTimeOn == 7 ? 'on' : ''}`"
|
||||||
|
@click="changeUpdateTime(7)"
|
||||||
>七日内</a
|
>七日内</a
|
||||||
>
|
>
|
||||||
<a filter-value="15" href="javascript:search(1,20)" class=""
|
<a
|
||||||
|
filter-value="15"
|
||||||
|
href="javascript:void(0)"
|
||||||
|
:class="`${updateTimeOn == 15 ? 'on' : ''}`"
|
||||||
|
@click="changeUpdateTime(15)"
|
||||||
>半月内</a
|
>半月内</a
|
||||||
>
|
>
|
||||||
<a filter-value="30" href="javascript:search(1,20)" class=""
|
<a
|
||||||
|
filter-value="30"
|
||||||
|
href="javascript:void(0)"
|
||||||
|
:class="`${updateTimeOn == 30 ? 'on' : ''}`"
|
||||||
|
@click="changeUpdateTime(30)"
|
||||||
>一月内</a
|
>一月内</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
<li class="so_sort">
|
<li class="so_sort">
|
||||||
<span class="tit">排序方式:</span>
|
<span class="tit">排序方式:</span>
|
||||||
<a href="javascript:search(1,20)" class="on">不限</a>
|
<a href="javascript:void(0)"
|
||||||
|
:class="`${sortOn == null ? 'on' : ''}`"
|
||||||
|
@click="changeSort(null)">不限</a>
|
||||||
<a
|
<a
|
||||||
filter-value="last_index_update_time"
|
filter-value="last_index_update_time"
|
||||||
href="javascript:search(1,20)"
|
href="javascript:void(0)"
|
||||||
class=""
|
:class="`${sortOn == 'last_chapter_update_time desc' ? 'on' : ''}`"
|
||||||
|
@click="changeSort('last_chapter_update_time desc')"
|
||||||
>更新时间</a
|
>更新时间</a
|
||||||
>
|
>
|
||||||
<a filter-value="word_count" href="javascript:search(1,20)" class=""
|
<a filter-value="word_count" href="javascript:void(0)"
|
||||||
|
:class="`${sortOn == 'word_count desc' ? 'on' : ''}`"
|
||||||
|
@click="changeSort('word_count desc')"
|
||||||
>总字数</a
|
>总字数</a
|
||||||
>
|
>
|
||||||
<a
|
<a
|
||||||
filter-value="visit_count"
|
filter-value="visit_count"
|
||||||
href="javascript:search(1,20)"
|
href="javascript:void(0)"
|
||||||
class=""
|
:class="`${sortOn == 'visitcount desc' ? 'on' : ''}`"
|
||||||
|
@click="changeSort('visit_count desc')"
|
||||||
>点击量</a
|
>点击量</a
|
||||||
>
|
>
|
||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
-->
|
|
||||||
<div class="channelWrap channelClassContent cf">
|
<div class="channelWrap channelClassContent cf">
|
||||||
<div class="updateTable rankTable">
|
<div class="updateTable rankTable">
|
||||||
<table cellpadding="0" cellspacing="0">
|
<table cellpadding="0" cellspacing="0">
|
||||||
@ -184,7 +233,8 @@
|
|||||||
import "@/assets/styles/book.css";
|
import "@/assets/styles/book.css";
|
||||||
import { reactive, toRefs, onMounted, ref } from "vue";
|
import { reactive, toRefs, onMounted, ref } from "vue";
|
||||||
import { useRouter, useRoute } from "vue-router";
|
import { useRouter, useRoute } from "vue-router";
|
||||||
import { searchBooks } from "@/api/book";
|
import { searchBooks, listCategorys } from "@/api/book";
|
||||||
|
import { addDay, dateFormat } from "@/utils";
|
||||||
import Top from "@/components/common/Top";
|
import Top from "@/components/common/Top";
|
||||||
import Navbar from "@/components/common/Navbar";
|
import Navbar from "@/components/common/Navbar";
|
||||||
import Footer from "@/components/common/Footer";
|
import Footer from "@/components/common/Footer";
|
||||||
@ -200,18 +250,25 @@ export default {
|
|||||||
const router = useRouter();
|
const router = useRouter();
|
||||||
|
|
||||||
const state = reactive({
|
const state = reactive({
|
||||||
|
bookCategorys: [],
|
||||||
books: [],
|
books: [],
|
||||||
searchCondition: {},
|
searchCondition: {},
|
||||||
backgroud: true,
|
backgroud: true,
|
||||||
total: 0,
|
total: 0,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
imgBaseUrl: process.env.VUE_APP_BASE_IMG_URL,
|
imgBaseUrl: process.env.VUE_APP_BASE_IMG_URL,
|
||||||
|
workDirectionOn: 0,
|
||||||
|
categoryOn: 0,
|
||||||
|
bookStatusOn: null,
|
||||||
|
wordCountOn: null,
|
||||||
|
updateTimeOn: null,
|
||||||
|
sortOn:null
|
||||||
});
|
});
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
const key = route.query.key;
|
const key = route.query.key;
|
||||||
state.searchCondition.keyword = key;
|
state.searchCondition.keyword = key;
|
||||||
state.searchCondition.pageSize = 10;
|
state.searchCondition.pageSize = 10;
|
||||||
search();
|
loadCategoryList(0);
|
||||||
});
|
});
|
||||||
|
|
||||||
const search = async () => {
|
const search = async () => {
|
||||||
@ -235,12 +292,71 @@ export default {
|
|||||||
search();
|
search();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const loadCategoryList = async (workDirection) => {
|
||||||
|
const { data } = await listCategorys({ workDirection: workDirection });
|
||||||
|
state.bookCategorys = data;
|
||||||
|
state.workDirectionOn = workDirection;
|
||||||
|
state.searchCondition.workDirection = workDirection;
|
||||||
|
state.categoryOn = 0;
|
||||||
|
state.searchCondition.categoryId = null;
|
||||||
|
search();
|
||||||
|
};
|
||||||
|
|
||||||
|
const changeCategory = async (categoryId) => {
|
||||||
|
state.categoryOn = categoryId;
|
||||||
|
if (categoryId > 0) {
|
||||||
|
state.searchCondition.categoryId = categoryId;
|
||||||
|
} else {
|
||||||
|
state.searchCondition.categoryId = null;
|
||||||
|
}
|
||||||
|
search();
|
||||||
|
};
|
||||||
|
|
||||||
|
const changeBookStatus = async (bookStatus) => {
|
||||||
|
state.bookStatusOn = bookStatus;
|
||||||
|
state.searchCondition.bookStatus = bookStatus;
|
||||||
|
search();
|
||||||
|
};
|
||||||
|
|
||||||
|
const changeWordCount = async (wordCountMin, wordCountMax) => {
|
||||||
|
state.wordCountOn = wordCountMin;
|
||||||
|
state.searchCondition.wordCountMin = wordCountMin;
|
||||||
|
state.searchCondition.wordCountMax = wordCountMax;
|
||||||
|
|
||||||
|
search();
|
||||||
|
};
|
||||||
|
|
||||||
|
const changeUpdateTime = async (days) => {
|
||||||
|
state.updateTimeOn = days;
|
||||||
|
if (days) {
|
||||||
|
state.searchCondition.updateTimeMin = dateFormat(
|
||||||
|
"YYYY-mm-dd",
|
||||||
|
addDay(-days)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
state.searchCondition.updateTimeMin = null;
|
||||||
|
}
|
||||||
|
search();
|
||||||
|
};
|
||||||
|
|
||||||
|
const changeSort = async (sort) => {
|
||||||
|
state.sortOn = sort;
|
||||||
|
state.searchCondition.sort = sort;
|
||||||
|
search();
|
||||||
|
};
|
||||||
|
|
||||||
return {
|
return {
|
||||||
...toRefs(state),
|
...toRefs(state),
|
||||||
bookDetail,
|
bookDetail,
|
||||||
searchByK,
|
searchByK,
|
||||||
search,
|
search,
|
||||||
handleCurrentChange,
|
handleCurrentChange,
|
||||||
|
loadCategoryList,
|
||||||
|
changeCategory,
|
||||||
|
changeBookStatus,
|
||||||
|
changeWordCount,
|
||||||
|
changeUpdateTime,
|
||||||
|
changeSort
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user