新增页面优化,首页接口对接

This commit is contained in:
zzyuan 2025-12-26 18:03:17 +08:00
parent 30e9871d7a
commit 96e721df80
13 changed files with 1192 additions and 588 deletions

View File

@ -1,5 +1,6 @@
import request from '@/utils/request'
//获取统计数量接口
export function getStatisticsApi(data) {
return request({
url: '/certificate/certificate_manage/certificateInfo/statistics',
@ -21,3 +22,78 @@ export function getTaskStatisticsApi(data) {
data: data
})
}
//核验任务占比
export function verificationTaskProportionApi(data) {
return request({
url: '/certificate/certificate_system/certificateInfo/verificationTaskProportion',
method: 'post',
headers: {
//"merchant-id":"378915229716713472",
},
data: data
})
}
//护照类型占比
export function typesProportionApi(data) {
return request({
url: '/certificate/certificate_system/certificateInfo/typesProportion',
method: 'post',
headers: {
//"merchant-id":"378915229716713472",
},
data: data
})
}
//存取证排行
export function takeRankingListApi(data) {
return request({
url: '/certificate/certificate_system/certificateInfo/takeRankingList',
method: 'post',
headers: {
//"merchant-id":"378915229716713472",
},
data: data
})
}
//证件临期统计
export function certificateExpirationingStatisticsApi(data) {
return request({
url: '/certificate/certificate_system/certificateInfo/certificateExpirationingStatistics',
method: 'post',
headers: {
//"merchant-id":"378915229716713472",
},
data: data
})
}
//证件过期统计
export function certificateExpirationedStatisticsApi(data) {
return request({
url: '/certificate/certificate_system/certificateInfo/certificateExpirationedStatistics',
method: 'post',
headers: {
//"merchant-id":"378915229716713472",
},
data: data
})
}
//出国原因统计
export function abroadReasonsStatisticsApi(data) {
return request({
url: '/certificate/certificate_system/certificateInfo/abroadReasonsStatistics',
method: 'post',
headers: {
//"merchant-id":"378915229716713472",
},
data: data
})
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 433 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 136 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -1,22 +1,137 @@
<template>
<div class="app-container home">
<el-row :gutter="20">
<el-col :sm="24" :lg="12" style="padding-left: 20px">
<h2>证途通</h2>
<div class="app-container home" style="height: 100vh;padding: 0;">
<div style="width: 100%;display: flex;align-items: center;padding: 5px 20px;background: #006F68;">
<img src="../assets/appIndex/logo108px.png" style="width: 72px;height: 72px;margin-right: 20px;" alt="">
<h2 style="color: #FFF;">证途通</h2>
</div>
<el-divider />
<el-tabs type="border-card" tab-position="left" style="height: 85vh;">
<el-tab-pane label="首页">
<p>
<b>应用介绍:</b> <span>主要用于管理个人护照证件信息主要用于验证证件护照的真伪通过跳转微信12307移民局小程序验证信息,进行统一管理</span>
</p>
<p>
<b>当前版本:</b> <span>v1.1测试版本</span>
</p>
<p>
<b>应用名称:</b> <span>证途通:</span>
<b>上架状态:</b> <span>未上架</span>
</p>
<p>
<b>项目简介:</b> <span>证途通:主要用于管理个人护照证件信息主要用于验证证件护照的真伪通过跳转微信12307移民局小程序验证信息,进行统一管理</span>
<b>开发状态:</b> <span>测试功能</span>
</p>
</el-col>
</el-row>
<el-divider />
<el-row :gutter="20">
<p>
<b>项目周期:</b> <span>2025-11-01~2026-02-10</span>
</p>
<p>
<b>本网站备案信息:</b> <span>内网测试阶段暂时不对外开发</span>
</p>
<p>
<i class="el-icon-s-promotion"></i> <b>下载地址</b><el-link
href="https://app.liuyingyong.cn/build/download/1c91f3a0-dfd0-11f0-beb2-1de4779888ef"
target="_blank"
>https://app.liuyingyong.cn/build/download/1c91f3a0-dfd0-11f0-beb2-1de4779888ef</el-link
>
</p>
<p>
<b>版权所有:</b> <span>安徽博诺思信息科技有限公司</span>
</p>
<p>
<i class="el-icon-s-promotion"></i> <b>公司官网</b><el-link
href="http://www.ahbonus.cn"
target="_blank"
>http://www.ahbonus.cn</el-link
>
</p>
<p>
<b>官网备案信息:</b> <span>皖ICP备15003955号-3</span>
</p>
</el-tab-pane>
<el-tab-pane label="产品展示">
<div style="width: 100%;display: flex;align-items: center;overflow: auto;">
<div style="width: 16%;height: auto;display: flex;flex-direction: column;justify-content: center;margin-right: 1%;">
<img src="../assets/appIndex/app1.png" style="width: 100%;height: 650px;margin-bottom: 20px;" alt="">
<div style="font-size: 18px;">
<b>功能描述</b>
<span>首页展示待办信息消息提醒快捷入口等方便用户快捷找到需要的功能</span>
</div>
</div>
<div style="width: 16%;height: auto;display: flex;flex-direction: column;justify-content: center;margin-right: 1%;">
<img src="../assets/appIndex/app2.png" style="width: 100%;height: 650px;margin-bottom: 20px;" alt="">
<div style="font-size: 18px;">
<b>功能描述</b>
<span>工作台展示功能模块功能区分更方便使用</span>
</div>
</div>
<div style="width: 16%;height: auto;display: flex;flex-direction: column;justify-content: center;margin-right: 1%;">
<img src="../assets/appIndex/app3.png" style="width: 100%;height: 650px;margin-bottom: 20px;" alt="">
<div style="font-size: 18px;">
<b>功能描述</b>
<span>证件护照做区分展示更明显</span>
</div>
</div>
<div style="width: 16%;height: auto;display: flex;flex-direction: column;justify-content: center;margin-right: 1%;">
<img src="../assets/appIndex/app4.png" style="width: 100%;height: 650px;margin-bottom: 20px;" alt="">
<div style="font-size: 18px;">
<b>功能描述</b>
<span>核验跳转移民局小程序核验更准确</span>
</div>
</div>
<div style="width: 16%;height: auto;display: flex;flex-direction: column;justify-content: center;margin-right: 1%;">
<img src="../assets/appIndex/app5.png" style="width: 100%;height: 650px;margin-bottom: 20px;" alt="">
<div style="font-size: 18px;">
<b>功能描述</b>
<span>定期核验多人批量操作管理更方便</span>
</div>
</div>
<div style="width: 16%;height: auto;display: flex;flex-direction: column;justify-content: center;margin-right: 1%;">
<img src="../assets/appIndex/app6.png" style="width: 100%;height: 650px;margin-bottom: 20px;" alt="">
<div style="font-size: 18px;">
<b>功能描述</b>
<span>问题反馈及时处理</span>
</div>
</div>
</div>
</el-tab-pane>
<el-tab-pane label="项目管理">
<p>
<b>项目背景:</b>
<span>
为中大型企业单位内特殊人员出国出境等护照统一管理备案管理人员后统一上传护照信息根据护照信息进行核验与移民局12367小程序对接个人跳转移民局12307小程序手机身份证验证后获取护照信息与备案护照信息比对真伪
</span>
</p>
<p>
<b>核验流程:</b>
<img src="../assets/appIndex/app7.png" style="width: 50%;height: 400px;margin-bottom: 20px;" alt="">
</p>
</el-tab-pane>
<el-tab-pane label="技术开发">
<p>
<b>后台管理系统:</b> <span>主要基于Vue2Elemenet-UI,框架构建的后台管理系统用于管理人员使用电脑管理证件信息 </span>
</p>
<p>
<b>APP:</b> <span>主要基于Uni-APPVue2Uview组件,构建的建议APP用于被管理人员使用手机查看个人证件信息及跳转小程序核验证件信息 </span>
</p>
</el-tab-pane>
<el-tab-pane label="联系我们">
<p>
<b>安徽博诺思信息科技有限公司</b>
</p>
<p>
<b>电话:</b> <span>0551-62573713</span>
</p>
<p>
<b>网址:</b> <span>ahbonus.cn</span>
</p>
<p>
<b>邮箱:</b> <span>anhuibonus@163.com</span>
</p>
<p>
<b>地址:</b> <span>安徽省合肥市蜀山区天狮路588号MAX科技园702</span>
</p>
</el-tab-pane>
</el-tabs>
<!-- <el-row :gutter="20">
<el-col :xs="24" :sm="24" :md="12" :lg="8">
<el-card class="update-log">
<div slot="header" class="clearfix">
@ -39,37 +154,8 @@
</p>
</div>
</el-card>
</el-col>
<!-- <el-col :xs="24" :sm="24" :md="12" :lg="8">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>更新日志</span>
</div>
<el-collapse accordion>
<el-collapse-item title="v24.7.0">
<ol>
<li>支持多权限字符匹配角色数据权限</li>
<li>新增密码最大错误次数/锁定时间</li>
<li>登录日志新增解锁账户功能</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v27.7.1">
<ol>
<li>菜单新增终端管理配置</li>
<li>记录登录退出日志信息</li>
<li>数据范围过滤属性调整</li>
<li>权限部分代码调整</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
</el-collapse>
</el-card>
</el-col> -->
</el-row>
</el-col>
</el-row> -->
</div>
</template>
@ -91,7 +177,7 @@ export default {
</script>
<style scoped lang="scss">
.home {
.home {
blockquote {
padding: 10px 20px;
margin: 0 0 20px;
@ -126,14 +212,14 @@ export default {
margin-top: 0px;
}
h2 {
margin-top: 10px;
h2 {
font-size: 26px;
font-weight: 100;
font-weight: 600;
}
p {
margin-top: 10px;
padding: 5px 20px;
b {
font-weight: 700;

View File

@ -0,0 +1,441 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="90px">
<el-form-item label="关键字" prop="keyWord">
<el-input
v-model="queryParams.keyWord"
placeholder="请输入标题"
clearable maxlength="20"
style="width: 300px"
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="tableListData" height="800">
<!-- <el-table-column type="selection" width="55" align="center"/> -->
<el-table-column label="序号" align="center" width="80" type="index">
<template slot-scope="scope">
<span>{{(queryParams.pageNum - 1) * queryParams.pageSize + scope.$index + 1}}</span>
</template>
</el-table-column>
<el-table-column label="标题" align="center" prop="title" :show-overflow-tooltip="true"/>
<el-table-column label="内容" align="center" prop="content" :show-overflow-tooltip="true"/>
<!-- <el-table-column label="是否启用" align="center" prop="state" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.state==1"></span>
<span v-if="scope.row.state==2"></span>
</template>
</el-table-column> -->
<el-table-column label="附件" align="center" prop="" :show-overflow-tooltip="true">
<template slot-scope="scope">
<span v-if="scope.row.fileUrl!=''" @click="checkFile(scope.row)" style="cursor: pointer;color: #46a6ff;">查看</span>
<span v-else>无附件</span>
</template>
</el-table-column>
<el-table-column label="操作" align="center" width="200" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
@click="handleUpdate(scope.row)"
>编辑</el-button>
<el-button
size="mini"
type="text"
style="color: red;"
@click="handleDelete(scope.row)"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改参数配置对话框 -->
<el-dialog :title="title+''" :visible.sync="open" width="800px" append-to-body>
<el-form ref="baseForm" :model="baseForm" :rules="baseFormRules" label-width="120px" style="width: 100%;height: 500px;overflow-y: auto;padding-right: 10px;">
<el-row>
<el-col :span="24" >
<el-form-item label="标题" prop="title">
<el-input v-model="baseForm.title" placeholder="请输入标题" maxlength="30"></el-input>
</el-form-item>
</el-col>
<el-col :span="24" >
<el-form-item label="使用类型" prop="useType">
<el-radio-group v-model="baseForm.useType">
<el-radio label="1">文本内容</el-radio>
<el-radio label="2">附件内容</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="文本内容" prop="content">
<el-input v-model="baseForm.content" :autosize="{ minRows: 4, maxRows: 8}" type="textarea" placeholder="请输入文本内容" maxlength="200"></el-input>
</el-form-item>
</el-col>
<el-col :span="24">
<el-form-item label="附件上传">
<el-upload
ref="upload"
:limit="1"
accept=".pdf"
:headers="upload.headers"
:action="upload.url"
:disabled="upload.isUploading"
:on-progress="handleFileUploadProgress"
:file-list="fileList"
:on-success="handleFileSuccess"
:on-remove="handleRemove"
:on-preview="handlePreviewDownloadFile"
:auto-upload="true"
drag
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将文件拖到此处<em>点击上传</em></div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm()"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
<el-dialog title="附件列表" :visible.sync="openFile" width="500px" append-to-body>
<div style="width: 100%;height: 240px;padding: 10px;color: #46a6ff;display: flex;flex-wrap: wrap;">
<div v-for="(item,index) in fileList" :key="index" style="margin: 10px;">
<div style="margin-bottom: 10px;"><img :src="item.url" @click="handlePictureCardPreview(item)" style="width: 60px;height: 60px;margin-right: 8px;"/></div>
<div style="cursor: pointer;" @click="handlePreviewDownloadFile(item)">{{ item.name }}</div>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="openFile=false"> </el-button>
</div>
</el-dialog>
<el-dialog :visible.sync="dialogVisible" width="700px">
<img style="width: 100%;height: 100%;" :src="dialogImageUrl" alt="">
</el-dialog>
</div>
</template>
<script>
import { getCertificateApplyListPageApi,addCertificateApplyApi, editCertificateApplyApi,
delCertificateApplyApi,revokeCertificateApplyApi } from "@/api/certificateManage/index";
import base64 from 'base-64';
import { getToken } from '@/utils/auth'
import { downloadFileByUrl } from '@/utils/download'
import Treeselect from '@riophae/vue-treeselect'
import '@riophae/vue-treeselect/dist/vue-treeselect.css'
export default {
name: "certificateInfo",
components: { Treeselect },
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
tableListData: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
keyWord:null,//
},
//
baseForm: {
title:"",
useType:"1",
content:""
},
//
baseFormRules: {
title: [
{ required: true, message: "标题不能为空", trigger: "change" }
],
useType: [
{ required: true, message: "使用类型不能为空", trigger: "change" }
],
content: [
{ required: true, message: "文本内容不能为空", trigger: "change" }
]
},
//
upload: {
//
isUploading: false,
//
headers: { Authorization: 'Bearer ' + getToken() },
//
url: process.env.VUE_APP_BASE_API + '/file/upload?type=file',
},
fileList:[],
fileUrls:[],
fileNames:[],
openFile:false,//
dialogVisible:false,//
dialogImageUrl:"",//
};
},
mounted(){
this.getList();
},
methods: {
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
/** 查询列表 */
getList() {
// this.loading = true;
// let param = {
// "pageNum":this.queryParams.pageNum,
// "pageSize":this.queryParams.pageSize,
// "keyWord":this.queryParams.keyWord,
// }
// getCertificateApplyListPageApi(param).then(response => {
// this.tableListData = response.rows;
// this.total = Number(response.total);
this.loading = false;
// });
},
//
reset() {
this.fileList=[]
this.fileUrls=[]
this.fileNames = []
this.baseForm = {
title:"",
useType:"1",
content:""
};
this.resetForm("baseForm");
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "新增";
console.log("this.baseForm",this.baseForm);
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.open = true;
this.baseForm = Object.assign({}, row)
if(row.fileUrl&&row.fileUrl!=''){
let arr = row.fileUrl.split(",");
let arr2 = row.fileName.split(",");
arr.forEach((item,index)=>{
this.fileList.push({url:item,name:arr2[index]})
this.fileUrls.push(item)
this.fileNames.push(arr2[index])
})
}else{
this.fileList=[]
this.fileUrls=[]
this.fileNames = []
}
this.title = "修改";
},
/** 提交按钮 */
submitForm: function(type) {
//applyState -1 0
this.baseForm.applyState = type;
//fileUrls
this.baseForm.fileUrls = this.fileUrls
this.baseForm.fileNames = this.fileNames
console.log("this.baseForm",this.baseForm);
this.$refs["baseForm"].validate(valid => {
if (valid) {
if (this.baseForm.checkId != undefined) {
editCertificateApplyApi(this.baseForm).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addCertificateApplyApi(this.baseForm).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
handleRevoke(row) {
this.$modal.confirm('是否确认撤销申请?').then(() => {
revokeCertificateApplyApi({checkId:row.checkId}).then(response => {
console.log("revokeCertificateApplyApi",response);
this.getList();
this.$modal.msgSuccess("撤销成功");
return;
});
}).catch(() => {});
},
/** 删除按钮操作 */
handleDelete(row) {
this.$modal.confirm('是否确认删除数据项?').then(() => {
delCertificateApplyApi({checkId:row.checkId}).then(response => {
console.log("delCertificateApplyApi",response);
this.getList();
this.$modal.msgSuccess("删除成功");
return;
});
}).catch(() => {});
},
//
handleFileUploadProgress(event, file, fileList) {
this.upload.isUploading = true
},
//
handleFileSuccess(response, file, fileList) {
this.upload.isUploading = false;
if(response.code==200){
this.fileUrls.push(response.data.url)
this.fileNames.push(response.data.name)
this.$modal.msgSuccess(response.msg);
}else{
this.$modal.msgError(response.msg);
}
},
handleRemove(file, fileList) {
let sum = 0
this.fileNames.forEach((item, index) => {
if (item == file.name) {
sum = index
}
})
this.fileUrls.splice(sum, 1)
this.fileNames.splice(sum, 1)
},
async handlePreviewDownloadFile(file) {
if (file.url != null && file.url !== '') {
let downloadUrl = file.url;
try {
const response = await fetch(downloadUrl); //
if (!response.ok) {
throw new Error('文件下载失败');
}
const blob = await response.blob(); // Blob
const link = document.createElement('a');
link.href = URL.createObjectURL(blob); // URL
link.download = file.name; //
document.body.appendChild(link); // DOM
link.click(); //
document.body.removeChild(link); // <a>
} catch (error) {
message.warning("文件下载失败!");
console.error(error);
}
}
if (file.raw != null && file.raw !== '') {
const blob = file.raw; // Blob
const link = document.createElement('a');
link.href = URL.createObjectURL(blob); // URL
link.download = file.name; //
document.body.appendChild(link); // DOM
link.click(); //
document.body.removeChild(link); // <a>
}
},
checkFile(row){
this.fileList=[]
this.fileUrls=[]
this.fileNames = []
if(row.fileUrl&&row.fileUrl!=''){
let arr = row.fileUrl.split(",");
let arr2 = row.fileName.split(",");
arr.forEach((item,index)=>{
this.fileList.push({url:item,name:arr2[index]})
this.fileUrls.push(item)
this.fileNames.push(arr2[index])
})
}
this.openFile = true
},
//
handlePictureCardPreview(file) {
this.dialogImageUrl = file.url
this.dialogVisible = true
},
formatDate(date) {
const year = date.getFullYear();
const month = String(date.getMonth() + 1).padStart(2, '0'); // 0
const day = String(date.getDate()).padStart(2, '0');
return `${year}-${month}-${day}`;
},
}
};
</script>
<style scoped lang="scss">
::v-deep .el-upload {
width: 100%;
}
::v-deep .el-upload-dragger{
width: 100%;
}
.form-title{
display: flex;
align-items: flex-end;
// width: 100%;
// height: 40px;
background: #e7f0fa;
border-left: 3px solid #46a6ff;
margin: 10px 0;
padding: 5px;
}
.form-item{
width: 100%;
font-size: 14px !important;
}
</style>

File diff suppressed because it is too large Load Diff

View File

@ -39,8 +39,8 @@ module.exports = {
// target: `http://127.0.0.1:48380`,//测试
// target: `http://192.168.2.108:48380`,//测试
// target: `http://192.168.137.1:48380`,//测试
// target: `http://192.168.1.120:48380`,//测试
target: `http://192.168.0.14:48380`,//
target: `http://192.168.1.101:48380`,//测试
// target: `http://192.168.0.14:48380`,//
changeOrigin: true,
pathRewrite: {
['^' + process.env.VUE_APP_BASE_API]: '',