From 4f46213df6495153bd8d427db27c4ce613d55fcc Mon Sep 17 00:00:00 2001 From: JEECG <445654970@qq.com> Date: Sun, 14 Sep 2025 10:39:48 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90v3.8.3=E3=80=91=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E5=B0=8F=E6=94=B9=E5=8A=A8=E6=B1=87=E6=80=BB=E9=9B=86=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jeecgboot-vue3/README.md | 4 +- jeecgboot-vue3/build/utils.ts | 1 + jeecgboot-vue3/src/api/sys/menu.ts | 21 +- jeecgboot-vue3/src/api/sys/user.ts | 5 +- .../src/assets/icons/collaborationNotice.png | Bin 0 -> 2127 bytes .../src/assets/icons/superviseNotice.png | Bin 0 -> 1566 bytes .../Form/src/components/ApiSelect.vue | 13 +- .../Form/src/components/FormItem.vue | 1 - .../Form/src/jeecg/components/JTreeSelect.vue | 5 + .../jeecg/components/TreeIcon/TreeIcon.vue | 96 ++++++++ .../components/modal/UserSelectModal.vue | 1 + .../src/components/Table/src/BasicTable.vue | 3 + .../Table/src/components/TableAction.vue | 4 +- .../src/components/Table/src/types/table.ts | 1 + .../components/jeecg/comment/CommentList.vue | 2 +- .../components/jeecg/comment/MyComment.vue | 4 +- .../src/hooks/system/useListPage.ts | 23 +- .../user-dropdown/UpdatePassword.vue | 2 +- .../header/components/user-dropdown/index.vue | 2 +- jeecgboot-vue3/src/router/routes/index.ts | 1 + jeecgboot-vue3/src/utils/common/compUtils.ts | 27 ++- .../src/utils/encryption/signMd5Utils.js | 2 +- .../src/views/monitor/mynews/DetailModal.vue | 31 ++- .../views/system/appconfig/ThirdApp.api.ts | 2 +- .../message/components/SysMessageModal.vue | 2 +- .../message/components/useSysMessage.ts | 2 +- .../src/views/system/notice/DetailModal.vue | 16 +- .../src/views/system/notice/NoticeModal.vue | 7 + .../src/views/system/notice/index.vue | 19 +- .../src/views/system/notice/notice.api.ts | 8 - .../role/components/RolePermissionDrawer.vue | 9 +- .../src/views/system/role/role.data.ts | 9 +- .../views/system/usersetting/BaseSetting.vue | 205 +++++++++++++++++- jeecgboot-vue3/vite.config.ts | 2 +- 34 files changed, 466 insertions(+), 64 deletions(-) create mode 100644 jeecgboot-vue3/src/assets/icons/collaborationNotice.png create mode 100644 jeecgboot-vue3/src/assets/icons/superviseNotice.png create mode 100644 jeecgboot-vue3/src/components/Form/src/jeecg/components/TreeIcon/TreeIcon.vue diff --git a/jeecgboot-vue3/README.md b/jeecgboot-vue3/README.md index ec0c0fc6a..bde6ac64c 100644 --- a/jeecgboot-vue3/README.md +++ b/jeecgboot-vue3/README.md @@ -1,10 +1,10 @@ JeecgBoot 企业级低代码开发平台 =============== -当前最新版本: 3.8.2(预计发布时间:2025-08-04) +当前最新版本: 3.8.3(预计发布时间:2025-09-22) [![AUR](https://img.shields.io/badge/license-Apache%20License%202.0-blue.svg)](https://github.com/zhangdaiscott/jeecg-boot/blob/master/LICENSE) [![](https://img.shields.io/badge/Author-北京国炬软件-orange.svg)](http://jeecg.com/aboutusIndex) -[![](https://img.shields.io/badge/version-3.8.2-brightgreen.svg)](https://github.com +[![](https://img.shields.io/badge/version-3.8.3-brightgreen.svg)](https://github.com /zhangdaiscott/jeecg-boot) [![GitHub stars](https://img.shields.io/github/stars/zhangdaiscott/jeecg-boot.svg?style=social&label=Stars)](https://github.com/zhangdaiscott/jeecg-boot) [![GitHub forks](https://img.shields.io/github/forks/zhangdaiscott/jeecg-boot.svg?style=social&label=Fork)](https://github.com/zhangdaiscott/jeecg-boot) diff --git a/jeecgboot-vue3/build/utils.ts b/jeecgboot-vue3/build/utils.ts index 9490116ff..ab68d442a 100644 --- a/jeecgboot-vue3/build/utils.ts +++ b/jeecgboot-vue3/build/utils.ts @@ -32,6 +32,7 @@ export function wrapperEnv(envConf: Recordable): ViteEnv { try { realName = JSON.parse(realName.replace(/'/g, '"')); } catch (error) { + console.log("PARSE VITE PROXY ERROR:", error); realName = ''; } } diff --git a/jeecgboot-vue3/src/api/sys/menu.ts b/jeecgboot-vue3/src/api/sys/menu.ts index 27d9ba563..b1ca9b58b 100644 --- a/jeecgboot-vue3/src/api/sys/menu.ts +++ b/jeecgboot-vue3/src/api/sys/menu.ts @@ -1,5 +1,10 @@ import { defHttp } from '/@/utils/http/axios'; import { getMenuListResultModel } from './model/menuModel'; +import { useUserStoreWithOut } from '@/store/modules/user'; +import { setAuthCache } from '@/utils/auth'; +import { TOKEN_KEY } from '@/enums/cacheEnum'; +import { router } from '@/router'; +import { PageEnum } from '@/enums/pageEnum'; enum Api { GetMenuList = '/sys/permission/getUserPermissionByToken', @@ -28,7 +33,21 @@ export const getMenuList = () => { * @description: 获取后台菜单权限和按钮权限 */ export function getBackMenuAndPerms() { - return defHttp.get({ url: Api.GetMenuList }); + return defHttp.get({ url: Api.GetMenuList }).catch((e) => { + // Token过期失效,直接跳转登录页面 2025-09-08 scott + if (e && (e.message.includes('timeout') || e.message.includes('401'))) { + const userStore = useUserStoreWithOut(); + userStore.setToken(''); + setAuthCache(TOKEN_KEY, null); + router.push({ + path: PageEnum.BASE_LOGIN, + query: { + // 传入当前的路由,登录成功后跳转到当前路由 + redirect: router.currentRoute.value.fullPath, + } + }); + } + }); } /** diff --git a/jeecgboot-vue3/src/api/sys/user.ts b/jeecgboot-vue3/src/api/sys/user.ts index 5ed47e364..34b82080e 100644 --- a/jeecgboot-vue3/src/api/sys/user.ts +++ b/jeecgboot-vue3/src/api/sys/user.ts @@ -81,13 +81,12 @@ export function phoneLoginApi(params: LoginParams, mode: ErrorMessageMode = 'mod export function getUserInfo() { return defHttp.get({ url: Api.GetUserInfo }, {}).catch((e) => { // update-begin--author:zyf---date:20220425---for:【VUEN-76】捕获接口超时异常,跳转到登录界面 + // Token过期失效,直接跳转登录页面 if (e && (e.message.includes('timeout') || e.message.includes('401'))) { //接口不通时跳转到登录界面 const userStore = useUserStoreWithOut(); userStore.setToken(''); setAuthCache(TOKEN_KEY, null); - - // update-begin-author:sunjianlei date:20230306 for: 修复登录成功后,没有正确重定向的问题 router.push({ path: PageEnum.BASE_LOGIN, query: { @@ -95,8 +94,6 @@ export function getUserInfo() { redirect: router.currentRoute.value.fullPath, } }); - // update-end-author:sunjianlei date:20230306 for: 修复登录成功后,没有正确重定向的问题 - } // update-end--author:zyf---date:20220425---for:【VUEN-76】捕获接口超时异常,跳转到登录界面 }); diff --git a/jeecgboot-vue3/src/assets/icons/collaborationNotice.png b/jeecgboot-vue3/src/assets/icons/collaborationNotice.png new file mode 100644 index 0000000000000000000000000000000000000000..931c29c701073e0b67e53d7cf53890652ca85eec GIT binary patch literal 2127 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 HpyYo6S!k6i literal 0 HcmV?d00001 diff --git a/jeecgboot-vue3/src/components/Form/src/components/ApiSelect.vue b/jeecgboot-vue3/src/components/Form/src/components/ApiSelect.vue index f1241c846..ba85b6498 100644 --- a/jeecgboot-vue3/src/components/Form/src/components/ApiSelect.vue +++ b/jeecgboot-vue3/src/components/Form/src/components/ApiSelect.vue @@ -3,6 +3,8 @@ v-bind="attrs_" v-model:value="state" :options="getOptions" + show-search + :filter-option="filterOption" @change="handleChange" @dropdownVisibleChange="handleFetch" @popupScroll="handlePopupScroll" @@ -152,7 +154,14 @@ watchEffect(() => { props.value && handleFetch(); }); - + /** + * 筛选流程 + * @param input + * @param option + */ + const filterOption = (input: string, option: any) => { + return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0 || option.label.indexOf(input) >= 0; + }; async function fetch() { const api = props.api; if (!api || !isFunction(api)) return; @@ -240,7 +249,7 @@ } } // update-end--author:liusq---date:20250407---for:【QQYUN-11831】ApiSelect 分页下拉方案 #7883 - return { state, attrs_, attrs, getOptions, loading, t, handleFetch, handleChange, handlePopupScroll }; + return { state, attrs_, attrs, getOptions, loading, t, handleFetch, handleChange, handlePopupScroll,filterOption }; }, }); diff --git a/jeecgboot-vue3/src/components/Form/src/components/FormItem.vue b/jeecgboot-vue3/src/components/Form/src/components/FormItem.vue index 515c51554..350272797 100644 --- a/jeecgboot-vue3/src/components/Form/src/components/FormItem.vue +++ b/jeecgboot-vue3/src/components/Form/src/components/FormItem.vue @@ -492,7 +492,6 @@ const showSuffix = !!suffix; const getSuffix = isFunction(suffix) ? suffix(unref(getValues)) : suffix; - return ( + + 批量下载所有附件 + @@ -72,15 +75,21 @@ import { getFileAccessHttpUrl } from '@/utils/common/compUtils'; import { useGlobSetting } from '@/hooks/setting'; import { encryptByBase64 } from '@/utils/cipher'; + import { getToken } from '@/utils/auth'; const router = useRouter(); const glob = useGlobSetting(); const isUpdate = ref(true); const content = ref({}); const noticeFiles = ref([]); + /** + * 下载文件路径 + */ + const downLoadFiles = `${glob.domainUrl}/sys/annountCement/downLoadFiles`; const emit = defineEmits(['close', 'register']); //表单赋值 const [registerModal, { setModalProps, closeModal }] = useModalInner(async (data) => { isUpdate.value = !!data?.isUpdate; + noticeFiles.value = []; if (unref(isUpdate)) { //data.record.msgContent = '

2323

xss test'; //update-begin-author:taoyan date:2022-7-14 for: VUEN-1702 【禁止问题】sql注入漏洞 @@ -194,6 +203,24 @@ padding: 0; } } + .ant-card-meta-detail { + display: flex !important ; + justify-content: center !important; + align-items: center !important; + flex-direction: column !important; + } + .ant-card-meta-title { + font-size: 22px !important; + color: rgba(51, 51, 51, 0.88); + font-weight: 600; + font-size: 16px; + overflow: hidden; + white-space: nowrap; + text-overflow: ellipsis; + } + .ant-card .ant-card-meta-description { + color: rgba(51, 51, 51, 0.45); + } `; frameDoc.head.appendChild(style); @@ -273,8 +300,8 @@ .print-btn { position: absolute; - top: 20px; - right: 20px; + top: 80px; + right: 40px; cursor: pointer; color: #a3a3a5; z-index: 999; diff --git a/jeecgboot-vue3/src/views/system/appconfig/ThirdApp.api.ts b/jeecgboot-vue3/src/views/system/appconfig/ThirdApp.api.ts index e9700cbda..8db4ccd99 100644 --- a/jeecgboot-vue3/src/views/system/appconfig/ThirdApp.api.ts +++ b/jeecgboot-vue3/src/views/system/appconfig/ThirdApp.api.ts @@ -78,4 +78,4 @@ export const deleteThirdAppConfig = (params, handleSuccess) => { return defHttp.delete({ url: Api.deleteThirdAppConfig, params }, { joinParamsToUrl: true }).then(() => { handleSuccess(); }); -}; +}; \ No newline at end of file diff --git a/jeecgboot-vue3/src/views/system/message/components/SysMessageModal.vue b/jeecgboot-vue3/src/views/system/message/components/SysMessageModal.vue index 50dd12966..80026d9dc 100644 --- a/jeecgboot-vue3/src/views/system/message/components/SysMessageModal.vue +++ b/jeecgboot-vue3/src/views/system/message/components/SysMessageModal.vue @@ -335,7 +335,7 @@ searchParams.realname = options[0].label; } } - + function openSelectPerson(){ openModal(true, {}) } diff --git a/jeecgboot-vue3/src/views/system/message/components/useSysMessage.ts b/jeecgboot-vue3/src/views/system/message/components/useSysMessage.ts index 01cef737b..7f0d888a2 100644 --- a/jeecgboot-vue3/src/views/system/message/components/useSysMessage.ts +++ b/jeecgboot-vue3/src/views/system/message/components/useSysMessage.ts @@ -161,7 +161,7 @@ export function useSysMessage(setLocaleText) { } } return '去处理' - }else{ + } else { return '查看详情' } } diff --git a/jeecgboot-vue3/src/views/system/notice/DetailModal.vue b/jeecgboot-vue3/src/views/system/notice/DetailModal.vue index 0cd17c1a4..6af1134ca 100644 --- a/jeecgboot-vue3/src/views/system/notice/DetailModal.vue +++ b/jeecgboot-vue3/src/views/system/notice/DetailModal.vue @@ -28,6 +28,9 @@ + + 批量下载所有附件 + @@ -40,16 +43,25 @@ import { DownloadOutlined, EyeOutlined, PaperClipOutlined } from '@ant-design/icons-vue'; import { encryptByBase64 } from '@/utils/cipher'; import { useGlobSetting } from '@/hooks/setting'; + import { getToken } from "@/utils/auth"; const glob = useGlobSetting(); // 获取props defineProps({ frameSrc: propTypes.string.def(''), }); + /** + * 下载文件路径 + */ + const downLoadFiles = `${glob.domainUrl}/sys/annountCement/downLoadFiles`; + //附件内容 const noticeFiles = ref([]); + //数据ID + const noticeId = ref(''); //表单赋值 const [registerModal] = useModalInner((data) => { noticeFiles.value = []; + noticeId.value = data.record.id; if (data.record?.files && data.record?.files.length > 0) { noticeFiles.value = data.record.files.split(',').map((item) => { return { @@ -96,8 +108,8 @@ diff --git a/jeecgboot-vue3/vite.config.ts b/jeecgboot-vue3/vite.config.ts index ef4963182..080634296 100644 --- a/jeecgboot-vue3/vite.config.ts +++ b/jeecgboot-vue3/vite.config.ts @@ -43,7 +43,7 @@ export default ({ command, mode }: ConfigEnv): UserConfig => { // ----- [end] 【JEECG作为乾坤子应用】 ----- console.log('[init] Start Port: ', VITE_PORT); - console.log('[init] Vite Proxy Config: ', VITE_PROXY); + console.debug('[init] Vite Proxy Config: ', VITE_PROXY); return {