28 Commits

Author SHA1 Message Date
疯狂的狮子Li
419e7bde9a 🧨🧨🧨发布 5.5.3-2.5.3 版本 提前祝大家新年快乐 2026-01-23 14:02:39 +08:00
疯狂的狮子Li
3c7691a6b7 update 优化 修改前端推荐的node版本号 2025-12-29 11:00:55 +08:00
疯狂的狮子Li
32ee077f1a fix 修复 角色删除按钮权限标识符不正确问题 2025-12-24 11:21:29 +08:00
疯狂的狮子Li
6b8600a989 fix 修复 代码漏改问题 2025-12-23 13:40:55 +08:00
疯狂的狮子Li
3724baa93a fix 修复 一个奇奇怪怪的问题(特殊芯片电脑可复现 https://gitee.com/dromara/RuoYi-Vue-Plus/issues/IBTNM1) 2025-12-23 10:47:55 +08:00
疯狂的狮子Li
1e5f89817e !254 update 优化 字典组件值宽松匹配values的问题
Merge pull request !254 from 加多宝/N/A
2025-12-23 01:40:27 +00:00
疯狂的狮子Li
c28a224d78 🧨🧨🧨发布 5.5.2-2.5.2 版本 2025年最后一版 2025-12-23 09:29:05 +08:00
加多宝
3008a8d7b0 update 优化 字典组件值宽松匹配values的问题
Signed-off-by: 加多宝 <945324621@qq.com>
2025-12-20 08:35:49 +00:00
疯狂的狮子Li
56bb05d547 update 优化 更改方法命名避免误会 2025-12-19 17:54:34 +08:00
疯狂的狮子Li
b4282f1423 update 优化 字典组件值宽松匹配 2025-12-18 09:39:56 +08:00
疯狂的狮子Li
f9c3958d5d !252 feat: 添加开发者工具保护功能,防止调试
Merge pull request !252 from mubai576/dev
2025-12-01 01:30:19 +00:00
mubai576
0e210b90a2 feat: 添加开发者工具保护功能,防止调试 2025-11-30 17:36:27 +08:00
疯狂的狮子Li
6a17a0735d fix 修复 附件按钮权限不生效 2025-11-06 10:00:50 +08:00
beginner
8284a87d36 !247 feat(login): 刷新验证码时清空验证码输入框
* feat(login): 刷新验证码时清空验证码输入框
* feat(login): 添加了验证码错误时清空输入框的功能
2025-11-05 01:25:06 +00:00
疯狂的狮子Li
cdad26bba6 !248 update 前端依赖小版本升级
Merge pull request !248 from Lau/dev
2025-11-05 01:24:40 +00:00
lau
ab9b1a1367 update 前端依赖小版本升级 2025-11-05 00:38:41 +08:00
lau
8048d80baa update 前端依赖小版本升级
JSEncrypt导包方式更换
Axios增加更明确的超时错误配置
2025-11-05 00:19:50 +08:00
疯狂的狮子Li
f1ef2b1083 update 优化 增加隐藏子菜单激活路由选项编辑功能 2025-11-04 15:05:47 +08:00
疯狂的狮子Li
5e1d44c2af 🐳🐳🐳发布 5.5.1-2.5.1 日常依赖升级bug修复 2025-10-28 11:20:14 +08:00
疯狂的狮子Li
55691695c4 fix 修复 前端变量名错误 2025-10-07 16:22:36 +08:00
Lau
53e7d03a1c !245 update 页面中的标题都从配置项获取
* update 规范环境变量命名
* update 将页面中的标题都从配置项获取
2025-09-28 03:27:45 +00:00
疯狂的狮子Li
9c84bf242c !244 update 挂载全局属性改为操作vue模块
Merge pull request !244 from Lau/dev
2025-09-28 02:31:40 +00:00
lau
b89e9cee7f update 挂载全局属性改为操作vue模块 2025-09-28 10:23:17 +08:00
疯狂的狮子Li
014bedd301 update 优化 禁止选择动态表单(无此功能) 2025-09-26 15:20:19 +08:00
疯狂的狮子Li
ceb6de9044 !243 update 升级unocss版本, 解决 nodejs lts 22 版本兼容问题
Merge pull request !243 from JackyTang/dev
2025-09-26 04:33:55 +00:00
JackyTang
04c6131fb0 update 升级unocss版本, 解决 nodejs lts 22 版本兼容问题 2025-09-26 12:17:08 +08:00
疯狂的狮子Li
c9cfefdc3e add 增加 同步租户参数配置功能 2025-09-26 11:57:33 +08:00
疯狂的狮子Li
fbe9254114 fix 修复 按钮权限不设置导致的问题 2025-09-25 11:34:52 +08:00
26 changed files with 287 additions and 74 deletions

View File

@@ -1,5 +1,6 @@
# 页面标题
VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
# 开发环境配置
VITE_APP_ENV = 'development'

View File

@@ -1,5 +1,6 @@
# 页面标题
VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统
VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus
# 生产环境配置
VITE_APP_ENV = 'production'

View File

@@ -17,6 +17,8 @@
"MaybeRefOrGetter": true,
"PropType": true,
"Ref": true,
"Slot": true,
"Slots": true,
"VNode": true,
"WritableComputedRef": true,
"acceptHMRUpdate": true,
@@ -35,6 +37,7 @@
"createInjectionState": true,
"createPinia": true,
"createReactiveFn": true,
"createRef": true,
"createReusableTemplate": true,
"createSharedComposable": true,
"createTemplatePromise": true,
@@ -277,6 +280,7 @@
"useThrottleFn": true,
"useThrottledRefHistory": true,
"useTimeAgo": true,
"useTimeAgoIntl": true,
"useTimeout": true,
"useTimeoutFn": true,
"useTimeoutPoll": true,
@@ -315,9 +319,6 @@
"watchThrottled": true,
"watchTriggerable": true,
"watchWithFilter": true,
"whenever": true,
"Slot": true,
"Slots": true,
"createRef": true
"whenever": true
}
}

View File

@@ -6,7 +6,7 @@
<meta name="renderer" content="webkit" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" />
<link rel="icon" href="/favicon.ico" />
<title>RuoYi-Vue-Plus多租户管理系统</title>
<title>%VITE_APP_TITLE%</title>
<!--[if lt IE 11
]><script>
window.location.href = '/html/ie.html';

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://json.schemastore.org/package",
"name": "ruoyi-vue-plus",
"version": "5.5.0-2.5.0",
"version": "5.5.3-2.5.3",
"description": "RuoYi-Vue-Plus多租户管理系统",
"author": "LionLi",
"license": "MIT",
@@ -20,72 +20,72 @@
"url": "https://gitee.com/JavaLionLi/plus-ui.git"
},
"dependencies": {
"@element-plus/icons-vue": "2.3.1",
"@highlightjs/vue-plugin": "2.1.0",
"@element-plus/icons-vue": "2.3.2",
"@highlightjs/vue-plugin": "2.1.2",
"@vueup/vue-quill": "1.2.0",
"@vueuse/core": "13.1.0",
"@vueuse/core": "13.9.0",
"animate.css": "4.1.1",
"await-to-js": "3.0.0",
"axios": "1.8.4",
"axios": "1.13.1",
"crypto-js": "4.2.0",
"echarts": "5.6.0",
"element-plus": "2.9.8",
"element-plus": "2.11.7",
"file-saver": "2.0.5",
"highlight.js": "11.9.0",
"highlight.js": "11.11.1",
"image-conversion": "2.1.1",
"js-cookie": "3.0.5",
"jsencrypt": "3.3.2",
"jsencrypt": "3.5.4",
"nprogress": "0.2.0",
"pinia": "3.0.2",
"pinia": "3.0.3",
"screenfull": "6.0.2",
"vue": "3.5.13",
"vue-cropper": "1.1.1",
"vue-i18n": "11.1.3",
"vue-json-pretty": "2.4.0",
"vue-router": "4.5.0",
"vue": "3.5.22",
"vue-cropper": "1.1.4",
"vue-i18n": "11.1.12",
"vue-json-pretty": "2.6.0",
"vue-router": "4.6.3",
"vue-types": "6.0.0",
"vxe-table": "4.13.7"
"vxe-table": "4.17.7"
},
"devDependencies": {
"@iconify/json": "^2.2.276",
"@iconify/json": "^2.2.403",
"@types/crypto-js": "4.2.2",
"@types/file-saver": "2.0.7",
"@types/js-cookie": "3.0.6",
"@types/node": "^22.13.4",
"@types/node": "^22.19.0",
"@types/nprogress": "0.2.3",
"@unocss/preset-attributify": "66.0.0",
"@unocss/preset-icons": "66.0.0",
"@unocss/preset-uno": "66.0.0",
"@vitejs/plugin-vue": "5.2.3",
"@vue/compiler-sfc": "3.5.13",
"@unocss/preset-attributify": "66.5.4",
"@unocss/preset-icons": "66.5.4",
"@unocss/preset-uno": "66.5.4",
"@vitejs/plugin-vue": "5.2.4",
"@vue/compiler-sfc": "3.5.22",
"@vue/eslint-config-prettier": "10.2.0",
"@vue/eslint-config-typescript": "14.4.0",
"autoprefixer": "10.4.20",
"eslint": "9.21.0",
"eslint-plugin-prettier": "5.2.3",
"eslint-plugin-vue": "9.32.0",
"globals": "16.0.0",
"prettier": "3.5.2",
"sass": "1.87.0",
"typescript": "~5.8.3",
"unocss": "66.0.0",
"unplugin-auto-import": "19.1.2",
"unplugin-icons": "22.1.0",
"unplugin-vue-components": "28.5.0",
"@vue/eslint-config-typescript": "14.6.0",
"autoprefixer": "10.4.21",
"eslint": "9.39.1",
"eslint-plugin-prettier": "5.5.4",
"eslint-plugin-vue": "9.33.0",
"globals": "16.5.0",
"prettier": "3.6.2",
"sass": "1.93.3",
"typescript": "~5.9.3",
"unocss": "66.5.4",
"unplugin-auto-import": "19.3.0",
"unplugin-icons": "22.5.0",
"unplugin-vue-components": "28.8.0",
"unplugin-vue-setup-extend-plus": "1.0.1",
"vite": "6.3.2",
"vite": "6.4.1",
"vite-plugin-compression": "0.5.1",
"vite-plugin-svg-icons-ng": "^1.4.0",
"vite-plugin-vue-devtools": "7.7.5",
"vitest": "3.1.2",
"vue-tsc": "^2.2.8"
"vite-plugin-svg-icons-ng": "^1.5.2",
"vite-plugin-vue-devtools": "8.0.3",
"vitest": "3.2.4",
"vue-tsc": "^2.2.12"
},
"overrides": {
"quill": "2.0.2"
},
"engines": {
"node": ">=18.18.0",
"npm": ">=8.9.0"
"node": ">=20.15.0",
"npm": ">=8.19.0"
},
"browserslist": [
"Chrome >= 87",

View File

@@ -1,7 +1,7 @@
import request from '@/utils/request';
// 绑定账号
export function authBinding(source: string, tenantId: string) {
// 获取跳转URL
export function authRouterUrl(source: string, tenantId: string) {
return request({
url: '/auth/binding/' + source,
method: 'get',

View File

@@ -99,3 +99,11 @@ export function syncTenantDict() {
method: 'get'
});
}
// 同步租户字典
export function syncTenantConfig() {
return request({
url: '/system/tenant/syncTenantConfig',
method: 'get'
});
}

View File

@@ -10,5 +10,5 @@ export interface StartProcessBo {
businessId: string | number;
flowCode: string;
variables: any;
flowInstanceBizExtBo: any;
bizExt: any;
}

View File

@@ -1,7 +1,7 @@
<template>
<div>
<template v-for="(item, index) in options">
<template v-if="values.includes(item.value)">
<template v-if="isValueMatch(item.value)">
<span
v-if="(item.elTagType === 'default' || item.elTagType === '') && (item.elTagClass === '' || item.elTagClass == null)"
:key="item.value"
@@ -50,6 +50,7 @@ const props = withDefaults(defineProps<Props>(), {
const values = computed(() => {
if (props.value === '' || props.value === null || typeof props.value === 'undefined') return [];
if (typeof props.value === 'number' || typeof props.value === 'boolean') return [props.value]
return Array.isArray(props.value) ? props.value.map((item) => '' + item) : String(props.value).split(props.separator);
});
@@ -58,7 +59,7 @@ const unmatch = computed(() => {
// 传入值为非数组
let unmatch = false; // 添加一个标志来判断是否有未匹配项
values.value.forEach((item) => {
if (!props.options.some((v) => v.value === item)) {
if (!props.options.some((v) => v.value == item)) {
unmatch = true; // 如果有未匹配项将标志设置为true
}
});
@@ -85,6 +86,10 @@ const handleArray = (array: Array<string | number>) => {
return pre + ' ' + cur;
});
};
const isValueMatch = (itemValue: any) => {
return values.value.some(val => val == itemValue)
}
</script>
<style lang="scss" scoped>

View File

@@ -8,7 +8,7 @@
<el-checkbox value="3" name="type">短信</el-checkbox>
</el-checkbox-group>
</el-form-item>
<el-form-item label="附件">
<el-form-item label="附件" v-if="buttonObj.file">
<fileUpload v-model="form.fileId" :file-type="['png', 'jpg', 'jpeg', 'doc', 'docx', 'xlsx', 'xls', 'ppt', 'txt', 'pdf']" :file-size="20" />
</el-form-item>
<el-form-item label="抄送" v-if="buttonObj.copy">
@@ -259,7 +259,7 @@ const openDialog = async (id?: string) => {
const response = await getTask(taskId.value);
task.value = response.data;
buttonObj.value = {};
task.value.buttonList.forEach((e) => {
task.value.buttonList?.forEach((e) => {
buttonObj.value[e.code] = e.show;
});
selectCopyUserList.value = task.value.copyList;

View File

@@ -34,7 +34,7 @@ defineProps({
}
});
const title = ref('RuoYi-Vue-Plus');
const title = import.meta.env.VITE_APP_LOGO_TITLE;
const settingsStore = useSettingsStore();
const sideTheme = computed(() => settingsStore.sideTheme);
</script>

View File

@@ -28,6 +28,9 @@ import ElementIcons from '@/plugins/svgicon';
// permission control
import './permission';
// 开发者工具保护
import { initDevToolsProtection } from '@/utils/devtools-protection';
// 国际化
import i18n from '@/lang/index';
@@ -55,3 +58,6 @@ app.use(plugins);
directive(app);
app.mount('#app');
// 初始化开发者工具保护(仅生产环境)
initDevToolsProtection();

View File

@@ -12,7 +12,7 @@ import type { LanguageType } from '@/lang';
export {};
declare module '@vue/runtime-core' {
declare module 'vue' {
interface ComponentCustomProperties {
// 全局方法声明
$modal: typeof modal;

View File

@@ -0,0 +1,158 @@
/**
* 开发者工具保护
* 检测开发者工具是否打开,如果打开则循环执行 debugger 阻止调试
*/
// 检测开发者工具是否打开
function detectDevTools(): boolean {
try {
// 方法1: 检测窗口尺寸差异(最可靠的方法)
const widthThreshold = 160; // 开发者工具最小宽度
const heightThreshold = 160; // 开发者工具最小高度
const widthDiff = window.outerWidth - window.innerWidth;
const heightDiff = window.outerHeight - window.innerHeight;
if (widthDiff > widthThreshold || heightDiff > heightThreshold) {
return true;
}
// 方法2: 检测 debugger 执行时间(最准确的方法)
const start = performance.now();
debugger; // 这个 debugger 用于检测,不会被移除
const end = performance.now();
const timeDiff = end - start;
// 如果 debugger 被跳过(开发者工具关闭),时间差会很小(通常 < 1ms
// 如果 debugger 暂停(开发者工具打开),时间差会很大(通常 > 100ms
// 降低阈值以提高检测灵敏度
if (timeDiff > 10) {
return true;
}
// 方法3: 检测控制台对象
let devtoolsDetected = false;
const element = document.createElement('div');
Object.defineProperty(element, 'id', {
get: function () {
devtoolsDetected = true;
return '';
}
});
// 使用 console 来触发 getter仅在开发者工具打开时
try {
console.log(element);
console.clear();
} catch (e) {
// 忽略错误
}
if (devtoolsDetected) {
return true;
}
// 方法4: 检测控制台是否被重写(开发者工具打开时)
const devtoolsRegex = /./;
// @ts-expect-error - 动态添加属性
devtoolsRegex.toString = function () {
// @ts-expect-error - 动态添加属性
this.opened = true;
};
console.log('%c', devtoolsRegex);
// @ts-expect-error - 检查动态添加的属性
if (devtoolsRegex.opened) {
return true;
}
} catch (e) {
// 如果检测过程中出错,默认返回 false
return false;
}
return false;
}
// 开发者工具保护主函数
export function initDevToolsProtection(): void {
// 可以通过环境变量控制是否启用
// 生产环境默认启用,开发环境可以通过 VITE_ENABLE_ANTI_DEBUG=true 来启用测试
const isProduction = import.meta.env.MODE === 'production';
const enableAntiDebug = import.meta.env.VITE_ENABLE_ANTI_DEBUG === 'true' || isProduction;
if (!enableAntiDebug) {
return;
}
let devToolsOpen = false;
let debuggerInterval: number | null = null;
// 立即执行一次检测
const initialCheck = detectDevTools();
if (initialCheck) {
devToolsOpen = true;
debuggerInterval = window.setInterval(() => {
debugger; // 循环执行 debugger
}, 50); // 更频繁的 debugger每 50ms 一次
}
// 循环检测开发者工具(更频繁的检测)
const checkInterval = setInterval(() => {
const isOpen = detectDevTools();
if (isOpen && !devToolsOpen) {
// 开发者工具刚打开
devToolsOpen = true;
// 开始循环执行 debugger更频繁
if (debuggerInterval === null) {
debuggerInterval = window.setInterval(() => {
debugger; // 循环执行 debugger
}, 50); // 每 50ms 执行一次,更激进
}
} else if (!isOpen && devToolsOpen) {
// 开发者工具关闭了
devToolsOpen = false;
// 停止循环 debugger
if (debuggerInterval !== null) {
clearInterval(debuggerInterval);
debuggerInterval = null;
}
}
}, 500); // 每 500ms 检测一次,更频繁
// 页面卸载时清理
window.addEventListener('beforeunload', () => {
clearInterval(checkInterval);
if (debuggerInterval !== null) {
clearInterval(debuggerInterval);
}
});
// 额外的检测:监听窗口大小变化
let lastWidth = window.innerWidth;
let lastHeight = window.innerHeight;
window.addEventListener('resize', () => {
const currentWidth = window.innerWidth;
const currentHeight = window.innerHeight;
// 如果窗口尺寸变化很大,可能是开发者工具打开/关闭
if (Math.abs(currentWidth - lastWidth) > 200 || Math.abs(currentHeight - lastHeight) > 200) {
// 重新检测
const isOpen = detectDevTools();
if (isOpen && !devToolsOpen) {
devToolsOpen = true;
if (debuggerInterval === null) {
debuggerInterval = window.setInterval(() => {
debugger; // 循环执行 debugger
}, 50); // 更频繁的 debugger
}
}
}
lastWidth = currentWidth;
lastHeight = currentHeight;
});
}

View File

@@ -1,4 +1,4 @@
import JSEncrypt from 'jsencrypt/bin/jsencrypt.min.js';
import JSEncrypt from 'jsencrypt';
// 密钥对生成 http://web.chacuo.net/netrsakeypair
const publicKey = import.meta.env.VITE_APP_RSA_PUBLIC_KEY;

View File

@@ -28,7 +28,11 @@ axios.defaults.headers['clientid'] = import.meta.env.VITE_APP_CLIENT_ID;
// 创建 axios 实例
const service = axios.create({
baseURL: import.meta.env.VITE_APP_BASE_API,
timeout: 50000
timeout: 50000,
transitional: {
// 超时错误更明确
clarifyTimeoutError: true
}
});
// 请求拦截器

View File

@@ -33,7 +33,7 @@
* 部署方式 Docker 容器编排 一键部署业务集群<br />
* 国际化 SpringMessage Spring标准国际化方案<br />
</p>
<p><b>当前版本:</b> <span>v5.5.0</span></p>
<p><b>当前版本:</b> <span>v5.5.3</span></p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>
@@ -77,7 +77,7 @@
* 分布式监控 PrometheusGrafana 全方位性能监控<br />
* 其余与 Vue 版本一致<br />
</p>
<p><b>当前版本:</b> <span>v2.5.0</span></p>
<p><b>当前版本:</b> <span>v2.5.3</span></p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>

View File

@@ -73,14 +73,14 @@
</el-form>
<!-- 底部 -->
<div class="el-login-footer">
<span>Copyright © 2018-2025 疯狂的狮子Li All Rights Reserved.</span>
<span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>
</div>
</div>
</template>
<script setup lang="ts">
import { getCodeImg, getTenantList } from '@/api/login';
import { authBinding } from '@/api/system/social/auth';
import { authRouterUrl } from '@/api/system/social/auth';
import { useUserStore } from '@/store/modules/user';
import { LoginData, TenantVO } from '@/api/types';
import { to } from 'await-to-js';
@@ -176,6 +176,8 @@ const getCode = async () => {
const { data } = res;
captchaEnabled.value = data.captchaEnabled === undefined ? true : data.captchaEnabled;
if (captchaEnabled.value) {
// 刷新验证码时清空输入框
loginForm.value.code = '';
codeUrl.value = 'data:image/gif;base64,' + data.img;
loginForm.value.uuid = data.uuid;
}
@@ -213,7 +215,7 @@ const initTenantList = async () => {
* @param type
*/
const doSocialLogin = (type: string) => {
authBinding(type, loginForm.value.tenantId).then((res: any) => {
authRouterUrl(type, loginForm.value.tenantId).then((res: any) => {
if (res.code === HttpStatus.SUCCESS) {
// 获取授权地址跳转
window.location.href = res.data;

View File

@@ -67,7 +67,7 @@
</el-form>
<!-- 底部 -->
<div class="el-register-footer">
<span>Copyright © 2018-2025 疯狂的狮子Li All Rights Reserved.</span>
<span>Copyright © 2018-2026 疯狂的狮子Li All Rights Reserved.</span>
</div>
</div>
</template>

View File

@@ -252,6 +252,21 @@
</el-radio-group>
</el-form-item>
</el-col>
<el-col v-if="form.visible !== '0'" :span="12">
<el-form-item label="激活路径" prop="form.remark">
<template #label>
<span>
<el-tooltip content="隐藏菜单填写默认激活路由,比如激活父菜单的路由 /system/user" placement="top">
<el-icon>
<question-filled />
</el-icon>
</el-tooltip>
激活路由
</span>
</template>
<el-input v-model="form.remark" placeholder="请输入激活路径" />
</el-form-item>
</el-col>
</el-row>
</el-form>
<template #footer>

View File

@@ -46,7 +46,7 @@
<el-button v-hasPermi="['system:role:edit']" type="success" plain :disabled="single" icon="Edit" @click="handleUpdate()">修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button v-hasPermi="['system:role:delete']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()">删除</el-button>
<el-button v-hasPermi="['system:role:remove']" type="danger" plain :disabled="ids.length === 0" @click="handleDelete()">删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button v-hasPermi="['system:role:export']" type="warning" plain icon="Download" @click="handleExport">导出</el-button>

View File

@@ -47,6 +47,9 @@
<el-col :span="1.5">
<el-button v-if="userId === 1" type="success" plain icon="Refresh" @click="handleSyncTenantDict">同步租户字典</el-button>
</el-col>
<el-col :span="1.5">
<el-button v-if="userId === 1" type="success" plain icon="Refresh" @click="handleSyncTenantConfig">同步租户参数配置</el-button>
</el-col>
<right-toolbar v-model:show-search="showSearch" @query-table="getList"></right-toolbar>
</el-row>
</template>
@@ -152,7 +155,8 @@ import {
updateTenant,
changeTenantStatus,
syncTenantPackage,
syncTenantDict
syncTenantDict,
syncTenantConfig
} from '@/api/system/tenant';
import { selectTenantPackage } from '@/api/system/tenantPackage';
import { useUserStore } from '@/store/modules/user';
@@ -365,6 +369,13 @@ const handleSyncTenantDict = async () => {
proxy?.$modal.msgSuccess(res.msg);
};
/**同步租户参数配置*/
const handleSyncTenantConfig = async () => {
await proxy?.$modal.confirm('确认要同步所有租户参数配置吗?');
const res = await syncTenantConfig();
proxy?.$modal.msgSuccess(res.msg);
};
onMounted(() => {
getList();
});

View File

@@ -56,7 +56,7 @@
</template>
<script setup lang="ts">
import { authUnlock, authBinding } from '@/api/system/social/auth';
import { authUnlock, authRouterUrl } from '@/api/system/social/auth';
import { propTypes } from '@/utils/propTypes';
import { useUserStore } from '@/store/modules/user';
@@ -84,7 +84,7 @@ const unlockAuth = (row: any) => {
};
const authUrl = (source: string) => {
authBinding(source, useUserStore().tenantId).then((res: any) => {
authRouterUrl(source, useUserStore().tenantId).then((res: any) => {
if (res.code === 200) {
window.location.href = res.data;
} else {

View File

@@ -127,10 +127,10 @@ const submitFormData = ref<StartProcessBo>({
businessId: '',
flowCode: '',
variables: {},
flowInstanceBizExtBo: {}
bizExt: {}
});
const taskVariables = ref<Record<string, any>>({});
const flowInstanceBizExtBo = ref<Record<string, any>>({});
const bizExt = ref<Record<string, any>>({});
const initFormData: LeaveForm = {
id: undefined,
@@ -244,12 +244,12 @@ const handleStartWorkFlow = async (data: LeaveForm) => {
userList: ['1', '3', '4']
};
//流程实例业务扩展字段
flowInstanceBizExtBo.value = {
bizExt.value = {
businessTitle: '请假申请',
businessCode: data.applyCode
};
submitFormData.value.variables = taskVariables.value;
submitFormData.value.flowInstanceBizExtBo = flowInstanceBizExtBo.value;
submitFormData.value.bizExt = bizExt.value;
const resp = await startWorkFlow(submitFormData.value);
if (submitVerifyRef.value) {
buttonLoading.value = false;

View File

@@ -189,7 +189,7 @@
</el-form-item>
<el-form-item label="是否动态表单" prop="formCustom">
<el-radio-group v-model="form.formCustom">
<el-radio value="Y" size="large" border></el-radio>
<el-radio value="Y" size="large" border disabled></el-radio>
<el-radio value="N" size="large" border></el-radio>
</el-radio-group>
</el-form-item>

View File

@@ -3,6 +3,7 @@ import Icons from 'unplugin-icons/vite';
export default () => {
return Icons({
// 自动安装图标库
autoInstall: true
autoInstall: true,
compiler: "vue3"
});
};