|
@@ -1,25 +1,35 @@
|
|
|
import { defineComponent, toRefs, reactive, onMounted, ref } from 'vue'
|
|
|
-
|
|
|
+import { ElButton, ElTag } from 'element-plus'
|
|
|
import classes from './index.module.less'
|
|
|
import tagItem from '@/components/tagItem'
|
|
|
import hot from './images/hot.png'
|
|
|
import arrow from '@/components/musicLIstItem/images/arrow.png'
|
|
|
import search from '@/components/hotSearch/images/search.png'
|
|
|
import request from '@/helpers/request'
|
|
|
+import clearIcon from './images/clearIcon.png'
|
|
|
+import item from '@/views/user-info/components/item'
|
|
|
+import { useRouter } from 'vue-router'
|
|
|
export default defineComponent({
|
|
|
name: 'hotSearch',
|
|
|
components: { tagItem },
|
|
|
+ emits:['searchRust','hotTag'],
|
|
|
props: {
|
|
|
type: {
|
|
|
type: String,
|
|
|
default: 'more'
|
|
|
}
|
|
|
},
|
|
|
- setup(props) {
|
|
|
+ setup(props,conent) {
|
|
|
const state = reactive({
|
|
|
hotList: [],
|
|
|
- type: props.type
|
|
|
+ type: props.type,
|
|
|
+ showDetail: true,
|
|
|
+ tagTree: [],
|
|
|
+ chioseTagList: [],
|
|
|
+ chioseParentList: [],
|
|
|
+ searchTagList: []
|
|
|
})
|
|
|
+ const router = useRouter()
|
|
|
const getHotList = async () => {
|
|
|
try {
|
|
|
const res = await request.get('/api-website/open/music/sheet/hotTag', {
|
|
@@ -33,37 +43,193 @@ export default defineComponent({
|
|
|
console.log(e)
|
|
|
}
|
|
|
}
|
|
|
+
|
|
|
+ const getTagTree = async () => {
|
|
|
+ try {
|
|
|
+ const res = await request.get('/api-website/open/MusicTag/tree', {})
|
|
|
+ state.tagTree = res.data
|
|
|
+
|
|
|
+ // state.hotList = res.data
|
|
|
+ } catch (e) {
|
|
|
+ console.log(e)
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const chioseTag = (tag: any) => {
|
|
|
+ // 选择判断
|
|
|
+
|
|
|
+ let chioseParentIndex = state.chioseParentList.indexOf(
|
|
|
+ tag.parentTagId as never
|
|
|
+ )
|
|
|
+ let chioseIndex = state.chioseTagList.indexOf(tag.id as never)
|
|
|
+ if (chioseParentIndex !== -1 && chioseIndex !== -1) {
|
|
|
+ // 这里就是反复点击这一个
|
|
|
+ tag.isCheck = false
|
|
|
+ state.chioseParentList.splice(chioseParentIndex, 1)
|
|
|
+ state.chioseTagList.splice(chioseIndex, 1)
|
|
|
+ setSearchTagList()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (chioseIndex == -1 && chioseParentIndex == -1) {
|
|
|
+ state.chioseParentList.push(tag.parentTagId as never)
|
|
|
+ state.chioseTagList.push(tag.id as never)
|
|
|
+ tag.isCheck = true
|
|
|
+ // 添加进去 并且设置其余的元素不可点击
|
|
|
+ setSearchTagList()
|
|
|
+ return
|
|
|
+ }
|
|
|
+
|
|
|
+ if (chioseIndex !== -1 || chioseParentIndex !== -1) {
|
|
|
+ // 选的没有且父元素也没有选中
|
|
|
+ state.tagTree.forEach((tree: any) => {
|
|
|
+ if (tree.id == tag.parentTagId) {
|
|
|
+ tree.children.forEach((item: any) => {
|
|
|
+ item.isCheck = false
|
|
|
+ let index = state.chioseTagList.indexOf(item.id as never)
|
|
|
+ if (index !== -1) {
|
|
|
+ state.chioseTagList.splice(index, 1)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ }
|
|
|
+ })
|
|
|
+ tag.isCheck = true
|
|
|
+ state.chioseTagList.push(tag.id as never)
|
|
|
+ setSearchTagList()
|
|
|
+ return
|
|
|
+ }
|
|
|
+ }
|
|
|
+ const setSearchTagList = () => {
|
|
|
+ state.searchTagList = []
|
|
|
+ state.tagTree.forEach((tree: any) => {
|
|
|
+ tree.children.forEach((item: any) => {
|
|
|
+ if (state.chioseTagList.indexOf(item.id as never) != -1) {
|
|
|
+ state.searchTagList.push(item as never)
|
|
|
+ }
|
|
|
+ })
|
|
|
+ })
|
|
|
+ console.log(state.searchTagList, 'searchTagList')
|
|
|
+ }
|
|
|
+ const isChiose = (tag: any) => {
|
|
|
+ if (tag.isCheck) {
|
|
|
+ return 'dark'
|
|
|
+ } else {
|
|
|
+ return 'light'
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ const closeChioseTag = (tag: any) => {
|
|
|
+ chioseTag(tag)
|
|
|
+ }
|
|
|
+ const clearSearch = () => {
|
|
|
+ state.chioseTagList = []
|
|
|
+ state.chioseParentList = []
|
|
|
+ state.searchTagList = []
|
|
|
+ state.tagTree.forEach((tree: any) => {
|
|
|
+ tree.children.forEach((item: any) => {
|
|
|
+ item.isCheck = false
|
|
|
+ })
|
|
|
+ })
|
|
|
+ }
|
|
|
+ const searchSubmit = ()=>{
|
|
|
+ // 请求
|
|
|
+ conent.emit('searchRust',state.chioseTagList)
|
|
|
+ state.showDetail = true
|
|
|
+ }
|
|
|
+
|
|
|
+ const clickHotTag = (key:string)=>{
|
|
|
+ conent.emit('hotTag',key)
|
|
|
+ }
|
|
|
+ const gotoSearch = ()=>{
|
|
|
+ router.push({path:'/searchdetail'})
|
|
|
+ }
|
|
|
onMounted(() => {
|
|
|
getHotList()
|
|
|
+ getTagTree()
|
|
|
})
|
|
|
return () => (
|
|
|
<>
|
|
|
- <div class={classes.wrap}>
|
|
|
- <div class={classes.wrapLeft}>
|
|
|
- <img src={hot} class={classes.hotIcon} alt="" />
|
|
|
- <h5>热门搜索:</h5>
|
|
|
- <div class={classes.tagWrap}>
|
|
|
- {state.hotList.map((item: any) => {
|
|
|
- return <tagItem title={item.key}></tagItem>
|
|
|
- })}
|
|
|
+ {state.showDetail ? (
|
|
|
+ <div class={classes.wrap}>
|
|
|
+ <div class={classes.wrapLeft}>
|
|
|
+ <img src={hot} class={classes.hotIcon} alt="" />
|
|
|
+ <h5>热门搜索:</h5>
|
|
|
+ <div class={classes.tagWrap}>
|
|
|
+ {state.hotList.map((item: any) => {
|
|
|
+ //
|
|
|
+ return <tagItem title={item.key} onSearchTag={(key)=>clickHotTag(key)}>{item.key}</tagItem>
|
|
|
+ })}
|
|
|
+ </div>
|
|
|
</div>
|
|
|
+ {state.type == 'more' ? (
|
|
|
+ <div class={classes.wrapRight} onClick={gotoSearch}>
|
|
|
+ <span>更多</span>
|
|
|
+ <img class={classes.arrow} src={arrow} alt="" />
|
|
|
+ </div>
|
|
|
+ ) : null}
|
|
|
+ {state.type == 'search' ? (
|
|
|
+ <div class={[classes.wrapRight, classes.searchWrap]} onClick={()=>state.showDetail = false}>
|
|
|
+ <span>筛选</span>
|
|
|
+ <img class={classes.search} src={search} alt="" />
|
|
|
+ </div>
|
|
|
+ ) : null}
|
|
|
</div>
|
|
|
- {state.type == 'more' ? (
|
|
|
- <div class={classes.wrapRight}>
|
|
|
- <span>更多</span>
|
|
|
- <img class={classes.arrow} src={arrow} alt="" />
|
|
|
+ ) : (
|
|
|
+ <div class={classes.searchDetail}>
|
|
|
+ <div class={classes.searchResult}>
|
|
|
+ <div class={classes.resultTitle}>
|
|
|
+ <span>搜索结果</span>
|
|
|
+ <img src={arrow} alt="" />
|
|
|
+ </div>
|
|
|
+ <div class={classes.tagList}>
|
|
|
+ {state.searchTagList.map((item: any) => {
|
|
|
+ return (
|
|
|
+ <ElTag
|
|
|
+ closable
|
|
|
+ onClose={() => closeChioseTag(item)}
|
|
|
+ class="chioseTag"
|
|
|
+ size="large"
|
|
|
+ >
|
|
|
+ {item.name}
|
|
|
+ </ElTag>
|
|
|
+ )
|
|
|
+ })}
|
|
|
+ </div>
|
|
|
+ <div class={classes.clearBtn} onClick={clearSearch}>
|
|
|
+ <span>清空</span>
|
|
|
+ <img src={clearIcon} class={classes.clearIcon} alt="" />
|
|
|
+ </div>
|
|
|
</div>
|
|
|
- ) : null}
|
|
|
- {state.type == 'search' ? (
|
|
|
- <div class={[classes.wrapRight, classes.searchWrap]}>
|
|
|
- <span>筛选</span>
|
|
|
- <img class={classes.search} src={search} alt="" />
|
|
|
+ <div class={classes.searchChioseWrap}>
|
|
|
+ <div class={classes.chioseLineWrap}>
|
|
|
+ {state.tagTree.map((tree: any) => {
|
|
|
+ return (
|
|
|
+ <div class={classes.chioseRow}>
|
|
|
+ <p>{tree.name}:</p>
|
|
|
+ <div class={[classes.chioseTagWrap, 'chioseTagWrap']}>
|
|
|
+ {tree.children.map((tag: any) => {
|
|
|
+ return (
|
|
|
+ <ElTag
|
|
|
+ class={classes.tags}
|
|
|
+ size="large"
|
|
|
+ effect={isChiose(tag)}
|
|
|
+ onClick={() => {
|
|
|
+ chioseTag(tag)
|
|
|
+ }}
|
|
|
+ >
|
|
|
+ {tag.name}
|
|
|
+ </ElTag>
|
|
|
+ )
|
|
|
+ })}
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+ )
|
|
|
+ })}
|
|
|
+ </div>
|
|
|
+ <div class={classes.submitBtn} onClick={searchSubmit}>搜索</div>
|
|
|
</div>
|
|
|
- ) : null}
|
|
|
- </div>
|
|
|
- <div class={classes.searchDetail}>
|
|
|
- <div ></div>
|
|
|
- </div>
|
|
|
+ </div>
|
|
|
+ )}
|
|
|
</>
|
|
|
)
|
|
|
}
|