From 39c8b288ec8294e026459dfb1955f0bbc49ebb52 Mon Sep 17 00:00:00 2001
From: WXL (wul) <wl_5969728@163.com>
Date: 星期一, 19 十月 2026 11:10:40 +0800
Subject: [PATCH] 测试完成

---
 src/views/patient/archives/maternalHealth/PSQIScoreTable.vue |  403 +++++++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 376 insertions(+), 27 deletions(-)

diff --git a/src/views/patient/archives/maternalHealth/PSQIScoreTable.vue b/src/views/patient/archives/maternalHealth/PSQIScoreTable.vue
index f9f8a83..93ab77a 100644
--- a/src/views/patient/archives/maternalHealth/PSQIScoreTable.vue
+++ b/src/views/patient/archives/maternalHealth/PSQIScoreTable.vue
@@ -1,37 +1,386 @@
 <template>
-  <div>
-    <el-table :data="items" border size="small">
-      <el-table-column prop="item" label="鏉$洰" width="280" />
-      <el-table-column label="璇勫垎" align="center" width="120">
-        <template slot-scope="scope">
-          <el-select v-if="editing" v-model="scope.row.score" size="small">
-            <el-option v-for="s in [0,1,2,3]" :key="s" :label="s" :value="s" />
-          </el-select>
-          <span v-else>{{ scope.row.score }}</span>
-        </template>
-      </el-table-column>
+  <div class="scale-wrap">
+    <div class="scale-title">鍖瑰吂鍫$潯鐪犺川閲忔寚鏁伴噺琛紙PSQI锛�</div>
+
+    <!-- 绾歌川琛ㄨ〃澶达細鎮h�呭熀鏈俊鎭� -->
+    <el-descriptions :column="3" border size="small" class="scale-head">
+      <el-descriptions-item label="濮撳悕">{{ patient.name || "-" }}</el-descriptions-item>
+      <el-descriptions-item label="鎬у埆">{{ patient.sex || "-" }}</el-descriptions-item>
+      <el-descriptions-item label="骞撮緞">{{ patient.age || "-" }}</el-descriptions-item>
+      <el-descriptions-item label="绉戝">{{ patient.dept || "-" }}</el-descriptions-item>
+      <el-descriptions-item label="涓村簥璇婃柇">{{ patient.diagnosis || "-" }}</el-descriptions-item>
+      <el-descriptions-item label="璇勪及鏃ユ湡">
+        <el-date-picker v-if="editing" v-model="local.date" value-format="yyyy-MM-dd" size="mini" style="width:160px" placeholder="閫夋嫨鏃ユ湡" />
+        <span v-else>{{ local.date || "-" }}</span>
+      </el-descriptions-item>
+    </el-descriptions>
+
+    <div class="scale-tip">鎸囧璇細涓嬮潰涓�浜涢棶棰樹笌鎮ㄨ繎 1 涓湀鐨勭潯鐪犵姸鍐垫湁鍏筹紝璇烽�夋嫨鎴栧~鍐欐渶绗﹀悎鎮ㄨ繎 1 涓湀瀹為檯鎯呭喌鐨勭瓟妗堛��</div>
+
+    <div class="q-list">
+      <div class="q-item">
+        <div class="q-text">1. 杩�1涓湀锛屾櫄涓婁笂搴婄潯瑙夐�氬父鍦� ____ 鐐归挓</div>
+        <div class="q-body">
+          <el-time-picker v-if="editing" v-model="local.q1BedTime" value-format="HH:mm" format="HH:mm" size="small" placeholder="閫夋嫨鏃堕棿" style="width:130px" />
+          <span v-else class="q-value">{{ local.q1BedTime || "鈥�" }}</span>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">2. 杩�1涓湀锛屼粠涓婂簥鍒板叆鐫¢�氬父闇�瑕� ____ 鍒嗛挓</div>
+        <div class="q-body">
+          <el-radio-group v-if="editing" v-model="local.q2Latency">
+            <el-radio :label="0">鈮�15鍒嗛挓</el-radio>
+            <el-radio :label="1">16~30鍒嗛挓</el-radio>
+            <el-radio :label="2">31~60鍒嗛挓</el-radio>
+            <el-radio :label="3">鈮�61鍒嗛挓</el-radio>
+          </el-radio-group>
+          <span v-else class="q-value">{{ latencyLabel }}</span>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">3. 杩�1涓湀锛岄�氬父鏃╀笂 ____ 鐐硅捣搴�</div>
+        <div class="q-body">
+          <el-time-picker v-if="editing" v-model="local.q3WakeTime" value-format="HH:mm" format="HH:mm" size="small" placeholder="閫夋嫨鏃堕棿" style="width:130px" />
+          <span v-else class="q-value">{{ local.q3WakeTime || "鈥�" }}</span>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">4. 杩�1涓湀锛屾瘡鏅氬疄闄呯潯鐪犳椂闂� ____ 灏忔椂</div>
+        <div class="q-body">
+          <el-input-number v-if="editing" v-model="local.q4Hours" :min="0" :max="24" :step="0.5" :precision="1" size="small" controls-position="right" style="width:130px" />
+          <span v-else class="q-value">{{ local.q4Hours === null || local.q4Hours === "" ? "鈥�" : local.q4Hours + " 灏忔椂" }}</span>
+          <span class="q-hint">锛�&gt;7h 璁�0鍒嗭紝6~7h 璁�1鍒嗭紝5~6h 璁�2鍒嗭紝&lt;5h 璁�3鍒嗭級</span>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">5. 杩�1涓湀锛屽洜涓嬪垪鎯呭喌褰卞搷鐫$湢鑰岀儲鎭�</div>
+        <div class="q-body">
+          <el-table :data="q5Items" border size="small" class="q-sub-table">
+            <el-table-column prop="label" label="鎯呭喌" min-width="220" />
+            <el-table-column label="鏃�" align="center" width="90">
+              <template slot-scope="scope"><el-radio v-if="editing" v-model="local[scope.row.key]" :label="0">&nbsp;</el-radio><span v-else>{{ local[scope.row.key] === 0 ? "鉁�" : "" }}</span></template>
+            </el-table-column>
+            <el-table-column label="涓嶈冻1娆�/鍛�" align="center" width="110">
+              <template slot-scope="scope"><el-radio v-if="editing" v-model="local[scope.row.key]" :label="1">&nbsp;</el-radio><span v-else>{{ local[scope.row.key] === 1 ? "鉁�" : "" }}</span></template>
+            </el-table-column>
+            <el-table-column label="1~2娆�/鍛�" align="center" width="110">
+              <template slot-scope="scope"><el-radio v-if="editing" v-model="local[scope.row.key]" :label="2">&nbsp;</el-radio><span v-else>{{ local[scope.row.key] === 2 ? "鉁�" : "" }}</span></template>
+            </el-table-column>
+            <el-table-column label="鈮�3娆�/鍛�" align="center" width="100">
+              <template slot-scope="scope"><el-radio v-if="editing" v-model="local[scope.row.key]" :label="3">&nbsp;</el-radio><span v-else>{{ local[scope.row.key] === 3 ? "鉁�" : "" }}</span></template>
+            </el-table-column>
+            <el-table-column label="寰楀垎" align="center" width="70">
+              <template slot-scope="scope">{{ local[scope.row.key] || 0 }}</template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">6. 杩�1涓湀锛屾�荤殑鏉ヨ鎮ㄨ涓鸿嚜宸辩殑鐫$湢璐ㄩ噺</div>
+        <div class="q-body">
+          <el-radio-group v-if="editing" v-model="local.q6Quality">
+            <el-radio :label="0">寰堝ソ</el-radio>
+            <el-radio :label="1">杈冨ソ</el-radio>
+            <el-radio :label="2">杈冨樊</el-radio>
+            <el-radio :label="3">寰堝樊</el-radio>
+          </el-radio-group>
+          <span v-else class="q-value">{{ qualityLabel }}</span>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">7. 杩�1涓湀锛屾偍浣跨敤鍌湢鑽墿鐨勬儏鍐�</div>
+        <div class="q-body">
+          <el-radio-group v-if="editing" v-model="local.q7Medication">
+            <el-radio :label="0">鏃�</el-radio>
+            <el-radio :label="1">灏戜簬1娆�/鍛�</el-radio>
+            <el-radio :label="2">1~2娆�/鍛�</el-radio>
+            <el-radio :label="3">3娆℃垨浠ヤ笂/鍛�</el-radio>
+          </el-radio-group>
+          <span v-else class="q-value">{{ medicationLabel }}</span>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">8. 杩�1涓湀锛屾偍甯告劅鍒板洶鍊﹀悧</div>
+        <div class="q-body">
+          <el-radio-group v-if="editing" v-model="local.q8Sleepy">
+            <el-radio :label="0">娌℃湁</el-radio>
+            <el-radio :label="1">鍋跺皵锛堝皯浜�1娆�/鍛級</el-radio>
+            <el-radio :label="2">鏈夋椂锛�1~2娆�/鍛級</el-radio>
+            <el-radio :label="3">缁忓父锛�3娆℃垨浠ヤ笂/鍛級</el-radio>
+          </el-radio-group>
+          <span v-else class="q-value">{{ freqLabel(local.q8Sleepy) }}</span>
+        </div>
+      </div>
+
+      <div class="q-item">
+        <div class="q-text">9. 杩�1涓湀锛屾偍鍋氫簨鎯呯殑绮惧姏涓嶈冻鍚�</div>
+        <div class="q-body">
+          <el-radio-group v-if="editing" v-model="local.q9Energy">
+            <el-radio :label="0">娌℃湁</el-radio>
+            <el-radio :label="1">鍋跺皵锛堝皯浜�1娆�/鍛級</el-radio>
+            <el-radio :label="2">鏈夋椂锛�1~2娆�/鍛級</el-radio>
+            <el-radio :label="3">缁忓父锛�3娆℃垨浠ヤ笂/鍛級</el-radio>
+          </el-radio-group>
+          <span v-else class="q-value">{{ freqLabel(local.q9Energy) }}</span>
+        </div>
+      </div>
+    </div>
+
+    <!-- 璁″垎琛� -->
+    <div class="sec-title">璁″垎琛�</div>
+    <el-table :data="components" border size="small" class="score-table">
+      <el-table-column prop="name" label="鎴愬垎" width="70" align="center" />
+      <el-table-column prop="title" label="鍐呭" min-width="240" />
+      <el-table-column prop="score" label="璇勫垎" width="70" align="center" />
     </el-table>
-    <div style="margin-top:10px;font-size:14px">PSQI鎬诲垎锛歿{ totalScore }} &nbsp;&nbsp; 璇勪环锛歿{ evaluation }}</div>
+
+    <!-- 缁撴灉 -->
+    <el-descriptions :column="2" border size="small" class="scale-result">
+      <el-descriptions-item label="PSQI 鎬诲垎"><b :class="totalClass">{{ totalScore }}</b> 鍒�</el-descriptions-item>
+      <el-descriptions-item label="璇勪环">{{ evaluation }}</el-descriptions-item>
+      <el-descriptions-item label="鐫$湢鏁堢巼">
+        <span v-if="efficiency !== null">{{ efficiency }}%锛堝湪搴� {{ fmtHours(hoursInBed) }} 灏忔椂 / 瀹為檯鐫$湢 {{ sleepHours }} 灏忔椂锛�</span>
+        <span v-else class="muted">濉啓鏉$洰 1銆�3銆�4 鍚庤嚜鍔ㄨ绠�</span>
+      </el-descriptions-item>
+      <el-descriptions-item label="璇勫垎浜哄憳">
+        <el-input v-if="editing" v-model="local.evaluator" size="mini" style="width:160px" placeholder="璇疯緭鍏�" />
+        <span v-else>{{ local.evaluator || "-" }}</span>
+      </el-descriptions-item>
+    </el-descriptions>
   </div>
 </template>
+
 <script>
+const FREQ_OPTIONS = [
+  { v: 0, l: "鏃�" },
+  { v: 1, l: "涓嶈冻1娆�/鍛�" },
+  { v: 2, l: "1~2娆�/鍛�" },
+  { v: 3, l: "鈮�3娆�/鍛�" },
+];
+
+const LATENCY_OPTIONS = [
+  { v: 0, l: "鈮�15鍒嗛挓" },
+  { v: 1, l: "16~30鍒嗛挓" },
+  { v: 2, l: "31~60鍒嗛挓" },
+  { v: 3, l: "鈮�61鍒嗛挓" },
+];
+
+const QUALITY_OPTIONS = [
+  { v: 0, l: "寰堝ソ" },
+  { v: 1, l: "杈冨ソ" },
+  { v: 2, l: "杈冨樊" },
+  { v: 3, l: "寰堝樊" },
+];
+
+const MEDICATION_OPTIONS = [
+  { v: 0, l: "鏃�" },
+  { v: 1, l: "灏戜簬1娆�/鍛�" },
+  { v: 2, l: "1~2娆�/鍛�" },
+  { v: 3, l: "3娆℃垨浠ヤ笂/鍛�" },
+];
+
+const Q5_ITEMS = [
+  { key: "q5a", label: "a. 鍏ョ潯鍥伴毦锛�30鍒嗛挓鍐呬笉鑳藉叆鐫★級" },
+  { key: "q5b", label: "b. 澶滈棿鏄撻啋鎴栨棭閱�" },
+  { key: "q5c", label: "c. 澶滈棿鍘诲帟鎵�" },
+  { key: "q5d", label: "d. 鍛煎惛涓嶇晠" },
+  { key: "q5e", label: "e. 鍜冲椊鎴栭季澹伴珮" },
+  { key: "q5f", label: "f. 鎰熻鍐�" },
+  { key: "q5g", label: "g. 鎰熻鐑�" },
+  { key: "q5h", label: "h. 鍋氬櫓姊�" },
+  { key: "q5i", label: "i. 鐤肩棝涓嶉��" },
+  { key: "q5j", label: "j. 鍏跺畠褰卞搷鐫$湢鐨勪簨鎯�" },
+];
+
+// 鏉$洰4 鎵嬪~灏忔椂鏁� 鈫� 鐫$湢鏃堕暱鎴愬垎 C 鐨勫垎妗i槇鍊�
+const SCORE_C_RULES = [
+  { test: (h) => h > 7, score: 0 },
+  { test: (h) => h > 6, score: 1 },
+  { test: (h) => h >= 5, score: 2 },
+  { test: () => true, score: 3 },
+];
+
+const FIELDS = [
+  "date", "q1BedTime", "q2Latency", "q3WakeTime", "q4Hours",
+  "q5a", "q5b", "q5c", "q5d", "q5e", "q5f", "q5g", "q5h", "q5i", "q5j",
+  "q6Quality", "q7Medication", "q8Sleepy", "q9Energy",
+];
+
 export default {
-  name:"PSQIScoreTable",
-  props:{ value:{ type:Object, default:()=>({}) }, editing:Boolean },
-  computed:{
-    items(){
-      const names=["涓昏鐫$湢璐ㄩ噺","鍏ョ潯鏃堕棿(鍒嗛挓)","鐫$湢鏃堕暱(灏忔椂)","鐫$湢鏁堢巼(%)","鐫$湢闅滅","鍌湢鑽墿浣跨敤","鏃ラ棿鍔熻兘闅滅"];
-      return names.map((n,i)=>({ item:n, key:'psqi_'+i, score:this.value['psqi_'+i]||0 }));
-    },
-    totalScore(){ return this.items.reduce((s,i)=>s+i.score,0); },
-    evaluation(){ const t=this.totalScore; return t<=5?"鐫$湢璐ㄩ噺鑹ソ":t<=10?"鐫$湢璐ㄩ噺涓�鑸�":t<=15?"鐫$湢璐ㄩ噺杈冨樊":"鐫$湢璐ㄩ噺寰堝樊"; },
+  name: "PSQIScoreTable",
+  props: {
+    value: { type: Object, default: () => ({}) },
+    patient: { type: Object, default: () => ({}) },
+    editing: Boolean,
   },
-  watch:{
-    items:{ deep:true, handler(v){
-      const obj={...this.value, psqiTotal:this.totalScore, psqiEvaluation:this.evaluation};
-      v.forEach(i=>{ obj[i.key]=i.score; });
-      this.$emit('input',obj);
-    }},
+  data() {
+    return { q5Items: Q5_ITEMS, local: this.normalize(this.value) };
+  },
+  computed: {
+    hoursInBed() {
+      const bed = this.parseTime(this.local.q1BedTime);
+      const wake = this.parseTime(this.local.q3WakeTime);
+      if (bed === null || wake === null) return null;
+      let diff = wake - bed;
+      if (diff <= 0) diff += 24;
+      return diff;
+    },
+    // 瀹為檯鐫$湢灏忔椂鏁帮紙鏉$洰4 鎵嬪~锛�
+    sleepHours() {
+      const h = Number(this.local.q4Hours);
+      return h > 0 ? h : null;
+    },
+    efficiency() {
+      if (this.hoursInBed === null || this.hoursInBed <= 0) return null;
+      const sh = this.sleepHours;
+      if (sh === null) return null;
+      return Math.round((sh / this.hoursInBed) * 100);
+    },
+    scoreA() { return this.num("q6Quality"); },
+    scoreB() { return this.mapSum(this.num("q2Latency") + this.num("q5a"), [1, 3, 5]); },
+    scoreC() {
+      const sh = this.sleepHours;
+      if (sh === null) return null;
+      const rule = SCORE_C_RULES.find((r) => r.test(sh));
+      return rule ? rule.score : 3;
+    },
+    scoreD() {
+      const e = this.efficiency;
+      if (e === null) return null;
+      if (e > 85) return 0;
+      if (e >= 75) return 1;
+      if (e >= 65) return 2;
+      return 3;
+    },
+    scoreE() {
+      const sum = ["q5b", "q5c", "q5d", "q5e", "q5f", "q5g", "q5h", "q5i", "q5j"]
+        .reduce((s, k) => s + this.num(k), 0);
+      return this.mapSum(sum, [1, 10, 19]);
+    },
+    scoreF() { return this.num("q7Medication"); },
+    scoreG() { return this.mapSum(this.num("q8Sleepy") + this.num("q9Energy"), [1, 3, 5]); },
+    components() {
+      return [
+        { name: "A", title: "涓昏鐫$湢璐ㄩ噺锛堟潯鐩�6锛�", score: this.disp(this.scoreA) },
+        { name: "B", title: "鍏ョ潯鏃堕棿锛堟潯鐩�2 + 鏉$洰5a锛�", score: this.disp(this.scoreB) },
+        { name: "C", title: "鐫$湢鏃堕暱锛堟潯鐩�4 瀹為檯鐫$湢灏忔椂鏁帮級", score: this.disp(this.scoreC) },
+        { name: "D", title: "鐫$湢鏁堢巼锛堝疄闄呯潯鐪犳椂闂� 梅 鍦ㄥ簥鏃堕棿锛�", score: this.disp(this.scoreD) },
+        { name: "E", title: "鐫$湢闅滅锛堟潯鐩�5b~5j 绱锛�", score: this.disp(this.scoreE) },
+        { name: "F", title: "鍌湢鑽墿浣跨敤锛堟潯鐩�7锛�", score: this.disp(this.scoreF) },
+        { name: "G", title: "鏃ラ棿鍔熻兘闅滅锛堟潯鐩�8 + 鏉$洰9锛�", score: this.disp(this.scoreG) },
+      ];
+    },
+    totalScore() {
+      return [this.scoreA, this.scoreB, this.scoreC, this.scoreD, this.scoreE, this.scoreF, this.scoreG]
+        .reduce((s, v) => s + (Number(v) || 0), 0);
+    },
+    evaluation() {
+      const t = this.totalScore;
+      if (t <= 5) return "鐫$湢璐ㄩ噺寰堝ソ";
+      if (t <= 10) return "鐫$湢璐ㄩ噺杩樿";
+      if (t <= 15) return "鐫$湢璐ㄩ噺涓�鑸�";
+      return "鐫$湢璐ㄩ噺寰堝樊";
+    },
+    totalClass() {
+      const t = this.totalScore;
+      return t <= 5 ? "lv-good" : t <= 10 ? "lv-mid" : t <= 15 ? "lv-warn" : "lv-bad";
+    },
+    latencyLabel() { return this.labelOf(LATENCY_OPTIONS, this.local.q2Latency); },
+    qualityLabel() { return this.labelOf(QUALITY_OPTIONS, this.local.q6Quality); },
+    medicationLabel() { return this.labelOf(MEDICATION_OPTIONS, this.local.q7Medication); },
+  },
+  watch: {
+    value: {
+      deep: true,
+      handler(v) {
+        const n = this.normalize(v);
+        if (JSON.stringify(n) !== JSON.stringify(this.local)) this.local = n;
+      },
+    },
+    local: {
+      deep: true,
+      handler(v) {
+        const out = this.buildOut(v);
+        if (JSON.stringify(out) !== JSON.stringify(this.value)) this.$emit("input", out);
+      },
+    },
+  },
+  methods: {
+    num(key) { return Number(this.local[key]) || 0; },
+    // 鏈~鍐欑殑鎴愬垎鏄剧ず鍗犱綅绗︼紝涓嶅弬涓庢�诲垎
+    disp(v) { return v === null || v === undefined ? "-" : v; },
+    // 鎸夐槇鍊兼妸绱鍒嗚浆鎹负 0~3 鐨勬垚鍒嗗垎
+    mapSum(sum, thresholds) {
+      if (sum < thresholds[0]) return 0;
+      if (sum < thresholds[1]) return 1;
+      if (sum < thresholds[2]) return 2;
+      return 3;
+    },
+    parseTime(str) {
+      if (!str) return null;
+      const m = String(str).match(/^(\d{1,2}):(\d{2})$/);
+      if (!m) return null;
+      const h = Number(m[1]), mi = Number(m[2]);
+      if (h > 23 || mi > 59) return null;
+      return h + mi / 60;
+    },
+    fmtHours(v) {
+      if (v === null || v === undefined) return "-";
+      return Number.isInteger(v) ? String(v) : v.toFixed(1);
+    },
+    labelOf(list, v) {
+      const o = list.find((x) => x.v === (Number(v) || 0));
+      return o ? o.l : "-";
+    },
+    freqLabel(v) { return this.labelOf(FREQ_OPTIONS, v); },
+    normalize(v) {
+      const src = v || {};
+      const out = { evaluator: src.evaluator || "" };
+      FIELDS.forEach((k) => {
+        if (k === "date" || k === "q1BedTime" || k === "q3WakeTime") {
+          out[k] = src[k] === undefined || src[k] === null ? "" : src[k];
+        } else {
+          out[k] = src[k] === undefined || src[k] === null ? 0 : src[k];
+        }
+      });
+      return out;
+    },
+    buildOut(v) {
+      return Object.assign({}, v, {
+        psqiA: this.scoreA, psqiB: this.scoreB, psqiC: this.scoreC, psqiD: this.scoreD,
+        psqiE: this.scoreE, psqiF: this.scoreF, psqiG: this.scoreG,
+        psqiEfficiency: this.efficiency,
+        psqiTotal: this.totalScore,
+        psqiEvaluation: this.evaluation,
+      });
+    },
   },
 };
 </script>
+
+<style scoped>
+.scale-title { margin-bottom: 10px; font-size: 16px; font-weight: 700; text-align: center; color: #303133; }
+.scale-head { margin-bottom: 10px; }
+.scale-tip { margin-bottom: 10px; padding: 6px 10px; font-size: 13px; color: #606266; line-height: 1.6; background: #f8f9fb; border-left: 3px solid #c0c4cc; }
+.q-item { padding: 8px 0; border-bottom: 1px dashed #ebeef5; }
+.q-text { font-size: 13px; color: #303133; font-weight: 600; }
+.q-body { margin-top: 6px; padding-left: 12px; }
+.q-value { font-size: 13px; color: #409eff; font-weight: 600; }
+.q-hint { margin-left: 10px; font-size: 12px; color: #909399; }
+.q-sub-table { margin: 4px 0 6px; }
+.sec-title { margin: 14px 0 8px; font-size: 14px; font-weight: 700; color: #303133; border-left: 3px solid #409eff; padding-left: 8px; }
+.score-table { margin-bottom: 12px; }
+.scale-result { margin-top: 6px; }
+.muted { color: #909399; font-size: 12px; }
+.lv-good { color: #67c23a; }
+.lv-mid { color: #409eff; }
+.lv-warn { color: #e6a23c; }
+.lv-bad { color: #f56c6c; }
+</style>

--
Gitblit v1.9.3