Commit ebb848ed by 周海峰

加密管理

parent bf195290
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({
url: '/',
url: '/core/encryptionconfig/queryBatchOriginalList',
method: 'post',
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,
loadingColumn, checkCanReload ,removeLoadingColumn, checkTableEncOrDecColumn,
loadingTableParams, reloadingColumn
} from '@/api/classification/classification.js'
import encryptFlag from '@/constants/encryptFlag.js'
const props = defineProps({
// tableData: {
// type: Array,
......@@ -183,23 +185,6 @@ const getTableData = async () => {
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">
import { computed,ref,watch } from 'vue'
import type { FormInstance } from 'element-plus'
import PageWrapperSearch from '@/components/search/PageWrapperSearch.vue'
// import { useDict } from '@/utils/dict'
// import { listDept } from '@/api/system/dept'// 部门
// 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
}>()
<script setup>
import { computed, ref, watch } from 'vue';
import PageWrapperSearch from '@/components/search/PageWrapperSearch.vue';
import encryptFlag from '@/constants/encryptFlag.js';
const emit = defineEmits(['update:modelValue', 'query', 'reset']);
const props = defineProps({
modelValue: Object
});
const queryForm = computed({
get() {
return props.modelValue
return props.modelValue;
},
set(val: any) {
console.log('query computed', val)
emit('update:modelValue', val)
set(val) {
console.log('query computed', val);
emit('update:modelValue', val);
}
})
});
// 搜索
function onSearch() {
emit('query')
emit('query');
}
// 重置
function onReset(formRef: FormInstance) {
queryForm.value.datasource = ''
queryForm.value.schema = ''
queryForm.value.tableName = ''
queryForm.value.fieldName = ''
queryForm.value.status = ''
emit('reset', formRef)
function onReset(formRef) {
queryForm.value.datasource = '';
queryForm.value.schema = '';
queryForm.value.tableName = '';
queryForm.value.fieldName = '';
queryForm.value.status = [];
emit('reset', formRef);
}
</script>
<template>
......@@ -87,10 +75,10 @@ function onReset(formRef: FormInstance) {
<el-select
v-model="queryForm.status"
placeholder="请选择状态"
multiple
clearable
>
<el-option label="启用" value="active" />
<el-option label="禁用" value="inactive" />
<el-option v-for="value in encryptFlag" :label="value.label" :value="value.value" />
</el-select>
</el-form-item>
</page-wrapper-search>
......
<script setup name="ProjectManageList">
import { getCurrentInstance, reactive, ref, toRefs } from 'vue'
import { onMounted, reactive, ref, toRefs } from 'vue'
import { ElMessage } from 'element-plus'
import QueryForm from './QueryForm.vue'
import { changeRoute } from '@/utils/switchRoute'
import { useRouter } from 'vue-router'
import useAppStore from '@/store/modules/app'
import usePermissionStore from '@/store/modules/permission'
const appStore = useAppStore()
const permissionStore = usePermissionStore()
import { queryBatchOriginalList, delBatchTableColumn, loadingBatchTableParams, loadingProgress, getProcesslog } from '@/api/classification/encryptionManagement.js'
import encryptFlag from '@/constants/encryptFlag.js';
const router = useRouter()
const emit = defineEmits(['page'])
const { proxy } = getCurrentInstance()
function onReset(formQuery) {
console.log('onReset')
formQuery.resetFields()
......@@ -24,65 +19,54 @@ function onQuery() {
// 搜索按钮操作
function handleQuery() {
console.log('queryParams',queryParams.value)
queryParams.value.pageNum = 1
queryParams.value.page = 1
getList()
}
const data = reactive({
queryParams: {
pageNum: 1,
pageSize: 8
page: 1,
rows: 10
}
})
// 表格数据
const { queryParams } = toRefs(data)
const total = ref(3)
const loading = ref(false)
const tableData = ref([]);
// 查询列表
function getList() {
loading.value = true
setTimeout(() => {
loading.value = false
}, 3000);
}
const tableData = ref([
{
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: '加密完成'
const params = {
page: queryParams.value.page,
rows: queryParams.value.rows,
projectid: sessionStorage.getItem('projectId'),
datasystemname: queryParams.value.datasource,
schema: queryParams.value.schema,
table_name: queryParams.value.tableName,
columnname: queryParams.value.fieldName,
flag: queryParams.value.status
}
]);
function pageProjectManage() {
queryBatchOriginalList(params)
.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()
router.push({
path: '/project/Project'
})
......@@ -90,62 +74,141 @@ function pageProjectManage() {
/**
* 删除多余列
*/
function deleteUnnecessaryColumns(){
console.log('删除多余列')
const deleteUnnecessaryColumns = async () => {
const params = {
projectid: sessionStorage.getItem('projectId')
}
try {
await delBatchTableColumn(params)
ElMessage.success('删除成功')
getList()
} catch (error) {
ElMessage.error('删除失败')
}
}
/**
* 批量加密
*/
function bulkEncryption(){
console.log('批量加密')
const bulkEncryption = async () => {
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() {
console.log('批量解密')
const batchDecryption = async() => {
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 detailData = ref({
fieldName: '',
status: '',
startTime: '',
endTime: '',
totalRows: 0,
processedRows: 0,
rejectedRows: 0
});
function handleDetail(val) {
const detailData = ref({});
const handleDetail = async (val) => {
console.log('查看详情', val);
const params = {
projectid: sessionStorage.getItem('projectId'),
columnName: val.table_field_id,
dataSystemId: val.datasystem_id,
schema: val.tschemas,
tableName: val.names
}
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 = {
id: '123',
fieldName: 'phonenumber',
status: '解密完成',
startTime: '2025-08-21 16:55:...',
endTime: '2025-08-21 16:56:...',
totalRows: 4,
processedRows: 0,
rejectedRows: 0
fieldName: data.columnName || '',
status: data.flag || '',
startTime: data.startTime || '',
endTime: data.endTime || '',
totalRows: data.totalCounts || 0,
finishCounts: data.finishCounts || 0,
rejectedRows: data.failCounts || 0,
params: params || {},
row: val
};
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;
// 这里可以打开日志弹窗或跳转到日志页面
};
const dialogVisibleLog = ref(false);
const logData = ref('12312312312312312')
const downLoad = () => {
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>
......@@ -179,7 +242,7 @@ const downLoad = () => {
<div class="app-container__body">
<div>
<query-form
<QueryForm
ref="QueryFormRef"
v-model="queryParams"
@query="onQuery"
......@@ -187,7 +250,7 @@ const downLoad = () => {
<div class="warning-alert">
<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>
</div>
</div>
......@@ -197,26 +260,26 @@ const downLoad = () => {
style="width: 100%"
:header-cell-style="{ background: '#f5f7fa', color: '#606266' }"
>
<el-table-column prop="index" label="序号" width="60" align="center" />
<el-table-column prop="dataSource" label="数据源名" width="120" show-overflow-tooltip />
<el-table-column prop="schema" label="SCHEMA" width="100" align="center" />
<el-table-column prop="tableName" label="表名" width="120" show-overflow-tooltip />
<el-table-column prop="fieldName" label="字段名" width="120" show-overflow-tooltip />
<el-table-column prop="fieldType" label="字段类型" width="120" show-overflow-tooltip />
<el-table-column prop="comment" label="注释" min-width="120" show-overflow-tooltip />
<el-table-column prop="algorithm" label="加密算法" min-width="150" show-overflow-tooltip />
<el-table-column prop="secretKey" label="密钥" width="120" show-overflow-tooltip />
<el-table-column prop="description" label="描述信息" width="120" show-overflow-tooltip />
<el-table-column prop="status" label="执行状态" width="120" align="center">
<el-table-column type="index" label="序号" width="60" align="center" />
<el-table-column prop="datasystemname" label="数据源名" width="120" show-overflow-tooltip />
<el-table-column prop="tschemas" label="SCHEMA" align="center" />
<el-table-column prop="names" label="表名" width="120" show-overflow-tooltip />
<el-table-column prop="table_field_id" label="字段名" width="120" show-overflow-tooltip />
<el-table-column prop="column_type" label="字段类型" width="120" show-overflow-tooltip />
<el-table-column prop="note" label="注释" min-width="120" show-overflow-tooltip />
<el-table-column prop="encryptiontypename" label="加密算法" min-width="150" show-overflow-tooltip />
<el-table-column prop="secretkeyname" label="密钥" width="120" show-overflow-tooltip />
<el-table-column prop="describe_info" label="描述信息" width="120" show-overflow-tooltip />
<el-table-column prop="flag" label="执行状态" width="120" align="center">
<template #default="scope">
<el-tag :type="scope.row.status === '加密完成' ? 'success' : 'warning'">
{{ scope.row.status }}
<el-tag :type="getFlagName(scope.row.flag).type">
{{ getFlagName(scope.row.flag).label }}
</el-tag>
</template>
</el-table-column>
<el-table-column label="操作" width="100" align="center" fixed="right">
<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>
</el-table-column>
</el-table>
......@@ -224,8 +287,8 @@ const downLoad = () => {
<pagination
v-show="total > 0"
:total="total"
v-model:page="queryParams.pageNum"
v-model:limit="queryParams.pageSize"
v-model:page="queryParams.page"
v-model:limit="queryParams.rows"
@pagination="getList"
/>
</div>
......@@ -243,33 +306,33 @@ const downLoad = () => {
class="detail-container"
>
<el-descriptions-item label="字段名">
{{ detailData.fieldName || 'phonenumber' }}
{{ detailData.fieldName }}
</el-descriptions-item>
<el-descriptions-item label="状态">
<el-tag :type="detailData.status === '解密完成' ? 'success' : 'warning'">
{{ detailData.status || '解密完成' }}
<el-tag :type="getFlagName(detailData.status).type">
{{ getFlagName(detailData.status).label }}
</el-tag>
</el-descriptions-item>
<el-descriptions-item label="开始时间">
{{ detailData.startTime || '2025-08-21 16:55:...' }}
{{ detailData.startTime }}
</el-descriptions-item>
<el-descriptions-item label="结束时间">
{{ detailData.endTime || '2025-08-21 16:56:...' }}
{{ detailData.endTime }}
</el-descriptions-item>
<el-descriptions-item label="加密/解密总行数">
{{ detailData.totalRows || 4 }}
{{ detailData.totalRows}}
</el-descriptions-item>
<el-descriptions-item label="已加密/解密行数">
{{ detailData.processedRows || 0 }}
{{ detailData.finishCounts}}
</el-descriptions-item>
<el-descriptions-item label="拒绝条数">
{{ detailData.rejectedRows || 0 }}
{{ detailData.rejectedRows}}
</el-descriptions-item>
</el-descriptions>
......@@ -284,15 +347,13 @@ const downLoad = () => {
title="日志"
width="50%"
>
<div class="flex-container flex-wrap" v-html="logData">
<div class="flex-container flex-wrap">
<textarea style="width: -webkit-fill-available;" v-model="logData" disabled></textarea>
</div>
<template #footer>
<el-button type="primary" @click="downLoad">下载</el-button>
</template>
</el-dialog>
</div>
</template>
......@@ -327,12 +388,14 @@ const downLoad = () => {
}
.flex-wrap {
flex-direction: wrap;
height: 500px;
overflow-y: scroll;
}
.warning-alert {
width: 100%;
padding: 12px 16px;
padding: 5px 16px;
margin: 10px 0;
border: 2px solid #f56c6c;
border: 0.5px solid #f56c6c;
border-radius: 4px;
background-color: #fef0f0;
display: flex;
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论