完成初版的问卷、问题、二维码管理

soul2/encrypt
soul2 1 year ago
parent 24ca6499c9
commit 1f2700486d
  1. 38
      src/api/questionnaire.js
  2. 45
      src/api/subject.js
  3. 46
      src/router/index.js
  4. 2
      src/views/qr/edit.vue
  5. 4
      src/views/qr/index.vue
  6. 161
      src/views/questionnaire/chooseSubject.vue
  7. 97
      src/views/questionnaire/edit.vue
  8. 299
      src/views/questionnaire/index.vue
  9. 182
      src/views/subject/edit.vue
  10. 255
      src/views/subject/index.vue

@ -0,0 +1,38 @@
import request from '@/utils/request'
let prefix = 'questionnaire'
export function page(data) {
return request({
url: `/${prefix}/page`,
data
})
}
export function saveOrUpdate(data) {
return request({
url: `/${prefix}/saveOrUpdate`,
data
})
}
export function remove(data) {
return request({
url: `/${prefix}/remove`,
data
})
}
export function updateStatus(data) {
return request({
url: `/${prefix}/status`,
data
})
}
export function ref(data) {
return request({
url: `/${prefix}/ref`,
data
})
}

@ -0,0 +1,45 @@
import request from '@/utils/request'
let prefix = 'subject'
export function page(data) {
return request({
url: `/${prefix}/page`,
data
})
}
export function saveOrUpdate(data) {
return request({
url: `/${prefix}/saveOrUpdate`,
data
})
}
export function remove(data) {
return request({
url: `/${prefix}/remove`,
data
})
}
export function updateStatus(data) {
return request({
url: `/${prefix}/status`,
data
})
}
export function items(data) {
return request({
url: `/${prefix}/items`,
data
})
}
export function chooseList(data) {
return request({
url: `/${prefix}/chooseList`,
data
})
}

@ -54,28 +54,54 @@ export const constantRoutes = [
}] }]
}, },
// {
// path: '/demo',
// component: Layout,
// children: [
// {
// path: 'index',
// name: 'Demo',
// component: () => import('@/views/demo/index'),
// meta: { title: '表格示例', icon: 'table' }
// }
// ]
// },
{ {
path: '/demo', path: '/qr',
component: Layout, component: Layout,
children: [ children: [
{ {
path: 'index', path: '',
name: 'Demo', name: 'Qr',
component: () => import('@/views/demo/index'), component: () => import('@/views/qr/index'),
meta: { title: '表格示例', icon: 'table' } meta: { title: '二维码', icon: 'table' }
} }
] ]
}, },
{ {
path: '/qr', path: '/questionnaire',
component: Layout, component: Layout,
children: [ children: [
{ {
path: 'index', path: '',
name: 'Qr', name: 'Questionnaire',
component: () => import('@/views/qr/index'), component: () => import('@/views/questionnaire/index'),
meta: { title: '二维码', icon: 'table' } meta: { title: '问卷管理', icon: 'el-icon-tickets' }
}
]
},
{
path: '/subject',
component: Layout,
children: [
{
path: '',
name: 'Subject',
component: () => import('@/views/subject/index'),
meta: { title: '问题管理', icon: 'el-icon-s-help' }
} }
] ]
}, },

@ -12,7 +12,7 @@
<el-input v-model="edit.qrUrl"/> <el-input v-model="edit.qrUrl"/>
</el-col> </el-col>
</el-form-item> </el-form-item>
<el-form-item label="注" prop="tip"> <el-form-item label="注" prop="tip">
<el-col :span="18"> <el-col :span="18">
<el-input v-model="edit.tip"/> <el-input v-model="edit.tip"/>
</el-col> </el-col>

@ -154,7 +154,7 @@ export default {
})() })()
} }
/* ↑ Base */ /* ↑ Base */
// /* todo */ // /*
// let datas = [] // let datas = []
// for (let i = 0; i < 23; i++) { // for (let i = 0; i < 23; i++) {
// datas.push({ id: i, name: 'test-' + i, choose: 'option-' + (i % 5) }) // datas.push({ id: i, name: 'test-' + i, choose: 'option-' + (i % 5) })
@ -243,7 +243,7 @@ export default {
const loading = this.$loading({ const loading = this.$loading({
background: this.$elementGlobal.loadingBackground background: this.$elementGlobal.loadingBackground
}) })
remove(this.multipleSelection.map(e => e.id)).then(r => { //todo remove remove(this.multipleSelection.map(e => e.id)).then(r => {
loading.close() loading.close()
if (r.data) { if (r.data) {
this.$message({ this.$message({

@ -0,0 +1,161 @@
<template>
<el-dialog ref="dialogForm" width="65%" :title="title" :visible.sync="visible"
@close="closeDialog"
>
<el-form label-width="100px" :inline="true" :model="condition" @submit.native.prevent
@keyup.enter.native="handleQueryList"
>
<!-- 查询条件 -->
<el-form-item label="题目类型" prop="type">
<el-select v-model="condition.type" clearable placeholder="请选择题目类型">
<el-option label="单选" :value="0"/>
<el-option label="多选" :value="1"/>
<el-option label="文字" :value="2"/>
</el-select>
</el-form-item>
</el-form>
<!-- 表格 -->
<div ref="tableContainer" class="table-container">
<!-- 表格主体 -->
<el-table ref="listTable" v-loading="selectLoading" :max-height="tableMaxHeight" :data="tableData" border
style="width: 100%" @row-click="handleRowClick" @selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" label="序号" width="60" align="center"/>
<el-table-column property="title" label="标题" width="180" align="center"/>
<el-table-column property="content" label="题目描述" min-width="25%" align="center"/>
<el-table-column property="type" label="题目类型" width="80" align="center">
<template v-slot="scope">
<el-tag v-if="scope.row.type === 0">单选</el-tag>
<el-tag type="success" v-if="scope.row.type === 1">多选</el-tag>
<el-tag type="warning" v-if="scope.row.type === 2">文字</el-tag>
</template>
</el-table-column>
<el-table-column property="useCount" label="已用数" width="80" align="center"/>
</el-table>
<!-- End 表格主体 -->
<!-- 表格页码控件 -->
<div class="pagination-container" v-if="total > 1">
<el-pagination background layout="total, sizes, prev, pager, next,jumper"
:current-page.sync="condition.pageNumber" :page-size.sync="condition.pageSize"
:page-sizes="[6, 10, 20, 30, 50, 100]" :total="total" @size-change="handleQueryList"
@current-change="handleQueryList"
/>
</div>
<!-- End 表格页码控件 -->
</div>
<!-- End 表格 -->
<div slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="handleSave">保存</el-button>
</div>
</el-dialog>
</template>
<script>
import { chooseList } from '@/api/subject'
import { ref } from '@/api/questionnaire'
const default_condition = {
type: null,
pageNumber: 1,
pageSize: 6
}
export default {
name: 'ChooseSubjectDialog',
props: {
row: {
type: Object,
require: true
},
show: {
type: Boolean,
default: () => false
}
},
components: {},
data() {
return {
edit: { id: null },
visible: this.show,
tableData: [],
total: null,
condition: Object.assign({}, default_condition),
multipleSelection: [],
selectLoading: false,
tableMaxHeight: null
}
},
computed: {
title() {
return '选择题目'
}
},
watch: {
visible() {
this.$emit('update:show', false)
}
},
created() {
},
mounted() {
if (this.row !== null) {
this.edit = JSON.parse(JSON.stringify(this.row))
this.condition.qnId = this.edit.id
// console.log(this.edit)
}
this.handleQueryList()
},
methods: {
handleQueryList() {
//
this.selectLoading = true
chooseList(this.condition).then(r => {
this.tableData = r.data.rows
this.total = r.data.total
this.selectLoading = false
this.$nextTick(() => {
this.tableData.filter(e => (e.selected === 1))
.forEach(item => this.$refs.listTable.toggleRowSelection(item))
// console.log('multipleSelection -> ', this.multipleSelection)
})
// console.log('r.data.rows -> ', r.data.rows)
})
},
// [] -
handleRowClick(row) {
this.$refs.listTable.toggleRowSelection(row)
},
handleSelectionChange(val) {
this.multipleSelection = val
},
closeDialog() {
//
},
handleSave() {
let saveData = {
qnId: this.row.id,
subjectIds: this.multipleSelection.map(e => e.id)
}
ref(saveData).then(r => {
if (r.data === true) {
this.visible = false
this.$message({ type: 'success', message: '保存成功!' })
this.$emit('saved')
} else {
this.$message({ type: 'error', message: '保存失败!' })
}
}).catch(r => {
})
}
}
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1,97 @@
<template>
<el-dialog ref="dialogForm" width="45%" :title="title" :visible.sync="visible" @close="closeDialog">
<el-form label-width="25%" ref="edit" :rules="rules" :model="edit">
<el-input v-show="false" v-model="edit.id"/>
<el-form-item label="名称" prop="name">
<el-col :span="18">
<el-input v-model="edit.name"/>
</el-col>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="handleSave">保存</el-button>
</div>
</el-dialog>
</template>
<script>
import { saveOrUpdate } from '@/api/questionnaire'
export default {
name: 'EditDialog',
props: {
row: {
type: Object,
require: true
},
show: {
type: Boolean,
default: () => false
}
},
components: {},
data() {
return {
edit: { id: null },
visible: this.show,
rules: {
name: [{ required: true, message: '请输入', trigger: 'blur' }]
}
}
},
computed: {
title() {
return (this.edit.id === null ? '新增' : '编辑')
}
},
watch: {
visible() {
this.$emit('update:show', false)
}
},
created() {
},
mounted() {
if (this.row !== null) {
this.edit = JSON.parse(JSON.stringify(this.row))
// console.log(this.edit)
}
},
methods: {
closeDialog() {
//
},
handleSave() {
this.$refs.edit.validate(valid => {
if (valid) {
const loading = this.$loading({
background: this.$elementGlobal.loadingBackground
})
saveOrUpdate(this.edit)
.then(r => {
loading.close()
if (r.data === true) {
this.visible = false
this.$message({ type: 'success', message: '保存成功!' })
this.$emit('saved')
} else {
this.$message({ type: 'error', message: '保存失败!' })
}
})
.catch(() => {
loading.close()
})
} else {
return false
}
})
}
}
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1,299 @@
<template>
<div class="app-container full-height">
<!-- 查询条件 -->
<el-card class="filter-container" shadow="never">
<el-form label-width="110px" :inline="true" :model="condition" @submit.native.prevent
@keyup.enter.native="conditionQuery"
>
<!--查询条件-->
<el-form-item label="名称" prop="name">
<el-input v-model="condition.name" placeholder="通过名称查找" clearable/>
</el-form-item>
<!-- <el-form-item label="" prop="">-->
<!-- <el-input v-model="condition." placeholder="请输入" />-->
<!-- </el-form-item>-->
<!--End-->
<el-form-item>
<el-button type="primary" @click="conditionQuery">查询</el-button>
</el-form-item>
<el-form-item>
<el-button @click="handleResetCondition">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 表格操作 -->
<el-card class="table-operate-container" shadow="never">
<el-button size="mini" icon="el-icon-plus" type="primary" plain @click="addRow">添加</el-button>
<el-button :disabled="!hasSelection" type="danger" size="mini" @click="removeBatchRows">批量删除
</el-button>
</el-card>
<!-- 表格 -->
<div ref="tableContainer" class="table-container">
<!-- 表格主体 -->
<el-table ref="listTable" v-loading="selectLoading" :max-height="tableMaxHeight" :data="tableData" border
style="width: 100%" @row-click="handleRowClick" @selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" label="序号" width="60" align="center"/>
<el-table-column property="name" label="名称" min-width="25%" align="center"/>
<el-table-column property="hasSubjectCount" label="已选题目" width="100" align="center">
<template v-slot="scope">
{{ scope.row.hasSubjectCount }}
</template>
</el-table-column>
<el-table-column property="status" label="状态" width="120" align="center">
<template v-slot="scope">
<el-tooltip
v-if="scope.row.id"
:content="formatterStatus(scope.row.status)"
placement="top"
>
<el-switch
v-model="scope.row.status"
:active-value="1"
:inactive-value="0"
@click.stop.native
@change="handleStatusChange(scope.row)"
/>
</el-tooltip>
</template>
</el-table-column>
<!--<el-table-column property="" label="" min-width="25%" align="center" />-->
<!--<el-table-column property="" label="" width="200" align="center" />-->
<el-table-column label="操作" width="250" align="center">
<template v-slot="scope">
<el-button size="mini" @click.stop="handleChooseSubject(scope.row)">选择题目</el-button>
<el-button size="mini" @click.stop="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" plain size="mini" @click.stop="handleRemove(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- End 表格主体 -->
<!-- 表格页码控件 -->
<div class="pagination-container">
<el-pagination background layout="total, sizes, prev, pager, next,jumper"
:current-page.sync="condition.pageNumber" :page-size.sync="condition.pageSize"
:page-sizes="[10, 20, 30, 50, 100]" :total="total" @size-change="conditionQuery"
@current-change="conditionQuery"
/>
</div>
<!-- End 表格页码控件 -->
</div>
<!-- End 表格 -->
<!-- 编辑弹窗 -->
<edit-dialog v-if="showDialog" :row="editRowData" :show.sync="showDialog" :is-add="isAddDialog"
@saved="conditionQuery"
/>
<choose-subject-dialog v-if="chooseSubjectDialog.show" :row="chooseSubjectDialog.row"
:show.sync="chooseSubjectDialog.show" @saved="conditionQuery"
/>
</div>
</template>
<script>
/**
* @version 2.0
*/
/* Base */
import { page, remove, updateStatus } from '@/api/questionnaire'
import EditDialog from '@/views/questionnaire/edit'
import ChooseSubjectDialog from '@/views/questionnaire/chooseSubject'
const default_condition = {
pageNumber: 1,
pageSize: 10
}
/* ↑ Base */
export default {
name: 'Questionnaire',
components: { ChooseSubjectDialog, EditDialog },
data() {
return {
chooseSubjectDialog: { show: false, row: null },
/* Edit Dialog */
editRowData: null,
showDialog: false,
isAddDialog: null,
/* ↑ Edit Dialog */
/* Base */
condition: JSON.parse(JSON.stringify(default_condition)),
tableData: [],
total: null,
selectLoading: false,
tableMaxHeight: null,
multipleSelection: []
/* ↑ Base */
}
},
computed: {
hasSelection() {
return this.multipleSelection.length > 1
}
},
watch: {},
created() {
},
mounted() {
this.conditionQuery()
/* Base */
this.resizeTable()
window.onresize = () => {
return (() => {
this.resizeTable()
})()
}
/* ↑ Base */
},
methods: {
handleChooseSubject(row) {
this.chooseSubjectDialog.show = true
this.chooseSubjectDialog.row = row
},
formatterStatus(status) {
return status === 0 ? '禁用' : '启用'
},
handleStatusChange(row) {
// v-modeld(10)
const status = row.status
// switch
row.status = 1 - parseInt(row.status)
const title = this.formatterStatus(status) + '这个问卷?'
this.$confirm(title, '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({ background: this.$elementGlobal.loadingBackground })
let data = JSON.parse(JSON.stringify(row))
data.status = status
updateStatus(data).then((r) => {
loading.close()
row.status = status // row.statusstatus
this.$message({ type: 'success', message: '修改成功!' })
this.conditionQuery()
})
.catch(() => {
loading.close()
})
})
},
/* Base */
addRow() {
// -
this.isAddDialog = true
this.editRowData = null
this.showDialog = true
},
handleRemove(row) {
// - -
let title = '确定要删除吗? 该操作可能无法恢复!'
this.$confirm(title, '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({
background: this.$elementGlobal.loadingBackground
})
remove([row.id]).then(r => {
loading.close()
if (r.data) {
this.$message({
type: 'success',
message: '操作成功!'
})
} else {
this.$message({
type: 'error',
message: '操作失败!'
})
}
this.conditionQuery()
}).catch(e => {
loading.close()
console.log(e)
})
}).catch(() => {
})
},
removeBatchRows() {
// -
const h = this.$createElement
this.$confirm(h('p', null, [
h('p', null, '确定要删除 ' + this.multipleSelection.length + ' 个吗?'),
h('p', { style: 'color: #f80' }, ' 该操作可能无法恢复!')
]), '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({
background: this.$elementGlobal.loadingBackground
})
remove(this.multipleSelection.map(e => e.id)).then(r => {
loading.close()
if (r.data) {
this.$message({
type: 'success',
message: '操作成功!'
})
} else {
this.$message({
type: 'error',
message: '操作失败!'
})
}
this.conditionQuery()
}).catch(e => {
loading.close()
console.log(e)
})
}).catch(() => {
})
},
// -
handleEdit(row) {
this.isAddDialog = false
this.showDialog = true
this.editRowData = row
},
// -
conditionQuery() {
this.selectLoading = true
page(this.condition).then(r => {
this.selectLoading = false
this.tableData = r.data.rows
this.total = r.data.total
// console.log('r.data -> ', r.data)
}).catch(e => {
this.selectLoading = false
console.log('query error -> ', e)
})
},
resizeTable() {
this.tableMaxHeight = window.innerHeight - (this.$refs.tableContainer.offsetTop + 100)
},
//
handleResetCondition() {
this.condition = Object.assign({}, default_condition)
},
// [] -
handleRowClick(row) {
this.$refs.listTable.toggleRowSelection(row)
},
handleSelectionChange(val) {
this.multipleSelection = val
}
/* ↑ Base */
}
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1,182 @@
<template>
<el-dialog ref="dialogForm" width="65%" :title="title" :visible.sync="visible" @close="closeDialog">
<el-form label-width="20%" ref="edit" :rules="rules" :model="edit">
<el-input v-show="false" v-model="edit.id"/>
<el-row>
<el-col :span="10" :offset="2" label-width="30%">
<el-form-item label="标题" prop="title">
<el-input v-model="edit.title"/>
</el-form-item>
</el-col>
<el-col :span="7" :offset="1">
<el-form-item label="排序" prop="sort" label-width="30%">
<el-input v-model="edit.sort"/>
</el-form-item>
</el-col>
</el-row>
<el-form-item label="题目描述" prop="content">
<el-col :span="19">
<el-input v-model="edit.content"/>
</el-col>
</el-form-item>
<el-form-item label="题目类型" prop="type">
<el-col :span="18" :offset="1">
<el-radio-group v-model="edit.type">
<el-radio :label="0">单选</el-radio>
<el-radio :label="1">多选</el-radio>
<el-radio :label="2">文字</el-radio>
</el-radio-group>
</el-col>
</el-form-item>
</el-form>
<el-card shadow="always" :body-style="{ padding: '5px' }" v-if="edit.type<2">
<div slot="header">
<div v-for="editItem in edit.items" :key="editItem.itemId">
<el-card shadow="hover" :body-style="{ padding: '20px 10px 0px 10px' }">
<el-form label-width="25%" size="mini">
<el-row>
<el-col :span="9">
<el-form-item label="选项描述">
<el-input v-model="editItem.content"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="分值" label-width="45%">
<el-input v-model="editItem.points"/>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="权重" label-width="45%">
<el-input v-model="editItem.weights"/>
</el-form-item>
</el-col>
<el-col :span="5">
<el-form-item label="正确答案" label-width="50%">
<el-radio-group v-model="editItem.isRight">
<el-radio-button label="1"></el-radio-button>
<el-radio-button label="0"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="2" style="text-align: center">
<el-popconfirm title="删除这个选项" hide-icon @confirm="handleRemoveItem(editItem)" placement="top">
<el-button slot="reference" round circle icon="el-icon-close" size="mini"/>
</el-popconfirm>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</div>
<el-col :offset="1">
<el-button class="el-icon-plus" type="text" @click="handleAddItem">添加一个选项</el-button>
</el-col>
</el-card>
<div slot="footer" class="dialog-footer">
<el-button @click="visible = false">取消</el-button>
<el-button type="primary" @click="handleSave">保存</el-button>
</div>
</el-dialog>
</template>
<script>
import { items, saveOrUpdate } from '@/api/subject'
export default {
name: 'EditDialog',
props: {
row: {
type: Object,
require: true
},
show: {
type: Boolean,
default: () => false
}
},
components: {},
data() {
return {
edit: { id: null },
visible: this.show,
rules: {
title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
content: [{ required: true, message: '请输入题目描述', trigger: 'blur' }],
type: [{ required: true, message: '请选择题目类型' }]
}
}
},
computed: {
title() {
return (this.edit.id === null ? '新增' : '编辑')
}
},
watch: {
visible() {
this.$emit('update:show', false)
}
},
created() {
},
mounted() {
if (this.row !== null) {
this.edit = JSON.parse(JSON.stringify(this.row))
// console.log(this.edit)
}
items({ id: this.row.id }).then(r => {
this.edit.items = r.data.items
console.log('edit.items -> ', this.edit.items)
})
},
methods: {
handleRemoveItem(i) {
this.edit.items = this.edit.items.filter(e => e !== i)
},
handleAddItem() {
this.edit.items.push({ isRight: 0 })
// console.log('edit -> ', this.edit)
},
closeDialog() {
//
},
handleSave() {
this.$refs.edit.validate(valid => {
if (valid) {
const loading = this.$loading({
background: this.$elementGlobal.loadingBackground
})
//
this.edit.items = this.edit.items.filter(e => {
let empty = true
for (let key in e) {
if (key !== 'isRight' && e[key] != null) empty = false
}
return empty
})
saveOrUpdate(this.edit)
.then(r => {
loading.close()
if (r.data === true) {
this.visible = false
this.$message({ type: 'success', message: '保存成功!' })
this.$emit('saved')
} else {
this.$message({ type: 'error', message: '保存失败!' })
}
})
.catch(() => {
loading.close()
})
} else {
return false
}
})
}
}
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1,255 @@
<template>
<div class="app-container full-height">
<!-- 查询条件 -->
<el-card class="filter-container" shadow="never">
<el-form label-width="100px" :inline="true" :model="condition" @submit.native.prevent
@keyup.enter.native="conditionQuery"
>
<!--查询条件-->
<el-form-item label="标题" prop="title">
<el-input v-model="condition.title" placeholder="根据标题查找" clearable/>
</el-form-item>
<el-form-item label="题目类型" prop="type">
<el-select v-model="condition.type" clearable placeholder="请选择题目类型">
<el-option label="单选" :value="0"/>
<el-option label="多选" :value="1"/>
<el-option label="文字" :value="2"/>
</el-select>
</el-form-item>
<!-- <el-form-item label="" prop="">-->
<!-- <el-input v-model="condition." placeholder="请输入" />-->
<!-- </el-form-item>-->
<!--End-->
<el-form-item>
<el-button type="primary" @click="conditionQuery">查询</el-button>
</el-form-item>
<el-form-item>
<el-button @click="handleResetCondition">重置</el-button>
</el-form-item>
</el-form>
</el-card>
<!-- 表格操作 -->
<el-card class="table-operate-container" shadow="never">
<el-button size="mini" icon="el-icon-plus" type="primary" plain @click="addRow">添加</el-button>
<el-button :disabled="!hasSelection" type="danger" size="mini" @click="removeBatchRows">批量删除
</el-button>
</el-card>
<!-- 表格 -->
<div ref="tableContainer" class="table-container">
<!-- 表格主体 -->
<el-table ref="listTable" v-loading="selectLoading" :max-height="tableMaxHeight" :data="tableData" border
style="width: 100%" @row-click="handleRowClick" @selection-change="handleSelectionChange"
>
<el-table-column type="selection" width="40" align="center"/>
<el-table-column type="index" label="序号" width="60" align="center"/>
<el-table-column property="title" label="标题" width="180" align="center"/>
<el-table-column property="content" label="内容" min-width="25%" align="center"/>
<el-table-column property="type" label="类型" width="70" align="center">
<template v-slot="scope">
<el-tag v-if="scope.row.type === 0">单选</el-tag>
<el-tag type="success" v-if="scope.row.type === 1">多选</el-tag>
<el-tag type="warning" v-if="scope.row.type === 2">文字</el-tag>
</template>
</el-table-column>
<el-table-column property="sort" label="排列" width="70" align="center"/>
<!--<el-table-column property="" label="" min-width="25%" align="center" />-->
<!--<el-table-column property="" label="" width="200" align="center" />-->
<el-table-column label="操作" width="200" align="center">
<template slot-scope="scope">
<el-button size="mini" @click.stop="handleEdit(scope.row)">编辑</el-button>
<el-button type="danger" plain size="mini" @click.stop="handleRemove(scope.row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<!-- End 表格主体 -->
<!-- 表格页码控件 -->
<div class="pagination-container">
<el-pagination background layout="total, sizes, prev, pager, next,jumper"
:current-page.sync="condition.pageNumber" :page-size.sync="condition.pageSize"
:page-sizes="[10, 20, 30, 50, 100]" :total="total" @size-change="conditionQuery"
@current-change="conditionQuery"
/>
</div>
<!-- End 表格页码控件 -->
</div>
<!-- End 表格 -->
<!-- 编辑弹窗 -->
<edit-dialog v-if="showDialog" :row="editRowData" :show.sync="showDialog" :is-add="isAddDialog"
@saved="conditionQuery"
/>
</div>
</template>
<script>
/**
* @version 2.0
*/
/* Base */
import { page, remove } from '@/api/subject'
import EditDialog from '@/views/subject/edit'
const default_condition = {
pageNumber: 1,
pageSize: 10
}
/* ↑ Base */
export default {
name: 'Subject',
components: { EditDialog },
data() {
return {
/* Edit Dialog */
editRowData: null,
showDialog: false,
isAddDialog: null,
/* ↑ Edit Dialog */
/* Base */
condition: JSON.parse(JSON.stringify(default_condition)),
tableData: [],
total: null,
selectLoading: false,
tableMaxHeight: null,
multipleSelection: []
/* ↑ Base */
}
},
computed: {
hasSelection() {
return this.multipleSelection.length > 1
}
},
watch: {},
created() {
},
mounted() {
/* Base */
this.resizeTable()
window.onresize = () => {
return (() => {
this.resizeTable()
})()
}
/* ↑ Base */
this.conditionQuery()
},
methods: {
/* Base */
addRow() {
// -
this.isAddDialog = true
this.editRowData = null
this.showDialog = true
},
handleRemove(row) {
// - -
let title = '确定要删除吗? 该操作可能无法恢复!'
this.$confirm(title, '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({
background: this.$elementGlobal.loadingBackground
})
remove([row.id]).then(r => { //todo remove
loading.close()
if (r.data) {
this.$message({
type: 'success',
message: '操作成功!'
})
} else {
this.$message({
type: 'error',
message: '操作失败!'
})
}
this.conditionQuery()
}).catch(e => {
loading.close()
console.log(e)
})
}).catch(() => {
})
},
removeBatchRows() {
// -
const h = this.$createElement
this.$confirm(h('p', null, [
h('p', null, '确定要删除 ' + this.multipleSelection.length + ' 个吗?'),
h('p', { style: 'color: #f80' }, ' 该操作可能无法恢复!')
]), '提示', {
type: 'warning'
}).then(() => {
const loading = this.$loading({
background: this.$elementGlobal.loadingBackground
})
remove(this.multipleSelection.map(e => e.id)).then(r => { //todo remove
loading.close()
if (r.data) {
this.$message({
type: 'success',
message: '操作成功!'
})
} else {
this.$message({
type: 'error',
message: '操作失败!'
})
}
this.conditionQuery()
}).catch(e => {
loading.close()
console.log(e)
})
}).catch(() => {
})
},
// -
handleEdit(row) {
this.isAddDialog = false
this.showDialog = true
this.editRowData = row
},
// -
conditionQuery() {
this.selectLoading = true
page(this.condition).then(r => {
this.selectLoading = false
this.tableData = r.data.rows
this.total = r.data.total
}).catch(e => {
this.selectLoading = false
console.log('query error -> ', e)
})
},
resizeTable() {
this.tableMaxHeight = window.innerHeight - (this.$refs.tableContainer.offsetTop + 100)
},
//
handleResetCondition() {
this.condition = Object.assign({}, default_condition)
},
// [] -
handleRowClick(row) {
this.$refs.listTable.toggleRowSelection(row)
},
handleSelectionChange(val) {
this.multipleSelection = val
}
/* ↑ Base */
}
}
</script>
<style scoped lang="scss">
</style>
Loading…
Cancel
Save