1
0

2 Ревизии d179a59de9 ... 0eb5323dc0

Автор SHA1 Съобщение Дата
  wangkun 0eb5323dc0 Merge remote-tracking branch 'origin/master' преди 1 седмица
  wangkun a34ceb75d4 bugfix:1.修复页面配置不生效的问题 преди 1 седмица
променени са 7 файла, в които са добавени 83 реда и са изтрити 45 реда
  1. 11 1
      src/core/config.js
  2. 17 9
      src/pinia/modules/pageSetting.js
  3. 9 10
      src/utils/request.js
  4. 25 0
      src/utils/resolvePageLogo.js
  5. 3 3
      src/view/layout/index.vue
  6. 3 3
      src/view/login/index.vue
  7. 15 19
      src/view/ude/setting/pageSetting/index.vue

+ 11 - 1
src/core/config.js

@@ -3,10 +3,20 @@
  */
 
 const config = {
-  appName: '非结构化数据透明加密平台',
+  appName: '非结构化数据透明加密',
   appLogo: '@/assets/logo.png',
   showViteLogo: true,
   logs: [],
 }
 
+// 运行时更新站点名称/Logo(页面配置模块使用,浏览器标题读取 appName)
+export const setConfig = (name, logo) => {
+  if (name) {
+    config.appName = name
+  }
+  if (logo !== undefined) {
+    config.appLogo = logo
+  }
+}
+
 export default config

+ 17 - 9
src/pinia/modules/pageSetting.js

@@ -1,9 +1,10 @@
 import { defineStore } from 'pinia'
 import { ref } from 'vue'
 import { clearPageSetting, getPageSetting } from '@/api/sys/pageSetting'
+import { setConfig } from '@/core/config'
 
 // 平台默认名称(与 core/config.js 的 appName 保持一致)
-const DEFAULT_NAME = '非结构化数据透明加密平台'
+const DEFAULT_NAME = '非结构化数据透明加密'
 
 export const usePageSettingStore = defineStore('pageSetting', () => {
   const pageSetting = ref({
@@ -12,28 +13,34 @@ export const usePageSettingStore = defineStore('pageSetting', () => {
     isLoaded: false
   })
 
-  // 初始化(布局/登录页挂载时调用):读取失败时静默走默认值
-  const initPageSetting = async () => {
+  // 初始化(布局/登录页挂载时调用):读取失败时保留当前值/默认值
+  const initPageSetting = async() => {
     try {
       const res = await getPageSetting()
-      if (res.code === 100000) {
+      const data = res?.data || {}
+      if (res?.code === 100000) {
         pageSetting.value = {
-          name: res.data.name || DEFAULT_NAME,
-          logo: res.data.logo || '',
+          name: data.name || DEFAULT_NAME,
+          logo: data.logo || '',
           isLoaded: true
         }
+        setConfig(pageSetting.value.name, pageSetting.value.logo)
       }
     } catch {
-      // 占位接口阶段静默失败
+      // 接口异常时静默保持默认值
     }
     pageSetting.value.isLoaded = true
   }
 
   const setPageSetting = val => {
-    pageSetting.value = val
+    pageSetting.value = {
+      ...val,
+      isLoaded: true
+    }
+    setConfig(pageSetting.value.name, pageSetting.value.logo)
   }
 
-  const resetPageSetting = async () => {
+  const resetPageSetting = async() => {
     const res = await clearPageSetting()
     if (res.code === 100000) {
       pageSetting.value = {
@@ -41,6 +48,7 @@ export const usePageSettingStore = defineStore('pageSetting', () => {
         logo: '',
         isLoaded: true
       }
+      setConfig(DEFAULT_NAME, '')
     }
     return pageSetting.value
   }

+ 9 - 10
src/utils/request.js

@@ -113,22 +113,21 @@ service.interceptors.response.use(
       return response
     }
 
-    // 静默失败:调用方标记 silentError 的请求不弹业务错误提示(占位接口/后台轮询场景)
-    if (response.config && response.config.silentError) {
-      return response
-    }
-
     if (response.data.code === 100000 || response.headers.success === 'true') {
       if (response.headers.message) {
         response.data.message = decodeURI(response.headers.message)
       }
       return response.data
     } else {
-      ElMessage({
-        showClose: true,
-        message: response.data.message || decodeURI(response.headers.message),
-        type: 'error'
-      })
+      // 静默失败:调用方标记 silentError 的请求不弹业务错误提示(占位接口/后台轮询场景),
+      // 但仍需返回响应体,保证调用方能拿到 code/message 自行判断
+      if (!response.config || !response.config.silentError) {
+        ElMessage({
+          showClose: true,
+          message: response.data.message || decodeURI(response.headers.message),
+          type: 'error'
+        })
+      }
       if (response.data.data && response.data.data.reload) {
         userStore.token = ''
         localStorage.clear()

+ 25 - 0
src/utils/resolvePageLogo.js

@@ -0,0 +1,25 @@
+import defaultLogo from '@/assets/logo.png'
+
+/**
+ * 解析页面配置中的 Logo 地址
+ * - 空值:使用内置默认 Logo
+ * - base64 / blob:直接使用
+ * - 完整 URL(http/https/协议相对):直接使用
+ * - 其他相对路径(后端返回的文件路径):基于当前站点 origin 解析
+ */
+export const resolvePageLogo = logo => {
+  if (!logo) {
+    return defaultLogo
+  }
+  if (logo.startsWith('data:image') || logo.startsWith('blob:')) {
+    return logo
+  }
+  if (/^(https?:)?\/\//i.test(logo)) {
+    return logo
+  }
+  try {
+    return new URL(logo, window.location.origin).href
+  } catch {
+    return defaultLogo
+  }
+}

+ 3 - 3
src/view/layout/index.vue

@@ -16,13 +16,13 @@
           <img
             alt
             class="w-9 h-9 p-1 bg-white rounded-full"
-            :src="pageSettingStore.pageSetting.logo || defaultLogo"
+            :src="resolvePageLogo(pageSettingStore.pageSetting.logo)"
           >
           <div
             v-if="isSider"
             :style="{color:textColor}"
             class="inline-flex font-bold text-2xl"
-          >{{ pageSettingStore.pageSetting.name || '非结构化数据透明加密平台' }}</div>
+          >{{ pageSettingStore.pageSetting.name || '非结构化数据透明加密' }}</div>
         </div>
         <Aside class="aside" />
       </el-aside>
@@ -205,7 +205,7 @@ import { useRouterStore } from '@/pinia/modules/router'
 import { fmtTitle } from '@/utils/fmtRouterTitle'
 import { useUserStore } from '@/pinia/modules/user'
 import { usePageSettingStore } from '@/pinia/modules/pageSetting'
-import defaultLogo from '@/assets/logo.png'
+import { resolvePageLogo } from '@/utils/resolvePageLogo'
 
 defineOptions({
   name: 'Layout',

+ 3 - 3
src/view/login/index.vue

@@ -16,12 +16,12 @@
               <img
                 alt
                 class="w-24"
-                :src="pageSettingStore.pageSetting.logo || defaultLogo"
+                :src="resolvePageLogo(pageSettingStore.pageSetting.logo)"
               />
             </div>
             <div class="mb-9">
               <p class="text-center text-4xl font-bold">
-                {{ pageSettingStore.pageSetting.name || '非结构化数据透明加密平台' }}
+                {{ pageSettingStore.pageSetting.name || '非结构化数据透明加密' }}
               </p>
             </div>
 
@@ -167,7 +167,7 @@ import { ElMessage } from 'element-plus'
 import { useRouter } from 'vue-router'
 import { useUserStore } from '@/pinia/modules/user'
 import { usePageSettingStore } from '@/pinia/modules/pageSetting'
-import defaultLogo from '@/assets/logo.png'
+import { resolvePageLogo } from '@/utils/resolvePageLogo'
 import { getLoginType } from '@/api/config'
 import { getUkeyDriver } from '@/utils/ukey/driver.js'
 

+ 15 - 19
src/view/ude/setting/pageSetting/index.vue

@@ -5,7 +5,7 @@ import { ElMessage, ElMessageBox } from 'element-plus'
 import { usePageSettingStore } from '@/pinia/modules/pageSetting'
 import 'vue-cropper/dist/index.css'
 import { VueCropper } from 'vue-cropper'
-import defaultLogo from '@/assets/logo.png'
+import { resolvePageLogo } from '@/utils/resolvePageLogo'
 
 defineOptions({
   name: 'MaskPageSetting'
@@ -24,9 +24,10 @@ const rules = ref({
 const handleGetPageSetting = async() => {
   await pageSettingStore.initPageSetting()
   form.value = {
-    name: pageSettingStore.pageSetting.name || '非结构化数据透明加密平台',
+    name: pageSettingStore.pageSetting.name || '非结构化数据透明加密',
     logo: pageSettingStore.pageSetting.logo || '',
   }
+  option.value.img = resolvePageLogo(form.value.logo)
 }
 const changeSetting = async() => {
   await formRef.value.validate()
@@ -37,29 +38,23 @@ const changeSetting = async() => {
   const res = await setPageSetting(params)
   if (res.code === 100000) {
     ElMessage.success('修改成功')
+    // 保存成功后直接同步 store,布局/登录页立即生效
+    pageSettingStore.setPageSetting(params)
+    form.value = {
+      ...form.value,
+      ...params
+    }
+    option.value.img = resolvePageLogo(params.logo)
   } else {
-    ElMessage.error(res.msg)
+    ElMessage.error(res.message || res.msg || '修改失败')
   }
-  handleGetPageSetting()
 }
 onMounted(() => {
   handleGetPageSetting()
 })
-function resolveLogo(path) {
-  // 如果为空,返回默认logo
-  if (!path) {
-    return defaultLogo
-  }
-  // 如果是 base64,直接返回
-  if (path.startsWith('data:image')) {
-    return path
-  }
-  // 如果是相对路径/别名路径,解析成真实地址
-  return new URL(path, import.meta.url).href
-}
 const dialogImageVisible = ref(false)
 const option = ref({
-  img: resolveLogo(pageSettingStore.pageSetting.logo), // 裁剪图片的地址
+  img: resolvePageLogo(pageSettingStore.pageSetting.logo), // 裁剪图片的地址
   outputSize: 1, // 裁剪生成图片的质量(可选0.1 - 1)
   outputType: 'jpeg', // 裁剪生成图片的格式(jpeg || png || webp)
   info: true, // 图片大小信息
@@ -219,9 +214,10 @@ const resetSetting = async() => {
   await pageSettingStore.resetPageSetting()
 
   form.value = {
-    name: pageSettingStore.pageSetting.name || '非结构化数据透明加密平台',
+    name: pageSettingStore.pageSetting.name || '非结构化数据透明加密',
     logo: pageSettingStore.pageSetting.logo || '',
   }
+  option.value.img = resolvePageLogo(form.value.logo)
 }
 </script>
 
@@ -255,7 +251,7 @@ const resetSetting = async() => {
         >
           <div class="image-container">
             <el-image
-              :src="resolveLogo(form.logo)"
+              :src="resolvePageLogo(form.logo)"
               class="image-position"
               fit="cover"
             />