Browse Source

人脸识别页面

master
xuhuajiao 4 weeks ago
parent
commit
baa9333625
  1. 22
      src/assets/iconfonts/light/iconfont.css
  2. 2
      src/assets/iconfonts/light/iconfont.js
  3. 28
      src/assets/iconfonts/light/iconfont.json
  4. BIN
      src/assets/iconfonts/light/iconfont.ttf
  5. BIN
      src/assets/iconfonts/light/iconfont.woff
  6. BIN
      src/assets/iconfonts/light/iconfont.woff2
  7. 22
      src/views/digitalScreen/module/areaSetting.vue
  8. 2
      src/views/digitalScreen/module/mediaSetting.vue
  9. 186
      src/views/faceRecognition/faceRecLog.vue
  10. 270
      src/views/faceRecognition/personInfoManage.vue

22
src/assets/iconfonts/light/iconfont.css

@ -1,8 +1,8 @@
@font-face { @font-face {
font-family: "iconfont"; /* Project id 3966148 */ font-family: "iconfont"; /* Project id 3966148 */
src: url('iconfont.woff2?t=1755072475931') format('woff2'),
url('iconfont.woff?t=1755072475931') format('woff'),
url('iconfont.ttf?t=1755072475931') format('truetype');
src: url('iconfont.woff2?t=1755595283030') format('woff2'),
url('iconfont.woff?t=1755595283030') format('woff'),
url('iconfont.ttf?t=1755595283030') format('truetype');
} }
.iconfont { .iconfont {
@ -13,6 +13,22 @@
-moz-osx-font-smoothing: grayscale; -moz-osx-font-smoothing: grayscale;
} }
.icon-yuzhuceqiye:before {
content: "\e69a";
}
.icon-yonghuzhuce:before {
content: "\e69b";
}
.icon-shenfen:before {
content: "\e698";
}
.icon-shenfenshimingrenzheng:before {
content: "\e699";
}
.icon-fuzhichenggong1:before { .icon-fuzhichenggong1:before {
content: "\e696"; content: "\e696";
} }

2
src/assets/iconfonts/light/iconfont.js
File diff suppressed because it is too large
View File

28
src/assets/iconfonts/light/iconfont.json

@ -5,6 +5,34 @@
"css_prefix_text": "icon-", "css_prefix_text": "icon-",
"description": "", "description": "",
"glyphs": [ "glyphs": [
{
"icon_id": "704557",
"name": "预注册企业",
"font_class": "yuzhuceqiye",
"unicode": "e69a",
"unicode_decimal": 59034
},
{
"icon_id": "5651535",
"name": "用户注册",
"font_class": "yonghuzhuce",
"unicode": "e69b",
"unicode_decimal": 59035
},
{
"icon_id": "6421901",
"name": "身份",
"font_class": "shenfen",
"unicode": "e698",
"unicode_decimal": 59032
},
{
"icon_id": "22785279",
"name": "身份实名认证",
"font_class": "shenfenshimingrenzheng",
"unicode": "e699",
"unicode_decimal": 59033
},
{ {
"icon_id": "40338657", "icon_id": "40338657",
"name": "复制成功-copy", "name": "复制成功-copy",

BIN
src/assets/iconfonts/light/iconfont.ttf

BIN
src/assets/iconfonts/light/iconfont.woff

BIN
src/assets/iconfonts/light/iconfont.woff2

22
src/views/digitalScreen/module/areaSetting.vue

@ -223,10 +223,7 @@ export default {
geoJsonVisible: false, geoJsonVisible: false,
link: 'https://datav.aliyun.com/portal/school/atlas/area_selector', link: 'https://datav.aliyun.com/portal/school/atlas/area_selector',
copied: false, copied: false,
tableData: [
// { name: '', libcode: 'lib001', province: '114.133561,30.641408', number: '3' },
// { name: '1', libcode: 'lib001', province: '114.133561,30.641408', number: '3' }
],
tableData: [],
page: { page: {
page: 0, page: 0,
size: 10, size: 10,
@ -259,11 +256,7 @@ export default {
{ required: true, message: '馆代码不可为空', trigger: 'blur' } { required: true, message: '馆代码不可为空', trigger: 'blur' }
] ]
}, },
libImgList: [
// { url: require('@/assets/images/cover-bg.png') },
// { url: require('@/assets/images/cover-bg.png') },
// { url: require('@/assets/images/cover-bg.png') }
]
libImgList: []
} }
}, },
computed: { computed: {
@ -588,18 +581,21 @@ export default {
margin-bottom: 10px; margin-bottom: 10px;
.libImg-item{ .libImg-item{
position: relative; position: relative;
height: 120px;
display: flex;
justify-content: flex-start;
height: 110px;
margin-right: 10px; margin-right: 10px;
img{ img{
display: block; display: block;
height: 100%; height: 100%;
} }
i{ i{
position: absolute;
left: 4px;
top: 0;
// position: absolute;
// left: 4px;
// top: 0;
color: red; color: red;
cursor: pointer; cursor: pointer;
margin: 76px 0 0 5px;
} }
} }
} }

2
src/views/digitalScreen/module/mediaSetting.vue

@ -486,9 +486,11 @@ export default {
handleVideoSizeChange(size) { handleVideoSizeChange(size) {
this.videoPage.size = size this.videoPage.size = size
this.videoPage.page = 0 this.videoPage.page = 0
this.initScreenVideo()
}, },
handleVideoCurrentPage(val) { handleVideoCurrentPage(val) {
this.videoPage.page = val this.videoPage.page = val
this.initScreenVideo()
} }
} }
} }

186
src/views/faceRecognition/faceRecLog.vue

@ -0,0 +1,186 @@
<template>
<div class="app-container row-container">
<!--工具栏-->
<div class="head-container">
<div class="head-search" style="align-items: center;">
<!-- 搜索 -->
<el-select v-model="query.status" clearable size="small" placeholder="操作类型" class="filter-item" style="width: 150px;" @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>
<el-input
v-model="keyWord"
size="small"
clearable
placeholder="请输入关键词"
style="width: 340px;"
class="input-prepend filter-item"
@clear="crud.toQuery"
@keyup.enter.native="crud.toQuery"
>
<el-select slot="prepend" v-model="optionVal" style="width: 150px" @change="searchChange">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
/>
</el-select>
</el-input>
<date-range-picker v-model="blurryTime" class="date-item" />
<rrOperation />
</div>
<crudOperation :permission="permission">
<template v-slot:right>
<!-- :disabled="crud.selections.length === 0" -->
<el-button :loading="crud.downloadLoading" size="mini" @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" highlight-current-row style="width: 100%;" height="calc(100vh - 330px)" :data="crud.data" @selection-change="crud.selectionChangeHandler">
<el-table-column type="index" label="序号" width="55" />
<el-table-column prop="name" label="操作者(读者证号/读者姓名)" />
<el-table-column prop="code" label="操作设备(设备编号/设备名称)" />
<el-table-column prop="type" label="所属机构(机构编号/机构名称)" />
<el-table-column prop="cardNum" label="操作类型" />
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="操作时间">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<pagination />
</div>
</div>
</template>
<script>
import crudColumn from '@/api/inquiryMachine/column'
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 DateRangePicker from '@/components/DateRangePicker'
// 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 }
export default {
name: 'PersonInfoManage',
components: { pagination, crudOperation, rrOperation, DateRangePicker },
cruds() {
return CRUD({ title: '人脸识别日志', url: 'api/fonds/initFondsList', crudMethod: { ...crudColumn }, optShow: {
add: false,
edit: false,
del: false,
reset: true,
download: false,
group: false
}})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
permission: {
add: ['admin', 'column:add'],
edit: ['admin', 'column:edit'],
del: ['admin', 'column:del']
},
enabledTypeOptions: [
{ key: '1', display_name: '借书登录' },
{ key: '2', display_name: '信息绑定登录' },
{ key: '3', display_name: '查询续借登录' }
],
blurryTime: [],
keyWord: '',
optionVal: 'username',
options: [
{ value: 'username', label: '读者证号/读者姓名' },
{ value: 'account', label: '设备名称/设备编号' }
]
}
},
computed: {
...mapGetters([
'baseApi',
'user'
])
},
created() {
},
mounted() {
},
methods: {
[CRUD.HOOK.beforeRefresh]() {
console.log('this', this.keyWord)
console.log('this.optionVal', this.optionVal)
this.crud.query[this.optionVal] = this.keyWord
if (this.blurryTime) {
this.crud.query.startTime = this.blurryTime[0]
this.crud.query.endTime = this.blurryTime[1]
} else {
this.crud.query.startTime = null
this.crud.query.endTime = null
}
},
[CRUD.HOOK.afterRefresh]() {
},
//
[CRUD.HOOK.beforeToAdd](crud, form) {
},
//
[CRUD.HOOK.beforeToEdit](crud, form) {
},
//
[CRUD.HOOK.afterValidateCU](crud) {
console.log(crud.form)
return true
},
searchChange(val) {
if (val) {
this.keyWord = ''
this.options.forEach(option => {
if (option.value !== val) {
this.crud.query[option.value] = null
}
})
}
},
doExport(data) {
console.log(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
}
console.log('params', params)
// exportFile(this.baseApi + '/api/log/downloadErrorLog?' + qs.stringify(params, { indices: false }))
}).catch(() => {
})
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .input-prepend .el-input__inner{
padding-left: 160px;
}
</style>

270
src/views/faceRecognition/personInfoManage.vue

@ -0,0 +1,270 @@
<template>
<div class="app-container row-container">
<!--工具栏-->
<div class="head-container">
<div class="head-search" style="align-items: center; ">
<!-- 搜索 -->
<el-select v-model="query.status" clearable size="small" placeholder="状态" class="filter-item" style="width: 120px;" @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>
<el-input v-model="query.blurry" size="small" clearable placeholder="输入证号、姓名、身份证号搜索" prefix-icon="el-icon-search" class="filter-item" style="width: 260px;" @keyup.enter.native="crud.toQuery" />
<rrOperation />
<el-button size="mini" class="face-search" style="background: transparent; margin-right: 10px;">
<i class="iconfont icon-shenfen" />
人脸查询
</el-button>
<el-checkbox v-model="fiterBlackUser" label="仅显示黑名单用户" name="fiterBlackUser" @change="handleFiterBlackUser($event)" />
</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 size="mini">
<i class="iconfont icon-piliangchengjian" />
批量导入
</el-button>
<el-button size="mini">
<i class="iconfont icon-yuzhuceqiye" />
自助注册
</el-button>
</template>
</crudOperation>
</div>
<div class="container-wrap">
<span class="right-top-line" />
<span class="left-bottom-line" />
<el-dialog :close-on-click-modal="false" :modal-append-to-body="false" append-to-body :before-close="crud.cancelCU" :visible.sync="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" :inline="true" :model="form" :rules="rules" size="small" label-width="110px">
<el-row>
<el-form-item label="栏目名称" prop="columnName">
<el-input v-model="form.columnName" style="width: 586px;" />
</el-form-item>
</el-row>
<el-form-item label="栏目编码" prop="columnNo">
<el-input v-model="form.columnNo" />
</el-form-item>
<el-form-item label="栏目类型" prop="columnType">
<el-radio-group v-model="form.columnType">
<el-radio :label="1">单页展示</el-radio>
<el-radio :label="0">列表展示</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item label="排序" prop="columnOrders">
<el-input-number
v-model.number="form.columnOrders"
:min="0"
:max="999"
controls-position="right"
/>
</el-form-item>
<el-form-item label="内容类型" prop="columnContentType">
<el-radio-group v-model="form.columnContentType">
<el-radio :label="1">图文</el-radio>
<el-radio :label="0">链接</el-radio>
</el-radio-group>
</el-form-item>
<el-row>
<el-form-item label="状态" prop="columnStatus">
<el-radio-group v-model="form.columnStatus">
<el-radio :label="1">启用</el-radio>
<el-radio :label="0">停用</el-radio>
</el-radio-group>
</el-form-item>
</el-row>
<el-row>
<el-form-item label="备注" prop="columnRemarks">
<el-input v-model="form.columnRemarks" style="width: 586px;" rows="3" type="textarea" />
</el-form-item>
</el-row>
</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-table ref="table" v-loading="crud.loading" highlight-current-row style="width: 100%;" height="calc(100vh - 330px)" :data="crud.data" @selection-change="crud.selectionChangeHandler">
<el-table-column type="selection" align="center" width="55" />
<el-table-column type="index" label="序号" width="55" />
<el-table-column prop="name" label="姓名" />
<el-table-column prop="code" label="性别" />
<el-table-column prop="type" label="读者证号" />
<el-table-column prop="cardNum" label="身份证号" />
<el-table-column prop="libcode" label="馆代码" />
<el-table-column prop="columnOrders" label="已存照片" align="center" />
<el-table-column label="黑名单" align="center" prop="columnStatus">
<template slot-scope="scope">
<el-switch v-model="scope.row.columnStatus" active-color="#409EFF" inactive-color="#F56C6C" :active-value="1" :inactive-value="0" @change="changeStatus(scope.row, scope.row.columnStatus)" />
</template>
</el-table-column>
<el-table-column :show-overflow-tooltip="true" prop="createTime" label="操作时间">
<template slot-scope="scope">
<div>{{ scope.row.createTime | parseTime }}</div>
</template>
</el-table-column>
</el-table>
<!--分页组件-->
<pagination />
</div>
</div>
</template>
<script>
import crudColumn from '@/api/inquiryMachine/column'
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 { 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 }
export default {
name: 'PersonInfoManage',
components: { pagination, crudOperation, rrOperation },
cruds() {
return CRUD({ title: '人员信息', url: 'api/fonds/initFondsList', crudMethod: { ...crudColumn }, optShow: {
add: true,
edit: true,
del: false,
reset: true,
download: false,
group: false
}})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
data() {
return {
permission: {
add: ['admin', 'column:add'],
edit: ['admin', 'column:edit'],
del: ['admin', 'column:del']
},
enabledTypeOptions: [
{ key: '1', display_name: '全部' },
{ key: '2', display_name: '已存照片' },
{ key: '3', display_name: '暂无照片' }
],
fiterBlackUser: false,
rules: {
columnName: [
{ required: true, message: '请输入机构名称', trigger: 'blur' }
],
columnNo: [
{ required: true, message: '请输入栏目编码', trigger: 'blur' }
],
columnType: [
{ required: true, message: '请选择栏目类型', trigger: 'change' }
],
columnContentType: [
{ required: true, message: '请选择内容类型', trigger: 'change' }
],
columnOrders: [
{ required: true, message: '请输入排序', trigger: 'blur', type: 'number' }
],
columnStatus: [
{ required: true, message: '请选择状态', trigger: 'change' }
]
}
}
},
computed: {
...mapGetters([
'baseApi',
'user'
])
},
created() {
},
mounted() {
},
methods: {
[CRUD.HOOK.beforeRefresh]() {
},
[CRUD.HOOK.afterRefresh]() {
},
//
[CRUD.HOOK.beforeToAdd](crud, form) {
},
//
[CRUD.HOOK.beforeToEdit](crud, form) {
},
//
[CRUD.HOOK.afterValidateCU](crud) {
console.log(crud.form)
return true
},
handleFiterBlackUser(val) {
console.log(val)
},
toDelete(datas) {
this.$confirm('此操作将删除当前所选' + this.crud.title + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
this.crud.delAllLoading = true
const ids = []
datas.forEach(val => {
ids.push(val.fondsId)
})
// crudColumn.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(() => {
})
},
changeStatus(data, val) {
this.$confirm('此操作将禁用 / 启用栏目 “' + data.fondsName + '”' + '<span>你是否还要继续?</span>', '提示', {
confirmButtonText: '继续',
cancelButtonText: '取消',
type: 'warning',
dangerouslyUseHTMLString: true
}).then(() => {
// crudColumn.FetchUpdateFondsStatus(data).then(res => {
// this.$message({ message: '', type: 'success', offset: 8 })
// }).catch(() => {
// data.fondsStatus = !data.fondsStatus
// })
}).catch(() => {
this.$message({ message: '已取消修改', offset: 8 })
// data.fondsStatus = data.fondsStatus ? 0 : 1
})
}
}
}
</script>
<style lang="scss" scoped>
::v-deep .el-dialog {
.el-dialog__body {
.el-form-item{
&:nth-child(odd){
margin-right: 0 !important;
}
}
}
}
.face-search.el-button:hover,
.face-search.el-button:focus,
.face-search.el-button--info.is-plain:hover,
.face-search.el-button--info.is-plain:focus{
background: #E8F2FF !important;
}
</style>
Loading…
Cancel
Save