diff --git a/package.json b/package.json
index 8825fcb..ab71d57 100644
--- a/package.json
+++ b/package.json
@@ -74,6 +74,7 @@
"pdfdist-mergeofd": "^2.2.228",
"pdfjs-dist": "^2.12.313",
"print-js": "^1.6.0",
+ "qrcodejs2": "^0.0.2",
"qs": "^6.10.1",
"quill": "^1.3.7",
"quill-image-resize-module": "^3.0.0",
diff --git a/src/assets/iconfonts/light/iconfont.css b/src/assets/iconfonts/light/iconfont.css
index 9cfcfe3..bc8a99a 100644
--- a/src/assets/iconfonts/light/iconfont.css
+++ b/src/assets/iconfonts/light/iconfont.css
@@ -1,8 +1,8 @@
@font-face {
font-family: "iconfont"; /* Project id 3966148 */
- src: url('iconfont.woff2?t=1756345950057') format('woff2'),
- url('iconfont.woff?t=1756345950057') format('woff'),
- url('iconfont.ttf?t=1756345950057') format('truetype');
+ src: url('iconfont.woff2?t=1757381540478') format('woff2'),
+ url('iconfont.woff?t=1757381540478') format('woff'),
+ url('iconfont.ttf?t=1757381540478') format('truetype');
}
.iconfont {
@@ -13,6 +13,14 @@
-moz-osx-font-smoothing: grayscale;
}
+.icon-yooxi:before {
+ content: "\e69d";
+}
+
+.icon-heimingdan:before {
+ content: "\e69f";
+}
+
.icon-caidan:before {
content: "\e69c";
}
diff --git a/src/assets/iconfonts/light/iconfont.js b/src/assets/iconfonts/light/iconfont.js
index cce0bd2..dccca42 100644
--- a/src/assets/iconfonts/light/iconfont.js
+++ b/src/assets/iconfonts/light/iconfont.js
@@ -1 +1 @@
-window._iconfont_svg_string_3966148='',(l=>{var c=(a=(a=document.getElementsByTagName("script"))[a.length-1]).getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var h,i,o,t,z,v=function(c,a){a.parentNode.insertBefore(c,a)};if(c&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}h=function(){var c,a=document.createElement("div");a.innerHTML=l._iconfont_svg_string_3966148,(a=a.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",a=a,(c=document.body).firstChild?v(a,c.firstChild):c.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=h,t=l.document,z=!1,p(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,s())})}function s(){z||(z=!0,o())}function p(){try{t.documentElement.doScroll("left")}catch(c){return void setTimeout(p,50)}s()}})(window);
\ No newline at end of file
+window._iconfont_svg_string_3966148='',(l=>{var c=(a=(a=document.getElementsByTagName("script"))[a.length-1]).getAttribute("data-injectcss"),a=a.getAttribute("data-disable-injectsvg");if(!a){var h,i,o,t,z,v=function(c,a){a.parentNode.insertBefore(c,a)};if(c&&!l.__iconfont__svg__cssinject__){l.__iconfont__svg__cssinject__=!0;try{document.write("")}catch(c){console&&console.log(c)}}h=function(){var c,a=document.createElement("div");a.innerHTML=l._iconfont_svg_string_3966148,(a=a.getElementsByTagName("svg")[0])&&(a.setAttribute("aria-hidden","true"),a.style.position="absolute",a.style.width=0,a.style.height=0,a.style.overflow="hidden",a=a,(c=document.body).firstChild?v(a,c.firstChild):c.appendChild(a))},document.addEventListener?~["complete","loaded","interactive"].indexOf(document.readyState)?setTimeout(h,0):(i=function(){document.removeEventListener("DOMContentLoaded",i,!1),h()},document.addEventListener("DOMContentLoaded",i,!1)):document.attachEvent&&(o=h,t=l.document,z=!1,p(),t.onreadystatechange=function(){"complete"==t.readyState&&(t.onreadystatechange=null,s())})}function s(){z||(z=!0,o())}function p(){try{t.documentElement.doScroll("left")}catch(c){return void setTimeout(p,50)}s()}})(window);
\ No newline at end of file
diff --git a/src/assets/iconfonts/light/iconfont.json b/src/assets/iconfonts/light/iconfont.json
index 31570bc..3ac700a 100644
--- a/src/assets/iconfonts/light/iconfont.json
+++ b/src/assets/iconfonts/light/iconfont.json
@@ -5,6 +5,20 @@
"css_prefix_text": "icon-",
"description": "",
"glyphs": [
+ {
+ "icon_id": "778898",
+ "name": "vip",
+ "font_class": "yooxi",
+ "unicode": "e69d",
+ "unicode_decimal": 59037
+ },
+ {
+ "icon_id": "9826652",
+ "name": "黑名单",
+ "font_class": "heimingdan",
+ "unicode": "e69f",
+ "unicode_decimal": 59039
+ },
{
"icon_id": "4438260",
"name": "菜单",
diff --git a/src/assets/iconfonts/light/iconfont.ttf b/src/assets/iconfonts/light/iconfont.ttf
index d7b4a18..fe57211 100644
Binary files a/src/assets/iconfonts/light/iconfont.ttf and b/src/assets/iconfonts/light/iconfont.ttf differ
diff --git a/src/assets/iconfonts/light/iconfont.woff b/src/assets/iconfonts/light/iconfont.woff
index ebdcba7..fa16613 100644
Binary files a/src/assets/iconfonts/light/iconfont.woff and b/src/assets/iconfonts/light/iconfont.woff differ
diff --git a/src/assets/iconfonts/light/iconfont.woff2 b/src/assets/iconfonts/light/iconfont.woff2
index a49fddb..a7b4a93 100644
Binary files a/src/assets/iconfonts/light/iconfont.woff2 and b/src/assets/iconfonts/light/iconfont.woff2 differ
diff --git a/src/assets/images/user.jpg b/src/assets/images/user.jpg
new file mode 100644
index 0000000..de47123
Binary files /dev/null and b/src/assets/images/user.jpg differ
diff --git a/src/views/digitalScreen/module/areaSetting.vue b/src/views/digitalScreen/module/areaSetting.vue
index 15646ed..c62695a 100644
--- a/src/views/digitalScreen/module/areaSetting.vue
+++ b/src/views/digitalScreen/module/areaSetting.vue
@@ -127,7 +127,7 @@
>
{{ link }}
-
+
2.在地图上找到并选择正确的区域(区域最小单位是:区/县)
diff --git a/src/views/faceRecognition/faceRecLog.vue b/src/views/faceRecognition/faceRecLog.vue
index 7412b1b..45ac316 100644
--- a/src/views/faceRecognition/faceRecLog.vue
+++ b/src/views/faceRecognition/faceRecLog.vue
@@ -4,9 +4,9 @@
-
+
-
+
+
+
+
+
@@ -46,6 +50,7 @@
+
@@ -56,7 +61,7 @@
-
+
@@ -94,6 +99,11 @@ export default {
edit: ['admin', 'column:edit'],
del: ['admin', 'column:del']
},
+ userTypeOptions: [
+ { key: '1', display_name: '普通用户' },
+ { key: '2', display_name: 'VIP用户' },
+ { key: '3', display_name: '黑名单用户' }
+ ],
enabledTypeOptions: [
{ key: '1', display_name: '借书登录' },
{ key: '2', display_name: '信息绑定登录' },
diff --git a/src/views/faceRecognition/module/batchImport.vue b/src/views/faceRecognition/module/batchImport.vue
new file mode 100644
index 0000000..18313c2
--- /dev/null
+++ b/src/views/faceRecognition/module/batchImport.vue
@@ -0,0 +1,31 @@
+
+
+
+
注意:批量导入,需在指定的模板文件内完成数据录入后,上传文件,再由系统执行导入操作!
+
+ 下载模板
+ 导入文件
+
+
+
+
+
+
+
+
diff --git a/src/views/faceRecognition/module/faceSearch.vue b/src/views/faceRecognition/module/faceSearch.vue
new file mode 100644
index 0000000..996a208
--- /dev/null
+++ b/src/views/faceRecognition/module/faceSearch.vue
@@ -0,0 +1,151 @@
+
+
+
+
+
+ - 馆代码:ftzn
+ - 读者证号:78198239
+ - 姓名:张三
+ - 身份证号:420105198500000000
+ - 性别:男
+ - 联系方式:15800000000
+ - 类型:普通用户
+
+
+
+
+
+
+
+
diff --git a/src/views/faceRecognition/module/selfRegister.vue b/src/views/faceRecognition/module/selfRegister.vue
new file mode 100644
index 0000000..6511d9b
--- /dev/null
+++ b/src/views/faceRecognition/module/selfRegister.vue
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
diff --git a/src/views/faceRecognition/personInfoManage.vue b/src/views/faceRecognition/personInfoManage.vue
index 6c229ed..de00fcf 100644
--- a/src/views/faceRecognition/personInfoManage.vue
+++ b/src/views/faceRecognition/personInfoManage.vue
@@ -1,20 +1,18 @@
-
-
-
+
-
+
-
+
人脸查询
-
+
@@ -24,11 +22,11 @@
-
+
批量导入
-
+
自助注册
@@ -42,49 +40,45 @@
-
-
-
-
+
+
+
+
-
-
-
-
-
-
- 单页展示
- 列表展示
-
-
-
-
-
-
-
- 图文
- 链接
-
-
-
-
-
- 启用
- 停用
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 男
+ 女
-
-
-
-
+
+
+
+
-
-
+
+
+

+
摄像头拍摄
+
+
+
+
+
+
@@ -123,16 +123,19 @@ 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 FaceSearch from './module/faceSearch'
+import SelfRegister from './module/selfRegister'
+import BatchImport from './module/batchImport'
// import { exportFile } from '@/utils/index'
// import qs from 'qs'
import { mapGetters } from 'vuex'
-const defaultForm = { id: null, columnName: null, columnNo: null, columnType: 1, columnOrders: 999, columnContentType: 1, columnStatus: 1, columnRemarks: null }
+const defaultForm = { id: null, libcode: null, code: null, name: null, card: null, phone: null, sex: 1, type: 1 }
export default {
name: 'PersonInfoManage',
- components: { pagination, crudOperation, rrOperation },
+ components: { pagination, crudOperation, rrOperation, FaceSearch, SelfRegister, BatchImport },
cruds() {
- return CRUD({ title: '人员信息', url: 'api/fonds/initFondsList', crudMethod: { ...crudColumn }, optShow: {
+ return CRUD({ title: '人员信息', url: 'api/person/initPersonInfo', crudMethod: { ...crudColumn }, optShow: {
add: true,
edit: true,
del: false,
@@ -145,34 +148,28 @@ export default {
data() {
return {
permission: {
- add: ['admin', 'column:add'],
- edit: ['admin', 'column:edit'],
- del: ['admin', 'column:del']
+ add: ['admin', 'face:add'],
+ edit: ['admin', 'face:edit'],
+ del: ['admin', 'face:del']
},
- enabledTypeOptions: [
- { key: '1', display_name: '全部' },
- { key: '2', display_name: '已存照片' },
- { key: '3', display_name: '暂无照片' }
+ userTypeOptions: [
+ { value: 1, label: '普通用户' },
+ { value: 2, label: 'VIP用户' },
+ { value: 3, label: '黑名单用户' }
],
fiterBlackUser: false,
rules: {
- columnName: [
- { required: true, message: '请输入机构名称', trigger: 'blur' }
- ],
- columnNo: [
- { required: true, message: '请输入栏目编码', trigger: 'blur' }
- ],
- columnType: [
- { required: true, message: '请选择栏目类型', trigger: 'change' }
+ libcode: [
+ { required: true, message: '馆代码不可为空', trigger: 'blur' }
],
- columnContentType: [
- { required: true, message: '请选择内容类型', trigger: 'change' }
+ code: [
+ { required: true, message: '读者证号不可为空', trigger: 'blur' }
],
- columnOrders: [
- { required: true, message: '请输入排序', trigger: 'blur', type: 'number' }
+ name: [
+ { required: true, message: '姓名不可为空', trigger: 'blur' }
],
- columnStatus: [
- { required: true, message: '请选择状态', trigger: 'change' }
+ type: [
+ { required: true, message: '请选择用户类型', trigger: 'change' }
]
}
}
@@ -206,6 +203,15 @@ export default {
handleFiterBlackUser(val) {
console.log(val)
},
+ handleFaceSearch() {
+ this.$refs.faceSearchRefs.faceSearchVisible = true
+ },
+ handleSelfRegister() {
+ this.$refs.selfRegisterRefs.open()
+ },
+ handleBatchImport() {
+ this.$refs.batchImportRefs.batchImportVisible = true
+ },
toDelete(datas) {
this.$confirm('此操作将删除当前所选' + this.crud.title + '你是否还要继续?', '提示', {
confirmButtonText: '继续',
@@ -229,8 +235,9 @@ export default {
}).catch(() => {
})
},
- changeStatus(data, val) {
- this.$confirm('此操作将禁用 / 启用栏目 “' + data.fondsName + '”' + '你是否还要继续?', '提示', {
+ addBlackOrVipUser(data, type) {
+ const message = type === 1 ? 'VIP' : '黑名单'
+ this.$confirm('此操作将所选用户加入' + message + '你是否还要继续?', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning',
@@ -251,20 +258,25 @@ export default {
diff --git a/src/views/inquiryMachine/column.vue b/src/views/inquiryMachine/column.vue
index 906e0d6..7ad1f8e 100644
--- a/src/views/inquiryMachine/column.vue
+++ b/src/views/inquiryMachine/column.vue
@@ -43,9 +43,9 @@
-
+
-
+
图文详情
@@ -94,7 +94,12 @@
图文列表-外部跳转
-
+
+
+ {{ scope.row.sonCount }}
+ {{ scope.row.sonCount }}
+
+
diff --git a/src/views/inquiryMachine/content.vue b/src/views/inquiryMachine/content.vue
index 961ffb3..acf2f45 100644
--- a/src/views/inquiryMachine/content.vue
+++ b/src/views/inquiryMachine/content.vue
@@ -12,16 +12,16 @@
{{ node.label }}
- {{ data.sonCount }} /∞
- {{ data.sonCount }} /1
+ {{ data.sonCount }} /∞
+ {{ data.sonCount }} /1
{{ node.label }}
- {{ data.sonCount }} /∞
- {{ data.sonCount }} /1
+ {{ data.sonCount }} /∞
+ {{ data.sonCount }} /1
@@ -168,6 +168,7 @@ export default {
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
+ needRefreshTree: false,
labelName: '内容图片',
currentKeyColumn: {},
rules: {
@@ -253,6 +254,17 @@ export default {
item.topicType = this.currentKeyColumn.type
})
this.tableData = this.crud.data
+
+ if (this.needRefreshTree) {
+ this.needRefreshTree = false
+ this.getQueryTopicTree()
+ }
+ },
+ expandParents(node) {
+ node.expanded = true
+ if (node.parent) {
+ this.expandParents(node.parent)
+ }
},
// 新增与编辑前做的操作
[CRUD.HOOK.afterToCU](crud, form) {
@@ -289,6 +301,12 @@ export default {
this.form.introHtml = this.editorContent
return true
},
+ [CRUD.HOOK.afterSubmit]() {
+ this.needRefreshTree = true
+ },
+ [CRUD.HOOK.afterDelete]() {
+ this.needRefreshTree = true
+ },
imgAdd(pos, $file) {
const _this = this
var formdata = new FormData()
@@ -327,6 +345,7 @@ export default {
this.form.introHtml = html
},
getQueryTopicTree() {
+ this.columnTreeDatas = []
const parent = {}
parent.id = 0
parent.title = '栏目'
@@ -334,9 +353,22 @@ export default {
parent.children = res
this.columnTreeDatas.push(parent)
this.$nextTick(() => {
+ let currentKey
+ const storedKey = localStorage.getItem('currentColumnKey')
+ if (storedKey) {
+ const parsedKey = JSON.parse(storedKey)
+ if (parsedKey && parsedKey.id) {
+ currentKey = parsedKey
+ } else {
+ currentKey = this.columnTreeDatas[0].children[0]
+ }
+ } else {
+ currentKey = this.columnTreeDatas[0].children[0]
+ }
+
Vue.set(this.defaultExpandedKeys, 0, this.columnTreeDatas[0].children[0].id)
- this.$refs.tree.setCurrentKey(this.columnTreeDatas[0].children[0].id)
- this.handleNodeClick(this.columnTreeDatas[0].children[0])
+ this.$refs.tree.setCurrentKey(currentKey.id)
+ this.handleNodeClick(currentKey)
})
})
},
@@ -346,6 +378,7 @@ export default {
},
handleNodeClick(val) {
this.currentKeyColumn = val
+ localStorage.setItem('currentColumnKey', JSON.stringify(val))
console.log(val)
if (val && val.id !== 0) {
this.crud.query.libcode = this.user.fonds.fondsNo
@@ -370,6 +403,7 @@ export default {
this.$message({ message: '删除成功', type: 'success', offset: 8 })
this.crud.delAllLoading = false
this.crud.refresh()
+ this.getQueryTopicTree()
}).catch(err => {
this.crud.delAllLoading = false
console.log(err)
@@ -410,6 +444,12 @@ export default {
display: flex;
justify-content: space-between;
align-items: center;
+ em{
+ font-style: normal;
+ &.no-data-style{
+ color: rgb(237, 74, 65);
+ }
+ }
}
}
}
diff --git a/src/views/inquiryMachine/form.vue b/src/views/inquiryMachine/form.vue
deleted file mode 100644
index a1a6a19..0000000
--- a/src/views/inquiryMachine/form.vue
+++ /dev/null
@@ -1,175 +0,0 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
diff --git a/src/views/inquiryMachine/menu.vue b/src/views/inquiryMachine/menu.vue
index 4a63ded..e63320e 100644
--- a/src/views/inquiryMachine/menu.vue
+++ b/src/views/inquiryMachine/menu.vue
@@ -71,9 +71,9 @@
栏目列表
新书推荐
-
-
-
仅1级菜单可生成链接地址!
+
+
+ 点击查看链接(仅1级菜单可生成链接地址)!
@@ -100,6 +100,16 @@
+
+
+
+
+
+
+
@@ -141,7 +151,7 @@
-
+
@@ -149,7 +159,16 @@
-
+
+
+ {{ item.title }}
+ {{ getTypeText(item.type) }}
+
@@ -263,7 +282,9 @@ export default {
},
selectKey: Math.random(),
btnType: 'add',
- currentNodeLevel: 0
+ currentNodeLevel: 0,
+ urlDialogVisible: false,
+ finalLink: null
}
},
computed: {
@@ -288,6 +309,13 @@ export default {
}
return this.selectOptions
+ },
+ typeTextStyle() {
+ return {
+ float: 'right',
+ color: '#8492a6',
+ fontSize: '13px'
+ }
}
},
created() {
@@ -295,6 +323,15 @@ export default {
this.initScreenSetting()
},
methods: {
+ getTypeText(type) {
+ const typeMap = {
+ 1: '图文详情',
+ 2: '文字列表-图文详情',
+ 3: '图文列表-图文详情',
+ 4: '图文列表-外部跳转'
+ }
+ return typeMap[type]
+ },
getInitQueryTopic(type) {
FetchQueryTopicTree({ 'libcode': this.user.fonds.fondsNo, 'type': type }).then(res => {
this.columnDatas = res
@@ -430,31 +467,25 @@ export default {
console.log(`当前节点层级:${node.level}`)
},
changeType(val) {
- const currentSelected = this.form.queryTopicList // 当前选中的栏目数据
- let savedData = [] // 暂存处理后的数据(统一用数组过渡,避免类型混乱)
+ const currentSelected = this.form.queryTopicList
+ let savedData = []
- // 1. 统一处理当前选中数据,转为数组格式(无论之前是单选/多选)
if (currentSelected === null || currentSelected === undefined) {
- savedData = [] // 无选中数据时,初始化为空数组
+ savedData = []
} else if (Array.isArray(currentSelected)) {
- savedData = [...currentSelected] // 多选(数组):直接浅拷贝
+ savedData = [...currentSelected]
} else {
- savedData = [currentSelected] // 单选(单个对象):转为数组,便于统一处理
+ savedData = [currentSelected]
}
- // 2. 根据目标类型(val),赋值为对应格式(单选:单个对象 / 多选:数组)
if (val === 2) {
- // 目标类型:栏目显示(单选)- 取数组第一个元素,无则为null
this.form.queryTopicList = savedData.length > 0 ? savedData[0] : null
} else {
- // 目标类型:栏目列表/其他(多选)- 直接赋值数组,空则为空数组
this.form.queryTopicList = [...savedData]
}
- // 3. 强制刷新下拉框组件(解决切换类型后选项不更新的问题)
this.selectKey = Math.random()
- // 4. 按需加载对应类型的栏目数据(type=2加载特定类型,其他加载全部)
this.$nextTick(() => {
this.getInitQueryTopic(val === 2 ? 1 : null)
})
@@ -484,6 +515,7 @@ export default {
this.dialogTilte = '编辑菜单'
const editType = this.selectedMenu.type // 当前编辑菜单的类型
const topicList = this.selectedMenu.queryTopicList || [] // 原始栏目数据(数组)
+ this.changeType(editType)
this.form = {
queryMenu: {
id: this.selectedMenu.id,
@@ -643,6 +675,7 @@ export default {
handleClose() {
this.formVisible = false
this.btnLoading = false
+ this.urlDialogVisible = false
if (this.$refs['form']) {
this.$refs['form'].resetFields()
@@ -682,20 +715,21 @@ export default {
}
const linkSeparator = this.menuForm.query_preview.includes('?') ? '&' : '?'
- const finalLink = `${this.menuForm.query_preview}${linkSeparator}menuId=${this.selectedMenu.id}`
+ this.finalLink = `${this.menuForm.query_preview}${linkSeparator}menuId=${this.selectedMenu.id}`
+ this.urlDialogVisible = true
- navigator.clipboard.writeText(finalLink)
- .then(() => {
- this.copied = true
- this.$message.success('链接复制成功!') // 新增复制成功提示,提升用户体验
- setTimeout(() => {
- this.copied = false
- }, 2000)
- })
- .catch(err => {
- console.error('无法复制内容: ', err)
- this.fallbackCopyText(finalLink) // 兼容处理时传递拼接后的链接
- })
+ // navigator.clipboard.writeText(finalLink)
+ // .then(() => {
+ // this.copied = true
+ // this.$message.success('链接复制成功!') // 新增复制成功提示,提升用户体验
+ // setTimeout(() => {
+ // this.copied = false
+ // }, 2000)
+ // })
+ // .catch(err => {
+ // console.error('无法复制内容: ', err)
+ // this.fallbackCopyText(finalLink) // 兼容处理时传递拼接后的链接
+ // })
},
fallbackCopyText() {
const textArea = document.createElement('textarea')