jwyu 2 سال پیش
والد
کامیت
723dd3f964

+ 2 - 0
src/App.vue

@@ -1,4 +1,6 @@
 <script setup>
+
+
 </script>
 
 <template>

+ 13 - 0
src/api/common.js

@@ -4,6 +4,19 @@
 
 import {get,post} from './index'
 
+/**
+ * 上传错误日志
+ */
+export function apiReportingErrInfo(params){
+    let obj={
+        ...params,
+        timestamp:new Date().toLocaleString(),
+        agent:'ETA移动端',
+        page:window.location.href
+    }
+    return post('/resource/public/wechat_warning',{content:JSON.stringify(obj)})
+}
+
 /**
  * 获取oss临时签名
  */

+ 22 - 13
src/api/index.js

@@ -8,6 +8,10 @@ import { showLoadingToast,showToast,closeToast } from "vant";
 // axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
 // axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';
 
+//loading动画白名单
+const LOADINGWHITELIST=[
+  '/public/wechat_warning'
+]
 // 请求数
 let LOADINGCOUNT = 0;
 let LOADING;
@@ -23,15 +27,17 @@ const _axios = axios.create(config);
 _axios.interceptors.request.use(
   function (config) {
     // Do something before request is sent
-    if (LOADINGCOUNT === 0) {
-      LOADING = showLoadingToast ({
-        message: "loading...",
-        duration: 0,
-        forbidClick: true,
-      });
+    if(!LOADINGWHITELIST.includes(config.url)){
+      if (LOADINGCOUNT === 0) {
+        LOADING = showLoadingToast ({
+          message: "loading...",
+          duration: 0,
+          forbidClick: true,
+        });
+      }
+      LOADINGCOUNT++;
     }
-    LOADINGCOUNT++;
-
+    
     config.headers.Authorization=localStorage.getItem('token')||''
     return config;
   },
@@ -47,11 +53,14 @@ _axios.interceptors.response.use(
     // Do something with response data
     const data=response.data
     //关闭loading
-    LOADINGCOUNT--;
-    if (LOADINGCOUNT === 0) {
-      // closeToast()
-      LOADING.close()
+    if(!LOADINGWHITELIST.includes(response.config.url)){
+      LOADINGCOUNT--;
+      if (LOADINGCOUNT === 0) {
+        // closeToast()
+        LOADING.close()
+      }
     }
+    
 
     if(response.status!==200){
       setTimeout(() => {
@@ -70,7 +79,7 @@ _axios.interceptors.response.use(
     }
     if(data.Ret===403){
       setTimeout(() => {
-        showToast(data.Msg)
+        showToast(data.Msg||'网络异常')
       }, 100);
     }
 

+ 4 - 4
src/hooks/common.js

@@ -1,4 +1,5 @@
 import {Base64} from 'js-base64'
+import {ref} from 'vue'
 
 
 // 导出静态图片资源
@@ -8,8 +9,7 @@ export function getStaticImg(path){
 
 // 获取个人信息
 export function useUserInfo(){
-    const userInfo=localStorage.getItem('userInfo')?JSON.parse(Base64.decode(localStorage.getItem('userInfo'))):null
-    return {
-        userInfo
-    }
+    let userInfo=ref(null)
+    userInfo.value=localStorage.getItem('userInfo')?JSON.parse(Base64.decode(localStorage.getItem('userInfo'))):null
+    return userInfo
 }

+ 6 - 7
src/layouts/Index.vue

@@ -1,14 +1,13 @@
 <script setup>
 import {ref} from 'vue'
 import {Base64} from 'js-base64'
+import { useRouter } from 'vue-router'
+import {useUserInfo} from '@/hooks/common'
 
-let userInfo=ref(null)
+const router=useRouter()
+
+let userInfo=useUserInfo()
 let showUserInfo=ref(false)
-function getUserInfo(){
-    const val=localStorage.getItem('userInfo')?JSON.parse(Base64.decode(localStorage.getItem('userInfo'))):null
-    userInfo.value=val
-}
-getUserInfo()
 
 
 function handleLoginOut(){
@@ -47,7 +46,7 @@ function handleLoginOut(){
                     </div>
                     <div class="info-item">
                         <span>所属部门:</span>
-                        <span>产品技术部</span>
+                        <span>{{userInfo.DepartmentName}}</span>
                     </div>
                     <div class="info-item">
                         <span>角色:</span>

+ 3 - 2
src/main.js

@@ -4,11 +4,12 @@ import router from "./router";
 import './plugin/vant'
 import 'normalize.css'
 import './assets/styles/common.scss'
+import reportErr from '@/utils/reportErr'
 
 
+const app= createApp(App)
 
+reportErr(app)//设置全局错误上报
 
-
-const app= createApp(App)
 app.use(router)
 app.mount('#app')

+ 31 - 0
src/utils/reportErr.js

@@ -0,0 +1,31 @@
+// 上报错误(及时上报)
+import {apiReportingErrInfo} from '@/api/common'
+
+const reportErr=(app)=>{
+    let errObj={}
+    app.config.errorHandler=(err, instance, info)=>{
+        console.error(err)
+        errObj={
+            msg:err.message,
+            stack:err.stack
+        }
+        if(import.meta.env.MODE==='production'){
+            apiReportingErrInfo({errInfo:errObj})
+        }
+    }
+
+    window.addEventListener('error',(e)=>{
+        console.error(e)
+        errObj={
+            msg:e.error?.message,
+            stack:e.error?.stack
+        }
+        if(import.meta.env.MODE==='production'){
+            apiReportingErrInfo({errInfo:errObj})
+        }
+    })
+}
+
+
+
+export default reportErr

+ 2 - 1
src/views/Login.vue

@@ -31,7 +31,8 @@ const onSubmit = (values) => {
                 RoleName:res.Data.RoleName,
                 RoleTypeCode:res.Data.RoleTypeCode,
                 SysRoleTypeCode:res.Data.SysRoleTypeCode,
-                AdminId:res.Data.AdminId
+                AdminId:res.Data.AdminId,
+                DepartmentName:res.Data.DepartmentName
             }
             localStorage.setItem('userInfo',Base64.encode(JSON.stringify(userInfo)))
             router.replace('/')

+ 2 - 2
src/views/ppt/Detail.vue

@@ -17,7 +17,7 @@ const router=useRouter()
 
 const pptId=route.query.id
 
-const {userInfo} =useUserInfo()
+const userInfo =useUserInfo()
 const { y } = useWindowScroll()
 
 // 获取ppt详情
@@ -76,7 +76,7 @@ function handleShowPPTOpt(){
         PptxUrl: PPTInfo.value.PptxUrl,
         Title: PPTInfo.value.Title
     }
-    PPTOptState.isCommon=userInfo.AdminId!=PPTInfo.value.AdminId?true:false
+    PPTOptState.isCommon=userInfo.value.AdminId!=PPTInfo.value.AdminId?true:false
     PPTOptState.show=true
 }
 

+ 2 - 2
src/views/ppt/hooks/useClassify.js

@@ -14,7 +14,7 @@ import {
     apiPPTCopy
 } from '@/api/ppt'
 
-const {userInfo} =useUserInfo()
+const userInfo =useUserInfo()
 
 
 
@@ -117,7 +117,7 @@ export function useClassify(){
     // e ppt的数据
     const handleShowPPTOpt=(e)=>{
         PPTOptState.data=e
-        PPTOptState.isCommon=userInfo.AdminId!=e.AdminId?true:false
+        PPTOptState.isCommon=userInfo.value.AdminId!=e.AdminId?true:false
         PPTOptState.show=true
     }
     // 删除ppt

+ 11 - 6
src/views/ppt/hooks/usePPTPublish.js

@@ -587,11 +587,18 @@ async function pageToPPT(){
         size: { type: "contain" },
     })
     //生成的ppt需要可以在封面页更改标题和类型,所以封面信息手动写入
-    const coverInfo = [
+    const coverInfo = window.location.pathname.startsWith('/ppten')?[
         {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
         {text:PPTContentList[0].Title,options:{fontSize:28*0.75,breakLine:true}},
-        {text:`\n— 弘则弥道(上海)投资咨询有限公司 ● ${PPTContentList[0].ReportType} —`,
-        options:{fontSize:16*0.75,breakLine:false}},
+        {text:`\nHORIZON INSIGHTS PTE. LTD.`,options:{fontSize:16*0.75,breakLine:true}},
+        {text:`\n — ${PPTContentList[0].ReportType} —`,options:{fontSize:16*0.75,breakLine:true}}, 
+        {text:'\nFICC Research Department',options:{fontSize:16*0.75,breakLine:true}},
+        {text:PPTContentList[0].PptDate,options:{fontSize:16*0.75,breakLine:true}},
+        {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
+    ]:[
+        {text:'—————————————————————————————————\n',options:{fontSize:16*0.75,breakLine:true}},
+        {text:PPTContentList[0].Title,options:{fontSize:28*0.75,breakLine:true}},
+        {text:`\n— 弘则弥道(上海)投资咨询有限公司 ● ${PPTContentList[0].ReportType} —`,options:{fontSize:16*0.75,breakLine:false}},
         {text:'\nFICC研究部',options:{fontSize:16*0.75,breakLine:true}},
         {text:PPTContentList[0].PptDate,options:{fontSize:16*0.75,breakLine:true}},
         {text:'\n—————————————————————————',options:{fontSize:16*0.75,breakLine:true}}
@@ -642,7 +649,7 @@ function handlePublishPPT(url){
  */
 export async function usePPTPublish(data,id){
     PPTContentList=data
-	pptId=id
+	  pptId=id
     if(!checkPPT()) return
     console.log('校验通过');
     LoadingINS=showLoadingToast({
@@ -651,6 +658,4 @@ export async function usePPTPublish(data,id){
         forbidClick: true,
     })
     pageToPPT()
-
-
 }

+ 4 - 9
src/views/tabbar/User.vue

@@ -2,16 +2,11 @@
 import {Base64} from 'js-base64'
 import  {ref} from 'vue'
 import { useRouter } from 'vue-router'
+import {useUserInfo} from '@/hooks/common'
 
 const router=useRouter()
 
-let userInfo=ref(null)
-function getUserInfo(){
-    const val=localStorage.getItem('userInfo')?JSON.parse(Base64.decode(localStorage.getItem('userInfo'))):null
-    userInfo.value=val
-    console.log(val);
-}
-getUserInfo()
+let userInfo=useUserInfo()
 
 function handleLoginOut(){
     localStorage.removeItem('token')
@@ -37,11 +32,11 @@ function handleLoginOut(){
             </div>
             <div class="item">
                 <span>所属部门:</span>
-                <span>产品技术部</span>
+                <span>{{userInfo.DepartmentName}}</span>
             </div>
             <div class="item">
                 <span>角色:</span>
-                <span>admin</span>
+                <span>{{userInfo.RoleName}}</span>
             </div>
         </div>
         <van-button