Skip to content

Commit 32470d7

Browse files
committed
feat[problem-search]support advance search #61
1 parent 457cf81 commit 32470d7

File tree

3 files changed

+138
-11
lines changed

3 files changed

+138
-11
lines changed

src/views/problems/ProblemSearch/SearchOptions/index.vue

Lines changed: 45 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,43 @@
11
<template>
2-
<div style="display:flex">
3-
<el-input v-model="inner_search.name" placeholder="题目内容" @keyup.enter.native="handleSearch" />
4-
<el-button type="primary" @click="handleSearch">搜索</el-button>
2+
<div>
3+
<div style="display:flex">
4+
<el-input v-model="inner_search.content" placeholder="题目内容" @keyup.enter.native="handleSearch" @change="generateOptionByResult" />
5+
<el-button type="primary" @click="handleSearch">搜索</el-button>
6+
<el-button v-if="advance && !show_advance" type="text" @click="show_advance=!show_advance">高级</el-button>
7+
</div>
8+
<el-card v-if="advance&&show_advance" style="margin-top:1rem">
9+
<template #header>
10+
<div style="display: flex;justify-content: space-between;">
11+
<h3>高级搜索</h3>
12+
<el-button v-if="show_advance" type="text" @click="show_advance=!show_advance">隐藏</el-button>
13+
</div>
14+
</template>
15+
<el-form label-width="7rem">
16+
<el-form-item label="按题干">
17+
<el-input v-model="inner_search.name" placeholder="高级搜索为 name:xxx;xxx;xxx" @change="generateResultByOption" />
18+
</el-form-item>
19+
<el-form-item label="按答案">
20+
<el-input v-model="inner_search.answer" placeholder="高级搜索为 answer:xxx;xxx;xxx" @change="generateResultByOption" />
21+
</el-form-item>
22+
<el-form-item label="按选项">
23+
<el-input v-model="inner_search.option" placeholder="高级搜索为 option:xxx;xxx;xxx" @change="generateResultByOption" />
24+
</el-form-item>
25+
<el-form-item label="按正确次数">
26+
<el-input-number v-model="inner_search.count_right" :disabled="true" :min="0" @change="generateResultByOption" />
27+
</el-form-item>
28+
<el-form-item label="按错误次数">
29+
<el-input-number v-model="inner_search.count_wrong" :disabled="true" :min="0" @change="generateResultByOption" />
30+
</el-form-item>
31+
<el-form-item label="按做题次数">
32+
<el-input-number v-model="inner_search.count_total" :disabled="true" :min="0" @change="generateResultByOption" />
33+
</el-form-item>
34+
</el-form>
35+
</el-card>
536
</div>
637
</template>
738

839
<script>
9-
40+
import { generateResultByOption, generateOptionByResult } from './options'
1041
export default {
1142
name: 'SearchOptions',
1243
model: {
@@ -15,8 +46,10 @@ export default {
1546
},
1647
props: {
1748
search: { type: Object, default: null },
49+
advance: { type: Boolean, default: false }
1850
},
1951
data: () => ({
52+
show_advance: false
2053
}),
2154
computed: {
2255
inner_search: {
@@ -31,6 +64,14 @@ export default {
3164
methods: {
3265
handleSearch() {
3366
this.$emit('onSearch')
67+
},
68+
generateResultByOption() {
69+
generateResultByOption(this.inner_search)
70+
this.handleSearch()
71+
},
72+
generateOptionByResult() {
73+
generateOptionByResult(this.inner_search)
74+
this.handleSearch()
3475
}
3576
}
3677
}
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
export function build_result(result, key, value) {
2+
if (!key)key = 'name'
3+
if (!result[key])result[key] = []
4+
result[key].push(value)
5+
}
6+
export function generateOptionByResult(data) {
7+
if (!data) return {}
8+
const { content } = data
9+
if (!content) return {}
10+
const items = content.split(' ')
11+
const result = { }
12+
items.map(i => {
13+
if (!i) return
14+
const ext_detect = i.indexOf(':')
15+
if (ext_detect === -1) return build_result(result, 'name', i)
16+
const key = i.substring(0, ext_detect)
17+
const value = i.substring(ext_detect + 1)
18+
return build_result(result, key, value)
19+
})
20+
Object.keys(data).filter(i => i !== 'content').map(i => {
21+
data[i] = null
22+
})
23+
Object.keys(result).map(i => {
24+
data[i] = result[i].join(';')
25+
})
26+
return result
27+
}
28+
export function build_options(data) {
29+
return Object.keys(data)
30+
.filter(i => i !== 'content' && data[i])
31+
.map(i => ({ k: i, v: data[i].split(';') }))
32+
}
33+
export function generateResultByOption(data) {
34+
if (!data) return {}
35+
const result =
36+
build_options(data)
37+
.map(i => {
38+
if (i.k === 'name') return i.v.join(';')
39+
return `${i.k}:${i.v.join(';')}`
40+
}).join(' ')
41+
data.content = result
42+
return result
43+
}

src/views/problems/ProblemSearch/index.vue

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<template #title>
66
<h3>题库:{{ database_data.alias }}(共{{ total_data_count }}题)</h3>
77
</template>
8-
<SearchOptions v-model="search" @onSearch="onSearch" />
8+
<SearchOptions v-model="search" :advance="true" @onSearch="onSearch" />
99
<transition-group
1010
name="slide-fade"
1111
mode="out-in"
@@ -25,7 +25,7 @@
2525
</template>
2626

2727
<script>
28-
28+
import { build_options } from './SearchOptions/options'
2929
import { beforeLeave, enter, beforeEnter } from '../Practice/Train/ProblemList/animations'
3030
import { mapState } from 'vuex'
3131
import { init_problems } from '../Practice/Train/ProblemList/problem_init'
@@ -43,7 +43,13 @@ export default {
4343
data: () => ({
4444
loading: false,
4545
search: {
46-
name: null
46+
content: null,
47+
name: null,
48+
answer: null,
49+
option: null,
50+
count_wrong: 0,
51+
count_right: 0,
52+
count_total: 0,
4753
},
4854
database_data: {},
4955
problems: [],
@@ -62,11 +68,48 @@ export default {
6268
return filtered_problems.slice(start, end)
6369
},
6470
filtered_problems () {
65-
const data = this.problems
71+
let data = this.problems
6672
if (!data) return []
67-
const name = this.search.name
68-
if (!name) return data
69-
return data.filter(i => JSON.stringify(i).indexOf(name) > -1)
73+
const options_arr = build_options(this.search)
74+
const options = options_arr.reduce((prev, cur) => (prev[cur.k] = cur.v) && prev, {})
75+
const { name, answer, option, count_wrong, count_right, count_total } = options
76+
console.log({ name, answer, option, count_wrong, count_right, count_total })
77+
if (name) {
78+
name.map(name => {
79+
data = data.filter(i => i.content.indexOf(name) > -1)
80+
})
81+
}
82+
if (answer) {
83+
answer.map(answer => {
84+
data = data.filter(i => {
85+
const p_answer = i.answer
86+
if (!p_answer) return false
87+
if (p_answer.push) {
88+
return p_answer.find(a => `${a}`.indexOf(answer) > -1)
89+
}
90+
return `${p_answer}`.indexOf(answer) > -1
91+
})
92+
})
93+
}
94+
if (option) {
95+
option.map(option => {
96+
data = data.filter(i => {
97+
const p_option = i.option
98+
if (!p_option) return false
99+
return p_option.find(a => a.indexOf(option) > -1)
100+
})
101+
})
102+
}
103+
if (count_wrong) {
104+
// not support yet
105+
}
106+
if (count_right) {
107+
// not support yet
108+
}
109+
if (count_total) {
110+
// not support yet
111+
}
112+
return data
70113
},
71114
...mapState({
72115
device: (state) => state.app.device,

0 commit comments

Comments
 (0)