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 000000000..931c29c70 Binary files /dev/null and b/jeecgboot-vue3/src/assets/icons/collaborationNotice.png differ diff --git a/jeecgboot-vue3/src/assets/icons/superviseNotice.png b/jeecgboot-vue3/src/assets/icons/superviseNotice.png new file mode 100644 index 000000000..66ceee828 Binary files /dev/null and b/jeecgboot-vue3/src/assets/icons/superviseNotice.png differ 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 {