!151 发布 vue 版本 5.2.3 与 cloud 版本 2.2.2
Merge pull request !151 from 疯狂的狮子Li/dev
This commit is contained in:
commit
9a02598c00
@ -30,3 +30,6 @@ VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
|
|||||||
|
|
||||||
# websocket 开关 默认使用sse推送
|
# websocket 开关 默认使用sse推送
|
||||||
VITE_APP_WEBSOCKET = false
|
VITE_APP_WEBSOCKET = false
|
||||||
|
|
||||||
|
# sse 开关
|
||||||
|
VITE_APP_SSE = true
|
||||||
|
@ -33,3 +33,6 @@ VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e'
|
|||||||
|
|
||||||
# websocket 开关 默认使用sse推送
|
# websocket 开关 默认使用sse推送
|
||||||
VITE_APP_WEBSOCKET = false
|
VITE_APP_WEBSOCKET = false
|
||||||
|
|
||||||
|
# sse 开关
|
||||||
|
VITE_APP_SSE = true
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "ruoyi-vue-plus",
|
"name": "ruoyi-vue-plus",
|
||||||
"version": "5.2.2",
|
"version": "5.2.3",
|
||||||
"description": "RuoYi-Vue-Plus多租户管理系统",
|
"description": "RuoYi-Vue-Plus多租户管理系统",
|
||||||
"author": "LionLi",
|
"author": "LionLi",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
|
@ -91,3 +91,11 @@ export function syncTenantPackage(tenantId: string | number, packageId: string |
|
|||||||
params: data
|
params: data
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 同步租户字典
|
||||||
|
export function syncTenantDict() {
|
||||||
|
return request({
|
||||||
|
url: '/system/tenant/syncTenantDict',
|
||||||
|
method: 'get',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
@ -73,7 +73,7 @@ onMounted(() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
initSSE(import.meta.env.VITE_APP_BASE_API + '/resource/sse')
|
initSSE(import.meta.env.VITE_APP_BASE_API + '/resource/sse');
|
||||||
});
|
});
|
||||||
|
|
||||||
const handleClickOutside = () => {
|
const handleClickOutside = () => {
|
||||||
|
1
src/types/env.d.ts
vendored
1
src/types/env.d.ts
vendored
@ -19,6 +19,7 @@ interface ImportMetaEnv {
|
|||||||
VITE_APP_RSA_PRIVATE_KEY: string;
|
VITE_APP_RSA_PRIVATE_KEY: string;
|
||||||
VITE_APP_CLIENT_ID: string;
|
VITE_APP_CLIENT_ID: string;
|
||||||
VITE_APP_WEBSOCKET: string;
|
VITE_APP_WEBSOCKET: string;
|
||||||
|
VITE_APP_SSE: string;
|
||||||
}
|
}
|
||||||
interface ImportMeta {
|
interface ImportMeta {
|
||||||
readonly env: ImportMetaEnv;
|
readonly env: ImportMetaEnv;
|
||||||
|
@ -10,6 +10,7 @@ import FileSaver from 'file-saver';
|
|||||||
import { getLanguage } from '@/lang';
|
import { getLanguage } from '@/lang';
|
||||||
import { encryptBase64, encryptWithAes, generateAesKey, decryptWithAes, decryptBase64 } from '@/utils/crypto';
|
import { encryptBase64, encryptWithAes, generateAesKey, decryptWithAes, decryptBase64 } from '@/utils/crypto';
|
||||||
import { encrypt, decrypt } from '@/utils/jsencrypt';
|
import { encrypt, decrypt } from '@/utils/jsencrypt';
|
||||||
|
import router from "@/router";
|
||||||
|
|
||||||
const encryptHeader = 'encrypt-key';
|
const encryptHeader = 'encrypt-key';
|
||||||
let downloadLoadingInstance: LoadingInstance;
|
let downloadLoadingInstance: LoadingInstance;
|
||||||
@ -134,8 +135,13 @@ service.interceptors.response.use(
|
|||||||
}).then(() => {
|
}).then(() => {
|
||||||
isRelogin.show = false;
|
isRelogin.show = false;
|
||||||
useUserStore().logout().then(() => {
|
useUserStore().logout().then(() => {
|
||||||
location.href = import.meta.env.VITE_APP_CONTEXT_PATH + 'index';
|
router.replace({
|
||||||
});
|
path: '/login',
|
||||||
|
query: {
|
||||||
|
redirect: encodeURIComponent(router.currentRoute.value.fullPath || '/')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
});
|
||||||
}).catch(() => {
|
}).catch(() => {
|
||||||
isRelogin.show = false;
|
isRelogin.show = false;
|
||||||
});
|
});
|
||||||
|
@ -2,10 +2,12 @@ import { getToken } from '@/utils/auth';
|
|||||||
import { ElNotification } from 'element-plus';
|
import { ElNotification } from 'element-plus';
|
||||||
import useNoticeStore from '@/store/modules/notice';
|
import useNoticeStore from '@/store/modules/notice';
|
||||||
|
|
||||||
let message = '';
|
|
||||||
|
|
||||||
// 初始化
|
// 初始化
|
||||||
export const initSSE = (url: any) => {
|
export const initSSE = (url: any) => {
|
||||||
|
if (import.meta.env.VITE_APP_SSE === 'false') {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
url = url + '?Authorization=Bearer ' + getToken() + '&clientid=' + import.meta.env.VITE_APP_CLIENT_ID
|
url = url + '?Authorization=Bearer ' + getToken() + '&clientid=' + import.meta.env.VITE_APP_CLIENT_ID
|
||||||
const {
|
const {
|
||||||
data,
|
data,
|
||||||
@ -15,13 +17,13 @@ export const initSSE = (url: any) => {
|
|||||||
retries: 10,
|
retries: 10,
|
||||||
delay: 3000,
|
delay: 3000,
|
||||||
onFailed() {
|
onFailed() {
|
||||||
console.log('Failed to connect after 10 retries')
|
console.log('Failed to connect after 10 retries');
|
||||||
},
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
watch(error, () => {
|
watch(error, () => {
|
||||||
console.log('SSE connection error:', error.value)
|
console.log('SSE connection error:', error.value);
|
||||||
error.value = null;
|
error.value = null;
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -41,5 +43,3 @@ export const initSSE = (url: any) => {
|
|||||||
data.value = null;
|
data.value = null;
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -33,7 +33,7 @@
|
|||||||
* 部署方式 Docker 容器编排 一键部署业务集群<br />
|
* 部署方式 Docker 容器编排 一键部署业务集群<br />
|
||||||
* 国际化 SpringMessage Spring标准国际化方案<br />
|
* 国际化 SpringMessage Spring标准国际化方案<br />
|
||||||
</p>
|
</p>
|
||||||
<p><b>当前版本:</b> <span>v5.2.2</span></p>
|
<p><b>当前版本:</b> <span>v5.2.3</span></p>
|
||||||
<p>
|
<p>
|
||||||
<el-tag type="danger">¥免费开源</el-tag>
|
<el-tag type="danger">¥免费开源</el-tag>
|
||||||
</p>
|
</p>
|
||||||
@ -77,7 +77,7 @@
|
|||||||
* 分布式监控 Prometheus、Grafana 全方位性能监控<br />
|
* 分布式监控 Prometheus、Grafana 全方位性能监控<br />
|
||||||
* 其余与 Vue 版本一致<br />
|
* 其余与 Vue 版本一致<br />
|
||||||
</p>
|
</p>
|
||||||
<p><b>当前版本:</b> <span>v2.2.1</span></p>
|
<p><b>当前版本:</b> <span>v2.2.2</span></p>
|
||||||
<p>
|
<p>
|
||||||
<el-tag type="danger">¥免费开源</el-tag>
|
<el-tag type="danger">¥免费开源</el-tag>
|
||||||
</p>
|
</p>
|
||||||
|
@ -97,7 +97,7 @@ const tenantEnabled = ref(true);
|
|||||||
|
|
||||||
// 注册开关
|
// 注册开关
|
||||||
const register = ref(false);
|
const register = ref(false);
|
||||||
const redirect = ref(undefined);
|
const redirect = ref('/');
|
||||||
const loginRef = ref<ElFormInstance>();
|
const loginRef = ref<ElFormInstance>();
|
||||||
// 租户列表
|
// 租户列表
|
||||||
const tenantList = ref<TenantVO[]>([]);
|
const tenantList = ref<TenantVO[]>([]);
|
||||||
@ -105,7 +105,7 @@ const tenantList = ref<TenantVO[]>([]);
|
|||||||
watch(
|
watch(
|
||||||
() => router.currentRoute.value,
|
() => router.currentRoute.value,
|
||||||
(newRoute: any) => {
|
(newRoute: any) => {
|
||||||
redirect.value = newRoute.query && newRoute.query.redirect;
|
redirect.value = newRoute.query && decodeURIComponent(newRoute.query.redirect);
|
||||||
},
|
},
|
||||||
{ immediate: true }
|
{ immediate: true }
|
||||||
);
|
);
|
||||||
|
@ -198,7 +198,7 @@ const handleExport = () => {
|
|||||||
{
|
{
|
||||||
...queryParams.value
|
...queryParams.value
|
||||||
},
|
},
|
||||||
`config_${new Date().getTime()}.xlsx`
|
`logininfor_${new Date().getTime()}.xlsx`
|
||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -49,6 +49,9 @@
|
|||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">刷新缓存</el-button>
|
<el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">刷新缓存</el-button>
|
||||||
</el-col>
|
</el-col>
|
||||||
|
<el-col :span="1.5">
|
||||||
|
<el-button v-if="userId === 1" type="success" plain icon="Refresh" @click="handleSyncTenantDict">同步租户字典</el-button>
|
||||||
|
</el-col>
|
||||||
<right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
|
<right-toolbar v-model:showSearch="showSearch" @query-table="getList"></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
</template>
|
</template>
|
||||||
@ -109,11 +112,15 @@
|
|||||||
|
|
||||||
<script setup name="Dict" lang="ts">
|
<script setup name="Dict" lang="ts">
|
||||||
import useDictStore from '@/store/modules/dict';
|
import useDictStore from '@/store/modules/dict';
|
||||||
|
import useUserStore from "@/store/modules/user";
|
||||||
import { listType, getType, delType, addType, updateType, refreshCache } from '@/api/system/dict/type';
|
import { listType, getType, delType, addType, updateType, refreshCache } from '@/api/system/dict/type';
|
||||||
import { DictTypeForm, DictTypeQuery, DictTypeVO } from '@/api/system/dict/type/types';
|
import { DictTypeForm, DictTypeQuery, DictTypeVO } from '@/api/system/dict/type/types';
|
||||||
|
import { syncTenantDict } from "@/api/system/tenant";
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
||||||
|
|
||||||
|
const userStore = useUserStore();
|
||||||
|
const userId = ref(userStore.userId);
|
||||||
const typeList = ref<DictTypeVO[]>([]);
|
const typeList = ref<DictTypeVO[]>([]);
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
const showSearch = ref(true);
|
const showSearch = ref(true);
|
||||||
@ -239,6 +246,12 @@ const handleRefreshCache = async () => {
|
|||||||
proxy?.$modal.msgSuccess('刷新成功');
|
proxy?.$modal.msgSuccess('刷新成功');
|
||||||
useDictStore().cleanDict();
|
useDictStore().cleanDict();
|
||||||
};
|
};
|
||||||
|
/**同步租户字典*/
|
||||||
|
const handleSyncTenantDict = async () => {
|
||||||
|
await proxy?.$modal.confirm('确认要同步所有租户字典吗?');
|
||||||
|
let res = await syncTenantDict();
|
||||||
|
proxy?.$modal.msgSuccess(res.msg);
|
||||||
|
};
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
getList();
|
getList();
|
||||||
|
@ -321,7 +321,7 @@ const handleDelete = async (row?: TenantPkgVO) => {
|
|||||||
/** 导出按钮操作 */
|
/** 导出按钮操作 */
|
||||||
const handleExport = () => {
|
const handleExport = () => {
|
||||||
proxy?.download(
|
proxy?.download(
|
||||||
'system/package/export',
|
'system/tenant/package/export',
|
||||||
{
|
{
|
||||||
...queryParams.value
|
...queryParams.value
|
||||||
},
|
},
|
||||||
|
@ -274,7 +274,6 @@ const setSubTableColumns = (value: string) => {
|
|||||||
/** 查询菜单下拉树结构 */
|
/** 查询菜单下拉树结构 */
|
||||||
const getMenuTreeselect = async () => {
|
const getMenuTreeselect = async () => {
|
||||||
const res = await listMenu();
|
const res = await listMenu();
|
||||||
res.data.forEach((m) => (m.menuId = m.menuId.toString()));
|
|
||||||
const data = proxy?.handleTree<MenuOptionsType>(res.data, 'menuId');
|
const data = proxy?.handleTree<MenuOptionsType>(res.data, 'menuId');
|
||||||
|
|
||||||
if (data) {
|
if (data) {
|
||||||
|
@ -23,10 +23,12 @@
|
|||||||
<el-form-item label="请假时间">
|
<el-form-item label="请假时间">
|
||||||
<el-date-picker
|
<el-date-picker
|
||||||
v-model="leaveTime"
|
v-model="leaveTime"
|
||||||
|
value-format="YYYY-MM-DD HH:mm:ss"
|
||||||
type="daterange"
|
type="daterange"
|
||||||
range-separator="To"
|
range-separator="To"
|
||||||
start-placeholder="开始时间"
|
start-placeholder="开始时间"
|
||||||
end-placeholder="结束时间"
|
end-placeholder="结束时间"
|
||||||
|
:default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]"
|
||||||
@change="changeLeaveTime()"
|
@change="changeLeaveTime()"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
@ -190,8 +192,8 @@ const handleStartWorkFlow = async (data: LeaveVO) => {
|
|||||||
taskVariables.value = {
|
taskVariables.value = {
|
||||||
entity: data,
|
entity: data,
|
||||||
leaveDays: data.leaveDays,
|
leaveDays: data.leaveDays,
|
||||||
userList: [1, 3],
|
userList: ["1", "3"],
|
||||||
userList2: [1, 3]
|
userList2: ["1", "3"]
|
||||||
};
|
};
|
||||||
submitFormData.value.variables = taskVariables.value;
|
submitFormData.value.variables = taskVariables.value;
|
||||||
const resp = await startWorkFlow(submitFormData.value);
|
const resp = await startWorkFlow(submitFormData.value);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user