diff --git a/build/vite/plugin/index.ts b/build/vite/plugin/index.ts index 0a943fed3db4fd56d531e82e7486e230df3ed670..6bcfbe49cccb11b7ba8af4983c5ed56804950199 100644 --- a/build/vite/plugin/index.ts +++ b/build/vite/plugin/index.ts @@ -15,6 +15,7 @@ import { configVisualizerConfig } from './visualizer' import { configThemePlugin } from './theme' import { configImageminPlugin } from './imagemin' import { configSvgIconsPlugin } from './svgSprite' +import reactivityTransform from '@vue-macros/reactivity-transform/vite' export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { const { VITE_USE_IMAGEMIN, VITE_USE_MOCK, VITE_LEGACY, VITE_BUILD_COMPRESS, VITE_BUILD_COMPRESS_DELETE_ORIGIN_FILE } = viteEnv @@ -22,8 +23,8 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { const vitePlugins: (PluginOption | PluginOption[])[] = [ // have to vue({ - // 响应式变量 - reactivityTransform: true, + // 响应式变量 TODO 3.3+ 废弃, 迁移到 Vue Macros Reactivity Transform。 + // reactivityTransform: true, }), // have to vueJsx(), @@ -61,6 +62,9 @@ export function createVitePlugins(viteEnv: ViteEnv, isBuild: boolean) { // vite-plugin-theme vitePlugins.push(configThemePlugin(isBuild)) + // Vue Macros Reactivity Transform 响应式变量 + vitePlugins.push(reactivityTransform()) + // The following plugins only work in the production environment if (isBuild) { // vite-plugin-imagemin diff --git a/package.json b/package.json index 55a8eb7a981c0303a369b7143769ed3540f0562c..614ad2af64e5fda6c8900351101a09b500614b64 100644 --- a/package.json +++ b/package.json @@ -34,8 +34,6 @@ "@ant-design/colors": "^6.0.0", "@ant-design/icons-vue": "^6.1.0", "@iconify/iconify": "^2.2.1", - "@logicflow/core": "^1.1.13", - "@logicflow/extension": "^1.1.13", "@vue/runtime-core": "^3.2.33", "@vue/shared": "^3.2.33", "@vueuse/core": "^8.3.0", @@ -80,6 +78,7 @@ "@commitlint/config-conventional": "^16.2.1", "@iconify/json": "^2.1.30", "@purge-icons/generated": "^0.8.1", + "@rys-fe/vite-plugin-theme": "^0.8.6", "@types/codemirror": "^5.60.5", "@types/crypto-js": "^4.1.1", "@types/fs-extra": "^9.0.13", @@ -98,6 +97,7 @@ "@vitejs/plugin-legacy": "^2.0.0", "@vitejs/plugin-vue": "^3.0.1", "@vitejs/plugin-vue-jsx": "^1.3.10", + "@vue-macros/reactivity-transform": "0.3.1", "@vue/compiler-sfc": "^3.2.33", "@vue/test-utils": "^2.0.0-rc.21", "autoprefixer": "^10.4.4", @@ -125,8 +125,8 @@ "rimraf": "^3.0.2", "rollup": "^2.70.2", "rollup-plugin-visualizer": "^5.6.0", - "stylelint": "^14.7.1", "sass": "^1.56.1", + "stylelint": "^14.7.1", "stylelint-config-prettier": "^9.0.3", "stylelint-config-recommended": "^7.0.0", "stylelint-config-recommended-vue": "^1.4.0", @@ -144,7 +144,6 @@ "vite-plugin-pwa": "^0.12.3", "vite-plugin-style-import": "^2.0.0", "vite-plugin-svg-icons": "^2.0.1", - "@rys-fe/vite-plugin-theme": "^0.8.6", "vite-plugin-vue-setup-extend": "^0.4.0", "vite-plugin-windicss": "^1.8.7", "vue-eslint-parser": "^8.3.0", diff --git a/src/api/sys/login.ts b/src/api/sys/login.ts index 235a9bb9cd775f2838af56c98dc29c487462f05e..7ee94677571ac556489dffaf248d2c97b3898b0c 100644 --- a/src/api/sys/login.ts +++ b/src/api/sys/login.ts @@ -16,7 +16,7 @@ export function login(params: LoginParams) { * 获取微信扫码登录二维码 */ export function applyQrCode() { - return defHttp.get>({ + return defHttp.post>({ url: `/token/wechat/qr/applyQrCode`, }) } diff --git a/src/api/sys/model/userModel.ts b/src/api/sys/model/userModel.ts index 05e5c71c548fc18c9875482b06af244520edf325..ce0e281984f5f7aad43b3fa41e039c7d0a242cab 100644 --- a/src/api/sys/model/userModel.ts +++ b/src/api/sys/model/userModel.ts @@ -14,6 +14,8 @@ export interface LoginParams { captchaKey?: string // 验证码 captcha?: string + // 授权码登录 + authCode?: string } /** diff --git a/src/components/Bootx/Query/BQuery.vue b/src/components/Bootx/Query/BQuery.vue index 0337d2f213fc79de6b714152283e8e8aa6d08c99..b9ad33fbe613c1f66bb5abdd81bc0e4052aadda6 100644 --- a/src/components/Bootx/Query/BQuery.vue +++ b/src/components/Bootx/Query/BQuery.vue @@ -29,29 +29,32 @@ import QueryItem from './QueryItem.vue' import { ref } from 'vue' import { DownOutlined, UpOutlined } from '@ant-design/icons-vue' + import { QueryField, QueryParam } from './Query' // 切换搜索条件展开状态 let toggleSearchStatus = ref(false) - const props = defineProps({ - fields: { - type: Array, - default: () => { - return [] - }, + const props = withDefaults( + defineProps<{ + // 字段 + fields: QueryField[] + // 查询条件 + queryParams: object + // 默认展示几个 + defaultItemCount?: number + // 所占栅格宽度 + defaultItemMd?: number + // 禁用查询 + disabledQuery?: boolean + // gutter + gutter?: number + }>(), + { + defaultItemCount: 2, + defaultItemMd: 6, + disabledQuery: false, + gutter: 10, }, - // 查询条件 - queryParams: { - type: Object, - required: true, - }, - // 默认展示几个 - defaultItemCount: { type: Number, default: 2 }, - // 所占栅格宽度 - defaultItemMd: { type: Number, default: 6 }, - // 禁用查询 - disabledQuery: { type: Boolean, default: false }, - gutter: { type: Number, default: 10 }, - }) + ) const emits = defineEmits(['update:modelValue', 'query', 'reset']) /** * 查询 diff --git a/src/components/Bootx/Query/Query.ts b/src/components/Bootx/Query/Query.ts index d23d230b8710290ba8a5e7daf9ea00c64736c89f..b5edeedd70d510c8599b9dc81b7ef55f0c8c9ce5 100644 --- a/src/components/Bootx/Query/Query.ts +++ b/src/components/Bootx/Query/Query.ts @@ -1,4 +1,5 @@ import { LabeledValueType } from 'ant-design-vue/lib/vc-tree-select/TreeSelect' +import { LabeledValue } from "ant-design-vue/lib/select"; // 数字 export const NUMBER = 'number' @@ -32,7 +33,7 @@ export interface QueryField { // 精度 precision?: number // 查询列表 - selectList?: LabeledValueType[] | null + selectList?: LabeledValue[] | null // 时间格式化 format?: string | null } diff --git a/src/components/Bootx/RoleSelectModal/BRoleSelectModal.vue b/src/components/Bootx/RoleSelectModal/BRoleSelectModal.vue index 46ccb6a9567eb6304639de032c9022ccd29e253c..e2d65d1a9fe0c7673a6275413184684514203067 100644 --- a/src/components/Bootx/RoleSelectModal/BRoleSelectModal.vue +++ b/src/components/Bootx/RoleSelectModal/BRoleSelectModal.vue @@ -52,7 +52,7 @@ diff --git a/src/components/FlowChart/src/adpterForTurbo.ts b/src/components/FlowChart/src/adpterForTurbo.ts deleted file mode 100644 index 51040797bb4887c0310e3cdd7b77e4ca271d7fa6..0000000000000000000000000000000000000000 --- a/src/components/FlowChart/src/adpterForTurbo.ts +++ /dev/null @@ -1,75 +0,0 @@ -const TurboType = { - SEQUENCE_FLOW: 1, - START_EVENT: 2, - END_EVENT: 3, - USER_TASK: 4, - SERVICE_TASK: 5, - EXCLUSIVE_GATEWAY: 6, -} - -function convertFlowElementToEdge(element) { - const { incoming, outgoing, properties, key } = element - const { text, startPoint, endPoint, pointsList, logicFlowType } = properties - const edge = { - id: key, - type: logicFlowType, - sourceNodeId: incoming[0], - targetNodeId: outgoing[0], - text, - startPoint, - endPoint, - pointsList, - properties: {}, - } - const excludeProperties = ['startPoint', 'endPoint', 'pointsList', 'text', 'logicFlowType'] - Object.keys(element.properties).forEach((property) => { - if (excludeProperties.indexOf(property) === -1) { - edge.properties[property] = element.properties[property] - } - }) - return edge -} - -function convertFlowElementToNode(element) { - const { properties, key } = element - const { x, y, text, logicFlowType } = properties - const node = { - id: key, - type: logicFlowType, - x, - y, - text, - properties: {}, - } - const excludeProperties = ['x', 'y', 'text', 'logicFlowType'] - Object.keys(element.properties).forEach((property) => { - if (excludeProperties.indexOf(property) === -1) { - node.properties[property] = element.properties[property] - } - }) - return node -} - -export function toLogicFlowData(data) { - const lfData: { - // TODO type - nodes: any[] - edges: any[] - } = { - nodes: [], - edges: [], - } - const list = data.flowElementList - list && - list.length > 0 && - list.forEach((element) => { - if (element.type === TurboType.SEQUENCE_FLOW) { - const edge = convertFlowElementToEdge(element) - lfData.edges.push(edge) - } else { - const node = convertFlowElementToNode(element) - lfData.nodes.push(node) - } - }) - return lfData -} diff --git a/src/components/FlowChart/src/config.ts b/src/components/FlowChart/src/config.ts deleted file mode 100644 index 1467cfc58dcff51c93a508496e385b791bbffcad..0000000000000000000000000000000000000000 --- a/src/components/FlowChart/src/config.ts +++ /dev/null @@ -1,96 +0,0 @@ -export const nodeList = [ - { - text: '开始', - type: 'start', - class: 'node-start', - }, - { - text: '矩形', - type: 'rect', - class: 'node-rect', - }, - { - type: 'user', - text: '用户', - class: 'node-user', - }, - { - type: 'push', - text: '推送', - class: 'node-push', - }, - { - type: 'download', - text: '位置', - class: 'node-download', - }, - { - type: 'end', - text: '结束', - class: 'node-end', - }, -] - -export const BpmnNode = [ - { - type: 'bpmn:startEvent', - text: '开始', - class: 'bpmn-start', - }, - { - type: 'bpmn:endEvent', - text: '结束', - class: 'bpmn-end', - }, - { - type: 'bpmn:exclusiveGateway', - text: '网关', - class: 'bpmn-exclusiveGateway', - }, - { - type: 'bpmn:userTask', - text: '用户', - class: 'bpmn-user', - }, -] - -export function configDefaultDndPanel(lf) { - return [ - { - text: '选区', - icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAOVJREFUOBGtVMENwzAIjKP++2026ETdpv10iy7WFbqFyyW6GBywLCv5gI+Dw2Bluj1znuSjhb99Gkn6QILDY2imo60p8nsnc9bEo3+QJ+AKHfMdZHnl78wyTnyHZD53Zzx73MRSgYvnqgCUHj6gwdck7Zsp1VOrz0Uz8NbKunzAW+Gu4fYW28bUYutYlzSa7B84Fh7d1kjLwhcSdYAYrdkMQVpsBr5XgDGuXwQfQr0y9zwLda+DUYXLaGKdd2ZTtvbolaO87pdo24hP7ov16N0zArH1ur3iwJpXxm+v7oAJNR4JEP8DoAuSFEkYH7cAAAAASUVORK5CYII=', - callback: () => { - lf.updateEditConfig({ - stopMoveGraph: true, - }) - }, - }, - { - type: 'circle', - text: '开始', - icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAAnBJREFUOBGdVL1rU1EcPfdGBddmaZLiEhdx1MHZQXApraCzQ7GKLgoRBxMfcRELuihWKcXFRcEWF8HBf0DdDCKYRZpnl7p0svLe9Zzbd29eQhTbC8nv+9zf130AT63jvooOGS8Vf9Nt5zxba7sXQwODfkWpkbjTQfCGUd9gIp3uuPP8bZ946g56dYQvnBg+b1HB8VIQmMFrazKcKSvFW2dQTxJnJdQ77urmXWOMBCmXM2Rke4S7UAW+/8ywwFoewmBps2tu7mbTdp8VMOkIRAkKfrVawalJTtIliclFbaOBqa0M2xImHeVIfd/nKAfVq/LGnPss5Kh00VEdSzfwnBXPUpmykNss4lUI9C1ga+8PNrBD5YeqRY2Zz8PhjooIbfJXjowvQJBqkmEkVnktWhwu2SM7SMx7Cj0N9IC0oQXRo8xwAGzQms+xrB/nNSUWVveI48ayrFGyC2+E2C+aWrZHXvOuz+CiV6iycWe1Rd1Q6+QUG07nb5SbPrL4426d+9E1axKjY3AoRrlEeSQo2Eu0T6BWAAr6COhTcWjRaYfKG5csnvytvUr/WY4rrPMB53Uo7jZRjXaG6/CFfNMaXEu75nG47X+oepU7PKJvvzGDY1YLSKHJrK7vFUwXKkaxwhCW3u+sDFMVrIju54RYYbFKpALZAo7sB6wcKyyrd+aBMryMT2gPyD6GsQoRFkGHr14TthZni9ck0z+Pnmee460mHXbRAypKNy3nuMdrWgVKj8YVV8E7PSzp1BZ9SJnJAsXdryw/h5ctboUVi4AFiCd+lQaYMw5z3LGTBKjLQOeUF35k89f58Vv/tGh+l+PE/wG0rgfIUbZK5AAAAABJRU5ErkJggg==', - }, - { - type: 'rect', - text: '用户任务', - icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==', - cls: 'important-node', - }, - { - type: 'rect', - text: '系统任务', - icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABMAAAATCAYAAAEFVwZaAAAABGdBTUEAALGPC/xhBQAAAqlJREFUOBF9VM9rE0EUfrMJNUKLihGbpLGtaCOIR8VjQMGDePCgCCIiCNqzCAp2MyYUCXhUtF5E0D+g1t48qAd7CCLqQUQKEWkStcEfVGlLdp/fm3aW2QQdyLzf33zz5m2IsAZ9XhDpyaaIZkTS4ASzK41TFao88GuJ3hsr2pAbipHxuSYyKRugagICGANkfFnNh3HeE2N0b3nN2cgnpcictw5veJIzxmDamSlxxQZicq/mflxhbaH8BLRbuRwNtZp0JAhoplVRUdzmCe/vO27wFuuA3S5qXruGdboy5/PRGFsbFGKo/haRtQHIrM83bVeTrOgNhZReWaYGnE4aUQgTJNvijJFF4jQ8BxJE5xfKatZWmZcTQ+BVgh7s8SgPlCkcec4mGTmieTP4xd7PcpIEg1TX6gdeLW8rTVMVLVvb7ctXoH0Cydl2QOPJBG21STE5OsnbweVYzAnD3A7PVILuY0yiiyDwSm2g441r6rMSgp6iK42yqroI2QoXeJVeA+YeZSa47gZdXaZWQKTrG93rukk/l2Al6Kzh5AZEl7dDQy+JjgFahQjRopSxPbrbvK7GRe9ePWBo1wcU7sYrFZtavXALwGw/7Dnc50urrHJuTPSoO2IMV3gUQGNg87IbSOIY9BpiT9HV7FCZ94nPXb3MSnwHn/FFFE1vG6DTby+r31KAkUktB3Qf6ikUPWxW1BkXSPQeMHHiW0+HAd2GelJsZz1OJegCxqzl+CLVHa/IibuHeJ1HAKzhuDR+ymNaRFM+4jU6UWKXorRmbyqkq/D76FffevwdCp+jN3UAN/C9JRVTDuOxC/oh+EdMnqIOrlYteKSfadVRGLJFJPSB/ti/6K8f0CNymg/iH2gO/f0DwE0yjAFO6l8JaR5j0VPwPwfaYHqOqrCI319WzwhwzNW/aQAAAABJRU5ErkJggg==', - cls: 'import_icon', - }, - { - type: 'diamond', - text: '条件判断', - icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABUAAAAVCAYAAAHeEJUAAAAABGdBTUEAALGPC/xhBQAAAvVJREFUOBGNVEFrE0EU/mY3bQoiFlOkaUJrQUQoWMGePLX24EH0IIoHKQiCV0G8iE1covgLiqA/QTzVm1JPogc9tIJYFaQtlhQxqYjSpunu+L7JvmUTU3AgmTfvffPNN++9WSA1DO182f6xwILzD5btfAoQmwL5KJEwiQyVbSVZ0IgRyV6PTpIJ81E5ZvqfHQR0HUOBHW4L5Et2kQ6Zf7iAOhTFAA8s0pEP7AXO1uAA52SbqGk6h/6J45LaLhO64ByfcUzM39V7ZiAdS2yCePPEIQYvTUHqM/n7dgQNfBKWPjpF4ISk8q3J4nB11qw6X8l+FsF3EhlkEMfrjIer3wJTLwS2aCNcj4DbGxXTw00JmAuO+Ni6bBxVUCvS5d9aa04+so4pHW5jLTywuXAL7jJ+D06sl82Sgl2JuVBQn498zkc2bGKxULHjCnSMadBKYDYYHAtsby1EQ5lNGrQd4Y3v4Zo0XdGEmDno46yCM9Tk+RiJmUYHS/aXHPNTcjxcbTFna000PFJHIVZ5lFRqRpJWk9/+QtlOUYJj9HG5pVFEU7zqIYDVsw2s+AJaD8wTd2umgSCCyUxgGsS1Y6TBwXQQTFuZaHcd8gAGioE90hlsY+wMcs30RduYtxanjMGal8H5dMW67dmT1JFtYUEe8LiQLRsPZ6IIc7A4J5tqco3T0pnv/4u0kyzrYUq7gASuEyI8VXKvB9Odytv6jS/PNaZBln0nioJG/AVQRZvApOdhjj3Jt8QC8Im09SafwdBdvIpztpxWxpeKCC+EsFdS8DCyuCn2munFpL7ctHKp+Xc5cMybeIyMAN33SPL3ZR9QV1XVwLyzHm6Iv0/yeUuUb7PPlZC4D4HZkeu6dpF4v9j9MreGtMbxMMRLIcjJic9yHi7WQ3yVKzZVWUr5UrViJvn1FfUlwe/KYVfYyWRLSGNu16hR01U9IacajXPei0wx/5BqgInvJN+MMNtNme7ReU9SBbgntovn0kKHpFg7UogZvaZiOue/q1SBo9ktHzQAAAAASUVORK5CYII=', - }, - { - type: 'circle', - text: '结束', - icon: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABQAAAAUCAYAAAH6ji2bAAAABGdBTUEAALGPC/xhBQAAA1BJREFUOBFtVE1IVUEYPXOf+tq40Y3vPcmFIdSjIorWoRG0ERWUgnb5FwVhYQSl72oUoZAboxKNFtWiwKRN0M+jpfSzqJAQclHo001tKkjl3emc8V69igP3znzfnO/M9zcDcKT67azmjYWTwl9Vn7Vumeqzj1DVb6cleQY4oAVnIOPb+mKAGxQmKI5CWNJ2aLPatxWa3aB9K7/fB+/Z0jUF6TmMlFLQqrkECWQzOZxYGjTlOl8eeKaIY5yHnFn486xBustDjWT6dG7pmjHOJd+33t0iitTPkK6tEvjxq4h2MozQ6WFSX/LkDUGfFwfhEZj1Auz/U4pyAi5Sznd7uKzznXeVHlI/Aywmk6j7fsUsEuCGADrWARXXwjxWQsUbIupDHJI7kF5dRktg0eN81IbiZXiTESic50iwS+t1oJgL83jAiBupLDCQqwziaWSoAFSeIR3P5Xv5az00wyIn35QRYTwdSYbz8pH8fxUUAtxnFvYmEmgI0wYXUXcCCSpeEVpXlsRhBnCEATxWylL9+EKCAYhe1NGstUa6356kS9NVvt3DU2fd+Wtbm/+lSbylJqsqkSm9CRhvoJVlvKPvF1RKY/FcPn5j4UfIMLn8D4UYb54BNsilTDXKnF4CfTobA0FpoW/LSp306wkXM+XaOJhZaFkcNM82ASNAWMrhrUbRfmyeI1FvRBTpN06WKxa9BK0o2E4Pd3zfBBEwPsv9sQBnmLVbLEIZ/Xe9LYwJu/Er17W6HYVBc7vmuk0xUQ+pqxdom5Fnp55SiytXLPYoMXNM4u4SNSCFWnrVIzKG3EGyMXo6n/BQOe+bX3FClY4PwydVhthOZ9NnS+ntiLh0fxtlUJHAuGaFoVmttpVMeum0p3WEXbcll94l1wM/gZ0Ccczop77VvN2I7TlsZCsuXf1WHvWEhjO8DPtyOVg2/mvK9QqboEth+7pD6NUQC1HN/TwvydGBARi9MZSzLE4b8Ru3XhX2PBxf8E1er2A6516o0w4sIA+lwURhAON82Kwe2iDAC1Watq4XHaGQ7skLcFOtI5lDxuM2gZe6WFIotPAhbaeYlU4to5cuarF1QrcZ/lwrLaCJl66JBocYZnrNlvm2+MBCTmUymPrYZVbjdlr/BxlMjmNmNI3SAAAAAElFTkSuQmCC', - }, - ] -} diff --git a/src/components/FlowChart/src/enum.ts b/src/components/FlowChart/src/enum.ts deleted file mode 100644 index 8ea134ca5eba3580d75f23754ee59df02be24441..0000000000000000000000000000000000000000 --- a/src/components/FlowChart/src/enum.ts +++ /dev/null @@ -1,11 +0,0 @@ -export enum ToolbarTypeEnum { - ZOOM_IN = 'zoomIn', - ZOOM_OUT = 'zoomOut', - RESET_ZOOM = 'resetZoom', - - UNDO = 'undo', - REDO = 'redo', - - SNAPSHOT = 'snapshot', - VIEW_DATA = 'viewData', -} diff --git a/src/components/FlowChart/src/types.ts b/src/components/FlowChart/src/types.ts deleted file mode 100644 index 5e42aedb60f39bdd5049834dae3bc407df5730a4..0000000000000000000000000000000000000000 --- a/src/components/FlowChart/src/types.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { NodeConfig } from '@logicflow/core' -import { ToolbarTypeEnum } from './enum' - -export interface NodeItem extends NodeConfig { - icon: string -} - -export interface ToolbarConfig { - type?: string | ToolbarTypeEnum - tooltip?: string | boolean - icon?: string - disabled?: boolean - separate?: boolean -} diff --git a/src/components/FlowChart/src/useFlowContext.ts b/src/components/FlowChart/src/useFlowContext.ts deleted file mode 100644 index da348e5cf4ba06a8a9e5a3539196fe5fe6aec8bc..0000000000000000000000000000000000000000 --- a/src/components/FlowChart/src/useFlowContext.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type LogicFlow from '@logicflow/core' - -import { provide, inject } from 'vue' - -const key = Symbol('flow-chart') - -type Instance = { - logicFlow: LogicFlow -} - -export function createFlowChartContext(instance: Instance) { - provide(key, instance) -} - -export function useFlowChartContext(): Instance { - return inject(key) as Instance -} diff --git a/src/components/registerGlobComp.ts b/src/components/registerGlobComp.ts index 9054255dd87a90c0c9688f2cd3b626cec74851c9..72a1df2812f1db56439ef771eb53117b2e0a76fe 100644 --- a/src/components/registerGlobComp.ts +++ b/src/components/registerGlobComp.ts @@ -1,3 +1,4 @@ +// @ts-nocheck import type { App } from 'vue' import { Button } from './Button' import { Link } from './Link' @@ -27,6 +28,7 @@ import { Col, Modal, Dropdown, + Timeline, Radio, Steps, Spin, @@ -64,6 +66,7 @@ export function registerGlobComp(app: App) { app.use(Divider) app.use(DatePicker) app.use(TimePicker) + app.use(Timeline) app.use(Typography) app.use(Empty) app.use(Popconfirm) diff --git a/src/design/components/index.less b/src/design/components/index.less index 79d53f9ba21f6c5e589340397147c711d3595d24..2d52363afd2b76f7dfe218a3e0b3ce82a2c523ab 100644 --- a/src/design/components/index.less +++ b/src/design/components/index.less @@ -1,3 +1,4 @@ @import "antdv.less"; @import "global.less"; @import "wangEditor.less"; +@import "vxeTable.less"; diff --git a/src/design/components/vxeTable.less b/src/design/components/vxeTable.less new file mode 100644 index 0000000000000000000000000000000000000000..1c86969279ec5e540ef1f9f31cdbc3449f433fed --- /dev/null +++ b/src/design/components/vxeTable.less @@ -0,0 +1,23 @@ +// vxe模态框样式 +.vxe-modal--wrapper{ + // 层级与保持antdv一致 + z-index: 1000 !important; + .vxe-modal--box{ + .vxe-modal--footer{ + padding: .8em 1em; + border-top: 1px solid #ebeef5; + .ant-btn{ + margin-left: 10px; + } + } + } +} +// vxe表格相关 +.vxe-custom--option-wrapper{ + // 需要低于顶栏 + z-index: 8 !important; +} +.vxe-table--border-line{ + // 需要低于顶栏 + z-index: 8 !important; +} diff --git a/src/hooks/bootx/useFormEdit.ts b/src/hooks/bootx/useFormEdit.ts index 37660b5a87a5c84464259d00af1fb2ed14efcffb..b0fb2230fbc9b3324bd41f909f9483d3ba658788 100644 --- a/src/hooks/bootx/useFormEdit.ts +++ b/src/hooks/bootx/useFormEdit.ts @@ -3,11 +3,11 @@ import { FormEditType } from '/@/enums/formTypeEnum' export default function () { const model = reactive({ - // 表单项标题文字 + // 表单项标题栅格宽度 labelCol: { sm: { span: 7 }, }, - // 表单项内容 + // 表单项内容栅格宽度 wrapperCol: { sm: { span: 13 }, }, @@ -20,9 +20,14 @@ export default function () { showable: false, formEditType: FormEditType.Add, }) - // 状态 + /** + * 状态 + */ const { labelCol, wrapperCol, title, modalWidth, confirmLoading, visible, editable, addable, showable, formEditType } = toRefs(model) + /** + * 初始化表单状态 + */ function initFormEditType(editType: FormEditType) { formEditType.value = editType visible.value = true @@ -40,7 +45,9 @@ export default function () { } } - // 关闭 + /** + * 关闭 + */ function handleCancel() { visible.value = false addable.value = false @@ -48,12 +55,16 @@ export default function () { showable.value = false } - // 搜索 + /** + * 搜索,供select下拉框组件进行筛选时使用(:filter-option="search") + */ function search(input: string, option) { return option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0 } - // 判断脱敏参数是否被修改的参数, 未修改返回空值 rawForm 后端获取到的原始数据, editForm 修改后的数据, keys 字段名称 + /** + * 判断脱敏参数是否被修改的参数, 未修改返回空值 rawForm 后端获取到的原始数据, editForm 修改后的数据, keys 字段名称 + */ function diffForm(rawForm, editForm, ...keys) { const form = {} for (const key of keys) { diff --git a/src/hooks/bootx/useTablePage.ts b/src/hooks/bootx/useTablePage.ts index 720bb5dba98906f15a377980a44614ebf413586b..ea118cfa435dd16bbbdbb4c8f34cd186409843d3 100644 --- a/src/hooks/bootx/useTablePage.ts +++ b/src/hooks/bootx/useTablePage.ts @@ -20,30 +20,38 @@ export default function (queryPageCallback: CallableFunction) { const loading = ref(false) // 批量操作标识 const batchOperateFlag = ref(false) - // 高级查询条件生效状态 + // 超级查询条件生效状态 const superQueryFlag = ref(false) // 不可以被重新赋值, 否则会失去绑定 const { pages, pagination } = model - // 普通查询 + /** + * 普通查询 + */ function query() { superQueryFlag.value = false batchOperateFlag.value = false resetPage() queryPageCallback() } - // 表格翻页或变动 + /** + * 表格翻页或变动 + */ function handleTableChange({ currentPage, pageSize }) { batchOperateFlag.value = false pages.current = currentPage pages.size = pageSize queryPageCallback() } - // 重置当前页数 + /** + * 重置当前页数 + */ function resetPage() { pages.current = 1 } - // 分页查询返回结果处理 + /** + * 分页查询返回结果处理 + */ function pageQueryResHandel(res: PageResult) { pagination.current = Number(res.current) pagination.size = Number(res.size) @@ -51,17 +59,23 @@ export default function (queryPageCallback: CallableFunction) { pagination.records = res.records loading.value = false } - // 重置查询 + /** + * 重置查询 + */ function resetQuery() { resetQueryParams() queryPageCallback() } - // 重置查询参数 + /** + * 重置查询参数 + */ function resetQueryParams() { superQueryFlag.value = false model.queryParam = {} } - // ok按钮 + /** + * ok按钮 + */ function handleOk() { queryPageCallback() } diff --git a/src/hooks/bootx/useValidate.ts b/src/hooks/bootx/useValidate.ts index 3652c90ec779f98e304e4fdf02a96ff20ce673a9..efd4f411b9b960f9f047a9d58241aa92123318a0 100644 --- a/src/hooks/bootx/useValidate.ts +++ b/src/hooks/bootx/useValidate.ts @@ -3,6 +3,12 @@ import { unref } from 'vue' /** * 服务器校验 + * @param value 要进行查重的值 + * @param id 主键 + * @param formEditType 方法类型,新增或更新 + * @param existsFun 查询该值的记录是否存在的请求方法 + * @param existsNotIdFun 查询该值id对应的数据之外否存在记录是的请求方法 + * @param errMsg 验证不通过的内容 */ async function existsByServer(value, id, formEditType, existsFun, existsNotIdFun, errMsg = '该编码已存在!') { if (!value) { @@ -12,13 +18,8 @@ async function existsByServer(value, id, formEditType, existsFun, existsNotIdFun return res.data ? Promise.reject(errMsg) : Promise.resolve() } -async function nullValidate() { - return Promise.resolve() -} - export function useValidate() { return { existsByServer, - nullValidate, } } diff --git a/src/layouts/default/header/components/notify/NoticeReader.vue b/src/layouts/default/header/components/notify/NoticeReader.vue index 1d6c5a45ee96974e049300967ad56ecd38db4933..ec5c8480478002b03f17a9ef2b67cc09cc292e50 100644 --- a/src/layouts/default/header/components/notify/NoticeReader.vue +++ b/src/layouts/default/header/components/notify/NoticeReader.vue @@ -21,7 +21,7 @@ diff --git a/src/views/login/third/ThirdLogin.vue b/src/views/login/third/ThirdLogin.vue index 442cb8fa4b109f2f101a65e28f5ba2eb70124c4c..7fcbea45831785e9ef2b88f84c47d18a95ea9614 100644 --- a/src/views/login/third/ThirdLogin.vue +++ b/src/views/login/third/ThirdLogin.vue @@ -6,7 +6,7 @@ + + diff --git a/src/views/modules/bpm/design/ProcessPanel.vue b/src/views/modules/bpm/design/ProcessPanel.vue new file mode 100644 index 0000000000000000000000000000000000000000..d155be574e573f7c6179895b0c617cdd10c9aff7 --- /dev/null +++ b/src/views/modules/bpm/design/ProcessPanel.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/src/views/modules/bpm/design/useProcessDesign.ts b/src/views/modules/bpm/design/useProcessDesign.ts new file mode 100644 index 0000000000000000000000000000000000000000..431f0edc3f43e61dca661ed372f0eddab7e24520 --- /dev/null +++ b/src/views/modules/bpm/design/useProcessDesign.ts @@ -0,0 +1,224 @@ +import Modeler from 'bpmn-js/lib/Modeler' +import { $ref } from '@vue-macros/reactivity-transform/macros' +import customTranslate from '/@/components/Bpmn/common/customTranslate' +import { nextTick } from 'vue' +import { getInitBpmnData } from '/@/components/Bpmn/flowable/designData' +import { useMessage } from '/@/hooks/web/useMessage' +import { $$ } from 'vue/macros' + +export default function (canvas: string, emit: any) { + const { createConfirm } = useMessage() + + let isEdit = $ref(false) + let isView = $ref(true) + + // 实例 + let modeler: Modeler + + // xml代码预览 + let codeVisible = $ref(false) + let xmlCode = $ref('') + + // 缩放 + let zoom = $ref(1) + // 编辑时参数 + const isEditModules = [ + { + translate: ['value', customTranslate], // 翻译 + }, + ] + // 查看时参数 + const notEditModules = [ + { + translate: ['value', customTranslate], // 翻译 + paletteProvider: ['value', ''], // 禁用/清空左侧工具栏 + labelEditingProvider: ['value', ''], // 禁用节点编辑 + contextPadProvider: ['value', ''], // 禁用图形菜单 + bendpoints: ['value', {}], // 禁用连线拖动 + move: ['value', ''], // 禁用单个图形拖动 + }, + ] + + /** + * 渲染函数 + */ + async function renderer(xml: string, edit: boolean, view: boolean) { + nextTick(() => console.log(9999)) + isEdit = edit + isView = view + const xmlData = xml || getInitBpmnData() + const additionalModule = edit && !view ? isEditModules : notEditModules + modeler = new Modeler({ + container: canvas, + propertiesPanel: {}, + additionalModules: additionalModule, + moddleExtensions: {}, + }) + await createNewDiagram(xmlData) + } + + /** + * 获取流程元素 + */ + function getProcessElement() { + const rootElements = modeler.getDefinitions().rootElements + for (let i = 0; i < rootElements.length; i++) { + if (rootElements[i].$type === 'bpmn:Process') return rootElements[i] + } + } + + /** + * 撤消 + */ + function undo() { + modeler.get('commandStack').undo() + } + /** + * 重做 + */ + function redo() { + modeler.get('commandStack').redo() + } + + /** + * 查看 bpmn.xml + */ + async function showXML() { + xmlCode = await downXML(false) + codeVisible = true + } + /** + * 保存 + */ + async function saveXML() { + const xml = await downXML() + emit('save', xml) + } + /** + * 下载 bpmn.xml + */ + async function downXML(download = false) { + try { + const { xml } = await modeler.saveXML({ format: true }) + if (download) { + downloadFile(`${getProcessElement().name}.bpmn20.xml`, xml, 'application/xml') + } + return xml + } catch (err) { + console.error(err) + } + } + + /** + * 下载图片 + */ + async function downImg(type = 'svg', download = false) { + try { + const { svg } = await modeler.saveSVG({ format: true }) + if (download) { + downloadFile(getProcessElement().name, svg, 'image/svg+xml') + } + return svg + } catch (err) { + console.error(err) + } + } + + /** + * 打开 bpmn.xml 文件 + */ + function openBpmn(file) { + const reader = new FileReader() + reader.readAsText(file, 'utf-8') + reader.onload = () => { + createNewDiagram(reader.result) + } + return false + } + /** + * 下载文件 + */ + function downloadFile(filename, data, type) { + const a = document.createElement('a') + const url = window.URL.createObjectURL(new Blob([data], { type: type })) + a.href = url + a.download = filename + a.click() + window.URL.revokeObjectURL(url) + } + + /** + * 关闭 + */ + function cancel() { + emit('cancel') + } + /** + * 新建画布 + */ + function newDiagram() { + createNewDiagram(getInitBpmnData()) + } + /** + * 让图能自适应屏幕 + */ + function fitViewport() { + zoom = modeler.get('canvas').zoom('fit-viewport', 'auto') + } + /** + * 放大缩小 + */ + function zoomViewport(zoomIn = true) { + zoom = modeler.get('canvas').zoom() + zoom += zoomIn ? 0.1 : -0.1 + modeler.get('canvas').zoom(zoom) + } + /** + * 创建新画布 + */ + async function createNewDiagram(data) { + // 将字符串转换成图显示出来 + data = data.replace(//g, function (match, str) { + return str.replace(/ { + newDiagram() + }, + }) + } + return { + modeler: $$(modeler), + isEdit: $$(isEdit), + isView: $$(isView), + codeVisible: $$(codeVisible), + xmlCode: $$(xmlCode), + zoom: $$(zoom), + renderer, + getProcessElement, + undo, + redo, + showXML, + saveXML, + downXML, + downImg, + openBpmn, + downloadFile, + cancel, + newDiagram, + fitViewport, + zoomViewport, + createNewDiagram, + clearDiagram, + } +} diff --git a/src/views/modules/bpm/instance/Instance.api.ts b/src/views/modules/bpm/instance/Instance.api.ts index 8e05346a545ec2d073193b7532a4b8a5c7f93152..59dd606634c5d6104378e1f4c342a32297ee7e81 100644 --- a/src/views/modules/bpm/instance/Instance.api.ts +++ b/src/views/modules/bpm/instance/Instance.api.ts @@ -1,7 +1,7 @@ import { defHttp } from '/@/utils/http/axios' import { BaseEntity } from '/#/web' import { PageResult, Result } from '/#/axios' -import { BpmModelNode } from '/@/views/modules/bpm/model/ModelNode.api' +import { BpmModelNode } from '/@/views/modules/bpm/model/node/ModelNode.api' /** * 分页 diff --git a/src/views/modules/bpm/instance/InstanceList.vue b/src/views/modules/bpm/instance/InstanceList.vue index c32b05fd4b30ed90de78555b2c79309889355b33..b6fd2ec30d64f451f6962ab8fa7bc497bf4bab17 100644 --- a/src/views/modules/bpm/instance/InstanceList.vue +++ b/src/views/modules/bpm/instance/InstanceList.vue @@ -42,7 +42,7 @@ + + diff --git a/src/views/modules/bpm/model/Model.api.ts b/src/views/modules/bpm/model/Model.api.ts index 4400a0be8392c47838c38bcad52436d50515ba14..980aa2a0593e3393e353e90c3f815b73a539b758 100644 --- a/src/views/modules/bpm/model/Model.api.ts +++ b/src/views/modules/bpm/model/Model.api.ts @@ -117,7 +117,7 @@ export function copy(id) { */ export interface BpmModel extends BaseEntity { // 名称 - name: string + name?: string // 流程类型 modelType?: string // 关联表单 diff --git a/src/views/modules/bpm/model/BpmModelNodeCode.ts b/src/views/modules/bpm/model/node/BpmModelNodeCode.ts similarity index 100% rename from src/views/modules/bpm/model/BpmModelNodeCode.ts rename to src/views/modules/bpm/model/node/BpmModelNodeCode.ts diff --git a/src/views/modules/bpm/model/BpmModelNodeEdit.vue b/src/views/modules/bpm/model/node/BpmModelNodeEdit.vue similarity index 98% rename from src/views/modules/bpm/model/BpmModelNodeEdit.vue rename to src/views/modules/bpm/model/node/BpmModelNodeEdit.vue index d5e40279cafc7d53d60b3e781cbb31bb65524b34..e66e5b8f79f2c233e195b100a0973cacd2ce43ee 100644 --- a/src/views/modules/bpm/model/BpmModelNodeEdit.vue +++ b/src/views/modules/bpm/model/node/BpmModelNodeEdit.vue @@ -70,13 +70,13 @@