32 changed files with 1506 additions and 1154 deletions
-
1package.json
-
27src/api/bookBasice/index.js
-
18src/assets/styles/archives-manage.scss
-
1src/assets/styles/index.scss
-
59src/assets/styles/manage.scss
-
26src/assets/styles/yxk-admin.scss
-
12src/router/routers.js
-
31src/utils/index.js
-
425src/views/system/dict/index2.vue
-
144src/views/system/group/index.vue
-
1src/views/system/log/search.vue
-
11src/views/system/menu/index.vue
-
17src/views/system/notify/index.vue
-
143src/views/system/role/index.vue
-
234src/views/system/user/cart.vue
-
13src/views/system/user/center.vue
-
102src/views/system/user/index.vue
-
372src/views/visualCheck/bookstore/book/index.vue
-
506src/views/visualCheck/bookstore/collection/index.vue
-
230src/views/visualCheck/bookstore/collectionLocation/index.vue
-
16src/views/visualCheck/checkManage/bookSearch/index.vue
-
16src/views/visualCheck/checkManage/bookshelfSearch/index.vue
-
16src/views/visualCheck/checkManage/checkLog/index.vue
-
16src/views/visualCheck/checkManage/checkPlan/index.vue
-
16src/views/visualCheck/checkManage/dataScreening/index.vue
-
2src/views/visualCheck/checkManage/index.vue
-
16src/views/visualCheck/checkManage/statistic/index.vue
-
1src/views/visualCheck/venueDevice/area/index.vue
-
1src/views/visualCheck/venueDevice/bookshelf/index.vue
-
1src/views/visualCheck/venueDevice/device/index.vue
-
170src/views/visualCheck/venueDevice/floor/index.vue
-
16src/views/visualCheck/venueDevice/index.vue
@ -0,0 +1,27 @@ |
|||
import request from '@/utils/request' |
|||
|
|||
export function add(data) { |
|||
return request({ |
|||
url: 'api/bookBasice/editCollectionLocation', |
|||
method: 'post', |
|||
data |
|||
}) |
|||
} |
|||
|
|||
export function edit(data) { |
|||
return request({ |
|||
url: 'api/bookBasice/editCollectionLocation', |
|||
method: 'post', |
|||
data |
|||
}) |
|||
} |
|||
|
|||
export function del(ids) { |
|||
return request({ |
|||
url: 'api/bookBasice/delCollectionLocation', |
|||
method: 'post', |
|||
data: ids |
|||
}) |
|||
} |
|||
|
|||
export default { add, edit, del } |
@ -0,0 +1,59 @@ |
|||
@import 'variables'; |
|||
@import 'mixin'; |
|||
|
|||
.venue-container{ |
|||
display: flex; |
|||
justify-content: space-between; |
|||
} |
|||
|
|||
.venue-left{ |
|||
width: calc(100% / 2); |
|||
margin-right: 20px; |
|||
@include bg_color; |
|||
@include box_padding; |
|||
.head-container{ |
|||
margin-bottom: 20px; |
|||
.crud-opts{ |
|||
justify-content: center; |
|||
} |
|||
} |
|||
.container-left{ |
|||
@include tree_height_min; |
|||
} |
|||
} |
|||
.venue-right{ |
|||
flex: 1; |
|||
@include bg_color; |
|||
@include box_padding; |
|||
.head-container{ |
|||
margin-bottom: 20px; |
|||
} |
|||
.container-right{ |
|||
@include table_height_min; |
|||
&.tab-content{ |
|||
@include tab_height_min; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.venue-container{ |
|||
.tab-content{ |
|||
position: relative; |
|||
@include row_tab_style; |
|||
.tab-nav{ |
|||
margin-bottom: 0; |
|||
} |
|||
} |
|||
} |
|||
|
|||
|
|||
.venue-preview{ |
|||
width: 100%; |
|||
height: 690px; |
|||
margin-top: 20px; |
|||
overflow: hidden; |
|||
img{ |
|||
display: block; |
|||
width: 100%; |
|||
} |
|||
} |
@ -1,425 +0,0 @@ |
|||
<template> |
|||
<div class="app-container row-container"> |
|||
<!--工具栏--> |
|||
<div class="head-container"> |
|||
<div class="head-search"> |
|||
<!-- 搜索 --> |
|||
<el-input v-model="query.blurry" clearable size="small" placeholder="输入字典名称或字典代码搜索" prefix-icon="el-icon-search" style="width: 240px;" class="filter-item" @keyup.enter.native="crud.toQuery" /> |
|||
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="crud.toQuery">搜索</el-button> |
|||
<el-button v-if="crud.optShow.reset" class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery()">重置</el-button> |
|||
</div> |
|||
<crudOperation :permission="permission"> |
|||
<template v-slot:middle> |
|||
<el-button slot="reference" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)"> |
|||
<i class="iconfont icon-shanchu" /> |
|||
删除 |
|||
</el-button> |
|||
</template> |
|||
<template v-slot:right> |
|||
<el-button :loading="crud.downloadLoading" size="mini" :disabled="crud.selections.length === 0" @click="doExport(crud.selections)"> |
|||
<i class="iconfont icon-daochu" /> |
|||
导出 |
|||
</el-button> |
|||
</template> |
|||
</crudOperation> |
|||
</div> |
|||
<!--表单组件--> |
|||
<el-dialog append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title"> |
|||
<div class="setting-dialog"> |
|||
<el-form ref="form" inline :model="form" :rules="rules" size="small" label-width="90px"> |
|||
<el-form-item label="字典名称" prop="dictionaryName"> |
|||
<el-input v-model="form.dictionaryName" /> |
|||
</el-form-item> |
|||
<el-form-item label="字典代码" prop="dictionaryCode"> |
|||
<el-input v-model="form.dictionaryCode" /> |
|||
</el-form-item> |
|||
<el-form-item label="顶级节点" prop="isTop"> |
|||
<el-radio-group v-model="form.isTop" @input="changeIsTop"> |
|||
<el-radio label="1">是</el-radio> |
|||
<el-radio label="0">否</el-radio> |
|||
</el-radio-group> |
|||
</el-form-item> |
|||
<el-form-item label="排序" prop="dictionaryOrder"> |
|||
<el-input-number |
|||
v-model.number="form.dictionaryOrder" |
|||
:min="0" |
|||
:max="999" |
|||
controls-position="right" |
|||
/> |
|||
</el-form-item> |
|||
<el-row> |
|||
<el-form-item v-if="form.isTop === '0'" label="上级节点" prop="dictionaryParents"> |
|||
<treeselect |
|||
v-model="form.dictionaryParents" |
|||
style="width: 584px;" |
|||
:load-options="loadDicts" |
|||
:options="dicts" |
|||
:normalizer="normalizer" |
|||
placeholder="选择上级节点" |
|||
> |
|||
<div slot="value-label" slot-scope="{ node }">{{ getAutoNameUnknown(node.label) }}</div> |
|||
</treeselect> |
|||
</el-form-item> |
|||
</el-row> |
|||
<el-form-item label="内容说明" prop="dictionaryRemarks"> |
|||
<el-input v-model="form.dictionaryRemarks" type="textarea" :rows="4" style="width: 584px;" /> |
|||
</el-form-item> |
|||
</el-form> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="text" @click="crud.cancelCU">取消</el-button> |
|||
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> |
|||
</div> |
|||
</div> |
|||
</el-dialog> |
|||
<!-- <el-dialog title="删除字典内容" :visible.sync="deleteVisible" :before-close="handleClose"> |
|||
<span class="dialog-right-top" /> |
|||
<span class="dialog-left-bottom" /> |
|||
<div class="setting-dialog"> |
|||
<div class="dialog-delt"> |
|||
<p><span>确定删除当前字典内容吗?</span></p> |
|||
</div> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="primary" @click.native="handleConfirm">确定</el-button> |
|||
</div> |
|||
</div> |
|||
</el-dialog> --> |
|||
<div class="container-wrap"> |
|||
<span class="right-top-line" /> |
|||
<span class="left-bottom-line" /> |
|||
<!--表格渲染--> |
|||
<!-- @selection-change="selectionChangeHandler" |
|||
@row-click="clickRowHandler" --> |
|||
<!-- height="calc(100vh - 232px)" --> |
|||
<el-table |
|||
ref="table" |
|||
v-loading="crud.loading" |
|||
lazy |
|||
:load="getDictsDatas" |
|||
:data="tableData" |
|||
:tree-props="{children: 'children', hasChildren: 'hasChildren'}" |
|||
:row-key="getRowKey" |
|||
style="width: 100%;" |
|||
@select-all="selectAll" |
|||
@select="selectTr" |
|||
@selection-change="crud.selectionChangeHandler" |
|||
@row-click="clickRowHandler" |
|||
> |
|||
<el-table-column type="selection" align="center" width="55" /> |
|||
<el-table-column prop="dictionaryName" label="字典名称" /> |
|||
<el-table-column prop="dictionaryCode" label="字典代码" /> |
|||
<el-table-column prop="dictionaryRemarks" label="内容说明" /> |
|||
<el-table-column prop="dictionaryOrder" label="排序" /> |
|||
<el-table-column prop="createTime" label="创建日期" width="200px"> |
|||
<template slot-scope="scope"> |
|||
<div>{{ scope.row.createTime | parseTime }}</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--分页组件--> |
|||
<pagination v-if="crud.data.length!==0" /> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import crudDict from '@/api/system/dict' |
|||
import CRUD, { presenter, header, form } from '@crud/crud' |
|||
import crudOperation from '@crud/CRUD.operation' |
|||
import pagination from '@crud/Pagination' |
|||
import Treeselect from '@riophae/vue-treeselect' |
|||
import '@riophae/vue-treeselect/dist/vue-treeselect.css' |
|||
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' |
|||
import { mapGetters } from 'vuex' |
|||
import { exportFile } from '@/utils/index' |
|||
import qs from 'qs' |
|||
|
|||
const defaultForm = { id: null, dictionaryName: null, isTop: '1', dictionaryCode: null, dictionaryOrder: 999, dictionaryRemarks: null, dictionaryParents: null } |
|||
|
|||
export default { |
|||
name: 'Dicts', |
|||
components: { crudOperation, Treeselect, pagination }, |
|||
cruds() { |
|||
return [ |
|||
CRUD({ |
|||
title: '字典', idField: 'dictionaryId || id', url: 'api/dictionary/initDictionaryList', |
|||
crudMethod: { ...crudDict }, |
|||
sort: [], |
|||
optShow: { |
|||
add: true, |
|||
edit: true, |
|||
del: false, |
|||
reset: true, |
|||
download: false, |
|||
group: false |
|||
}}) |
|||
] |
|||
}, |
|||
mixins: [ |
|||
presenter(), |
|||
header(), |
|||
form(function() { |
|||
return Object.assign({ dictionaryParents: this.dictionaryParents }, defaultForm) |
|||
}) |
|||
], |
|||
props: { |
|||
activeAddBtn: { |
|||
type: Boolean |
|||
} |
|||
}, |
|||
data() { |
|||
return { |
|||
dicts: [], |
|||
dictionaryParents: null, |
|||
rules: { |
|||
dictionaryName: [ |
|||
{ required: true, message: '请输入字典名称', trigger: 'blur' } |
|||
], |
|||
dictionaryCode: [ |
|||
{ required: true, message: '请输入字典代码', trigger: 'blur' } |
|||
], |
|||
isTop: [ |
|||
{ required: true, message: '请选择是否为顶级节点', trigger: 'change' } |
|||
], |
|||
dictionaryOrder: [ |
|||
{ required: true, message: '请输入序号', trigger: 'blur', type: 'number' } |
|||
] |
|||
}, |
|||
permission: { |
|||
add: ['admin', 'dict:add'], |
|||
edit: ['admin', 'dict:edit'], |
|||
del: ['admin', 'dict:del'] |
|||
}, |
|||
deleteVisible: false, |
|||
deleteData: {}, |
|||
isAllSelect: false |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapGetters([ |
|||
'baseApi' |
|||
]) |
|||
}, |
|||
mounted() { |
|||
}, |
|||
methods: { |
|||
// 处理vue-treeSelect回显出现unknown问题 |
|||
getAutoNameUnknown(name) { |
|||
if (name.lastIndexOf('unknown') > -1) { |
|||
return name.split('(')[0] |
|||
} else { |
|||
return name |
|||
} |
|||
}, |
|||
getRowKey(row) { |
|||
return row.dictionaryId |
|||
}, |
|||
resetQuery() { |
|||
this.crud.query.blurry = '' |
|||
this.crud.toQuery() |
|||
}, |
|||
// 新增与编辑前做的操作 |
|||
[CRUD.HOOK.afterToCU](crud, form) { |
|||
if (form.dictionaryParents !== null) { |
|||
form.isTop = '0' |
|||
} else if (form.dictionaryId !== null) { |
|||
form.isTop = '1' |
|||
} |
|||
this.getDictsTreeList() |
|||
}, |
|||
// 获取数据前设置默认参数 |
|||
[CRUD.HOOK.beforeRefresh]() { |
|||
this.tableData = [] |
|||
}, |
|||
[CRUD.HOOK.afterRefresh](crud) { |
|||
crud.data.forEach(function(item, index) { |
|||
if (item.sonNum !== 0) { |
|||
item.hasChildren = true |
|||
} else { |
|||
item.hasChildren = false |
|||
} |
|||
if (!item.hasChildren) { |
|||
item.children = null |
|||
} |
|||
}) |
|||
this.tableData = this.crud.data |
|||
console.log('this.tableData0', this.tableData) |
|||
}, |
|||
// 编辑前 |
|||
[CRUD.HOOK.beforeToEdit](crud, form) { |
|||
crud.form.id = form.dictionaryId |
|||
}, |
|||
// 提交前的验证 |
|||
[CRUD.HOOK.afterValidateCU](crud) { |
|||
if (crud.form.isTop === '1') { |
|||
crud.form.dictionaryParents = null |
|||
} |
|||
delete crud.form.isTop |
|||
console.log(crud.form) |
|||
return true |
|||
}, |
|||
changeIsTop(val) { |
|||
if (val === '0') { |
|||
this.getDictsTreeList() |
|||
} |
|||
}, |
|||
selectAll() { |
|||
this.isAllSelect = !this.isAllSelect |
|||
const data = this.tableData |
|||
this.toggleSelect(data, this.isAllSelect, 'all') |
|||
console.log('selectAll', data) |
|||
}, |
|||
// 选择某行 |
|||
selectTr(selection, row) { |
|||
this.$set(row, 'isChecked', !row.isChecked) |
|||
this.$nextTick(() => { |
|||
this.isAllSelect = row.isChecked |
|||
this.toggleSelect(row, row.isChecked, 'tr') |
|||
}) |
|||
}, |
|||
// 递归子级 |
|||
toggleSelect(data, flag, type) { |
|||
console.log('data.children', data.children) |
|||
if (type === 'all') { |
|||
if (data.length > 0) { |
|||
data.forEach((item) => { |
|||
this.toggleSelection(item, flag) |
|||
if (item.children && item.children.length > 0) { |
|||
this.toggleSelect(item.children, flag, type) |
|||
} |
|||
}) |
|||
} |
|||
} else { |
|||
if (data.children && data.children.length > 0) { |
|||
data.children.forEach((item) => { |
|||
item.isChecked = flag |
|||
this.$refs.table.toggleRowSelection(item, flag) |
|||
this.toggleSelect(item, flag, type) |
|||
}) |
|||
} |
|||
} |
|||
}, |
|||
// 改变选中 |
|||
toggleSelection(row, flag) { |
|||
this.$set(row, 'isChecked', flag) |
|||
this.$nextTick(() => { |
|||
if (flag) { |
|||
this.$refs.table.toggleRowSelection(row, flag) |
|||
} else { |
|||
this.$refs.table.clearSelection() |
|||
} |
|||
}) |
|||
}, |
|||
clickRowHandler(row) { |
|||
this.$refs.table.clearSelection() |
|||
this.$refs.table.toggleRowSelection(row) |
|||
}, |
|||
getDictsDatas(tree, treeNode, resolve) { |
|||
setTimeout(() => { |
|||
console.log(treeNode) |
|||
crudDict.FetchSonDictionaryList({ pid: tree.dictionaryId }).then(res => { |
|||
const data = res.map(function(obj) { |
|||
if (obj.sonNum !== 0) { |
|||
obj.hasChildren = true |
|||
obj.children = null |
|||
} else { |
|||
obj.hasChildren = false |
|||
} |
|||
return obj |
|||
}) |
|||
resolve(data) |
|||
}) |
|||
}, 100) |
|||
}, |
|||
getDictsTreeList() { |
|||
crudDict.FetchDictionaryTree().then(res => { |
|||
this.dicts = res.map(function(obj) { |
|||
if (obj.sonNum !== 0) { |
|||
obj.hasChildren = true |
|||
} else { |
|||
obj.hasChildren = false |
|||
} |
|||
if (obj.hasChildren) { |
|||
obj.children = null |
|||
} |
|||
return obj |
|||
}) |
|||
this.crud.loading = false |
|||
}) |
|||
}, |
|||
// 获取弹窗内字典数据 |
|||
loadDicts({ action, parentNode, callback }) { |
|||
if (action === LOAD_CHILDREN_OPTIONS) { |
|||
crudDict.FetchDictionaryTree().then(res => { |
|||
parentNode.children = res.map(function(obj) { |
|||
if (obj.children) { |
|||
obj.childMenus = null |
|||
} |
|||
return obj |
|||
}) |
|||
setTimeout(() => { |
|||
callback() |
|||
}, 100) |
|||
}) |
|||
} |
|||
}, |
|||
toDelete(datas) { |
|||
this.deleteData = datas |
|||
this.$confirm('此操作将删除当前所选' + this.crud.title + '<span>你是否还要继续?</span>', '提示', { |
|||
confirmButtonText: '继续', |
|||
cancelButtonText: '取消', |
|||
type: 'warning', |
|||
dangerouslyUseHTMLString: true |
|||
}).then(() => { |
|||
this.crud.delAllLoading = true |
|||
const dictionaryIds = [] |
|||
this.deleteData.forEach(val => { |
|||
dictionaryIds.push(val.dictionaryId) |
|||
}) |
|||
crudDict.del(dictionaryIds).then(() => { |
|||
this.$message({ message: '删除成功', type: 'success', offset: 8 }) |
|||
this.crud.delAllLoading = false |
|||
this.crud.refresh() |
|||
}).catch(err => { |
|||
this.crud.delAllLoading = false |
|||
console.log(err) |
|||
}) |
|||
}).catch(() => { |
|||
}) |
|||
}, |
|||
doExport(data) { |
|||
console.log(data) |
|||
this.crud.downloadLoading = true |
|||
this.$confirm('此操作将导出所选数据' + '<span>你是否还要继续?</span>', '提示', { |
|||
confirmButtonText: '继续', |
|||
cancelButtonText: '取消', |
|||
type: 'warning', |
|||
dangerouslyUseHTMLString: true |
|||
}).then(() => { |
|||
const ids = [] |
|||
data.forEach(val => { |
|||
ids.push(val.dictionaryId) |
|||
}) |
|||
const params = { |
|||
'dictionaryIds': ids |
|||
} |
|||
exportFile(this.baseApi + '/api/dictionary/download?' + qs.stringify(params, { indices: false })) |
|||
this.crud.downloadLoading = false |
|||
}).catch(() => { |
|||
}) |
|||
}, |
|||
normalizer(node) { |
|||
if (node.childDictionarys == null || node.childDictionarys === 'null') { |
|||
delete node.childDictionarys |
|||
} |
|||
return { |
|||
id: node.id, |
|||
label: node.dictionaryName, |
|||
children: node.childDictionarys |
|||
} |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
</style> |
@ -1,234 +0,0 @@ |
|||
<template> |
|||
<div class="app-container tab-container" style="height: calc(100vh - 140px);"> |
|||
<div class="head-container" style="display: flex; justify-content: space-between; align-items: center; padding-bottom: 20px;"> |
|||
<div class="head-search" style="margin-bottom: 0;"> |
|||
<el-input |
|||
v-model="keyWord" |
|||
size="small" |
|||
clearable |
|||
placeholder="输入关键字可模糊检索" |
|||
style="width: 245px;" |
|||
class="filter-item" |
|||
@clear="crud.toQuery" |
|||
@keyup.enter.native="crud.toQuery" |
|||
/> |
|||
<el-button class="filter-item filter-search" size="mini" type="success" icon="el-icon-search" @click="crud.toQuery">搜索</el-button> |
|||
<el-button class="filter-item filter-refresh" size="mini" type="warning" icon="el-icon-refresh-left" @click="resetQuery()">重置</el-button> |
|||
</div> |
|||
<crudOperation> |
|||
<template v-slot:right> |
|||
<el-button size="mini" :disabled="crud.selections.length === 0" @click="handleLend(crud.selections)"> |
|||
<i class="iconfont icon-shengchengpandiandan" /> |
|||
利用 |
|||
</el-button> |
|||
<el-button size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)"> |
|||
<i class="iconfont icon-shanchu" /> |
|||
删除 |
|||
</el-button> |
|||
</template> |
|||
</crudOperation> |
|||
</div> |
|||
<el-table |
|||
ref="table" |
|||
v-loading="crud.loading" |
|||
class="archives-table" |
|||
:data="crud.data" |
|||
row-key="id" |
|||
style="width: 100%;" |
|||
height="calc(100vh - 266px)" |
|||
@row-click="clickRowHandler" |
|||
@cell-dblclick="tableDoubleClick" |
|||
@selection-change="crud.selectionChangeHandler" |
|||
> |
|||
<el-table-column type="selection" :reserve-selection="true" width="55" align="center" /> |
|||
<el-table-column prop="maintitle" label="题名" /> |
|||
<el-table-column prop="archiveNo" label="档号" min-width="200" /> |
|||
<el-table-column prop="categoryName" label="门类" align="center" /> |
|||
<el-table-column prop="archivesClassName" label="分类" align="center" /> |
|||
<el-table-column prop="categoryLevel" label="层级" align="center"> |
|||
<template slot-scope="scope"> |
|||
<div>{{ scope.row.categoryLevel === 3 ? '文件' : '其他' }}</div> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="processStatus" label="审批锁定" align="center"> |
|||
<template slot-scope="scope"> |
|||
<span :class="['row-state', 'row-warehousing', scope.row.processStatus !== 1 ? 'state-active' : '' ]">{{ processedStatusText(scope.row.processStatus) }}</span> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="createTime" label="加入时间" width="200"> |
|||
<template slot-scope="scope"> |
|||
<div>{{ scope.row.createTime | parseTime }}</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<pagination v-if="crud.data.length !== 0" /> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import CRUD, { presenter, crud } from '@crud/crud' |
|||
import pagination from '@crud/Pagination' |
|||
import crudOperation from '@crud/CRUD.operation' |
|||
// import { FetchDelBorrowCar } from '@/api/archiveUtilize/cart' |
|||
import { mapGetters } from 'vuex' |
|||
// import store from '@/store' |
|||
export default { |
|||
name: 'Cart', |
|||
components: { pagination, crudOperation }, |
|||
mixins: [presenter(), crud()], |
|||
cruds() { |
|||
return CRUD({ |
|||
url: 'api/archivesUtilize/initborrowCar', |
|||
title: '借阅车', |
|||
crudMethod: { }, |
|||
optShow: { |
|||
add: false, |
|||
edit: false, |
|||
del: false, |
|||
download: false, |
|||
reset: false, |
|||
group: false |
|||
} |
|||
}) |
|||
}, |
|||
data() { |
|||
return { |
|||
isTitleType: 3, |
|||
keyWord: null, |
|||
categoryId: null, |
|||
arcId: '' |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapGetters([ |
|||
'user', |
|||
'baseApi' |
|||
]), |
|||
processedStatusText() { |
|||
return function(status) { |
|||
let text = '' |
|||
if (status === 1) { |
|||
text = '空闲' |
|||
} else if (status === 2) { |
|||
text = '退回' |
|||
} else if (status === 3) { |
|||
text = '开放' |
|||
} else if (status === 4) { |
|||
text = '销毁' |
|||
} else if (status === 5) { |
|||
text = '利用' |
|||
} else if (status === 6) { |
|||
text = '内部移交' |
|||
} else if (status === 7) { |
|||
text = '外部移交' |
|||
} |
|||
return text |
|||
} |
|||
} |
|||
}, |
|||
watch: { |
|||
}, |
|||
created() { |
|||
}, |
|||
methods: { |
|||
resetQuery() { |
|||
this.keyWord = null |
|||
this.crud.toQuery() |
|||
}, |
|||
[CRUD.HOOK.beforeRefresh]() { |
|||
this.crud.query.search = this.keyWord |
|||
}, |
|||
toDelete(data) { |
|||
console.log(data) |
|||
this.$confirm('此操作将删除所选数据' + '<span>你是否还要继续?</span>', '提示', { |
|||
confirmButtonText: '继续', |
|||
cancelButtonText: '取消', |
|||
type: 'warning', |
|||
dangerouslyUseHTMLString: true |
|||
}).then(() => { |
|||
// const ids = data.map(item => { |
|||
// return item.archivesId |
|||
// }) |
|||
// const params = { |
|||
// 'ids': ids |
|||
// } |
|||
// FetchDelBorrowCar(params).then((res) => { |
|||
// if (res) { |
|||
// this.$message({ message: '删除成功', type: 'success', offset: 8 }) |
|||
// this.crud.refresh() |
|||
// store.dispatch('initborrowCar').then(() => {}) |
|||
// } else { |
|||
// this.crud.notify(res.message, CRUD.NOTIFICATION_TYPE.ERROR) |
|||
// } |
|||
// this.$refs.table.clearSelection() |
|||
// }).catch(err => { |
|||
// console.log(err) |
|||
// }) |
|||
}).catch(() => { |
|||
}) |
|||
}, |
|||
handleLend(data) { |
|||
console.log('data', data) |
|||
this.$refs.lendFormRef.lendFormVisible = true |
|||
this.$nextTick(() => { |
|||
this.$refs.lendFormRef.detailArcData = [] |
|||
data.forEach(item => { |
|||
item.checkedId = [1] |
|||
item.childMenu = [{ |
|||
value: 1, |
|||
label: '电子查看' |
|||
}, |
|||
{ |
|||
value: 2, |
|||
label: '下载' |
|||
}, |
|||
{ |
|||
value: 3, |
|||
label: '打印' |
|||
}, |
|||
{ |
|||
value: 4, |
|||
label: '实体借阅' |
|||
}] |
|||
}) |
|||
this.$refs.lendFormRef.detailArcData = data |
|||
}) |
|||
}, |
|||
clickRowHandler(row) { |
|||
this.$refs.table.toggleRowSelection(row) |
|||
}, |
|||
tableDoubleClick(row) { |
|||
this.categoryId = row.categoryPid |
|||
this.arcId = row.archivesId |
|||
this.$nextTick(() => { |
|||
if (row.categoryLevel === 2) { |
|||
this.$refs.archivesInfo.isHasFile = false |
|||
this.$refs.archivesInfo.detailTitle = '案卷详情' |
|||
this.$refs.archivesInfo.getDetial(2, row.archivesId) |
|||
} else { |
|||
this.$refs.archivesInfo.isHasFile = true |
|||
this.$refs.archivesInfo.detailTitle = '文件详情' |
|||
this.$refs.archivesInfo.getDetial(3, row.archivesId) |
|||
} |
|||
// this.$refs.archivesInfo.isHasFile = true |
|||
// this.$refs.archivesInfo.detailTitle = '文件详情' |
|||
// this.$refs.archivesInfo.getDetial(3, row.archivesId) |
|||
this.$refs.archivesInfo.isFourTest = true |
|||
this.$refs.archivesInfo.archivesInfoVisible = true |
|||
this.$refs.archivesInfo.archivesTabIndex = 0 |
|||
}) |
|||
}, |
|||
closeDialog() { |
|||
this.keyWord = null |
|||
this.crud.toQuery() |
|||
this.$refs.table.clearSelection() |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.el-pagination{ |
|||
margin: 10px 0 !important; |
|||
} |
|||
</style> |
@ -0,0 +1,372 @@ |
|||
<template> |
|||
<div class="app-container row-container" style="height: calc(100vh - 140px);"> |
|||
<!--工具栏--> |
|||
<div class="head-container"> |
|||
<div class="head-search"> |
|||
<el-input |
|||
v-model="keyWord" |
|||
size="small" |
|||
clearable |
|||
placeholder="请输入输入搜索关键词" |
|||
style="width: 320px;" |
|||
class="input-prepend filter-item" |
|||
@clear="crud.toQuery" |
|||
@keyup.enter.native="crud.toQuery" |
|||
> |
|||
<el-select slot="prepend" v-model="optionVal" style="width: 140px" @change="searchChange"> |
|||
<el-option |
|||
v-for="item in options" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-input> |
|||
|
|||
<el-select v-model="query.userStatus" clearable size="small" placeholder="状态" class="filter-item" style="width: 100px" @change="crud.toQuery"> |
|||
<i slot="prefix" class="iconfont icon-zhuangtai" /> |
|||
<el-option v-for="item in enabledTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" /> |
|||
</el-select> |
|||
<rrOperation /> |
|||
</div> |
|||
<crudOperation :permission="permission" /> |
|||
</div> |
|||
<!--表单渲染--> |
|||
<el-dialog class="auto-dialog" append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title"> |
|||
<div class="setting-dialog"> |
|||
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="90px"> |
|||
<div style="width: 696px;"> |
|||
<el-form-item label="题名" prop="title"> |
|||
<el-input v-model="form.title" placeholder="请输入" /> |
|||
</el-form-item> |
|||
<el-form-item label="著者" prop="author"> |
|||
<el-input v-model="form.author" placeholder="请输入" /> |
|||
</el-form-item> |
|||
<el-form-item label="ISBN" prop="isbn"> |
|||
<el-input v-model="form.isbn" placeholder="请输入" /> |
|||
</el-form-item> |
|||
<el-form-item label="索书号" prop="code"> |
|||
<el-input v-model="form.code" placeholder="请输入" /> |
|||
</el-form-item> |
|||
<div> |
|||
<el-form-item label="出版社" prop="publish"> |
|||
<el-input v-model="form.publish" placeholder="请输入" style="width: 586px;" /> |
|||
</el-form-item> |
|||
</div> |
|||
<div> |
|||
<el-form-item class="book-cover-upload" label="图书封面" prop="cover"> |
|||
<el-input v-model="form.cover" placeholder="请上传图书封面" :readonly="true" /> |
|||
<!-- <p :class="['input-style', form.cover === null ? 'error-box' :'']">{{ form.cover }}</p> --> |
|||
<!-- <span v-if="form.cover === null" class="error-tip">请上传图书封面</span> --> |
|||
<div class="upload-btn"> |
|||
<input id="upFile" type="file" name="upFile" @change="changeFile($event)"> |
|||
<el-button size="small" type="primary"><i class="iconfont icon-shangchuan" />上传</el-button> |
|||
</div> |
|||
</el-form-item> |
|||
</div> |
|||
</div> |
|||
<div v-if="imageUrl" class="preview-cover"> |
|||
<p>封面预览</p> |
|||
<img :src="imageUrl" alt=""> |
|||
</div> |
|||
</el-form> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="text" @click="crud.cancelCU">取消</el-button> |
|||
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> |
|||
</div> |
|||
</div> |
|||
</el-dialog> |
|||
<!--表格渲染--> |
|||
<div class="container-wrap"> |
|||
<span class="right-top-line" /> |
|||
<span class="left-bottom-line" /> |
|||
<el-table |
|||
ref="table" |
|||
v-loading="crud.loading" |
|||
height="645" |
|||
:data="crud.data" |
|||
@selection-change="crud.selectionChangeHandler" |
|||
@row-click="clickRowHandler" |
|||
> |
|||
<el-table-column type="selection" align="center" width="55" /> |
|||
<el-table-column prop="icon" label="封面" align="center"> |
|||
<!-- slot-scope="scope" --> |
|||
<template> |
|||
<!-- <svg-icon :icon-class="scope.row.icon ? scope.row.icon : ''" /> --> |
|||
<img src="~@/assets/images/cover-bg.png" alt="" style="height: 100px;"> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column label="题名" prop="title" width="300px" :show-overflow-tooltip="true" /> |
|||
<el-table-column label="著者" prop="author" /> |
|||
<el-table-column label="出版社" prop="publish" /> |
|||
<el-table-column label="ISBN" prop="isbn" /> |
|||
<el-table-column label="索书号" prop="code" /> |
|||
<el-table-column label="馆藏量" prop="num" /> |
|||
</el-table> |
|||
<!--分页组件--> |
|||
<pagination v-if="crud.data.length!==0" /> |
|||
</div> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import crudMenu from '@/api/system/menu' |
|||
import '@riophae/vue-treeselect/dist/vue-treeselect.css' |
|||
import CRUD, { presenter, header, form, crud } from '@crud/crud' |
|||
import rrOperation from '@crud/RR.operation' |
|||
import crudOperation from '@crud/CRUD.operation' |
|||
import pagination from '@crud/Pagination' |
|||
import { getCurrentTime } from '@/utils/index' |
|||
|
|||
const defaultForm = { id: null, title: null, author: null, isbn: null, code: null, publish: null, cover: null } |
|||
export default { |
|||
name: 'Book', |
|||
components: { crudOperation, rrOperation, pagination }, |
|||
cruds() { |
|||
return CRUD({ title: '图书', url: 'api/menus', crudMethod: { ...crudMenu }, |
|||
optShow: { |
|||
add: true, |
|||
edit: true, |
|||
del: true, |
|||
download: false, |
|||
group: false, |
|||
reset: true |
|||
} |
|||
}) |
|||
}, |
|||
mixins: [presenter(), header(), form(defaultForm), crud()], |
|||
data() { |
|||
return { |
|||
keyWord: null, |
|||
optionVal: 'username', |
|||
options: [ |
|||
{ value: 'username', label: '题名/著者/出版社' }, |
|||
{ value: 'isbn', label: 'ISBN' }, |
|||
{ value: 'code', label: '索书号' } |
|||
], |
|||
permission: { |
|||
add: ['admin', 'book:add'], |
|||
edit: ['admin', 'book:edit'], |
|||
del: ['admin', 'book:del'] |
|||
}, |
|||
enabledTypeOptions: [ |
|||
{ key: '1', display_name: '全部' }, |
|||
{ key: '0', display_name: '馆藏数量不为0' } |
|||
], |
|||
bookCover: null, |
|||
file: null, // 附件 change |
|||
fileNames: '', // 附件 - name |
|||
formatType: '', // 附件 - type |
|||
postfix: '', // 附件 - 文件后缀 |
|||
fileSize: '', // 附件 - 大小 |
|||
filePath: '', // 附件 - path |
|||
px: '', // 附件 - 分辨率 |
|||
nowDate: '', // 当前时间 |
|||
fileJsonString: null, |
|||
imageUrl: null, |
|||
rules: { |
|||
title: [ |
|||
{ required: true, message: '题名不可为空', trigger: 'blur' } |
|||
], |
|||
author: [ |
|||
{ required: true, message: '著者不可为空', trigger: 'blur' } |
|||
], |
|||
isbn: [ |
|||
{ required: true, message: 'ISBN不可为空', trigger: 'blur' } |
|||
], |
|||
code: [ |
|||
{ required: true, message: '索书号不可为空', trigger: 'blur' } |
|||
], |
|||
publish: [ |
|||
{ required: true, message: '出版社不可为空', trigger: 'blur' } |
|||
] |
|||
} |
|||
} |
|||
}, |
|||
methods: { |
|||
[CRUD.HOOK.beforeRefresh]() { |
|||
}, |
|||
// 新增与编辑前做的操作 |
|||
[CRUD.HOOK.afterToCU](crud, form) { |
|||
}, |
|||
// 新增前 |
|||
[CRUD.HOOK.beforeToAdd]() { |
|||
}, |
|||
// 初始化编辑时候 |
|||
[CRUD.HOOK.beforeToEdit](crud, form) { |
|||
}, |
|||
// 提交前做的操作 |
|||
[CRUD.HOOK.afterValidateCU](crud) { |
|||
console.log(crud.form) |
|||
return false |
|||
}, |
|||
searchChange(val) { |
|||
if (val) { |
|||
this.keyWord = '' |
|||
this.options.forEach(option => { |
|||
if (option.value !== val) { |
|||
this.crud.query[option.value] = null |
|||
} |
|||
}) |
|||
} |
|||
}, |
|||
clickRowHandler(row) { |
|||
this.$refs.table.clearSelection() |
|||
this.$refs.table.toggleRowSelection(row) |
|||
}, |
|||
// 选择附件 |
|||
async changeFile(e) { |
|||
const file = e.target.files[0] |
|||
|
|||
if (file && file.type.startsWith('image/')) { |
|||
this.file = e.target.files[0] |
|||
this.fileSize = this.file.size |
|||
// this.formatType = this.file.type.substring(0, this.file.type.indexOf('/')) |
|||
this.fileNames = this.file.name |
|||
|
|||
const fileBase64 = await this.getBase64(this.file) |
|||
const res = await this.getImgPx(fileBase64) |
|||
this.imageUrl = fileBase64 |
|||
this.px = res.width + 'px*' + res.height + 'px' |
|||
// 上传附件 |
|||
// reDocumentUpload(this.baseApi + '/api/re-document/uploadFile', this.file, this.selectedDocument.id).then(res => { |
|||
// if (res.data.code === 200) { |
|||
// this.filePath = res.data.data |
|||
// this.uploadSave() |
|||
// } |
|||
// }) |
|||
this.uploadSave() |
|||
} else { |
|||
this.$message({ message: '只可上传图片', type: 'error', offset: 8 }) |
|||
this.imageUrl = null |
|||
} |
|||
}, |
|||
// 上传附件 - 选择上传即保存 |
|||
uploadSave() { |
|||
this.nowDate = getCurrentTime() |
|||
const json = { |
|||
'file_name': this.fileNames, |
|||
'file_size': this.fileSize, |
|||
'file_type': this.postfix, |
|||
'file_path': this.filePath, |
|||
'sequence': null, |
|||
'file_dpi': this.px, |
|||
'file_thumbnail': '', |
|||
'create_time': this.nowDate, |
|||
'id': null, |
|||
'is_quote': null, |
|||
'last_modified': this.file.lastModified |
|||
} |
|||
const arrayUpload = [] |
|||
arrayUpload.push(json) |
|||
this.form.cover = this.fileNames |
|||
|
|||
this.fileJsonString = JSON.stringify(arrayUpload) |
|||
console.log(this.fileJsonString) |
|||
}, |
|||
// 将上传的图片转为base64 |
|||
getBase64(file) { |
|||
const reader = new FileReader() |
|||
reader.readAsDataURL(file) |
|||
return new Promise((resolve) => { |
|||
reader.onload = () => { |
|||
resolve(reader.result) |
|||
} |
|||
}) |
|||
}, |
|||
// 获取图片的分辨率 |
|||
getImgPx(img) { |
|||
const image = new Image() |
|||
image.src = img |
|||
return new Promise((resolve) => { |
|||
image.onload = () => { |
|||
const width = image.width |
|||
const height = image.height |
|||
resolve({ width, height }) |
|||
} |
|||
}) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
::v-deep .input-prepend .el-input__inner{ |
|||
padding-left: 150px; |
|||
} |
|||
|
|||
.auto-dialog{ |
|||
::v-deep .el-dialog{ |
|||
width: initial; |
|||
} |
|||
} |
|||
|
|||
::v-deep .book-cover-upload { |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
.el-form-item__content{ |
|||
position: relative; |
|||
width: 580px !important; |
|||
display: flex; |
|||
justify-content: space-between; |
|||
.input-style{ |
|||
width: 490px; |
|||
height: 34px; |
|||
line-height: 34px; |
|||
padding: 0 20px; |
|||
border: 1px solid #e6e8ed; |
|||
border-radius: 3px; |
|||
&.error-box{ |
|||
border-color: #ed4a41; |
|||
} |
|||
} |
|||
.error-tip{ |
|||
position: absolute; |
|||
left: 0; |
|||
bottom: -26px; |
|||
font-size: 12px; |
|||
color: #ff4949; |
|||
} |
|||
} |
|||
} |
|||
|
|||
.upload-btn{ |
|||
position: relative; |
|||
width: 62px; |
|||
margin-right: 0 !important; |
|||
margin-left: 10px; |
|||
overflow: initial !important; |
|||
#upFile{ |
|||
position: absolute; |
|||
left: 0; |
|||
top: 0; |
|||
width: 84px; |
|||
height: 34px; |
|||
} |
|||
.el-button{ |
|||
margin-top: -2px; |
|||
font-weight: bold; |
|||
border-color: #0348f3; |
|||
color: #0348f3; |
|||
} |
|||
} |
|||
|
|||
.el-form{ |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
} |
|||
|
|||
.preview-cover{ |
|||
flex: 1; |
|||
padding-left: 10px; |
|||
p{ |
|||
font-weight: bold; |
|||
color: #0c0e1e; |
|||
margin: -14px 0 10px 0; |
|||
} |
|||
img{ |
|||
display: block; |
|||
height: 180px; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,506 @@ |
|||
<template> |
|||
<div class="app-container row-container" style="height: calc(100vh - 140px);"> |
|||
<!--工具栏--> |
|||
<div class="head-container"> |
|||
<div class="head-search"> |
|||
<el-input |
|||
v-model="keyWord" |
|||
size="small" |
|||
clearable |
|||
placeholder="请输入输入搜索关键词" |
|||
style="width: 320px;" |
|||
class="input-prepend filter-item" |
|||
@clear="crud.toQuery" |
|||
@keyup.enter.native="crud.toQuery" |
|||
> |
|||
<el-select slot="prepend" v-model="optionVal" style="width: 140px" @change="searchChange"> |
|||
<el-option |
|||
v-for="item in options" |
|||
:key="item.value" |
|||
:label="item.label" |
|||
:value="item.value" |
|||
/> |
|||
</el-select> |
|||
</el-input> |
|||
|
|||
<el-select v-model="query.userStatus" clearable size="small" placeholder="状态" class="filter-item" style="width: 100px" @change="crud.toQuery"> |
|||
<i slot="prefix" class="iconfont icon-zhuangtai" /> |
|||
<el-option v-for="item in enabledTypeOptions" :key="item.key" :label="item.display_name" :value="item.key" /> |
|||
</el-select> |
|||
<rrOperation /> |
|||
</div> |
|||
<crudOperation :permission="permission"> |
|||
<template v-slot:middle> |
|||
<el-button slot="reference" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)"> |
|||
<i class="iconfont icon-shanchu" /> |
|||
删除 |
|||
</el-button> |
|||
</template> |
|||
<template v-slot:right> |
|||
<el-button :loading="crud.downloadLoading" size="mini" :disabled="crud.selections.length === 0" @click="doExport(crud.selections)"> |
|||
<i class="iconfont icon-daochu" /> |
|||
导出 |
|||
</el-button> |
|||
<el-button type="primary" class="warehousing-btn iconfont" :disabled="crud.selections.length === 0" @click="printArchivesCode(crud.selections)"><svg-icon icon-class="print" class="svg-arc-style" />批量打印条形码</el-button> |
|||
</template> |
|||
</crudOperation> |
|||
</div> |
|||
<!--表单渲染--> |
|||
<el-dialog class="auto-dialog" append-to-body :close-on-click-modal="false" :before-close="crud.cancelCU" :visible.sync="crud.status.cu > 0" :title="crud.status.title"> |
|||
<div class="setting-dialog"> |
|||
<el-form ref="form" :inline="true" :model="form" :rules="rules" size="small" label-width="90px"> |
|||
<div style="width: 696px;"> |
|||
<el-form-item class="brcode-input" label="ISBN" prop="isbn"> |
|||
<el-input v-model="form.isbn" placeholder="请输入" /> |
|||
<div class="search-box"> |
|||
<i class="iconfont icon-sousuo" @click="toIsbnSearch" /> |
|||
</div> |
|||
</el-form-item> |
|||
<el-form-item label="题名" prop="title"> |
|||
<el-input v-model="form.title" readonly /> |
|||
</el-form-item> |
|||
<el-form-item class="brcode-input" label="条码" prop="brcode"> |
|||
<el-input v-model="form.brcode" placeholder="请输入" /> |
|||
<div :class="isAutoBrcode?'auto-box auto-loading':'auto-box'"> |
|||
<i class="iconfont icon-zidonggengxin" @click="autoBrcode" /> |
|||
</div> |
|||
</el-form-item> |
|||
<el-form-item label="馆藏地" prop="library"> |
|||
<el-select v-model="form.library" placeholder="请选择" style="width: 225px;" @change="changeLibrarysValue($event)"> |
|||
<el-option |
|||
v-for="(item,index) in librarysOptions" |
|||
:key="index" |
|||
:label="item.label" |
|||
:value="item.id" |
|||
/> |
|||
</el-select> |
|||
</el-form-item> |
|||
<div> |
|||
<el-form-item label="所在架位" prop="bookshelf"> |
|||
<treeselect |
|||
v-model="form.bookshelf" |
|||
:options="bookshelfNum" |
|||
:load-options="loadDepts" |
|||
placeholder="选择层位架" |
|||
:normalizer="normalizer" |
|||
:default-expand-level="levelNumber" |
|||
style="width: 586px;" |
|||
> |
|||
<div slot="value-label" slot-scope="{ node }">{{ getAutoNameUnknown(node.label) }}</div> |
|||
</treeselect> |
|||
</el-form-item> |
|||
</div> |
|||
</div> |
|||
<div v-if="imageUrl" class="preview-cover"> |
|||
<p>封面预览</p> |
|||
<img :src="imageUrl" alt=""> |
|||
</div> |
|||
</el-form> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="text" @click="crud.cancelCU">取消</el-button> |
|||
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">确认</el-button> |
|||
</div> |
|||
</div> |
|||
</el-dialog> |
|||
<!--表格渲染--> |
|||
<div class="container-wrap"> |
|||
<span class="right-top-line" /> |
|||
<span class="left-bottom-line" /> |
|||
<el-table |
|||
ref="table" |
|||
v-loading="crud.loading" |
|||
height="645" |
|||
:data="crud.data" |
|||
@selection-change="crud.selectionChangeHandler" |
|||
@row-click="clickRowHandler" |
|||
> |
|||
<el-table-column type="selection" align="center" width="55" /> |
|||
<el-table-column label="条码" prop="brcode" /> |
|||
<el-table-column label="[ISBN]题名" prop="isbn"> |
|||
<template slot-scope="scope"> |
|||
<p>[{{ scope.row.isbn }}]{{ scope.row.title }}</p> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="floor" label="所在楼层" /> |
|||
<el-table-column prop="area" label="所在区域" /> |
|||
<el-table-column prop="bookshelf" label="所在架位" /> |
|||
<el-table-column prop="library" label="所属馆藏" /> |
|||
<el-table-column prop="createTime" label="创建日期" :show-overflow-tooltip="true"> |
|||
<template slot-scope="scope"> |
|||
<div>{{ scope.row.createTime | parseTime }}</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--分页组件--> |
|||
<pagination v-if="crud.data.length!==0" /> |
|||
</div> |
|||
|
|||
<div ref="printDiv" style="display: none;"> |
|||
<div v-for="item in selectedRows" :key="item.barcode" style="page-break-after:always; margin-top: 8px; margin-left: 20px;"> |
|||
<div> |
|||
<img :src="item.barcode | creatBarCode(item.barcode, item.title)" style="border: 1px solid #000; width: 160px;"> |
|||
</div> |
|||
</div> |
|||
</div> |
|||
<iframe ref="printIframe" frameborder="0" scrolling="no" style="margin: 0px;padding: 0px;width: 0px;height: 0px;" /> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import crudMenu from '@/api/system/menu' |
|||
import '@riophae/vue-treeselect/dist/vue-treeselect.css' |
|||
import CRUD, { presenter, header, form, crud } from '@crud/crud' |
|||
import rrOperation from '@crud/RR.operation' |
|||
import crudOperation from '@crud/CRUD.operation' |
|||
import pagination from '@crud/Pagination' |
|||
import Treeselect from '@riophae/vue-treeselect' |
|||
import '@riophae/vue-treeselect/dist/vue-treeselect.css' |
|||
import { LOAD_CHILDREN_OPTIONS } from '@riophae/vue-treeselect' |
|||
import { exportFile } from '@/utils/index' |
|||
import qs from 'qs' |
|||
import { mapGetters } from 'vuex' |
|||
import JsBarcode from 'jsbarcode' |
|||
|
|||
const defaultForm = { id: null, title: null, author: null, isbn: null, code: null, publish: null, cover: null } |
|||
export default { |
|||
name: 'Collection', |
|||
components: { crudOperation, rrOperation, pagination, Treeselect }, |
|||
filters: { |
|||
creatBarCode(barCodeData, codePrintData, barCodeText) { |
|||
// console.log('触发条码生成事件') |
|||
console.log('codePrintData', codePrintData) |
|||
console.log('barCodeText', barCodeText) |
|||
const canvas = document.createElement('canvas') |
|||
// 'fantasy', // 设置文本的字体 |
|||
JsBarcode(canvas, barCodeData, { |
|||
format: 'CODE128', |
|||
displayValue: true, |
|||
text: barCodeText, |
|||
fontOptions: 'bold', // 使文字加粗体或变斜体 |
|||
font: 'arial', |
|||
margin: 15, |
|||
height: 120, |
|||
width: 5, |
|||
fontSize: 36, |
|||
textMargin: 6, |
|||
textPosition: 'top' |
|||
}) |
|||
return canvas.toDataURL('image/png') |
|||
} |
|||
}, |
|||
cruds() { |
|||
return CRUD({ title: '图书', url: 'api/menus', crudMethod: { ...crudMenu }, |
|||
optShow: { |
|||
add: true, |
|||
edit: true, |
|||
del: false, |
|||
download: false, |
|||
group: false, |
|||
reset: true |
|||
} |
|||
}) |
|||
}, |
|||
mixins: [presenter(), header(), form(defaultForm), crud()], |
|||
data() { |
|||
return { |
|||
keyWord: null, |
|||
optionVal: 'brcode', |
|||
bookshelfNum: [], |
|||
levelNumber: 0, |
|||
librarysOptions: [], |
|||
options: [ |
|||
{ value: 'brcode', label: '条码' }, |
|||
{ value: 'username', label: '题名/著者/出版社' }, |
|||
{ value: 'isbn', label: 'ISBN' } |
|||
], |
|||
permission: { |
|||
add: ['admin', 'collection:add'], |
|||
edit: ['admin', 'collection:edit'], |
|||
del: ['admin', 'collection:del'] |
|||
}, |
|||
enabledTypeOptions: [ |
|||
{ key: '1', display_name: '在架' }, |
|||
{ key: '0', display_name: '不在架' } |
|||
], |
|||
imageUrl: require('@/assets/images/system/default-img.jpg'), |
|||
rules: { |
|||
title: [ |
|||
{ required: true, message: '题名不可为空', trigger: 'blur' } |
|||
], |
|||
library: [ |
|||
{ required: true, message: '馆藏地不可为空', trigger: 'blur' } |
|||
], |
|||
isbn: [ |
|||
{ required: true, message: 'ISBN不可为空', trigger: 'blur' } |
|||
], |
|||
brcode: [ |
|||
{ required: true, message: '条码不可为空', trigger: 'blur' } |
|||
] |
|||
}, |
|||
selectedRows: [], |
|||
isAutoBrcode: false |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapGetters([ |
|||
'baseApi' |
|||
]) |
|||
}, |
|||
methods: { |
|||
[CRUD.HOOK.beforeRefresh]() { |
|||
}, |
|||
// 新增与编辑前做的操作 |
|||
[CRUD.HOOK.afterToCU](crud, form) { |
|||
}, |
|||
// 新增前 |
|||
[CRUD.HOOK.beforeToAdd]() { |
|||
}, |
|||
// 初始化编辑时候 |
|||
[CRUD.HOOK.beforeToEdit](crud, form) { |
|||
}, |
|||
// 提交前做的操作 |
|||
[CRUD.HOOK.afterValidateCU](crud) { |
|||
console.log(crud.form) |
|||
return false |
|||
}, |
|||
searchChange(val) { |
|||
if (val) { |
|||
this.keyWord = '' |
|||
this.options.forEach(option => { |
|||
if (option.value !== val) { |
|||
this.crud.query[option.value] = null |
|||
} |
|||
}) |
|||
} |
|||
}, |
|||
toIsbnSearch() { |
|||
if (this.form.isbn) { |
|||
console.log(this.form.isbn) |
|||
} else { |
|||
this.$refs.form.validateField(['isbn'], err => { |
|||
if (err) { |
|||
return |
|||
} |
|||
}) |
|||
} |
|||
}, |
|||
autoBrcode() { |
|||
this.isAutoBrcode = true |
|||
|
|||
setTimeout(() => { |
|||
this.isAutoBrcode = false |
|||
}, 5000) |
|||
}, |
|||
changeLibrarysValue(value) { |
|||
// this.depts = [] |
|||
// var obj = {} |
|||
// obj = this.fondsOptions.find(function(item) { |
|||
// return item.id === value |
|||
// }) |
|||
// this.form.deptsParentsId = null |
|||
// const params = { |
|||
// 'fondsId': obj.id, |
|||
// 'fondsName': obj.fondsName, |
|||
// 'status': 1 |
|||
// } |
|||
this.getLirarys() |
|||
}, |
|||
getLirarys(params) { |
|||
// crudDept.getDepts(params).then(res => { |
|||
// this.depts = res.content.map(function(obj) { |
|||
// if (obj.sonNum !== 0) { |
|||
// obj.hasChildren = true |
|||
// } else { |
|||
// obj.hasChildren = false |
|||
// } |
|||
// if (obj.hasChildren) { |
|||
// obj.children = null |
|||
// } |
|||
// return obj |
|||
// }) |
|||
// }) |
|||
}, |
|||
// 处理vue-treeSelect回显出现unknown问题 |
|||
getAutoNameUnknown(name) { |
|||
if (name.lastIndexOf('unknown') > -1) { |
|||
return name.split('(')[0] |
|||
} else { |
|||
return name |
|||
} |
|||
}, |
|||
normalizer(node) { |
|||
if (node.children && !node.children.length) { |
|||
delete node.children |
|||
} |
|||
return { |
|||
id: node.deptsId, |
|||
label: node.deptsName, |
|||
children: node.children |
|||
} |
|||
}, |
|||
// 获取弹窗内架位数据 |
|||
loadDepts({ action, parentNode, callback }) { |
|||
if (action === LOAD_CHILDREN_OPTIONS) { |
|||
// crudDept.FetchSonDepts({ deptsId: parentNode.deptsId }).then(res => { |
|||
// parentNode.children = res.map(function(obj) { |
|||
// if (obj.sonNum !== 0) { |
|||
// obj.hasChildren = true |
|||
// } else { |
|||
// obj.hasChildren = false |
|||
// } |
|||
// if (obj.hasChildren) { |
|||
// obj.children = null |
|||
// } |
|||
// return obj |
|||
// }) |
|||
// setTimeout(() => { |
|||
// callback() |
|||
// }, 100) |
|||
// }) |
|||
} |
|||
}, |
|||
clickRowHandler(row) { |
|||
this.$refs.table.clearSelection() |
|||
this.$refs.table.toggleRowSelection(row) |
|||
}, |
|||
toDelete(datas) { |
|||
this.deleteData = datas |
|||
|
|||
this.$confirm('此操作将删除当前所选图书所有馆藏信息<span>你是否还要继续?</span>', '提示', { |
|||
confirmButtonText: '继续', |
|||
cancelButtonText: '取消', |
|||
type: 'warning', |
|||
dangerouslyUseHTMLString: true |
|||
}).then(() => { |
|||
this.crud.delAllLoading = true |
|||
const ids = [] |
|||
this.deleteData.forEach(val => { |
|||
ids.push(val.deptsId) |
|||
}) |
|||
// crudDept.del(ids).then(() => { |
|||
// this.$message({ message: '删除成功', type: 'success', offset: 8 }) |
|||
// this.crud.delAllLoading = false |
|||
// this.crud.refresh() |
|||
// }).catch(err => { |
|||
// this.crud.delAllLoading = false |
|||
// console.log(err) |
|||
// }) |
|||
}).catch(() => { |
|||
}) |
|||
}, |
|||
doExport(data) { |
|||
crud.downloadLoading = true |
|||
this.$confirm('此操作将导出所选数据' + '<span>你是否还要继续?</span>', '提示', { |
|||
confirmButtonText: '继续', |
|||
cancelButtonText: '取消', |
|||
type: 'warning', |
|||
dangerouslyUseHTMLString: true |
|||
}).then(() => { |
|||
const ids = [] |
|||
data.forEach(val => { |
|||
ids.push(val.fondsId) |
|||
}) |
|||
const params = { |
|||
'fondsIds': ids |
|||
} |
|||
exportFile(this.baseApi + '/api/fonds/download?' + qs.stringify(params, { indices: false })) |
|||
}).catch(() => { |
|||
}) |
|||
}, |
|||
// 打印条码 |
|||
printArchivesCode(data) { |
|||
// this.codeLoading = true |
|||
const params = data.map(item => { |
|||
return item.id |
|||
}) |
|||
console.log(params) |
|||
// FetchPrintArchivesBarcode(params).then(res => { |
|||
// if (res && res.length !== 0) { |
|||
// this.selectedRows = res |
|||
// } else { |
|||
// this.selectedRows = [] |
|||
// this.$message({ |
|||
// message: '无相关可打印条码数据!', |
|||
// type: 'warning' |
|||
// }) |
|||
// return false |
|||
// } |
|||
// this.$nextTick(() => { |
|||
// this.codePrintData.count = this.selectedRows.length |
|||
// var printIframe = this.$refs.printIframe |
|||
// var html = this.$refs.printDiv.innerHTML |
|||
// printIframe.setAttribute('srcdoc', html) |
|||
// printIframe.onload = function() { |
|||
// console.log(printIframe.contentWindow) |
|||
// // 去掉iframe里面的dom的body的padding margin的默认数值 |
|||
// printIframe.contentWindow.document.body.style.padding = '0px' |
|||
// printIframe.contentWindow.document.body.style.margin = '0px' |
|||
// // 开始打印 |
|||
// printIframe.contentWindow.focus() |
|||
// printIframe.contentWindow.print() |
|||
// } |
|||
// }) |
|||
// // this.crud.refresh() |
|||
// this.codeLoading = false |
|||
// }) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
::v-deep .input-prepend .el-input__inner{ |
|||
padding-left: 150px; |
|||
} |
|||
.auto-dialog{ |
|||
::v-deep .el-dialog{ |
|||
width: initial; |
|||
} |
|||
} |
|||
|
|||
.el-form{ |
|||
display: flex; |
|||
justify-content: flex-start; |
|||
} |
|||
|
|||
.brcode-input{ |
|||
::v-deep .el-form-item__content{ |
|||
position: relative; |
|||
} |
|||
.auto-box{ |
|||
position: absolute; |
|||
right: -30px; |
|||
top: 0; |
|||
i::before{ |
|||
margin-right:0; |
|||
} |
|||
} |
|||
.auto-loading{ |
|||
animation: rotates 3s linear infinite; |
|||
} |
|||
.search-box{ |
|||
position: absolute; |
|||
right: 6px; |
|||
top: -2px; |
|||
} |
|||
} |
|||
|
|||
@keyframes rotates { |
|||
0% {transform: rotate(0deg) } |
|||
100% {transform: rotate(-360deg) } |
|||
} |
|||
|
|||
.preview-cover{ |
|||
flex: 1; |
|||
padding-left: 10px; |
|||
p{ |
|||
font-weight: bold; |
|||
color: #0c0e1e; |
|||
margin: -14px 0 10px 0; |
|||
} |
|||
img{ |
|||
display: block; |
|||
height: 120px; |
|||
} |
|||
} |
|||
</style> |
@ -0,0 +1,230 @@ |
|||
<template> |
|||
<div class="app-container row-container"> |
|||
<div class="head-container"> |
|||
<div class="head-search"> |
|||
<!-- 搜索 --> |
|||
<el-input v-model="query.collectionName" clearable size="small" placeholder="输入馆藏名称搜索" prefix-icon="el-icon-search" style="width: 200px;" class="filter-item" @keyup.enter.native="crud.toQuery" /> |
|||
<rrOperation /> |
|||
</div> |
|||
<crudOperation :permission="permission"> |
|||
<template v-slot:middle> |
|||
<el-button slot="reference" size="mini" :loading="crud.delAllLoading" :disabled="crud.selections.length === 0" @click="toDelete(crud.selections)"> |
|||
<i class="iconfont icon-shanchu" /> |
|||
删除 |
|||
</el-button> |
|||
</template> |
|||
<template v-slot:right> |
|||
<el-button :loading="crud.downloadLoading" size="mini" :disabled="crud.selections.length === 0" @click="doExport(crud.selections)"> |
|||
<i class="iconfont icon-daochu" /> |
|||
导出 |
|||
</el-button> |
|||
</template> |
|||
</crudOperation> |
|||
</div> |
|||
<div class="container-wrap"> |
|||
<span class="right-top-line" /> |
|||
<span class="left-bottom-line" /> |
|||
<!--表格渲染--> |
|||
<el-table |
|||
ref="table" |
|||
v-loading="crud.loading" |
|||
:data="crud.data" |
|||
style="width: 100%;" |
|||
@selection-change="crud.selectionChangeHandler" |
|||
@row-click="clickRowHandler" |
|||
> |
|||
<el-table-column type="selection" align="center" width="55" /> |
|||
<el-table-column prop="collectionName" label="馆藏地名称" /> |
|||
<el-table-column prop="collectionFloor" label="楼层" /> |
|||
<el-table-column prop="collectionExplain" label="说明"> |
|||
<template slot-scope="scope"> |
|||
<div>{{ scope.row.collectionExplain ? scope.row.collectionExplain : '-' }}</div> |
|||
</template> |
|||
</el-table-column> |
|||
<el-table-column prop="createTime" label="创建时间" min-width="180"> |
|||
<template slot-scope="scope"> |
|||
<div>{{ scope.row.createTime | parseTime }}</div> |
|||
</template> |
|||
</el-table-column> |
|||
</el-table> |
|||
<!--分页组件--> |
|||
<pagination v-if="crud.data.length!==0" /> |
|||
</div> |
|||
<!-- form --> |
|||
<el-dialog append-to-body :close-on-click-modal="false" :modal-append-to-body="false" :before-close="crud.cancelCU" :visible="crud.status.cu > 0" :title="crud.status.title"> |
|||
<span class="dialog-right-top" /> |
|||
<span class="dialog-left-bottom" /> |
|||
<div class="setting-dialog"> |
|||
<el-form ref="form" :rules="rules" :model="form" size="small" label-width="100px"> |
|||
<el-form-item label="所在楼层" prop="collectionFloor"> |
|||
<el-input v-model="form.collectionFloor" style="width: 580px;" /> |
|||
</el-form-item> |
|||
<el-form-item label="馆藏地名称" prop="collectionName"> |
|||
<el-input v-model="form.collectionName" placeholder="请输入" style="width: 580px;" /> |
|||
</el-form-item> |
|||
<el-form-item label="馆藏地编码" prop="collectionCode"> |
|||
<el-input v-model="form.collectionCode" placeholder="请输入" style="width: 580px;" /> |
|||
</el-form-item> |
|||
<el-form-item label="说明" prop="collectionExplain"> |
|||
<el-input v-model="form.collectionExplain" placeholder="请输入" type="textarea" rows="3" style="width: 580px;" /> |
|||
</el-form-item> |
|||
</el-form> |
|||
<div slot="footer" class="dialog-footer"> |
|||
<el-button type="text" @click="crud.cancelCU">取消</el-button> |
|||
<el-button :loading="crud.status.cu === 2" type="primary" @click="crud.submitCU">保存</el-button> |
|||
</div> |
|||
</div> |
|||
</el-dialog> |
|||
</div> |
|||
</template> |
|||
|
|||
<script> |
|||
import crudBookBasice from '@/api/bookBasice/index' |
|||
import CRUD, { presenter, header, form, crud } from '@crud/crud' |
|||
import crudOperation from '@crud/CRUD.operation' |
|||
import rrOperation from '@crud/RR.operation' |
|||
import pagination from '@crud/Pagination' |
|||
import { parseTime, saveAs, getBlob } from '@/utils/index' |
|||
import qs from 'qs' |
|||
import { mapGetters } from 'vuex' |
|||
|
|||
const defaultForm = { id: null, fondsId: null, collectionFloor: null, collectionName: null, collectionCode: null, collectionExplain: null } |
|||
export default { |
|||
name: 'CollectionLocation', |
|||
components: { crudOperation, rrOperation, pagination }, |
|||
cruds() { |
|||
return CRUD({ title: '馆藏地', url: 'api/bookBasice/initCollectionLocationList', crudMethod: { ...crudBookBasice }, sort: [], optShow: { |
|||
add: true, |
|||
edit: true, |
|||
del: false, |
|||
download: false, |
|||
group: false, |
|||
reset: true |
|||
}}) |
|||
}, |
|||
mixins: [presenter(), header(), form(defaultForm), crud()], |
|||
data() { |
|||
return { |
|||
permission: { |
|||
add: ['admin', 'collectionLocation:add'], |
|||
edit: ['admin', 'collectionLocation:edit'], |
|||
del: ['admin', 'collectionLocation:del'] |
|||
}, |
|||
rules: { |
|||
collectionFloor: [ |
|||
{ required: true, message: '所在楼层不可为空', trigger: 'blur' } |
|||
], |
|||
collectionName: [ |
|||
{ required: true, message: '馆藏名不可为空', trigger: 'blur' } |
|||
] |
|||
} |
|||
} |
|||
}, |
|||
computed: { |
|||
...mapGetters([ |
|||
'baseApi', |
|||
'user' |
|||
]) |
|||
}, |
|||
created() { |
|||
}, |
|||
methods: { |
|||
[CRUD.HOOK.beforeRefresh]() { |
|||
}, |
|||
// 提交前的验证 |
|||
[CRUD.HOOK.afterValidateCU](crud) { |
|||
crud.form.fondsId = this.user.fonds.id |
|||
console.log(crud.form) |
|||
return true |
|||
}, |
|||
[CRUD.HOOK.afterAddCancel]() { |
|||
}, |
|||
[CRUD.HOOK.afterSubmit]() { |
|||
}, |
|||
toDelete(datas) { |
|||
this.$confirm('此操作将删除当前所选机构<span>你是否还要继续?</span>', '提示', { |
|||
confirmButtonText: '继续', |
|||
cancelButtonText: '取消', |
|||
type: 'warning', |
|||
dangerouslyUseHTMLString: true |
|||
}).then(() => { |
|||
this.crud.delAllLoading = true |
|||
const ids = [] |
|||
datas.forEach(val => { |
|||
ids.push(val.id) |
|||
}) |
|||
console.log(ids) |
|||
crudBookBasice.del(ids).then(() => { |
|||
this.$message({ message: '删除成功', type: 'success', offset: 8 }) |
|||
this.crud.delAllLoading = false |
|||
this.crud.refresh() |
|||
}).catch(err => { |
|||
this.crud.delAllLoading = false |
|||
console.log(err) |
|||
}) |
|||
}).catch(() => { |
|||
this.crud.delAllLoading = false |
|||
}) |
|||
}, |
|||
doExport(data) { |
|||
crud.downloadLoading = true |
|||
this.$confirm('此操作将导出所选数据' + '<span>你是否还要继续?</span>', '提示', { |
|||
confirmButtonText: '继续', |
|||
cancelButtonText: '取消', |
|||
type: 'warning', |
|||
dangerouslyUseHTMLString: true |
|||
}).then(() => { |
|||
const ids = [] |
|||
data.forEach(val => { |
|||
ids.push(val.id) |
|||
}) |
|||
const params = { |
|||
'ids': ids |
|||
} |
|||
const fileName = '馆藏地-' + parseTime(new Date()) + '.xlsx' |
|||
getBlob(this.baseApi + '/api/bookBasice/exportCollectionLocation' + '?' + qs.stringify(params, { indices: false }), function(blob) { |
|||
saveAs(blob, fileName) |
|||
}) |
|||
}).catch(() => { |
|||
}) |
|||
}, |
|||
clickRowHandler(row) { |
|||
this.$refs.table.clearSelection() |
|||
this.$refs.table.toggleRowSelection(row) |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
|
|||
<style lang="scss" scoped> |
|||
.select-btn{ |
|||
display: inline-block; |
|||
padding: 4px 11px 4px 14px; |
|||
font-size: 18px; |
|||
color: #fff; |
|||
background: #0348F3; |
|||
border-radius: 3px; |
|||
margin: 10px 0 0 100px; |
|||
text-align: center; |
|||
cursor: pointer; |
|||
} |
|||
.send-obj{ |
|||
width: 580px; |
|||
height: 180px; |
|||
padding: 0 10px; |
|||
border-radius: 3px 3px 3px 3px; |
|||
border: 1px solid #E6E8ED; |
|||
.el-tag{ |
|||
margin-right: 10px; |
|||
} |
|||
} |
|||
|
|||
::v-deep .crud-opts-left{ |
|||
position: relative; |
|||
} |
|||
.double-click-btn{ |
|||
top: 4px !important; |
|||
right: 0; |
|||
left: -156px !important; |
|||
} |
|||
</style> |
@ -0,0 +1,16 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
图书检索 |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'BookSearch', |
|||
data() { |
|||
return { |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,16 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
图架检索 |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'BookshelfSearch', |
|||
data() { |
|||
return { |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,16 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
盘点日志 |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'CheckLog', |
|||
data() { |
|||
return { |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,16 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
盘点计划 |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'CheckPlan', |
|||
data() { |
|||
return { |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,16 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
数据总览 |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'DataScreening', |
|||
data() { |
|||
return { |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,16 @@ |
|||
<template> |
|||
<div class="app-container"> |
|||
统计分析 |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'Statistic', |
|||
data() { |
|||
return { |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped> |
|||
</style> |
@ -0,0 +1,16 @@ |
|||
<template> |
|||
<div> |
|||
<router-view /> |
|||
</div> |
|||
</template> |
|||
<script> |
|||
export default { |
|||
name: 'VenueDevice', |
|||
data() { |
|||
return { |
|||
} |
|||
} |
|||
} |
|||
</script> |
|||
<style scoped> |
|||
</style> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue