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">锛�>7h 璁�0鍒嗭紝6~7h 璁�1鍒嗭紝5~6h 璁�2鍒嗭紝<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"> </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"> </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"> </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"> </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 }} 璇勪环锛歿{ 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