Browse Source

加解密源更换

power_master
herenshan112 1 month ago
parent
commit
9b5a8810fe
  1. 1
      package.json
  2. 3
      src/api/DesignForm/type.ts
  3. 3
      src/api/date/type.ts
  4. 22
      src/components/DesignForm/formControlPropertiNew.vue
  5. 74
      src/utils/encryptionAndDecryption/sm4UtilsWasm.ts
  6. 2
      src/utils/request.ts
  7. 26
      src/views/sysworkflow/lowcodepage/newLowCode/appLayout/appContainer.vue
  8. 97
      src/views/sysworkflow/lowcodepage/runApp/newRunAppForm.vue
  9. 8
      yarn.lock

1
package.json

@ -62,6 +62,7 @@
"element-resize-detector": "^1.2.4", "element-resize-detector": "^1.2.4",
"font-awesome": "^4.7.0", "font-awesome": "^4.7.0",
"gm-crypto": "^0.1.12", "gm-crypto": "^0.1.12",
"gm-crypto-wasm": "^0.1.5",
"html2canvas": "^1.4.1", "html2canvas": "^1.4.1",
"install": "^0.13.0", "install": "^0.13.0",
"js-beautify": "^1.14.8", "js-beautify": "^1.14.8",

3
src/api/DesignForm/type.ts

@ -6,6 +6,9 @@ export interface SearchForm extends PageQuery{
} }
//自定义表单列表内容 //自定义表单列表内容
export interface customerFormCont{ export interface customerFormCont{
signCodeStr: any;
isEdit: any;
describe: any;
id: number, id: number,
name: string, name: string,
tablename: string, tablename: string,

3
src/api/date/type.ts

@ -95,7 +95,8 @@ export interface appSetInfo {
appName:string; appName:string;
appSvg:string; appSvg:string;
state:number; state:number;
uuid:string; uuid:string;
describe?:string;
} }
/** /**
@ 作者: 秦东 @ 作者: 秦东

22
src/components/DesignForm/formControlPropertiNew.vue

@ -4085,17 +4085,17 @@ getCustomerFormList().then(({ data }) => {
}); });
const orgAndManTree = ref<Tree[]>(); const orgAndManTree = ref<Tree[]>();
getAssociatedFormsOrgAndManTree().then(({ data }) => { // getAssociatedFormsOrgAndManTree().then(({ data }) => {
let resData = ref(data.children); // let resData = ref(data.children);
orgAndManTree.value = [ // orgAndManTree.value = [
{ // {
id: data.id, // id: data.id,
//label: data.label, // //label: data.label,
label: "组织机构", // label: "",
children: [...resData.value], // children: [...resData.value],
}, // },
]; // ];
}); // });
const roleTree = ref<Tree[]>(); const roleTree = ref<Tree[]>();
getAssociatedFormsRoleTree().then(({ data }) => { getAssociatedFormsRoleTree().then(({ data }) => {

74
src/utils/encryptionAndDecryption/sm4UtilsWasm.ts

@ -0,0 +1,74 @@
import { SM4 } from "gm-crypto-wasm";
import * as CryptoJS from 'crypto-js'
/**
@ 作者: 秦东
@ 时间: 2025-12-07 10:26:51
@ 备注: 将字符串转换成16进制
*/
const strToHexMethod = (str: string): string => {
return CryptoJS.enc.Utf8.parse(str).toString(CryptoJS.enc.Hex)
}
/**
@ 作者: 秦东
@ 时间: 2025-12-07 10:29:48
@ 备注: 判断是不是12位16进制参数
*/
const isValidHex32 = (str: string): boolean => {
return /^[0-9a-fA-F]{32}$/.test(str)
}
/**
@ 作者: 秦东
@ 时间: 2025-12-07 10:28:33
@ 备注: 初始化SM4密钥参数
*/
const appSystemKey = strToHexMethod(import.meta.env.VITE_APP_SYSTEM_KEY)
const sm4TokenKey = strToHexMethod(import.meta.env.VITE_APP_SM4_APP_KEY)
/**
@ 作者: 秦东
@ 时间: 2026-02-11 08:17:36
@ 功能: SM4加密方法
*/
const sm4EncryptMethod = (data: string, customKey: string): string => {
let ivSetup = sm4TokenKey
if (customKey) {
ivSetup = strToHexMethod(customKey)
if (!isValidHex32(ivSetup)) {
ivSetup = sm4TokenKey
}
}
return SM4.encrypt(data, appSystemKey, {
iv: ivSetup,
mode: SM4.constants.CBC,
inputEncoding: 'utf8',
outputEncoding: 'hex',
padding: 1
} as never)
}
/**
@ 作者: 秦东
@ 时间: 2025-12-07 10:31:22
@ 备注: SM4解密方法
*/
const sm4DecryptMethod = (data: string, customKey: string): string => {
let ivSetup = sm4TokenKey
if (customKey) {
ivSetup = strToHexMethod(customKey)
if (!isValidHex32(ivSetup)) {
ivSetup = sm4TokenKey
}
}
// console.log('SM4解密方法----解密结构---data--->', data)
// console.log('SM4解密方法----解密结构----customKey-->', customKey)
// console.log('SM4解密方法----解密结构--ivSetup---->', ivSetup)
// console.log('SM4解密方法----解密结构---sm4TokenKey--->', sm4TokenKey)
// console.log('SM4解密方法----解密结构---appSystemKey--->', appSystemKey)
return SM4.decrypt(data, appSystemKey, {
iv: ivSetup,
mode: SM4.constants.CBC,
inputEncoding: 'hex',
outputEncoding: 'utf8',
padding: 1
} as never)
}
export { sm4EncryptMethod, sm4DecryptMethod }

2
src/utils/request.ts

@ -6,7 +6,7 @@
import axios, { AxiosError, type InternalAxiosRequestConfig } from 'axios' import axios, { AxiosError, type InternalAxiosRequestConfig } from 'axios'
import { ElMessage, ElMessageBox } from 'element-plus' import { ElMessage, ElMessageBox } from 'element-plus'
import { generateRandomString } from '@/utils/encryptionAndDecryption/randNumber' import { generateRandomString } from '@/utils/encryptionAndDecryption/randNumber'
import { sm4DecryptMethod, sm4EncryptMethod } from '@/utils/encryptionAndDecryption/sm4Utils' import { sm4DecryptMethod, sm4EncryptMethod } from '@/utils/encryptionAndDecryption/sm4UtilsWasm'
import { useUserStoreHook } from '@/store/modules/user'; import { useUserStoreHook } from '@/store/modules/user';
import { useRouter } from 'vue-router' import { useRouter } from 'vue-router'

26
src/views/sysworkflow/lowcodepage/newLowCode/appLayout/appContainer.vue

@ -10,6 +10,9 @@ import { gainAppEditPsge } from "@/api/DesignForm/requestapi";
import RegularPage from "@/views/sysworkflow/lowcodepage/runApp/regularPage.vue"; import RegularPage from "@/views/sysworkflow/lowcodepage/runApp/regularPage.vue";
import RunAppForm from "@/views/sysworkflow/lowcodepage/runApp/runAppForm.vue"; import RunAppForm from "@/views/sysworkflow/lowcodepage/runApp/runAppForm.vue";
// import NewRunAppForm from "@/views/sysworkflow/lowcodepage/runApp/newRunAppForm.vue";
import { AllowDropType } from "element-plus/es/components/tree/src/tree.type";
const props = defineProps({ const props = defineProps({
drawerWith: { drawerWith: {
@ -36,9 +39,10 @@ const props = defineProps({
const emits = defineEmits(["update:runIsOpen", "refreshPage"]); const emits = defineEmits(["update:runIsOpen", "refreshPage"]);
const userStore = useUserStore(); const userStore = useUserStore();
const menusTree = ref<appMenuTreeInfo[]>([]); // const menusTree = ref<appMenuTreeInfo[]>([]); //
const pickAppMenu = ref(""); // const pickAppMenu = ref<any>(""); //
const switchPAge = ref(1); // 12 const switchPAge = ref(1); // 12
const pickAppMenuSel = ref(""); // const pickAppMenuSel = ref(""); //
/** /**
@ 作者: 秦东 @ 作者: 秦东
@ 时间: 2024-07-22 11:40:06 @ 时间: 2024-07-22 11:40:06
@ -72,7 +76,7 @@ const gainAppContent = () => {
appCont.state = data.data.state; appCont.state = data.data.state;
appCont.uuid = data.data.uuid; appCont.uuid = data.data.uuid;
let isIn = true; let isIn = true;
data.data.menuTree.forEach((item) => { data.data.menuTree.forEach((item:any) => {
if (item.isLock == 1 && item.isMain == 1) { if (item.isLock == 1 && item.isMain == 1) {
pickAppMenu.value = item; pickAppMenu.value = item;
isIn = false; isIn = false;
@ -121,10 +125,20 @@ const openAppPage = (val: any) => {
pickAppMenu.value = val; pickAppMenu.value = val;
} }
}; };
const openOrClose = computed(() => props.runIsOpen);
const allowDrop = (draggingNode: any, dropNode: any, type: AllowDropType) => {
if (draggingNode.data.type === 2 && dropNode.data.type === 2 && type == "inner") {
return false;
} else {
return true;
}
// return true
};
</script> </script>
<template> <template>
<el-drawer <el-drawer
v-model="props.runIsOpen" v-model="openOrClose"
:with-header="false" :with-header="false"
:close-on-click-modal="false" :close-on-click-modal="false"
:close-on-press-escape="false" :close-on-press-escape="false"
@ -176,7 +190,6 @@ const openAppPage = (val: any) => {
v-model="pickAppMenuSel" v-model="pickAppMenuSel"
:data="menusTree" :data="menusTree"
:render-after-expand="false" :render-after-expand="false"
:suffix-icon="Search"
node-key="id" node-key="id"
clearable clearable
filterable filterable
@ -212,6 +225,11 @@ const openAppPage = (val: any) => {
:pick-app-menu="pickAppMenu" :pick-app-menu="pickAppMenu"
:drawer-with="props.drawerWith" :drawer-with="props.drawerWith"
/> />
<!-- <NewRunAppForm
v-else
:pick-app-menu="pickAppMenu"
:drawer-with="props.drawerWith"
/> -->
</el-main> </el-main>
</el-container> </el-container>
</el-container> </el-container>

97
src/views/sysworkflow/lowcodepage/runApp/newRunAppForm.vue

@ -0,0 +1,97 @@
<!--
@ 作者: 秦东
@ 时间: 2026-02-10 16:13:56
@ 备注: App内容列表
-->
<script lang='ts' setup>
import { gainAppPageInfo } from '@/api/DesignForm/requestapi';
const props = defineProps({
pickAppMenu: {
type: Object,
default() {
return {};
},
},
drawerWith: {
type: Number,
default: 0,
}
});
const appFormTitle = ref("");
/**
@ 作者: 秦东
@ 时间: 2026-02-10 16:21:21
@ 功能: 初始化数据
*/
const initLoadData = () => {
if (props.pickAppMenu.type != 1) {
appFormTitle.value = props.pickAppMenu.label;
gainAppPageInfo({ id: props.pickAppMenu.id }).then((data:any) => {
console.log("初始化数据------>",data);
if (data.code == 200) {
appFormTitle.value = data.data.appName;
}
});
}
}
/**
@ 作者: 秦东
@ 时间: 2024-06-03 09:26:17
@ 功能: 监听菜单数据变化
*/
watch(
() => props.pickAppMenu,
(val: any) => {
initLoadData();
},
{
deep: true,
}
);
/**
@ 作者: 秦东
@ 时间: 2026-02-10 16:21:41
@ 功能: 加载数据
*/
onMounted(() => {
initLoadData();
});
</script>
<template>
<div class="listContent">
<div class="columnHeadBox">{{ appFormTitle }}</div>
</div>
<el-scrollbar class="scroBox">
<el-card class="tispMsg" shadow="always">
{{ props.pickAppMenu.type }}
</el-card>
</el-scrollbar>
</template>
<style lang='scss' scoped>
.listContent {
width: 100%;
}
.columnHeadBox{
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 45px;
line-height: 45px;
text-align: center;
background-color: #ffffff;
font-size: 16px;
padding: 0 15px;
font-weight: 400;
}
.scroBox {
margin: 10px auto 0 auto;
padding: 0 10px;
height: calc(100vh - 95px);
.tispMsg {
margin: 0 auto 15px auto;
}
}
</style>

8
yarn.lock

@ -5756,6 +5756,14 @@ globjoin@^0.1.4:
resolved "https://registry.npmmirror.com/globjoin/-/globjoin-0.1.4.tgz" resolved "https://registry.npmmirror.com/globjoin/-/globjoin-0.1.4.tgz"
integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg== integrity sha512-xYfnw62CKG8nLkZBfWbhWwDw02CHty86jfPcc2cr3ZfeuK9ysoVPPEUxf21bAD/rWAgk52SuBrLJlefNy8mvFg==
gm-crypto-wasm@^0.1.5:
version "0.1.5"
resolved "https://registry.npmmirror.com/gm-crypto-wasm/-/gm-crypto-wasm-0.1.5.tgz"
integrity sha512-xnmWsjWpK9tFlPuVa/x72mECFk0WAYDew5PeLXCiayGyqKQNlcIaNW6MucGamGwgAbI2/4LGpKtdzSSCeNQQ6w==
dependencies:
buffer "^5.7.0"
to-arraybuffer "^1.0.1"
gm-crypto@^0.1.12: gm-crypto@^0.1.12:
version "0.1.12" version "0.1.12"
resolved "https://registry.npmmirror.com/gm-crypto/-/gm-crypto-0.1.12.tgz" resolved "https://registry.npmmirror.com/gm-crypto/-/gm-crypto-0.1.12.tgz"

Loading…
Cancel
Save