!151 发布 vue 版本 5.2.3 与 cloud 版本 2.2.2
Merge pull request !151 from 疯狂的狮子Li/dev
| | |
| | | |
| | | # websocket 开关 默认使用sse推送 |
| | | VITE_APP_WEBSOCKET = false |
| | | |
| | | # sse 开关 |
| | | VITE_APP_SSE = true |
| | |
| | | |
| | | # websocket 开关 默认使用sse推送 |
| | | VITE_APP_WEBSOCKET = false |
| | | |
| | | # sse 开关 |
| | | VITE_APP_SSE = true |
| | |
| | | { |
| | | "name": "ruoyi-vue-plus", |
| | | "version": "5.2.2", |
| | | "version": "5.2.3", |
| | | "description": "RuoYi-Vue-Plus多租户管理系统", |
| | | "author": "LionLi", |
| | | "license": "MIT", |
| | |
| | | params: data |
| | | }); |
| | | } |
| | | |
| | | // 同步租户字典 |
| | | export function syncTenantDict() { |
| | | return request({ |
| | | url: '/system/tenant/syncTenantDict', |
| | | method: 'get', |
| | | }); |
| | | } |
| | |
| | | }); |
| | | |
| | | onMounted(() => { |
| | | initSSE(import.meta.env.VITE_APP_BASE_API + '/resource/sse') |
| | | initSSE(import.meta.env.VITE_APP_BASE_API + '/resource/sse'); |
| | | }); |
| | | |
| | | const handleClickOutside = () => { |
| | |
| | | VITE_APP_RSA_PRIVATE_KEY: string; |
| | | VITE_APP_CLIENT_ID: string; |
| | | VITE_APP_WEBSOCKET: string; |
| | | VITE_APP_SSE: string; |
| | | } |
| | | interface ImportMeta { |
| | | readonly env: ImportMetaEnv; |
| | |
| | | import { getLanguage } from '@/lang'; |
| | | import { encryptBase64, encryptWithAes, generateAesKey, decryptWithAes, decryptBase64 } from '@/utils/crypto'; |
| | | import { encrypt, decrypt } from '@/utils/jsencrypt'; |
| | | import router from "@/router"; |
| | | |
| | | const encryptHeader = 'encrypt-key'; |
| | | let downloadLoadingInstance: LoadingInstance; |
| | |
| | | }).then(() => { |
| | | isRelogin.show = false; |
| | | 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(() => { |
| | | isRelogin.show = false; |
| | | }); |
| | |
| | | import { ElNotification } from 'element-plus'; |
| | | import useNoticeStore from '@/store/modules/notice'; |
| | | |
| | | let message = ''; |
| | | |
| | | // 初始化 |
| | | 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 |
| | | const { |
| | | data, |
| | |
| | | retries: 10, |
| | | delay: 3000, |
| | | onFailed() { |
| | | console.log('Failed to connect after 10 retries') |
| | | }, |
| | | console.log('Failed to connect after 10 retries'); |
| | | } |
| | | } |
| | | }); |
| | | |
| | | watch(error, () => { |
| | | console.log('SSE connection error:', error.value) |
| | | console.log('SSE connection error:', error.value); |
| | | error.value = null; |
| | | }); |
| | | |
| | |
| | | data.value = null; |
| | | }); |
| | | }; |
| | | |
| | | |
| | |
| | | * 部署方式 Docker 容器编排 一键部署业务集群<br /> |
| | | * 国际化 SpringMessage Spring标准国际化方案<br /> |
| | | </p> |
| | | <p><b>当前版本:</b> <span>v5.2.2</span></p> |
| | | <p><b>当前版本:</b> <span>v5.2.3</span></p> |
| | | <p> |
| | | <el-tag type="danger">¥免费开源</el-tag> |
| | | </p> |
| | |
| | | * 分布式监控 Prometheus、Grafana 全方位性能监控<br /> |
| | | * 其余与 Vue 版本一致<br /> |
| | | </p> |
| | | <p><b>当前版本:</b> <span>v2.2.1</span></p> |
| | | <p><b>当前版本:</b> <span>v2.2.2</span></p> |
| | | <p> |
| | | <el-tag type="danger">¥免费开源</el-tag> |
| | | </p> |
| | |
| | | |
| | | // 注册开关 |
| | | const register = ref(false); |
| | | const redirect = ref(undefined); |
| | | const redirect = ref('/'); |
| | | const loginRef = ref<ElFormInstance>(); |
| | | // 租户列表 |
| | | const tenantList = ref<TenantVO[]>([]); |
| | |
| | | watch( |
| | | () => router.currentRoute.value, |
| | | (newRoute: any) => { |
| | | redirect.value = newRoute.query && newRoute.query.redirect; |
| | | redirect.value = newRoute.query && decodeURIComponent(newRoute.query.redirect); |
| | | }, |
| | | { immediate: true } |
| | | ); |
| | |
| | | { |
| | | ...queryParams.value |
| | | }, |
| | | `config_${new Date().getTime()}.xlsx` |
| | | `logininfor_${new Date().getTime()}.xlsx` |
| | | ); |
| | | }; |
| | | |
| | |
| | | <el-col :span="1.5"> |
| | | <el-button v-hasPermi="['system:dict:remove']" type="danger" plain icon="Refresh" @click="handleRefreshCache">刷新缓存</el-button> |
| | | </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> |
| | | </el-row> |
| | | </template> |
| | |
| | | |
| | | <script setup name="Dict" lang="ts"> |
| | | 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 { DictTypeForm, DictTypeQuery, DictTypeVO } from '@/api/system/dict/type/types'; |
| | | import { syncTenantDict } from "@/api/system/tenant"; |
| | | |
| | | const { proxy } = getCurrentInstance() as ComponentInternalInstance; |
| | | |
| | | const userStore = useUserStore(); |
| | | const userId = ref(userStore.userId); |
| | | const typeList = ref<DictTypeVO[]>([]); |
| | | const loading = ref(true); |
| | | const showSearch = ref(true); |
| | |
| | | proxy?.$modal.msgSuccess('刷新成功'); |
| | | useDictStore().cleanDict(); |
| | | }; |
| | | /**同步租户字典*/ |
| | | const handleSyncTenantDict = async () => { |
| | | await proxy?.$modal.confirm('确认要同步所有租户字典吗?'); |
| | | let res = await syncTenantDict(); |
| | | proxy?.$modal.msgSuccess(res.msg); |
| | | }; |
| | | |
| | | onMounted(() => { |
| | | getList(); |
| | |
| | | /** 导出按钮操作 */ |
| | | const handleExport = () => { |
| | | proxy?.download( |
| | | 'system/package/export', |
| | | 'system/tenant/package/export', |
| | | { |
| | | ...queryParams.value |
| | | }, |
| | |
| | | /** 查询菜单下拉树结构 */ |
| | | const getMenuTreeselect = async () => { |
| | | const res = await listMenu(); |
| | | res.data.forEach((m) => (m.menuId = m.menuId.toString())); |
| | | const data = proxy?.handleTree<MenuOptionsType>(res.data, 'menuId'); |
| | | |
| | | if (data) { |
| | |
| | | <el-form-item label="请假时间"> |
| | | <el-date-picker |
| | | v-model="leaveTime" |
| | | value-format="YYYY-MM-DD HH:mm:ss" |
| | | type="daterange" |
| | | range-separator="To" |
| | | start-placeholder="开始时间" |
| | | end-placeholder="结束时间" |
| | | :default-time="[new Date(2000, 1, 1, 0, 0, 0), new Date(2000, 1, 1, 23, 59, 59)]" |
| | | @change="changeLeaveTime()" |
| | | /> |
| | | </el-form-item> |
| | |
| | | taskVariables.value = { |
| | | entity: data, |
| | | leaveDays: data.leaveDays, |
| | | userList: [1, 3], |
| | | userList2: [1, 3] |
| | | userList: ["1", "3"], |
| | | userList2: ["1", "3"] |
| | | }; |
| | | submitFormData.value.variables = taskVariables.value; |
| | | const resp = await startWorkFlow(submitFormData.value); |