增加店铺自定义题库的基本操作
This commit is contained in:
parent
ba993db028
commit
dddbed3b6f
2
dist/js/app.250d583b.js
vendored
2
dist/js/app.250d583b.js
vendored
File diff suppressed because one or more lines are too long
@ -13,6 +13,7 @@ export interface IQuestionData {
|
||||
category?: string
|
||||
quality: number
|
||||
withNext: boolean
|
||||
shop?: string
|
||||
}
|
||||
|
||||
export const defaultQuestionData: IQuestionData = {
|
||||
|
40
src/api/shoppuzzle.ts
Normal file
40
src/api/shoppuzzle.ts
Normal file
@ -0,0 +1,40 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export const getShopQuestions = (params: any) =>
|
||||
request({
|
||||
url: `/api/${params.shop}/puzzles`,
|
||||
method: 'post',
|
||||
params
|
||||
})
|
||||
|
||||
export const getShopQuestion = (shop: string, id: string, params: any) =>
|
||||
request({
|
||||
url: `/api/${shop}/puzzle/${id}`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
export const nextShopQuestion = (shop: string, id: string) =>
|
||||
request({
|
||||
url: `/api/${shop}/nextpuzzle`,
|
||||
method: 'post',
|
||||
data: { id }
|
||||
})
|
||||
|
||||
export const saveShopQuestion = (data: any) =>
|
||||
request({
|
||||
url: `/api/${data.shop}/puzzle/save`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
|
||||
export const deleteShopQuestion = (shop: string, id: string) =>
|
||||
request({
|
||||
url: `/api/${shop}/puzzle/${id}/delete`,
|
||||
method: 'post'
|
||||
})
|
||||
|
||||
export const getShopCategory = (shop: string) =>
|
||||
request({
|
||||
url: `/api/${shop}/categorys`,
|
||||
method: 'get'
|
||||
})
|
@ -95,7 +95,8 @@ export default {
|
||||
edit_theme: 'Edit Theme',
|
||||
shop_member: 'Member Manage',
|
||||
shop_statistics: 'Statistics',
|
||||
game_statistics: 'Game Statistics'
|
||||
game_statistics: 'Game Statistics',
|
||||
shop_puzzles: 'Custom Puzzles'
|
||||
},
|
||||
navbar: {
|
||||
logOut: 'Log Out',
|
||||
@ -216,5 +217,8 @@ export default {
|
||||
},
|
||||
marketing: {
|
||||
|
||||
},
|
||||
main: {
|
||||
shop: 'shop'
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,8 @@ export default {
|
||||
edit_theme: '订制游戏主题',
|
||||
shop_member: '成员管理',
|
||||
shop_statistics: '统计',
|
||||
game_statistics: '游戏数据'
|
||||
game_statistics: '游戏数据',
|
||||
shop_puzzles: '自定义题库'
|
||||
},
|
||||
navbar: {
|
||||
logOut: '退出登录',
|
||||
@ -213,5 +214,8 @@ export default {
|
||||
},
|
||||
article: {
|
||||
add: '添加'
|
||||
},
|
||||
main: {
|
||||
shop: '店铺'
|
||||
}
|
||||
}
|
||||
|
@ -52,6 +52,39 @@ const questionRoutes: RouteConfig = {
|
||||
permissions: ['shop:tiku_setting'],
|
||||
icon: 'excel'
|
||||
}
|
||||
},
|
||||
|
||||
{
|
||||
path: 'shoppuzzles',
|
||||
component: () => import('@/views/question/shop_puzzles.vue'),
|
||||
name: 'ShopPuzzles',
|
||||
meta: {
|
||||
title: 'shop_puzzles',
|
||||
permissions: ['shoppuzzle:read'],
|
||||
icon: 'form'
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'newshoppuzzle/:shop',
|
||||
component: () => import('@/views/question/shop_puzzle_editor.vue'),
|
||||
name: 'CreatePuzzle',
|
||||
meta: {
|
||||
title: 'createQuestion',
|
||||
permissions: ['shoppuzzle:edit'],
|
||||
icon: 'edit',
|
||||
hidden: true
|
||||
}
|
||||
},
|
||||
{
|
||||
path: 'shoppuzzle/:shop/:id',
|
||||
component: () => import('@/views/question/shop_puzzle_editor.vue'),
|
||||
name: 'PuzzleEditor',
|
||||
meta: {
|
||||
title: 'question_prepare',
|
||||
permissions: ['shoppuzzle:edit'],
|
||||
elicon: 'el-icon-arrow-right',
|
||||
hidden: true
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
3
src/utils/event-bus.ts
Normal file
3
src/utils/event-bus.ts
Normal file
@ -0,0 +1,3 @@
|
||||
|
||||
import Vue from 'vue'
|
||||
export const EventBus = new Vue()
|
@ -10,10 +10,10 @@
|
||||
>
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="基本信息" name="first">
|
||||
<el-form-item label="店铺" prop="key" v-if="userLevel === 1">
|
||||
<el-form-item :label="$t('main.shop')" prop="key" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="postForm.shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
|
@ -5,10 +5,10 @@
|
||||
<el-form-item label="关键字" prop="key">
|
||||
<el-input v-model="filterForm.key" placeholder="关键字"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="店铺" prop="key" v-if="userLevel === 1">
|
||||
<el-form-item :label="$t('main.shop')" prop="key" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="filterForm.shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
@ -54,7 +54,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
prop="shop"
|
||||
v-if="userLevel === 1"
|
||||
:formatter = "formatDept"
|
||||
|
@ -225,7 +225,7 @@
|
||||
<div class="action-bar">
|
||||
<el-select
|
||||
v-model="shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
@ -255,7 +255,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
prop="shop"
|
||||
v-if="userLevel === 1"
|
||||
:formatter = "formatDept"
|
||||
|
@ -10,10 +10,10 @@
|
||||
>
|
||||
<el-tabs v-model="activeName">
|
||||
<el-tab-pane label="基本信息" name="first">
|
||||
<el-form-item label="店铺" prop="key" v-if="userLevel === 1">
|
||||
<el-form-item :label="$t('main.shop')" prop="key" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="postForm.shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
|
@ -5,10 +5,10 @@
|
||||
<el-form-item label="关键字" prop="key">
|
||||
<el-input v-model="filterForm.key" placeholder="关键字"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="店铺" prop="key" v-if="userLevel === 1">
|
||||
<el-form-item :label="$t('main.shop')" prop="key" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="filterForm.shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
@ -54,7 +54,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
prop="shop"
|
||||
v-if="userLevel === 1"
|
||||
:formatter = "formatDept"
|
||||
|
@ -20,7 +20,7 @@
|
||||
<el-row>
|
||||
<el-select
|
||||
v-model="shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
|
@ -183,6 +183,7 @@ export default class extends Vue {
|
||||
query: this.otherQuery
|
||||
}).catch(err => {
|
||||
// console.warn(err)
|
||||
this.loading = false
|
||||
})
|
||||
// Just to simulate the time of the request
|
||||
setTimeout(() => {
|
||||
|
@ -5,7 +5,7 @@
|
||||
<el-form-item label="关键字" prop="key">
|
||||
<el-input v-model="filterForm.key" placeholder="关键字"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="店铺" v-if="userLevel === 1">
|
||||
<el-form-item :label="$t('main.shop')" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="filterForm.department"
|
||||
placeholder="所有"
|
||||
@ -53,7 +53,7 @@
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
prop="shop"
|
||||
v-if="userLevel === 1"
|
||||
:formatter = "formatDept"
|
||||
|
@ -7,10 +7,10 @@
|
||||
label-width="121px"
|
||||
class="form-container"
|
||||
>
|
||||
<el-form-item label="店铺" prop="shop" v-if="userLevel === 1">
|
||||
<el-form-item :label="$t('main.shop')" prop="shop" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="postForm.shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
|
@ -5,7 +5,7 @@
|
||||
<el-form-item label="关键字" prop="key">
|
||||
<el-input v-model="filterForm.key" placeholder="关键字"/>
|
||||
</el-form-item>
|
||||
<el-form-item label="店铺">
|
||||
<el-form-item :label="$t('main.shop')">
|
||||
<el-select
|
||||
v-model="filterForm.department"
|
||||
placeholder="所有"
|
||||
|
@ -3,7 +3,7 @@
|
||||
<el-row style="margin-bottom: 24px">
|
||||
<el-select
|
||||
v-model="shop"
|
||||
placeholder="选择店铺"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
|
356
src/views/question/shop_puzzle_editor.vue
Normal file
356
src/views/question/shop_puzzle_editor.vue
Normal file
@ -0,0 +1,356 @@
|
||||
<template>
|
||||
<div class="createPost-container">
|
||||
<el-form
|
||||
ref="postForm"
|
||||
:model="postForm"
|
||||
:rules="rules"
|
||||
label-width="120px"
|
||||
class="form-container"
|
||||
>
|
||||
|
||||
<div class="createPost-main-container">
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item
|
||||
style="margin-bottom: 40px;"
|
||||
prop="question"
|
||||
>
|
||||
<material-input
|
||||
v-model="postForm.question"
|
||||
:maxlength="100"
|
||||
name="question"
|
||||
required
|
||||
>
|
||||
题目
|
||||
</material-input>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item
|
||||
style="margin-bottom: 40px;"
|
||||
label="答案:"
|
||||
prop="a1"
|
||||
>
|
||||
<el-input
|
||||
v-model="postForm.a1"
|
||||
placeholder="输入答案"
|
||||
name="a1"
|
||||
required
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item
|
||||
label="评分:"
|
||||
class="postInfo-container-item"
|
||||
>
|
||||
<el-rate
|
||||
v-model="postForm.quality"
|
||||
:max="3"
|
||||
:colors="['#99A9BF', '#F7BA2A', '#ff5900']"
|
||||
:low-threshold="1"
|
||||
:high-threshold="3"
|
||||
style="display:inline-block"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="6">
|
||||
<el-form-item
|
||||
style="margin-bottom: 40px;"
|
||||
label="混淆答案1:"
|
||||
>
|
||||
<el-input
|
||||
v-model="postForm.a2"
|
||||
:rows="1"
|
||||
placeholder="输入答案"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item
|
||||
style="margin-bottom: 40px;"
|
||||
label="混淆答案2:"
|
||||
>
|
||||
<el-input
|
||||
v-model="postForm.a3"
|
||||
:rows="1"
|
||||
placeholder="输入答案"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="6">
|
||||
<el-form-item
|
||||
style="margin-bottom: 40px;"
|
||||
label="混淆答案3:"
|
||||
>
|
||||
<el-input
|
||||
v-model="postForm.a4"
|
||||
:rows="1"
|
||||
placeholder="输入答案"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item
|
||||
label="TAGS:"
|
||||
>
|
||||
<el-select
|
||||
v-model="postForm.groups"
|
||||
multiple
|
||||
filterable
|
||||
allow-create
|
||||
default-first-option
|
||||
style="width: 50%"
|
||||
@change="tagChange"
|
||||
placeholder="请选择">
|
||||
<el-option
|
||||
v-for="item in tagOptions"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item">
|
||||
</el-option>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="24">
|
||||
<el-form-item>
|
||||
<el-button
|
||||
type="primary"
|
||||
v-loading="loading"
|
||||
@click="submitForm"
|
||||
v-permission="['shoppuzzle:edit']"
|
||||
>
|
||||
保存
|
||||
</el-button>
|
||||
<el-button
|
||||
v-loading="loading"
|
||||
style="margin-left: 10px;"
|
||||
type="danger"
|
||||
@click="deleteRecord"
|
||||
v-permission="['shoppuzzle:delete']"
|
||||
>
|
||||
删除
|
||||
</el-button>
|
||||
<el-button @click="onCancel">
|
||||
取消
|
||||
</el-button>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</el-form>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { Component, Vue } from 'vue-property-decorator'
|
||||
import { AppModule } from '@/store/modules/app'
|
||||
import { ITagView, TagsViewModule } from '@/store/modules/tags-view'
|
||||
import MaterialInput from '@/components/MaterialInput/index.vue'
|
||||
import Sticky from '@/components/Sticky/index.vue'
|
||||
import Tinymce from '@/components/Tinymce/index.vue'
|
||||
import UploadImage from '@/components/UploadImage/index.vue'
|
||||
import { defaultQuestionData } from '@/api/question'
|
||||
import { deleteShopQuestion, getShopQuestion, saveShopQuestion } from '@/api/shoppuzzle'
|
||||
import { EventBus } from '@/utils/event-bus'
|
||||
|
||||
@Component({
|
||||
name: 'ShopPuzzleEdit',
|
||||
components: {
|
||||
MaterialInput,
|
||||
Sticky,
|
||||
Tinymce,
|
||||
UploadImage
|
||||
}
|
||||
})
|
||||
export default class extends Vue {
|
||||
private validateRequire = (rule: any, value: string, callback: Function) => {
|
||||
if (value === '') {
|
||||
if (rule.field === 'imageURL') {
|
||||
this.$message({
|
||||
message: 'Upload cover image is required',
|
||||
type: 'error'
|
||||
})
|
||||
} else {
|
||||
this.$message({
|
||||
message: rule.field + ' 是必填的',
|
||||
type: 'error'
|
||||
})
|
||||
}
|
||||
callback(new Error(rule.field + ' 是必填的'))
|
||||
} else {
|
||||
callback()
|
||||
}
|
||||
}
|
||||
|
||||
private postForm = Object.assign({}, defaultQuestionData)
|
||||
private loading = false
|
||||
private rules = {
|
||||
question: [{ validator: this.validateRequire }],
|
||||
a1: [{ validator: this.validateRequire }]
|
||||
}
|
||||
|
||||
private typeSelect: string[] = []
|
||||
private tagSet: Set<string> = new Set()
|
||||
private tagOptions: string[] = []
|
||||
|
||||
private tempTagView?: ITagView
|
||||
|
||||
get lang() {
|
||||
return AppModule.language
|
||||
}
|
||||
|
||||
$refs!: {
|
||||
postForm: HTMLFormElement
|
||||
}
|
||||
|
||||
created() {
|
||||
const shop = this.$route.params && this.$route.params.shop
|
||||
this.postForm.shop = shop
|
||||
const id = this.$route.params && this.$route.params.id
|
||||
if (id) {
|
||||
this.fetchData(shop, id)
|
||||
}
|
||||
this.tempTagView = Object.assign({}, this.$route)
|
||||
}
|
||||
|
||||
private async fetchData(shop: string, id: string) {
|
||||
try {
|
||||
const { data } = await getShopQuestion(shop, id, {})
|
||||
this.postForm = data
|
||||
this.typeSelect = [this.postForm.tag || '', this.postForm.sub_tag || '']
|
||||
// Just for test
|
||||
const title = this.lang === 'zh' ? '编辑题目' : 'Edit Question'
|
||||
// Set tagsview title
|
||||
this.setTagsViewTitle(title)
|
||||
// Set page title
|
||||
this.setPageTitle(title)
|
||||
} catch (err) {
|
||||
console.error(err)
|
||||
}
|
||||
}
|
||||
|
||||
private setTagsViewTitle(title: string) {
|
||||
const tagView = this.tempTagView
|
||||
if (tagView) {
|
||||
tagView.title = `${title}-${this.postForm._id}`
|
||||
TagsViewModule.updateVisitedView(tagView)
|
||||
}
|
||||
}
|
||||
|
||||
private setPageTitle(title: string) {
|
||||
document.title = `${title} - ${this.postForm._id}`
|
||||
}
|
||||
|
||||
private typeChange() {
|
||||
this.postForm.tag = this.typeSelect[0]
|
||||
this.postForm.sub_tag = this.typeSelect[1]
|
||||
}
|
||||
|
||||
private async tagChange(tags: string[]) {
|
||||
console.log('tagchange: ', tags)
|
||||
for (const tag of tags) {
|
||||
if (!this.tagSet.has(tag)) {
|
||||
this.tagSet.add(tag)
|
||||
this.tagOptions.push(tag)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private async submitForm() {
|
||||
await this.saveRecord(false)
|
||||
}
|
||||
|
||||
private async saveNext() {
|
||||
await this.saveRecord(true)
|
||||
}
|
||||
|
||||
private async saveRecord(withNext: boolean) {
|
||||
try {
|
||||
await this.$refs.postForm.validate()
|
||||
this.loading = true
|
||||
const { data } = await saveShopQuestion(this.postForm)
|
||||
this.postForm = data
|
||||
this.loading = false
|
||||
this.$notify({
|
||||
title: 'Success',
|
||||
message: '题目保存成功',
|
||||
type: 'success',
|
||||
duration: 2000
|
||||
})
|
||||
EventBus.$emit('shop_puzzles_update', {})
|
||||
} catch (err) {
|
||||
console.error('Submit Error!')
|
||||
this.loading = false
|
||||
return false
|
||||
}
|
||||
}
|
||||
|
||||
private async deleteRecord() {
|
||||
try {
|
||||
this.loading = true
|
||||
await this.$confirm('确认删除当前记录?', 'Warning', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
await deleteShopQuestion(this.postForm.shop!, this.postForm._id!)
|
||||
this.loading = false
|
||||
EventBus.$emit('shop_puzzles_update', {})
|
||||
this.$store.dispatch('delView', this.$route)
|
||||
this.$router.go(-1)
|
||||
} catch (e) {
|
||||
this.loading = false
|
||||
}
|
||||
}
|
||||
|
||||
private async onCancel() {
|
||||
try {
|
||||
await this.$confirm('确认不保存当前记录?', 'Warning', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
this.$store.dispatch('delView', this.$route)
|
||||
this.$router.go(-1)
|
||||
} catch (e) {
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.createPost-container {
|
||||
position: relative;
|
||||
|
||||
.createPost-main-container {
|
||||
padding: 40px 45px 20px 50px;
|
||||
|
||||
.postInfo-container {
|
||||
position: relative;
|
||||
@include clearfix;
|
||||
margin-bottom: 10px;
|
||||
|
||||
.postInfo-container-item {
|
||||
float: left;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.word-counter {
|
||||
width: 40px;
|
||||
position: absolute;
|
||||
right: 10px;
|
||||
top: 0px;
|
||||
}
|
||||
}
|
||||
</style>
|
319
src/views/question/shop_puzzles.vue
Normal file
319
src/views/question/shop_puzzles.vue
Normal file
@ -0,0 +1,319 @@
|
||||
<template>
|
||||
<div class="app-container">
|
||||
<!-- filter -->
|
||||
<el-form ref="filterForm" :inline="true" :model="filterForm" class="filter">
|
||||
<el-form-item label="关键字" prop="key">
|
||||
<el-input v-model="filterForm.key" placeholder="关键字"/>
|
||||
</el-form-item>
|
||||
<el-form-item :label="$t('main.shop')" prop="key" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="filterForm.shop"
|
||||
:placeholder="'选择'+$t('main.shop')"
|
||||
name="shop"
|
||||
required
|
||||
class="w100"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in allDepts"
|
||||
:key="item._id"
|
||||
:label="item.name"
|
||||
:value="item._id"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="分类" prop="key">
|
||||
<el-select
|
||||
v-model="filterForm.typeSelect"
|
||||
placeholder="选择"
|
||||
name="typeSelect"
|
||||
required
|
||||
class="w100"
|
||||
multiple
|
||||
v-loading="cateLoading"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in typeOptions"
|
||||
:key="item"
|
||||
:label="item"
|
||||
:value="item"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="search">查询</el-button>
|
||||
<el-button @click="resetFilterForm">重置</el-button>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
<router-link :to="'/question/newshoppuzzle/' + filterForm.shop">
|
||||
<el-button
|
||||
type="primary"
|
||||
icon="el-icon-edit"
|
||||
v-permission="['shoppuzzle:edit']"
|
||||
>
|
||||
添加
|
||||
</el-button>
|
||||
</router-link>
|
||||
<el-table
|
||||
v-loading="listLoading"
|
||||
:data="list"
|
||||
border
|
||||
fit
|
||||
highlight-current-row
|
||||
style="width: 100%;margin-top:30px;"
|
||||
>
|
||||
<el-table-column
|
||||
width="180px"
|
||||
align="center"
|
||||
label="添加时间"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ row.createtime | parseTime }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
min-width="200px"
|
||||
label="名称"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
<router-link
|
||||
:to="'/question/edit/'+row._id"
|
||||
class="link-type"
|
||||
>
|
||||
<span>{{ row.question }}</span>
|
||||
</router-link>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
label="答案"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ row.a1 }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
label="混淆答案"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
<span>{{ row.a2 || '' }} {{ row.a3 || '' }} {{ row.a4 || '' }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
label="Tags"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
<el-tag v-for="item in row.groups" :key="item">{{ item }}</el-tag>
|
||||
</template>
|
||||
</el-table-column>
|
||||
|
||||
<el-table-column
|
||||
align="center"
|
||||
width="180"
|
||||
label="操作"
|
||||
fixed="right"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<router-link :to="'/question/shoppuzzle/'+scope.row.shop+'/'+scope.row._id">
|
||||
<el-button
|
||||
type="primary"
|
||||
size="small"
|
||||
icon="el-icon-edit"
|
||||
v-permission="['shoppuzzle:edit']"
|
||||
>
|
||||
编辑
|
||||
</el-button>
|
||||
</router-link>
|
||||
<el-button
|
||||
type="danger"
|
||||
size="small"
|
||||
style="margin-left: 10px"
|
||||
@click="handleDelete(scope)"
|
||||
v-permission="['shoppuzzle:delete']"
|
||||
>
|
||||
{{ $t('permission.delete') }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
|
||||
<pagination
|
||||
v-show="total>0"
|
||||
:total="total"
|
||||
:page.sync="listQuery.page"
|
||||
:limit.sync="listQuery.limit"
|
||||
@pagination="getList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script lang="ts">
|
||||
import { Component, Vue, Watch } from 'vue-property-decorator'
|
||||
import Pagination from '@/components/Pagination/index.vue'
|
||||
import { getShops } from '@/api/shop'
|
||||
import { parseTime } from '@/utils'
|
||||
import { IQuestionData } from '@/api/question'
|
||||
import { UserModule } from '@/store/modules/user'
|
||||
import { deleteShopQuestion, getShopCategory, getShopQuestions } from '@/api/shoppuzzle'
|
||||
import { IShopData } from '@/api/types'
|
||||
import { EventBus } from '@/utils/event-bus'
|
||||
|
||||
@Component({
|
||||
name: 'ShopPuzzles',
|
||||
components: {
|
||||
Pagination
|
||||
},
|
||||
filters: {
|
||||
parseTime: (timestamp: string) => {
|
||||
return parseTime(timestamp)
|
||||
},
|
||||
parseDate: (timestamp: string) => {
|
||||
if (!timestamp) {
|
||||
return '-'
|
||||
}
|
||||
return parseTime(timestamp, '{y}-{m}-{d}')
|
||||
},
|
||||
formatCount: (count: string) => {
|
||||
if (!count) {
|
||||
return 0
|
||||
}
|
||||
return count
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
export default class extends Vue {
|
||||
private total = 0
|
||||
private list: IQuestionData[] = []
|
||||
private listLoading = false
|
||||
private cateLoading = false
|
||||
private allDepts: IShopData[] = []
|
||||
private listQuery = {
|
||||
page: 1,
|
||||
limit: 20,
|
||||
key: '',
|
||||
tag: '',
|
||||
sub_tag: '',
|
||||
groups: [],
|
||||
shop: ''
|
||||
}
|
||||
|
||||
private typeOptions: any[] = []
|
||||
private filterForm = {
|
||||
key: '',
|
||||
typeSelect: [],
|
||||
shop: ''
|
||||
}
|
||||
|
||||
$refs!: {
|
||||
filterForm: HTMLFormElement
|
||||
}
|
||||
|
||||
get userLevel() {
|
||||
return UserModule.level
|
||||
}
|
||||
|
||||
async created() {
|
||||
if (UserModule.level === 1) {
|
||||
await this.getRemoteDeptList()
|
||||
} else {
|
||||
this.filterForm.shop = UserModule.department
|
||||
this.listQuery.shop = UserModule.department
|
||||
await this.getList()
|
||||
}
|
||||
// this.getList()
|
||||
EventBus.$on('shop_puzzles_update', () => {
|
||||
this.getList()
|
||||
})
|
||||
}
|
||||
|
||||
beforeDestory() {
|
||||
EventBus.$off('shop_puzzles_update')
|
||||
}
|
||||
|
||||
private async getList() {
|
||||
this.listLoading = true
|
||||
const { data } = await getShopQuestions(this.listQuery)
|
||||
this.listLoading = false
|
||||
this.list = data.records
|
||||
this.total = data.total
|
||||
}
|
||||
|
||||
private async handleDelete(scope: any) {
|
||||
const { $index, row } = scope
|
||||
await this.$confirm('确认删除该记录?', 'Warning', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
await deleteShopQuestion(this.listQuery.shop, row._id)
|
||||
this.list.splice($index, 1)
|
||||
this.$message({
|
||||
type: 'success',
|
||||
message: '删除成功!'
|
||||
})
|
||||
}
|
||||
|
||||
private search() {
|
||||
this.filterData()
|
||||
}
|
||||
|
||||
private filterData() {
|
||||
this.listQuery.key = this.filterForm.key
|
||||
if (this.filterForm.typeSelect.length > 0) {
|
||||
this.listQuery.tag = this.filterForm.typeSelect[0]
|
||||
}
|
||||
if (this.filterForm.typeSelect.length > 1) {
|
||||
this.listQuery.sub_tag = this.filterForm.typeSelect[1]
|
||||
}
|
||||
this.listQuery.page = 1
|
||||
this.getList()
|
||||
}
|
||||
|
||||
private resetFilterForm() {
|
||||
this.$refs.filterForm.resetFields()
|
||||
}
|
||||
|
||||
private async getRemoteDeptList(name?: string) {
|
||||
const { data } = await getShops({ key: name })
|
||||
if (!data.records) return
|
||||
this.allDepts = data.records
|
||||
if (this.allDepts.length > 0) {
|
||||
this.filterForm.shop = this.allDepts[0]._id!
|
||||
}
|
||||
}
|
||||
|
||||
@Watch('filterForm.shop')
|
||||
private filterShopChange(val: string) {
|
||||
console.log('filterForm.shop: ', val)
|
||||
this.listQuery.shop = this.filterForm.shop
|
||||
this.getRemoteCategory()
|
||||
this.getList()
|
||||
}
|
||||
|
||||
@Watch('filterForm.')
|
||||
private filerTypeChange(val: string) {
|
||||
this.listQuery.groups = this.filterForm.typeSelect
|
||||
this.getList()
|
||||
}
|
||||
|
||||
private async getRemoteCategory() {
|
||||
this.cateLoading = true
|
||||
try {
|
||||
const { data } = await getShopCategory(this.listQuery.shop)
|
||||
this.typeOptions = data
|
||||
this.cateLoading = false
|
||||
this.$forceUpdate()
|
||||
} catch (err) {
|
||||
this.cateLoading = false
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.el-tag{
|
||||
margin-right: 5px;
|
||||
}
|
||||
</style>
|
@ -8,7 +8,7 @@
|
||||
class="form-container"
|
||||
>
|
||||
<el-form-item
|
||||
label="店铺名"
|
||||
:label="$t('main.shop')+'名'"
|
||||
>
|
||||
<el-select
|
||||
v-model="postForm.name"
|
||||
@ -17,7 +17,7 @@
|
||||
default-first-option
|
||||
remote
|
||||
@change="areaSelectChange"
|
||||
placeholder="搜索店铺"
|
||||
:placeholder="'搜索'+$t('main.shop')"
|
||||
allow-create
|
||||
style="width: 50%"
|
||||
>
|
||||
@ -121,6 +121,7 @@ import UploadImage from '@/components/UploadImage/index.vue'
|
||||
import RegionPicker from '@/components/RegionPicker/index.vue'
|
||||
import { defaultShopData, getShop, saveShop } from '@/api/shop'
|
||||
import { addressToLoc, IAreaData, queryArea } from '@/api/map'
|
||||
import i18n from '@/lang'
|
||||
|
||||
@Component({
|
||||
name: 'ShopEditor',
|
||||
@ -183,7 +184,7 @@ export default class extends Vue {
|
||||
console.log(data)
|
||||
this.postForm = data
|
||||
// Just for test
|
||||
const title = this.lang === 'zh' ? '编辑店铺' : 'Edit Shop'
|
||||
const title = this.lang === 'zh' ? `编辑${i18n.tc('main.shop')}` : 'Edit Shop'
|
||||
// Set tagsview title
|
||||
this.setTagsViewTitle(title)
|
||||
// Set page title
|
||||
@ -226,7 +227,7 @@ export default class extends Vue {
|
||||
|
||||
private async onCancel() {
|
||||
try {
|
||||
await this.$confirm('确认不保存当前店铺信息?', 'Warning', {
|
||||
await this.$confirm(`确认不保存当前${i18n.tc('main.shop')}信息?`, 'Warning', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
|
@ -51,7 +51,7 @@
|
||||
|
||||
<el-table-column
|
||||
min-width="200px"
|
||||
label="店铺名"
|
||||
label="名称"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
<router-link
|
||||
@ -150,6 +150,7 @@ import { IShopData } from '@/api/types'
|
||||
import Pagination from '@/components/Pagination/index.vue'
|
||||
import { deleteShop, getShops, updateShopPublish } from '@/api/shop'
|
||||
import { parseTime } from '@/utils'
|
||||
import i18n from '@/lang'
|
||||
|
||||
@Component({
|
||||
name: 'ShopList',
|
||||
@ -205,7 +206,8 @@ export default class extends Vue {
|
||||
|
||||
private async handleDelete(scope: any) {
|
||||
const { $index, row } = scope
|
||||
await this.$confirm('确认删除该店铺?', 'Warning', {
|
||||
try {
|
||||
await this.$confirm(`确认删除该${i18n.tc('main.shop')}?`, 'Warning', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
@ -216,11 +218,13 @@ export default class extends Vue {
|
||||
type: 'success',
|
||||
message: '删除成功!'
|
||||
})
|
||||
} catch (err) {
|
||||
}
|
||||
}
|
||||
|
||||
private async publishShop(scope: any) {
|
||||
const { row } = scope
|
||||
const str = row.publish ? '确认取消该店铺的审核状态?' : '确定通过该店铺的审核?'
|
||||
const str = row.publish ? `确认取消该${i18n.tc('main.shop')}的审核状态?` : `确定通过该${i18n.tc('main.shop')}的审核?`
|
||||
try {
|
||||
await this.$confirm(str, 'Warning', {
|
||||
confirmButtonText: '确定',
|
||||
|
@ -20,7 +20,7 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="店铺" v-if="userLevel === 1">
|
||||
<el-form-item :label="$t('main.shop')" v-if="userLevel === 1">
|
||||
<el-select
|
||||
v-model="filterForm.department"
|
||||
placeholder="所有"
|
||||
@ -67,7 +67,7 @@
|
||||
<el-table-column
|
||||
prop="department"
|
||||
align="center"
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
v-if="userLevel === 1"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
@ -218,11 +218,11 @@
|
||||
</el-form-item>
|
||||
<el-form-item label="帐号类型">
|
||||
<el-radio-group v-model="record.level" size="small">
|
||||
<el-radio-button :label="9">店铺</el-radio-button>
|
||||
<el-radio-button :label="9">{{$t('main.shop')}}</el-radio-button>
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
prop="department"
|
||||
v-if="userLevel === 1"
|
||||
>
|
||||
|
@ -20,7 +20,7 @@
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
<el-form-item label="店铺">
|
||||
<el-form-item :label="$t('main.shop')">
|
||||
<el-select
|
||||
v-model="filterForm.department"
|
||||
placeholder="所有"
|
||||
@ -68,7 +68,7 @@
|
||||
<el-table-column
|
||||
prop="department"
|
||||
align="center"
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
>
|
||||
<template slot-scope="{row}">
|
||||
{{formatDept(row)}}
|
||||
@ -223,7 +223,7 @@
|
||||
</el-radio-group>
|
||||
</el-form-item>
|
||||
<el-form-item
|
||||
label="店铺"
|
||||
:label="$t('main.shop')"
|
||||
prop="department"
|
||||
v-if="record.level === 9"
|
||||
>
|
||||
|
Loading…
x
Reference in New Issue
Block a user