Commit ebb848ed by 周海峰

加密管理

parent bf195290
import request from '@/utils/request' import request from '@/utils/request'
import { pa } from 'element-plus/es/locales.mjs'
export function query(data) { /**
* 查询批量原始数据
* @param {*} data
* @returns
*/
export function queryBatchOriginalList(data) {
return request({ return request({
url: '/', url: '/core/encryptionconfig/queryBatchOriginalList',
method: 'post', method: 'post',
data: data data: data
}) })
} }
/**
* 查询所有加密数据
* @param {*} data
* @returns
*/
export function queryAllEncrypted(data) {
return request({
url: '/core/encryptionconfig/queryAllEncrypted',
method: 'post',
data: data
})
}
/**
* 删除批量表字段
* @param {*} data projectid
* @returns
*/
export function delBatchTableColumn(data) {
return request({
url: '/switchfield/delBatchTableColumn',
method: 'post',
data: data
})
}
/**
* 加载批量表参数
* @param {*} data operate
* @param {*} data projectid
* @returns
*/
export function loadingBatchTableParams(data) {
return request({
url: '/core/encryption/loadingBatchTableParams',
method: 'post',
data: data
})
}
/**
* 加载进度
* @param {*} data
* @returns
*/
export function loadingProgress(data) {
return request({
url: '/core/encryption/loadingProgress',
method: 'post',
data: data
})
}
/**
* 获取进度日志
* @param {*} data
* @returns
*/
export function getProcesslog(query) {
return request({
url: '/core/encryption/getProcesslog',
method: 'get',
params: query
})
}
\ No newline at end of file
// 状态标识对象数组
const encryptFlag = [
{ value: '0', label: '无' },
{ value: '-2', label: '解密中', type: 'warning' },
{ value: '-1', label: '加密中', type: 'warning' },
// { value: '1', label: '加密完成' },
{ value: '5', label: '加密完成', type: 'success' },
{ value: '4', label: '加密失败' ,type: 'danger'},
{ value: '44', label: '解密失败' ,type: 'danger'},
// { value: '6', label: '解密完成' },
{ value: '7', label: '解密完成' ,type: 'success'}
// { value: '9', label: '加密替换失败' },
// { value: '10', label: '解密替换失败' },
// { value: '11', label: '解密校验失败' },
// { value: '12', label: '加密校验失败' }
]
export default encryptFlag;
\ No newline at end of file
...@@ -117,6 +117,8 @@ import { queryOriginalList, queryEncryptionList, hasRedundanceColumns, ...@@ -117,6 +117,8 @@ import { queryOriginalList, queryEncryptionList, hasRedundanceColumns,
loadingColumn, checkCanReload ,removeLoadingColumn, checkTableEncOrDecColumn, loadingColumn, checkCanReload ,removeLoadingColumn, checkTableEncOrDecColumn,
loadingTableParams, reloadingColumn loadingTableParams, reloadingColumn
} from '@/api/classification/classification.js' } from '@/api/classification/classification.js'
import encryptFlag from '@/constants/encryptFlag.js'
const props = defineProps({ const props = defineProps({
// tableData: { // tableData: {
// type: Array, // type: Array,
...@@ -183,23 +185,6 @@ const getTableData = async () => { ...@@ -183,23 +185,6 @@ const getTableData = async () => {
tableDataCache.value = JSON.parse(JSON.stringify(tableData.value)) tableDataCache.value = JSON.parse(JSON.stringify(tableData.value))
} }
// 状态标识对象数组
const encryptFlag = [
{ value: '0', label: '无' },
{ value: '-2', label: '解密中' },
{ value: '-1', label: '加密中' },
{ value: '1', label: '加密完成' },
{ value: '5', label: '加密完成' },
{ value: '4', label: '加密失败' },
{ value: '44', label: '解密失败' },
{ value: '6', label: '解密完成' },
{ value: '7', label: '解密完成' },
{ value: '9', label: '加密替换失败' },
{ value: '10', label: '解密替换失败' },
{ value: '11', label: '解密校验失败' },
{ value: '12', label: '加密校验失败' }
]
/** /**
* 加密状态标识 * 加密状态标识
*/ */
......
<script setup lang="ts" name="QueryForm"> <script setup>
import { computed,ref,watch } from 'vue' import { computed, ref, watch } from 'vue';
import type { FormInstance } from 'element-plus' import PageWrapperSearch from '@/components/search/PageWrapperSearch.vue';
import PageWrapperSearch from '@/components/search/PageWrapperSearch.vue' import encryptFlag from '@/constants/encryptFlag.js';
// import { useDict } from '@/utils/dict' const emit = defineEmits(['update:modelValue', 'query', 'reset']);
// import { listDept } from '@/api/system/dept'// 部门 const props = defineProps({
modelValue: Object
});
// const { approve_status, invoice_status} = useDict('approve_status', 'invoice_status')
const emit = defineEmits(['update:modelValue', 'query', 'reset'])
const invoice_status_filter = ref([])
const employeesList = ref([])
const props = defineProps<{
modelValue: any
}>()
const queryForm = computed({ const queryForm = computed({
get() { get() {
return props.modelValue return props.modelValue;
}, },
set(val: any) { set(val) {
console.log('query computed', val) console.log('query computed', val);
emit('update:modelValue', val) emit('update:modelValue', val);
} }
}) });
// 搜索 // 搜索
function onSearch() { function onSearch() {
emit('query') emit('query');
} }
// 重置 // 重置
function onReset(formRef: FormInstance) { function onReset(formRef) {
queryForm.value.datasource = '' queryForm.value.datasource = '';
queryForm.value.schema = '' queryForm.value.schema = '';
queryForm.value.tableName = '' queryForm.value.tableName = '';
queryForm.value.fieldName = '' queryForm.value.fieldName = '';
queryForm.value.status = '' queryForm.value.status = [];
emit('reset', formRef) emit('reset', formRef);
} }
</script> </script>
<template> <template>
...@@ -87,10 +75,10 @@ function onReset(formRef: FormInstance) { ...@@ -87,10 +75,10 @@ function onReset(formRef: FormInstance) {
<el-select <el-select
v-model="queryForm.status" v-model="queryForm.status"
placeholder="请选择状态" placeholder="请选择状态"
multiple
clearable clearable
> >
<el-option label="启用" value="active" /> <el-option v-for="value in encryptFlag" :label="value.label" :value="value.value" />
<el-option label="禁用" value="inactive" />
</el-select> </el-select>
</el-form-item> </el-form-item>
</page-wrapper-search> </page-wrapper-search>
......
<script setup name="ProjectManageList"> <script setup name="ProjectManageList">
import { getCurrentInstance, reactive, ref, toRefs } from 'vue' import { onMounted, reactive, ref, toRefs } from 'vue'
import { ElMessage } from 'element-plus' import { ElMessage } from 'element-plus'
import QueryForm from './QueryForm.vue' import QueryForm from './QueryForm.vue'
import { changeRoute } from '@/utils/switchRoute' import { changeRoute } from '@/utils/switchRoute'
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'
import { queryBatchOriginalList, delBatchTableColumn, loadingBatchTableParams, loadingProgress, getProcesslog } from '@/api/classification/encryptionManagement.js'
import useAppStore from '@/store/modules/app' import encryptFlag from '@/constants/encryptFlag.js';
import usePermissionStore from '@/store/modules/permission'
const appStore = useAppStore()
const permissionStore = usePermissionStore()
const router = useRouter() const router = useRouter()
const emit = defineEmits(['page']) const emit = defineEmits(['page'])
const { proxy } = getCurrentInstance()
function onReset(formQuery) { function onReset(formQuery) {
console.log('onReset') console.log('onReset')
formQuery.resetFields() formQuery.resetFields()
...@@ -24,65 +19,54 @@ function onQuery() { ...@@ -24,65 +19,54 @@ function onQuery() {
// 搜索按钮操作 // 搜索按钮操作
function handleQuery() { function handleQuery() {
console.log('queryParams',queryParams.value) console.log('queryParams',queryParams.value)
queryParams.value.pageNum = 1 queryParams.value.page = 1
getList() getList()
} }
const data = reactive({ const data = reactive({
queryParams: { queryParams: {
pageNum: 1, page: 1,
pageSize: 8 rows: 10
} }
}) })
// 表格数据 // 表格数据
const { queryParams } = toRefs(data) const { queryParams } = toRefs(data)
const total = ref(3) const total = ref(3)
const loading = ref(false) const loading = ref(false)
const tableData = ref([]);
// 查询列表 // 查询列表
function getList() { function getList() {
loading.value = true loading.value = true
const params = {
page: queryParams.value.page,
setTimeout(() => { rows: queryParams.value.rows,
loading.value = false projectid: sessionStorage.getItem('projectId'),
}, 3000); datasystemname: queryParams.value.datasource,
schema: queryParams.value.schema,
} table_name: queryParams.value.tableName,
const tableData = ref([ columnname: queryParams.value.fieldName,
{ flag: queryParams.value.status
id: '1',
index: 1,
dataSource: '若依配...',
schema: 'ry',
tableName: 'sys_user',
fieldName: 'phone...',
fieldType: 'VARCHAR...',
comment: '手机号码',
algorithm: '姓名加密规则',
secretKey: '姓名加...',
description: '',
status: '加密完成'
},
{id: '2',
index: 2,
dataSource: '若依配...',
schema: 'ry',
tableName: 'sys_user',
fieldName: 'user_n...',
fieldType: 'VARCHAR...',
comment: '用户名昵称',
algorithm: '姓名加密规则',
secretKey: '姓名加...',
description: '',
status: '加密完成'
} }
]); queryBatchOriginalList(params)
function pageProjectManage() { .then((response) => {
if (response && response.data) {
tableData.value = response.data || [];
total.value = response.totalCount || 0;
} else {
tableData.value = [];
total.value = 0;
}
})
.catch((error) => {
console.error('Failed to fetch table data:', error);
ElMessage.error('获取表格数据失败,请稍后重试');
})
.finally(() => {
loading.value = false;
});
}
function pageProjectManage() {
changeRoute() changeRoute()
router.push({ router.push({
path: '/project/Project' path: '/project/Project'
}) })
...@@ -90,62 +74,141 @@ function pageProjectManage() { ...@@ -90,62 +74,141 @@ function pageProjectManage() {
/** /**
* 删除多余列 * 删除多余列
*/ */
function deleteUnnecessaryColumns(){ const deleteUnnecessaryColumns = async () => {
console.log('删除多余列') const params = {
projectid: sessionStorage.getItem('projectId')
}
try {
await delBatchTableColumn(params)
ElMessage.success('删除成功')
getList()
} catch (error) {
ElMessage.error('删除失败')
}
} }
/** /**
* 批量加密 * 批量加密
*/ */
function bulkEncryption(){ const bulkEncryption = async () => {
console.log('批量加密') const params = {
projectid: sessionStorage.getItem('projectId'),
operate: "0"
}
const response = await loadingBatchTableParams(params)
if (response && response.code === 'POP_00014' && response.flag) {
ElMessage.success('批量加密成功')
getList()
} else {
ElMessage.error('批量加密失败')
}
setTimeout(() => {
getList()
}, 5000); // 5秒后刷新列表
} }
/** /**
* 批量解密 * 批量解密
*/ */
function batchDecryption() { const batchDecryption = async() => {
console.log('批量解密') const params = {
projectid: sessionStorage.getItem('projectId'),
operate: "1"
}
const response = await loadingBatchTableParams(params)
if (response && response.code === 'POP_00014' && response.flag) {
ElMessage.success('批量解密成功')
getList()
} else {
ElMessage.error('批量解密失败')
}
setTimeout(() => {
getList()
}, 5000); // 5秒后刷新列表
} }
// 弹窗控制 // 弹窗控制
const dialogVisible = ref(false); const dialogVisible = ref(false);
const detailData = ref({ const detailData = ref({});
fieldName: '', const handleDetail = async (val) => {
status: '', console.log('查看详情', val);
startTime: '', const params = {
endTime: '', projectid: sessionStorage.getItem('projectId'),
totalRows: 0, columnName: val.table_field_id,
processedRows: 0, dataSystemId: val.datasystem_id,
rejectedRows: 0 schema: val.tschemas,
}); tableName: val.names
function handleDetail(val) { }
const response = await loadingProgress(params)
if (response && response.code === 'POP_00014' && response.flag) {
} else {
ElMessage.error('加载进度失败')
return
}
console.log('加载进度成功', response);
const data = response.data[0] || {};
// 这里根据实际数据结构调整 // 这里根据实际数据结构调整
detailData.value = { detailData.value = {
id: '123', fieldName: data.columnName || '',
fieldName: 'phonenumber', status: data.flag || '',
status: '解密完成', startTime: data.startTime || '',
startTime: '2025-08-21 16:55:...', endTime: data.endTime || '',
endTime: '2025-08-21 16:56:...', totalRows: data.totalCounts || 0,
totalRows: 4, finishCounts: data.finishCounts || 0,
processedRows: 0, rejectedRows: data.failCounts || 0,
rejectedRows: 0 params: params || {},
row: val
}; };
dialogVisible.value = true; dialogVisible.value = true;
} }
// 查看日志
const showLog = () => {
console.log('查看日志');
// 查看日志
const dialogVisibleLog = ref(false);
const logData = ref()
const showLog = async () => {
const params = {
projectId: sessionStorage.getItem('projectId'),
dataSystemId: detailData.value.params.dataSystemId,
schema: detailData.value.params.schema,
tableName: detailData.value.params.tableName
}
console.log('查看日志params', params);
const response = await getProcesslog(params)
if (response && response.code === 'POP_00014' && response.flag) {
logData.value = response.data || '';
} else {
ElMessage.error('加载日志失败')
}
dialogVisibleLog.value = true; dialogVisibleLog.value = true;
// 这里可以打开日志弹窗或跳转到日志页面 // 这里可以打开日志弹窗或跳转到日志页面
}; };
const dialogVisibleLog = ref(false);
const logData = ref('12312312312312312')
const downLoad = () => { const downLoad = () => {
console.log('下载日志'); console.log('下载日志');
const blob = new Blob([logData.value]);
const link = document.createElement('a')
link.href = URL.createObjectURL(blob)
link.download = `${detailData.value.row.datasystemname}-${detailData.value.row.tschemas}.${detailData.value.row.names}_${new Date().toISOString().slice(0, 10)}.log`
link.click()
URL.revokeObjectURL(link.href)
}; };
/**
* 加密状态标识
*/
const getFlagName = (flag) => {
const found = encryptFlag.find(item => item.value === String(flag))
return found ? found: {}
}
onMounted(() => {
getList()
})
</script> </script>
...@@ -179,7 +242,7 @@ const downLoad = () => { ...@@ -179,7 +242,7 @@ const downLoad = () => {
<div class="app-container__body"> <div class="app-container__body">
<div> <div>
<query-form <QueryForm
ref="QueryFormRef" ref="QueryFormRef"
v-model="queryParams" v-model="queryParams"
@query="onQuery" @query="onQuery"
...@@ -187,7 +250,7 @@ const downLoad = () => { ...@@ -187,7 +250,7 @@ const downLoad = () => {
<div class="warning-alert"> <div class="warning-alert">
<div class="warning-content flex-container align-center"> <div class="warning-content flex-container align-center">
<el-icon color="#f33"><Warning /></el-icon> <el-icon color="#f33"><WarnTriangleFilled /></el-icon>
<span class="warning-text">警告:存在未加密字段,请完成历史数据加密操作,否则无法正常使用插件!</span> <span class="warning-text">警告:存在未加密字段,请完成历史数据加密操作,否则无法正常使用插件!</span>
</div> </div>
</div> </div>
...@@ -197,26 +260,26 @@ const downLoad = () => { ...@@ -197,26 +260,26 @@ const downLoad = () => {
style="width: 100%" style="width: 100%"
:header-cell-style="{ background: '#f5f7fa', color: '#606266' }" :header-cell-style="{ background: '#f5f7fa', color: '#606266' }"
> >
<el-table-column prop="index" label="序号" width="60" align="center" /> <el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="dataSource" label="数据源名" width="120" show-overflow-tooltip /> <el-table-column prop="datasystemname" label="数据源名" width="120" show-overflow-tooltip />
<el-table-column prop="schema" label="SCHEMA" width="100" align="center" /> <el-table-column prop="tschemas" label="SCHEMA" align="center" />
<el-table-column prop="tableName" label="表名" width="120" show-overflow-tooltip /> <el-table-column prop="names" label="表名" width="120" show-overflow-tooltip />
<el-table-column prop="fieldName" label="字段名" width="120" show-overflow-tooltip /> <el-table-column prop="table_field_id" label="字段名" width="120" show-overflow-tooltip />
<el-table-column prop="fieldType" label="字段类型" width="120" show-overflow-tooltip /> <el-table-column prop="column_type" label="字段类型" width="120" show-overflow-tooltip />
<el-table-column prop="comment" label="注释" min-width="120" show-overflow-tooltip /> <el-table-column prop="note" label="注释" min-width="120" show-overflow-tooltip />
<el-table-column prop="algorithm" label="加密算法" min-width="150" show-overflow-tooltip /> <el-table-column prop="encryptiontypename" label="加密算法" min-width="150" show-overflow-tooltip />
<el-table-column prop="secretKey" label="密钥" width="120" show-overflow-tooltip /> <el-table-column prop="secretkeyname" label="密钥" width="120" show-overflow-tooltip />
<el-table-column prop="description" label="描述信息" width="120" show-overflow-tooltip /> <el-table-column prop="describe_info" label="描述信息" width="120" show-overflow-tooltip />
<el-table-column prop="status" label="执行状态" width="120" align="center"> <el-table-column prop="flag" label="执行状态" width="120" align="center">
<template #default="scope"> <template #default="scope">
<el-tag :type="scope.row.status === '加密完成' ? 'success' : 'warning'"> <el-tag :type="getFlagName(scope.row.flag).type">
{{ scope.row.status }} {{ getFlagName(scope.row.flag).label }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="操作" width="100" align="center" fixed="right"> <el-table-column label="操作" width="100" align="center" fixed="right">
<template #default="scope"> <template #default="scope">
<el-button type="primary" size="small" @click="handleDetail(scope.row.id)">详情</el-button> <el-button type="primary" size="small" @click="handleDetail(scope.row)">详情</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
...@@ -224,8 +287,8 @@ const downLoad = () => { ...@@ -224,8 +287,8 @@ const downLoad = () => {
<pagination <pagination
v-show="total > 0" v-show="total > 0"
:total="total" :total="total"
v-model:page="queryParams.pageNum" v-model:page="queryParams.page"
v-model:limit="queryParams.pageSize" v-model:limit="queryParams.rows"
@pagination="getList" @pagination="getList"
/> />
</div> </div>
...@@ -243,33 +306,33 @@ const downLoad = () => { ...@@ -243,33 +306,33 @@ const downLoad = () => {
class="detail-container" class="detail-container"
> >
<el-descriptions-item label="字段名"> <el-descriptions-item label="字段名">
{{ detailData.fieldName || 'phonenumber' }} {{ detailData.fieldName }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="状态"> <el-descriptions-item label="状态">
<el-tag :type="detailData.status === '解密完成' ? 'success' : 'warning'"> <el-tag :type="getFlagName(detailData.status).type">
{{ detailData.status || '解密完成' }} {{ getFlagName(detailData.status).label }}
</el-tag> </el-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="开始时间"> <el-descriptions-item label="开始时间">
{{ detailData.startTime || '2025-08-21 16:55:...' }} {{ detailData.startTime }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="结束时间"> <el-descriptions-item label="结束时间">
{{ detailData.endTime || '2025-08-21 16:56:...' }} {{ detailData.endTime }}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="加密/解密总行数"> <el-descriptions-item label="加密/解密总行数">
{{ detailData.totalRows || 4 }} {{ detailData.totalRows}}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="已加密/解密行数"> <el-descriptions-item label="已加密/解密行数">
{{ detailData.processedRows || 0 }} {{ detailData.finishCounts}}
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="拒绝条数"> <el-descriptions-item label="拒绝条数">
{{ detailData.rejectedRows || 0 }} {{ detailData.rejectedRows}}
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
...@@ -284,15 +347,13 @@ const downLoad = () => { ...@@ -284,15 +347,13 @@ const downLoad = () => {
title="日志" title="日志"
width="50%" width="50%"
> >
<div class="flex-container flex-wrap">
<div class="flex-container flex-wrap" v-html="logData"> <textarea style="width: -webkit-fill-available;" v-model="logData" disabled></textarea>
</div> </div>
<template #footer> <template #footer>
<el-button type="primary" @click="downLoad">下载</el-button> <el-button type="primary" @click="downLoad">下载</el-button>
</template> </template>
</el-dialog> </el-dialog>
</div> </div>
</template> </template>
...@@ -327,12 +388,14 @@ const downLoad = () => { ...@@ -327,12 +388,14 @@ const downLoad = () => {
} }
.flex-wrap { .flex-wrap {
flex-direction: wrap; flex-direction: wrap;
height: 500px;
overflow-y: scroll;
} }
.warning-alert { .warning-alert {
width: 100%; width: 100%;
padding: 12px 16px; padding: 5px 16px;
margin: 10px 0; margin: 10px 0;
border: 2px solid #f56c6c; border: 0.5px solid #f56c6c;
border-radius: 4px; border-radius: 4px;
background-color: #fef0f0; background-color: #fef0f0;
display: flex; display: flex;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论