Răsfoiți Sursa

修复警告报错

liangzhicheng 4 ani în urmă
părinte
comite
e86af91f6a

+ 2 - 1
.eslintrc.js

@@ -90,6 +90,7 @@ module.exports = {
     "moment": true,
     "gantt": true,
     "__webpack_public_path__": true,
-    "Notify": true
+    "Notify": true,
+    "Vue": true
   }
 }

+ 13 - 0
package-lock.json

@@ -2583,6 +2583,11 @@
         "domelementtype": "^2.2.0"
       }
     },
+    "dompurify": {
+      "version": "2.3.6",
+      "resolved": "https://registry.npmjs.org/dompurify/-/dompurify-2.3.6.tgz",
+      "integrity": "sha512-OFP2u/3T1R5CEgWCEONuJ1a5+MFKnOYpkywpUSxv/dj1LeBT1erK+JwM7zK0ROy2BRhqVCf0LRw/kHqKuMkVGg=="
+    },
     "domutils": {
       "version": "2.8.0",
       "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz",
@@ -5392,6 +5397,14 @@
         "@vue/shared": "3.2.31"
       }
     },
+    "vue-dompurify-html": {
+      "version": "2.5.0",
+      "resolved": "https://registry.npmjs.org/vue-dompurify-html/-/vue-dompurify-html-2.5.0.tgz",
+      "integrity": "sha512-k2ejMJmsCsREGtJFDXNwqMvvek447id5ZAOU10jm2+cmsZHXgFIEdlwDam4cU4wh0iOZM+uDmkwbVJAJtmgeVQ==",
+      "requires": {
+        "dompurify": "^2.3.4"
+      }
+    },
     "vue-eslint-parser": {
       "version": "8.3.0",
       "resolved": "https://registry.npmmirror.com/vue-eslint-parser/-/vue-eslint-parser-8.3.0.tgz",

+ 3 - 2
package.json

@@ -9,11 +9,12 @@
     "build": "webpack --mode=production --config ./webpack.prod.cjs --progress --hide-modules"
   },
   "dependencies": {
+    "pc-component-v3": "^1.0.5",
+    "v-tooltip": "^4.0.0-beta.17",
     "vue": "^3.2.31",
+    "vue-dompurify-html": "^2.5.0",
     "vue-i18n": "^9.1.9",
     "vue-router": "^4.0.13",
-    "v-tooltip": "^4.0.0-beta.17",
-    "pc-component-v3": "^1.0.5",
     "vue-select": "^4.0.0-beta.3",
     "vuedraggable": "^4.1.0"
   },

+ 3 - 1
src/main.js

@@ -9,11 +9,13 @@ import App from './App.vue';
 import routes from './router/index.js';
 import PcClientComponent from 'pc-component-v3';
 
+import VueDOMPurifyHTML from 'vue-dompurify-html';
+
 // bug fixed by jack 
 // 在加载 css 的时候 font 不能被正确的加载
 import './assets/summernote.css';
 
-
+Vue.use(VueDOMPurifyHTML);
 
 let instance = null;
 let i18n = createI18n({

+ 2 - 2
src/trace/FinishedProjectTraces.vue

@@ -73,16 +73,16 @@
                   </span>
                   <span @click="openLine(trace)">
                     <span
+                      v-dompurify-html="trace.summary"
                       class="trace-summary"
                       :class="{'font-color': trace.timeLineCompletion==true}"
-                      v-html="trace.summary"
                     />
                     <span
                       class="glyphicon glyphicon-option-vertical trace-icon"
                       aria-hidden="true"
                     />
                     <span class="label label-primary trace-user">
-                      <span v-html="trace.receiveUserName" />
+                      <span v-dompurify-html="trace.receiveUserName" />
                       <span>{{ formatDate(trace.planFinishedDate) }}</span>
                     </span>
                     <span class="badge">

+ 2 - 2
src/trace/NotFinishedProjectTraces.vue

@@ -41,10 +41,10 @@
                     />
                   </span>
                   <span @click="openLine(trace)">
-                    <span class="trace-summary" :class="{'font-color': trace.timeLineCompletion==true}" v-html="trace.summary" />
+                    <span v-dompurify-html="trace.summary" class="trace-summary" :class="{'font-color': trace.timeLineCompletion==true}" />
                     <span class="glyphicon glyphicon-option-vertical trace-icon" aria-hidden="true" />
                     <span class="label trace-user" :class="{'label-danger' : trace.overdue == true, 'label-primary' : trace.overdue != true}">
-                      <span v-html="trace.receiveUserName" />
+                      <span v-dompurify-html="trace.receiveUserName" />
                       <span>{{ formatDate(trace.planFinishedDate) }}</span>
                     </span>
                   </span>

+ 7 - 1
src/trace/TraceAttachment.vue

@@ -44,7 +44,13 @@ export default {
     Loading,
     DownloadService,
   },
-  props: ['traceId'],
+  // props: ['traceId'],
+  props: {
+    traceId: {
+      type: String,
+      default: null,
+    },
+  },
   data: function () {
     return {
       className: 'com.leanwo.prodog.model.trace.TraceAttachment',

+ 12 - 2
src/trace/TraceComment.vue

@@ -13,7 +13,7 @@
       </h4>
       <div class="media-body">
         <div>
-          <div v-html="items.content" />
+          <div v-dompurify-html="items.content" />
           <br />
           {{ items.created }}
         </div>
@@ -39,7 +39,17 @@ export default {
     Common,
     DownloadService,
   },
-  props: ['traceId', 'trace'],
+  // props: ['traceId', 'trace'],
+  props: {
+    traceId: {
+      type: String,
+      default: null,
+    }, 
+    trace: {
+      type: String,
+      default: null,
+    },
+  },
 
   data: function () {
     return {

+ 7 - 1
src/trace/TraceHeader.vue

@@ -58,7 +58,13 @@ var Uuid = require('pc-component-v3').Uuid;
 var Common = require('../common/Common.js');
 
 export default {
-  props: ['type'],
+  // props: ['type'],
+  props: {
+    type: {
+      type: String,
+      default: '',
+    },
+  },
 
   data: function () {
     return {

+ 2 - 2
src/trace/TraceList.vue

@@ -36,10 +36,10 @@
                   />
                 </span>
                 <span @click="openLine(item)">
-                  <span class="trace-summary" :class="{'font-color': item.timeLineCompletion==true}" v-html="item.summary" />
+                  <span v-dompurify-html="item.summary" class="trace-summary" :class="{'font-color': item.timeLineCompletion==true}" />
                   <span class="glyphicon glyphicon-option-vertical trace-icon" aria-hidden="true" />
                   <span class="label trace-user" :class="{'label-danger' : item.overdue == true, 'label-primary' : item.overdue != true}">
-                    <span v-html="item.receiveUserName" />
+                    <span v-dompurify-html="item.receiveUserName" />
                     <span>{{ formatDate(item.planFinishedDate) }}</span>
                   </span>
                 </span>

+ 8 - 2
src/trace/TraceLog.vue

@@ -22,7 +22,7 @@
         <div v-for="item in traceLogs" :key="item.id">
           <h5>
             {{ item.dateTime }} &nbsp;{{ item.operatorUserName }}
-            <div v-html="item.content" />
+            <div v-dompurify-html="item.content" />
           </h5>
         </div>
       </div>
@@ -36,7 +36,13 @@ export default {
   components: {
     Common,
   },
-  props: ['traceId'],
+  // props: ['traceId'],
+  props: {
+    traceId: {
+      type: String,
+      default: null,
+    },
+  },
 
   data: function () {
     return {

+ 2 - 2
src/trace/TraceName.vue

@@ -20,7 +20,7 @@
       <div>
         <div class="page-header">
           <h3>
-            <span v-html="trace.summary" />
+            <span v-dompurify-html="trace.summary" />
             <span
               class="label"
               :class="{
@@ -68,7 +68,7 @@
         </div>
       </div>
 
-      <div id="v-html" v-html="trace.detail" />
+      <div id="v-html" v-dompurify-html="trace.detail" />
       <AudioField
         :class-name="className"
         :src-array="srcArray"

+ 11 - 1
src/trace/TraceTimeLine.vue

@@ -82,7 +82,17 @@ export default {
     Checkbox,
     Loading,
   },
-  props: ['traceId', 'trace'],
+  // props: ['traceId', 'trace'],
+  props: {
+    traceId: {
+      type: String,
+      default: null,
+    },
+    trace: {
+      type: String,
+      default: null,
+    },
+  },
 
   data: function () {
     return {

+ 2 - 2
src/trace/UseFinishedTrace.vue

@@ -37,16 +37,16 @@
             </span>
             <span @click="openLine(trace)">
               <span
+                v-dompurify-html="trace.summary"
                 class="trace-summary"
                 :class="{'font-color': trace.timeLineCompletion==true}"
-                v-html="trace.summary"
               />
               <span
                 class="glyphicon glyphicon-option-vertical trace-icon"
                 aria-hidden="true"
               />
               <span class="label label-primary trace-user">
-                <span v-html="trace.receiveUserName" />
+                <span v-dompurify-html="trace.receiveUserName" />
                 <span>{{ formatDate(trace.planFinishedDate) }}</span>
               </span>
               <span class="badge">

+ 2 - 2
src/trace/UserNotFinishedTrace.vue

@@ -48,9 +48,9 @@
             </span>
             <span @click="openLine(trace)">
               <span
+                v-dompurify-html="trace.summary"
                 class="trace-summary"
                 :class="{'font-color': trace.timeLineCompletion==true}"
-                v-html="trace.summary"
               />
               <span
                 class="glyphicon glyphicon-option-vertical trace-icon"
@@ -60,7 +60,7 @@
                 class="label trace-user"
                 :class="{'label-danger' : trace.overdue == true, 'label-primary' : trace.overdue != true}"
               >
-                <span v-html="trace.receiveUserName" />
+                <span v-dompurify-html="trace.receiveUserName" />
                 <span>{{ formatDate(trace.planFinishedDate) }}</span>
               </span>
               <span class="badge">

+ 20 - 1
src/widget/AudioField.vue

@@ -47,7 +47,26 @@ export default {
   components: {
     AuthAudio,
   },
-  props: ['className', 'srcArray', 'token', 'isReadonly'],
+  // props: ['className', 'srcArray', 'token', 'isReadonly'],
+  props: {
+    className: {
+      type: String,
+      default: null,
+    }, 
+    srcArray: {
+      type: Array,
+      default() {
+        return [];
+      },
+    }, 
+    token: {
+      type: String,
+      default: null,
+    }, 
+    isReadonly: {
+      type: Boolean,
+    },
+  },
   data() {
     return {
       src: null,

+ 9 - 1
src/widget/QueryWidget.vue

@@ -18,7 +18,15 @@
 
 <script>
 export default {
-  props: ['placeholderText'],
+  // props: ['placeholderText'],
+  props: {
+    placeholderText: {
+      type: String,
+      default: null,
+    },
+  },
+
+  emits: ['valueChanged','search'],
 		
   data: function(){
     return {

+ 14 - 1
src/widget/TreeSelect.vue

@@ -19,7 +19,20 @@ export default {
   components: {
     // Treeselect,
   },
-  props: ['multiple', 'options'],
+  // props: ['multiple', 'options'],
+  props: {
+    multiple: {
+      type: String,
+      default: null,
+    }, 
+    options: {
+      type: String,
+      default: null,
+    },
+  },
+
+  emits: ['valueChanged'],
+
   data: function () {
     return {
       value: undefined,