Browse Source

Merge branch 'master' into li_s1

qin_s3
liwenxuan 1 month ago
parent
commit
7d5e48bc6a
  1. 1
      package.json
  2. 3
      src/api/DesignForm/type.ts
  3. 1
      src/api/date/type.ts
  4. 41
      src/components/DesignForm/app/index.vue
  5. 22
      src/components/DesignForm/formControlPropertiNew.vue
  6. 4
      src/components/DesignForm/public/form/newForm.vue
  7. 21
      src/components/DesignForm/tableListPage/newFormPageCont.vue
  8. 74
      src/utils/encryptionAndDecryption/sm4UtilsWasm.ts
  9. 2
      src/utils/request.ts
  10. 26
      src/views/sysworkflow/lowcodepage/newLowCode/appLayout/appContainer.vue
  11. 22
      src/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue
  12. 97
      src/views/sysworkflow/lowcodepage/runApp/newRunAppForm.vue
  13. 22
      src/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue
  14. 8
      yarn.lock

1
package.json

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

3
src/api/DesignForm/type.ts

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

1
src/api/date/type.ts

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

41
src/components/DesignForm/app/index.vue

@ -1151,11 +1151,19 @@ let asfQueryParams: any[] = [];
@ 功能: 获取数据
*/
const getPageData = () => {
// by han2015:
let arr:string[]=[];
columnSortData.forEach((value, key) => {
arr.push(`${key} ${value}`)
});
let sendData = {
formId: props.formId,
page: state.currentPage,
pagesize: state.pageSize,
searchData: json2string(props.searchData),
sortData: arr.join(", "),
};
// console.log("",sendData)
@ -1185,6 +1193,7 @@ const getPageData = () => {
break;
default:
state.loading = true;
//by han2015, 便
doGainFormPageListCont(sendData)
.then((datas) => {
@ -1782,6 +1791,32 @@ const lookPageInfoIsShow = ref(false);
const asflookPageInfoIsShow = ref(false);
const pageInfoCont = ref<any>();
//------------------ by han2015: ----------------------
const columnSortData = new Map();
const setHeaderClass=(params:any)=>{
if(columnSortData.has(params.column.property)){
if(columnSortData.get(params.column.property)=="DESC"){
params.column.order="descending"
return
}else{
params.column.order="ascending"
return
}
}
}
// by han2015:
const onUpdateSort = (data: { prop: string; order: "ascending" | "descending" | null }) => {
if (data.order === "descending") {
columnSortData.set(data.prop, "DESC");
} else if (data.order === "ascending") {
columnSortData.set(data.prop, "ASC");
} else {
columnSortData.delete(data.prop);
}
getPageData()
}
const lookPageInfo = (val: any) => {
console.log("查看详细内容--------------------------->");
console.log(val);
@ -2331,13 +2366,14 @@ const getNonValue = () => {
</el-col>
<el-col v-if="viewType == 1" :span="24" class="tableTdClass">
<el-table
v-bind="data.tableProps"
ref="table"
v-loading="state.loading"
:data="tableDataList"
table-layout="fixed"
@sort-change="onUpdateSort"
:header-cell-class-name="(params:any)=>{setHeaderClass(params)}"
border
@selection-change="selectionChange"
>
@ -2370,12 +2406,14 @@ const getNonValue = () => {
{{ writeListTitle(scope.row, viewPage.list) }}
</template>
</el-table-column>
<el-table-column
v-else-if="item.fieldClass == ''"
:prop="item.field"
:label="item.label"
:min-width="readerColumnSun(item)"
header-align="center"
sortable="custom"
align="center"
>
<template #default>
@ -2550,6 +2588,7 @@ const getNonValue = () => {
config=""
min-width="220"
header-align="center"
sortable="custom"
align="center"
>
<template v-if="item.help" #header="scope">

22
src/components/DesignForm/formControlPropertiNew.vue

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

4
src/components/DesignForm/public/form/newForm.vue

@ -3329,7 +3329,7 @@ const webPage = computed({
}
.twoPage{
display: grid;
grid-template-columns: 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
@ -3337,7 +3337,7 @@ const webPage = computed({
}
.treePage{
display: grid;
grid-template-columns: minmax(150px, 400px) 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: minmax(150px, 300px) 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;

21
src/components/DesignForm/tableListPage/newFormPageCont.vue

@ -160,7 +160,7 @@ const getCustomrrFormInfo = () => {
formState.formData = stringToObj(data.structure.mastesform);
console.log("获取自定义表单内容--state.formData->1", formState.formData);
if(isFlowTable.value){
extraW = 150
extraW = 300
}
if(formState.formData&&formState.formData.aiConfig&&formState.formData.aiConfig.length>0){
aiConfigArea.value=true
@ -178,16 +178,25 @@ const getCustomrrFormInfo = () => {
});
}
if(aiConfigArea.value){
extraW = extraW + 150
extraW = extraW + 300
}
console.log("获取自定义表单内容--drawBodyWidth.value->2", drawBodyWidth.value);
if (aiConfigArea.value && isFlowTable.value){
drawBodyWidth.value = drawBodyWidth.value + extraW - 160
drawBodyWidth.value = drawBodyWidth.value + extraW - 100
}else if ((!aiConfigArea.value && isFlowTable.value) || (aiConfigArea.value && !isFlowTable.value)){
drawBodyWidth.value = drawBodyWidth.value + extraW
}else{
drawBodyWidth.value = drawBodyWidth.value
}
if (extraW == 0){
drawBodyWidth.value = 780
}
if (extraW == 300 && drawBodyWidth.value > 1100){
drawBodyWidth.value = 1100
}
if(drawBodyWidth.value > 1400){
drawBodyWidth.value = 1400
}
props.dprt.forEach((element: any[]) => {
let tableName = element[0]
let datePickerName = element[1]
@ -489,7 +498,7 @@ const submitEdit = (type: string, val?: any) => {
}
.twoPageAi{
display: grid;
grid-template-columns: minmax(150px, 400px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: minmax(150px, 300px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
// grid-template-columns: 4fr 6fr; /* 150px250px */
grid-template-rows: auto;
gap: 10px;
@ -498,7 +507,7 @@ const submitEdit = (type: string, val?: any) => {
}
.twoPageFlow{
display: grid;
grid-template-columns: 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
// grid-template-columns: 4fr 1fr; /* 150px250px */
grid-template-rows: auto;
gap: 10px;
@ -507,7 +516,7 @@ const submitEdit = (type: string, val?: any) => {
}
.treePage{
display: grid;
grid-template-columns: minmax(150px, 400px) 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: minmax(150px, 300px) 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
// grid-template-columns: 2fr 6fr 2fr; /* 150px250px */
grid-template-rows: auto;
gap: 10px;

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 { ElMessage, ElMessageBox } from 'element-plus'
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 { 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 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({
drawerWith: {
@ -36,9 +39,10 @@ const props = defineProps({
const emits = defineEmits(["update:runIsOpen", "refreshPage"]);
const userStore = useUserStore();
const menusTree = ref<appMenuTreeInfo[]>([]); //
const pickAppMenu = ref(""); //
const pickAppMenu = ref<any>(""); //
const switchPAge = ref(1); // 12
const pickAppMenuSel = ref(""); //
/**
@ 作者: 秦东
@ 时间: 2024-07-22 11:40:06
@ -72,7 +76,7 @@ const gainAppContent = () => {
appCont.state = data.data.state;
appCont.uuid = data.data.uuid;
let isIn = true;
data.data.menuTree.forEach((item) => {
data.data.menuTree.forEach((item:any) => {
if (item.isLock == 1 && item.isMain == 1) {
pickAppMenu.value = item;
isIn = false;
@ -121,10 +125,20 @@ const openAppPage = (val: any) => {
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>
<template>
<el-drawer
v-model="props.runIsOpen"
v-model="openOrClose"
:with-header="false"
:close-on-click-modal="false"
:close-on-press-escape="false"
@ -176,7 +190,6 @@ const openAppPage = (val: any) => {
v-model="pickAppMenuSel"
:data="menusTree"
:render-after-expand="false"
:suffix-icon="Search"
node-key="id"
clearable
filterable
@ -212,6 +225,11 @@ const openAppPage = (val: any) => {
:pick-app-menu="pickAppMenu"
:drawer-with="props.drawerWith"
/>
<!-- <NewRunAppForm
v-else
:pick-app-menu="pickAppMenu"
:drawer-with="props.drawerWith"
/> -->
</el-main>
</el-container>
</el-container>

22
src/views/sysworkflow/lowcodepage/pageFlow/newTableFlow.vue

@ -155,7 +155,7 @@ const getTaskFormData = () => {
}
if(isFlowTable.value){
extraW = 150
extraW = 300
}
@ -206,13 +206,14 @@ const getTaskFormData = () => {
if(aiConfigArea.value){
extraW = extraW + 150
extraW = extraW + 300
}
console.error("不存在流程--extraW--》",extraW)
if (aiConfigArea.value && isFlowTable.value){
pageType.value = 3
pageBody.value = "treePage"
drawBodyWidth.value = drawBodyWidth.value + extraW - 160
drawBodyWidth.value = drawBodyWidth.value + extraW - 100
}else if ((!aiConfigArea.value && isFlowTable.value) || (aiConfigArea.value && !isFlowTable.value)){
pageType.value = 2
pageBody.value = "twoPage"
@ -223,6 +224,15 @@ const getTaskFormData = () => {
drawBodyWidth.value = drawBodyWidth.value
}
if (extraW == 0){
drawBodyWidth.value = 780
}
if (extraW == 300 && drawBodyWidth.value > 1100){
drawBodyWidth.value = 1100
}
if(drawBodyWidth.value > 1400){
drawBodyWidth.value = 1400
}
drawLoading.value = false
// console.error("2---------------->",formBodyRef.value?.clientWidth)
@ -792,7 +802,7 @@ provide(constAiEffect, ({ key, value, field,rowdex}: any) => {
}
.twoPageAi{
display: grid;
grid-template-columns: minmax(150px, 400px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: minmax(150px, 300px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
@ -800,7 +810,7 @@ provide(constAiEffect, ({ key, value, field,rowdex}: any) => {
}
.twoPageFlow{
display: grid;
grid-template-columns: 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
@ -808,7 +818,7 @@ provide(constAiEffect, ({ key, value, field,rowdex}: any) => {
}
.treePage{
display: grid;
grid-template-columns: minmax(150px, 400px) 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: minmax(150px, 300px) 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;

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>

22
src/views/taskplatform/taskmanagement/lookFlowInfoNewApp.vue

@ -129,7 +129,7 @@ const gainFormData = () => {
.then((data: any) => {
let extraW=0;
if(isFlowTable.value){
extraW = 150
extraW = 300
}
if (data.data.logistrue) {
formState.formData.list.push(editLookFormCont);
@ -158,18 +158,26 @@ const gainFormData = () => {
});
}
if(aiConfigArea.value){
extraW = extraW + 150
extraW = extraW + 300
}
if (aiConfigArea.value && isFlowTable.value){
drawBodyWidth.value = drawBodyWidth.value + extraW - 160
drawBodyWidth.value = drawBodyWidth.value + extraW - 100
}else if ((!aiConfigArea.value && isFlowTable.value) || (aiConfigArea.value && !isFlowTable.value)){
drawBodyWidth.value = drawBodyWidth.value + extraW
}else{
drawBodyWidth.value = drawBodyWidth.value
}
if (extraW == 0){
drawBodyWidth.value = 780
}
if (extraW == 300 && drawBodyWidth.value > 1100){
drawBodyWidth.value = 1100
}
if(drawBodyWidth.value > 1400){
drawBodyWidth.value = 1400
}
nextTick(() => {
// console.log("-1111-->",data.data.tableData)
@ -378,7 +386,7 @@ const submitEdit = () => {
}
.twoPageAi{
display: grid;
grid-template-columns: minmax(150px, 400px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: minmax(150px, 300px) 1fr; /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
@ -386,7 +394,7 @@ const submitEdit = () => {
}
.twoPageFlow{
display: grid;
grid-template-columns: 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;
@ -394,7 +402,7 @@ const submitEdit = () => {
}
.treePage{
display: grid;
grid-template-columns: minmax(150px, 400px) 1fr minmax(150px, 400px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-columns: minmax(150px, 300px) 1fr minmax(150px, 300px); /* 左右最小150px,最大250px,中间自适应 */
grid-template-rows: auto;
gap: 10px;
max-width: 100%;

8
yarn.lock

@ -5756,6 +5756,14 @@ globjoin@^0.1.4:
resolved "https://registry.npmmirror.com/globjoin/-/globjoin-0.1.4.tgz"
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:
version "0.1.12"
resolved "https://registry.npmmirror.com/gm-crypto/-/gm-crypto-0.1.12.tgz"

Loading…
Cancel
Save