From 4eefd90c82210efa63f5620295af434212c060f9 Mon Sep 17 00:00:00 2001
From: feige <791364011@qq.com>
Date: 星期二, 25 三月 2025 20:52:30 +0800
Subject: [PATCH] 修改了图片

---
 ruoyi-ui/src/views/genealogy/index.vue |  453 ++++++++++++++------------------------------------------
 1 files changed, 115 insertions(+), 338 deletions(-)

diff --git a/ruoyi-ui/src/views/genealogy/index.vue b/ruoyi-ui/src/views/genealogy/index.vue
index 4e1626f..fe78294 100644
--- a/ruoyi-ui/src/views/genealogy/index.vue
+++ b/ruoyi-ui/src/views/genealogy/index.vue
@@ -1,22 +1,6 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch">
-      <el-form-item label="" prop="phone wx qq twitter isAlways remark" >
-        <el-input
-          v-model:phone="queryParams.phone"
-          v-model:wx="queryParams.wx"
-          v-model:qq="queryParams.qq"
-          v-model:twitter="queryParams.twitter"
-          v-model:isAlways="queryParams.isAlways"
-          v-model:remark="queryParams.remark"
-          placeholder="鍦ㄢ�滃紶姘忎竴瑙堣〃鈥濅腑鎼滅储"
-          clearable
-          style="width: 240px"
-          @keyup.enter.native="handleQuery">
-          <i slot="prefix" class="el-input__icon el-icon-search"></i>
-        </el-input>
-        <!--        v-model="queryParams.id"-->
-      </el-form-item>
 
       <el-form-item label="韬唤" prop="identity" >
         <el-select
@@ -48,26 +32,28 @@
       </el-form-item>
 
       <el-form-item label="鎬у埆" prop="sex">
-        <el-input
-          v-model="queryParams.sex"
-          placeholder="璇疯緭鍏ユ�у埆"
-          clearable
-          style="width: 240px"
-          @keyup.enter.native="handleQuery">
-          <i slot="prefix" class="el-input__icon el-icon-search"></i>
-        </el-input>
+        <el-select v-model="queryParams.sex" placeholder="璇烽�夋嫨鎬у埆" clearable
+                   style="width: 240px" @keyup.enter.native="handleQuery">
+          <el-option v-for="item in typeOption"
+                     :key="item.value" :label="item.label" :value="item.value"/>
+        </el-select>
       </el-form-item>
+
       <el-form-item label="鐢熸棩" prop="birth">
-        <el-input
+        <el-date-picker
           v-model="queryParams.birth"
-          placeholder="璇疯緭鍏ョ敓鏃�"
-          clearable
-          style="width: 240px"
+          style="width:  240px;
+          height: 30px;
+          background: #FFFFFF;
+          border-radius: 14px 14px 14px 14px;
+          opacity: 0.5;
+          border: 1px solid rgba(0,0,0,0.25);"
+          value-format="yyyy-MM-dd"
           @keyup.enter.native="handleQuery"
-        >
-          <i slot="prefix" class="el-input__icon el-icon-search"></i>
-        </el-input>
+        ></el-date-picker>
+
       </el-form-item>
+
       <el-form-item>
         <el-button size="mini" @click="handleQuery" style=" width: 67px;height: 27px;background: #FFDDE3;
             border-radius: 7px 7px 7px 7px;opacity: 1; " >鎼滅储</el-button>
@@ -77,48 +63,7 @@
       </el-form-item>
     </el-form>
     <div>
-<!--      <div style="width: 149px;-->
-<!--      height: 24px;-->
-<!--      font-size: 18px;-->
-<!--      font-family: Microsoft YaHei-Regular, Microsoft YaHei;-->
-<!--      font-weight: 400;-->
-<!--      color: #000000;-->
-<!--      line-height: 21px;-->
-<!--      ">寮犳皬涓�瑙堣〃</div>-->
-
       <el-row :gutter="10" class="mb8">
-<!--        <el-col :span="1.5">-->
-<!--          <el-button-->
-<!--            type="primary"-->
-<!--            plain-->
-<!--            icon="el-icon-plus"-->
-<!--            size="mini"-->
-<!--            @click="handleAdd"-->
-<!--            v-hasPermi="['system:role:add']"-->
-<!--          >鏂板</el-button>-->
-<!--        </el-col>-->
-
-<!--        <el-col :span="1.5">-->
-<!--          <el-button-->
-<!--            type="danger"-->
-<!--            plain-->
-<!--            icon="el-icon-delete"-->
-<!--            size="mini"-->
-<!--            :disabled="multiple"-->
-<!--            @click="handleDelete"-->
-<!--            v-hasPermi="['system:role:remove']"-->
-<!--          >鍒犻櫎</el-button>-->
-<!--        </el-col>-->
-        <el-col :span="1.5">
-          <el-button
-            type="warning"
-            plain
-            icon="el-icon-download"
-            size="mini"
-            @click="handleExport"
-            v-hasPermi="['family:note:export']"
-          >瀵煎嚭</el-button>
-        </el-col>
 <!--        <el-col :span="1.5">-->
 <!--          <el-button-->
 <!--            type="warning"-->
@@ -127,41 +72,33 @@
 <!--            size="mini"-->
 <!--            @click="handleExport"-->
 <!--            v-hasPermi="['family:note:export']"-->
-<!--          >瀵煎叆妯℃澘涓嬭浇</el-button>-->
-<!--        </el-col>-->
-<!--        <el-col :span="1.2">-->
-
-<!--          <el-upload-->
-<!--            action=""-->
-<!--            class="upload-demo"-->
-<!--            :show-file-list="false"-->
-<!--            :http-request="handleEnport"-->
-<!--          >-->
-<!--            <el-button size="mini"   type="primary"-->
-<!--                       plain-->
-<!--                       icon="el-icon-plus" >瀵煎叆</el-button>-->
-<!--          </el-upload>-->
+<!--          >瀵煎嚭</el-button>-->
 <!--        </el-col>-->
 
         <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
       </el-row>
     </div>
 
-    <el-table v-loading="loading" :data="listRoot"  @selection-change="handleSelectionChange"  :row-class-name="tableRowClassName" style="background: #FFEFF2;  border-radius: 14px 14px 14px 14px;">
-      <el-table-column type="selection" width="25"  align="center" />
-      <el-table-column  label="搴忓彿" sortable type="index" :index="(queryParams.pageNum-1)*queryParams.pageSize+1" width="80"/>
-
+    <el-table class="eltab" v-loading="loading" border :data="listRoot" :row-key="getRowId" ref="multipleTable"  @selection-change="handleSelectionChange"  :row-class-name="tableRowClassName" style="background: #FFEFF2;  border-radius: 14px 14px 14px 14px;">
+      <el-table-column type="selection" width="55"  align="center" />
+      <el-table-column fixed label="搴忓彿" sortable type="index" :index="(queryParams.pageNum-1)*queryParams.pageSize+1" width="80"/>
       <el-table-column label="韬唤" prop="identity" sortable width="100" >
-        <template slot-scope="scope">
-          <span>绗瑊{scope.row.identity}}浠�</span>
+        <template slot-scope="scope" >
+          <span v-if="scope.row.isMyFamily==1">绗瑊{scope.row.identity}}浠�</span>
+          <span v-else>鈥斺��</span>
         </template>
-<!--        <template slot-scope="scope">{{ getSrc(scope.row.identity) }}</template>-->
       </el-table-column>
-      <el-table-column label="濮撳悕" prop="nickName" sortable :show-overflow-tooltip="true" width="100" align="center"/>
+      <el-table-column label="濮撳悕" prop="nickName" sortable :show-overflow-tooltip="true" width="100" align="center">
+		    <template slot-scope="scope" >
+				
+			<el-button @click="handleCheck(scope.row)">{{scope.row.nickName}}</el-button>
+		         </template>
+		      </el-table-column> 
+		  
       <el-table-column label="鎬у埆" prop="sex" sortable width="100" align="center" >
         <template slot-scope="scope">
-          <span v-if="scope.row.sex===1">鐢�</span>
-          <span v-if="scope.row.sex===0">濂�</span>
+          <span v-if="scope.row.sex===0">鐢�</span>
+          <span v-if="scope.row.sex===1">濂�</span>
           <span v-if="scope.row.sex== null">鈥斺��</span>
         </template>
       </el-table-column>
@@ -184,22 +121,23 @@
         <template slot-scope="scope">{{scope.row.spouseName? scope.row.spouseName: '鈥斺�斺�斺��'}}</template>
       </el-table-column>
 
-  <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
+      <el-table-column fixed="right" label="鎿嶄綔" align="center" class-name="small-padding fixed-width">
         <template slot-scope="scope" v-if="scope.row.roleId !== 1">
 
 
-<el-button
+        <el-button
              size="mini"
               type="text"
              icon="el-icon-d-arrow-right"
               @click="handleCheck(scope.row)">
-鏌ョ湅璇︽儏</el-button>
+          鏌ョ湅璇︽儏
+        </el-button>
         </template>
       </el-table-column>
     </el-table>
 
     <pagination
-      v-show="total"
+      v-show="total>0"
       :total="total"
       :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
@@ -207,115 +145,9 @@
       @pagination="getList"
     />
 
+  <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
 
-  <!--  <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
-      <el-form ref="elForm" :model="formDat" :rules="rules" size="medium" label-width="100px">
-
-        <el-form-item label="鎴愬憳濮撳悕" prop="myName">
-          <el-input v-model="formDat.myName" placeholder="璇疯緭鍏ユ垚鍛樺鍚�" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-
-        <el-form-item label="绉板懠" prop="nickName">
-          <el-input v-model="formDat.nickName" placeholder="璇疯緭鍏ョО鍛�" clearable :style="{width: '100%'}" ></el-input>
-        </el-form-item>
-        <el-form-item label="濮撳悕" prop="name">
-          <el-input v-model="formDat.name" placeholder="璇疯緭鍏ュ鍚�" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-        <el-form-item label="宸ヤ綔鍗曚綅" prop="work">
-          <el-input v-model="formDat.work" placeholder="璇疯緭鍏ュ伐浣滃崟浣�" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-        <el-form-item label="鎵嬫満" prop="phone">
-          <el-input v-model="formDat.phone" placeholder="璇疯緭鍏ユ墜鏈�" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-        <el-form-item label="寰俊" prop="wx">
-          <el-input v-model="formDat.wx" placeholder="璇疯緭鍏ュ井淇�" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-        <el-form-item label="QQ" prop="qq">
-          <el-input v-model="formDat.qq" placeholder="璇疯緭鍏Q" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-        <el-form-item label="twitter" prop="twitter">
-          <el-input v-model="formDat.twitter" placeholder="璇疯緭鍏witter" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-        <el-form-item label="鏄惁甯歌仈绯�" prop="isAlways">
-          <el-input v-model="formDat.isAlways" placeholder="鏄惁甯歌仈绯�" clearable :style="{width: '100%'}" >
-          </el-input>
-        </el-form-item>
-
-        <el-form-item label="澶囨敞锛堟槸鍚﹀瓨鍦ㄩ噾閽卞叧绯伙級" prop="remark">
-          <el-input v-model="formDat.remark" placeholder="璇疯緭鍏ュ娉�" clearable :style="{width: '100%'}" ></el-input>
-        </el-form-item>
-
-        <h4 class="form-header">鐢靛瓙鍚嶇墖 </h4>
-        <el-upload
-          action="#"
-          list-type="picture-card"
-          multiple
-          :http-request="requestUpload"
-          :file-list="fileList"
-        >
-          <i slot="default" class="el-icon-plus"></i>
-          <div slot="file" slot-scope="{file}">
-            <img
-              class="el-upload-list__item-thumbnail"
-              :src="file.url"
-              alt=""
-              style="width: 126px; height: 126px"
-              fit="cover"
-              :preview-src-list="[file.url]"
-            >
-            <span class="el-upload-list__item-actions">
-        <span
-          class="el-upload-list__item-preview"
-          @click="handlePictureCardPreview(file)"
-        >
-          <i class="el-icon-zoom-in"></i>
-        </span>
-
-        <span
-          v-if="!disabled"
-          class="el-upload-list__item-delete"
-          @click="handleRemove(file)"
-        >
-          <i class="el-icon-delete"></i>
-        </span>
-      </span>
-
-
-          </div>
-        </el-upload>
-        <h4 class="form-header">鍏朵粬闄勪欢 </h4>
-        <el-upload
-          action=""
-          :file-list="fileListOther"
-          class="upload-demo"
-          multiple
-
-          :on-remove="handleRemove"
-          :http-request="requestUpload"
-          :show-file-list="true"
-        >
-          <el-button type="primary">鐐瑰嚮涓婁紶</el-button>
-          <template #tip>
-            <div class="el-upload__tip">
-            </div>
-          </template>
-        </el-upload>
-
-      </el-form>
-      <h4 class="form-header"> </h4>
-
-      <div slot="footer" class="dialog-footer">
-        <el-button type="primary" @click="submitDataScope">淇� 瀛�</el-button>
-        <el-button @click="cancelData">鍙� 娑�</el-button>
-      </div>
-    </el-dialog>  -->
+    </el-dialog>
 
     <el-dialog :title="title" :visible.sync="openDataScope" width="500px" append-to-body>
 
@@ -333,6 +165,8 @@
 //瀵煎叆鎺ュ彛鍑芥暟
 import {enload, uploadPic} from "@/api/contacts/index";
 import {getRoot,listUserAll} from "@/api/root/index";
+
+
 export default {
   name: "index",
   dicts: ['sys_normal_disable'],
@@ -351,7 +185,8 @@
       multiple: true,
       // 鏄剧ず鎼滅储鏉′欢
       showSearch: true,
-      // 鎬绘潯鏁�
+      pageSize: 10, // 姣忛〉鏄剧ず鏁版嵁鏉℃暟
+      pageNum: 1, // 褰撳墠椤电爜      // 鎬绘潯鏁�
       total: 0,
       // 瀹惰氨琛ㄦ牸鏁版嵁
       listRoot: [],
@@ -368,16 +203,13 @@
       // 鏃ユ湡鑼冨洿
       dateRange: [],
       // 鏁版嵁鑼冨洿閫夐」
-      fot:[".jpg",".jif"],
-      fileList:[
-      ],
-      fileListOther:[
-
-      ],
+      fot:[".jpg",".jif",'.M4A'],
+      fileList:[],
+      fileListOther:[],
       dsb:true,
       btn:false,
       fit:['fill'],
-
+      uploading: false,
       formDat: {
         //寮犳皬涓�瑙堣〃
         userid:undefined,
@@ -409,6 +241,7 @@
         secondFamilyId:undefined,
         childList:undefined,
         identity:undefined,
+        isMyFamily:undefined,
         url: undefined,
 
       },
@@ -424,6 +257,7 @@
         nickName:undefined,
         sex:undefined,
         birth:undefined,
+		clanId: undefined
       },
       // searchVal:"",
 
@@ -463,6 +297,14 @@
         }],
 
       },
+      typeOption: [{
+        value: '0',
+        label: '鐢�',
+      },
+        {
+          value: '1',
+          label: '濂�',
+        }],
       typeOptions: [{
         value:'1',
         label:'绗�1浠�'
@@ -480,10 +322,6 @@
   },
   created() {
     this.getList();
-    // this.getCateInfor()
-    // for (let i = 0; i < this.contactList.length; i++) {
-    //   this.formDat[i] = this.contactList[i];
-    // }
   },
   methods: {
     // 鍙栨秷鎸夐挳
@@ -492,30 +330,30 @@
       this.reset();
     },
      //鎷垮埌閰嶅伓鐨勫鍚�
-   //   getPerson(id)
-   //   {
-   //   //  alert(id)
-   // //    alert(typeof(id))
-   //     // this.listRoot.forEach(function(item, index) {
-   //     //             //item 灏辨槸褰撴棩鎸夊惊鐜埌鐨勫璞�
-   //     //             //index鏄惊鐜殑绱㈠紩锛屼粠0寮�濮�
-   //     //              //alert(typeof(item.userId))
-   //     //             if(item.userId==id){
-   //     //            //   alert(89)
-   //     //            alert(item.nickName)
-   //     //               return item.nickName
-   //     //             }
-   //
-   //     // })
-   //     let username = ""
-   //     for(let i = 0; i < this.listRoot.length;i++)
-   //     {
-   //       if(this.listRoot[i].userId==id)
-   //        username = this.listRoot[i].nickName
-   //     }
-   //     return username;
-   //    // return "12ddd"
-   //   },
+     getPerson(id)
+     {
+     //  alert(id)
+   //    alert(typeof(id))
+       // this.listRoot.forEach(function(item, index) {
+       //             //item 灏辨槸褰撴棩鎸夊惊鐜埌鐨勫璞�
+       //             //index鏄惊鐜殑绱㈠紩锛屼粠0寮�濮�
+       //              //alert(typeof(item.userId))
+       //             if(item.userId==id){
+       //            //   alert(89)
+       //            alert(item.nickName)
+       //               return item.nickName
+       //             }
+
+       // })
+       let username = ""
+       for(let i = 0; i < this.listRoot.length;i++)
+       {
+         if(this.listRoot[i].userId==id)
+          username = this.listRoot[i].nickName
+       }
+       return username;
+      // return "12ddd"
+     },
     //闅旇鍙樿壊
     tableRowClassName({ row, rowIndex }) {
       if (rowIndex % 2 == 0) {
@@ -524,36 +362,30 @@
         return "statistics-warning-row";
       }
     },
-
-    /** 鏌ヨ閫氳褰曞垪琛� */
+    /** 鏌ヨ瀹惰氨鍒楄〃 */
     getList() {
       this.loading = true;
      //  console.log(this.queryParams)
       //alert(23)
-
+      this.queryParams.happenStartTime = this.dateRange.length > 0 && this.dateRange[0]
+      this.queryParams.happenEndTime = this.dateRange.length > 0 && this.dateRange[1]
+	  this.queryParams.clanId = this.$store.state.user.clanId
+      this.listRoot = []
       //  listProperty(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
       listUserAll(this.queryParams).then(response => {
-          //  alert(123)
           //   console.log(response.data)
-       //   alert(76)
           this.listRoot = response.data.data;
-        //  alert(this.listRoot)
-          this.total = response.data.length;
-       //   alert(this.total)
+          this.total = response.data.total;
+          // this.pageNum=1;
+          // this.pageSize=10;
+        // this.pageNum = response.data.pageNum;
           this.loading = false;
         }
       );
     },
-    /** 鏌ヨ绫诲埆淇℃伅 */
-    getCateInfor()
-    {
-      let _this = this
-      getCategory().then(response=>{
-
-        response.data.itemValues.replace("{","").replace("}","").split(",").map(elem=>{
-          _this.typeOptions.push({"label":elem.split(":")[0], "value":elem.split(":")[0]})
-        })
-      })
+    handlePageChange(currentPage) {
+      this.pageNum = currentPage; // 鏍规嵁 currentPage 璁$畻鍑� pageNum 鍊�
+      this.getList();
     },
     //韬唤閫夋嫨
     getSrc(identity) {
@@ -569,10 +401,11 @@
         return '鍏跺畠'
       }
     },
-
-    handleRemove(file) {
-      alert(323)
+    getRowId(row)
+    {
+      return row.id
     },
+
     // 鍙栨秷鎸夐挳
     cancel() {
       this.open = false;
@@ -581,7 +414,6 @@
     // 鍙栨秷鎸夐挳锛堟暟鎹潈闄愶級
     cancelDataScope() {
       this.openDataScope = false;
-      this.reset();
     },
     // 琛ㄥ崟閲嶇疆
     reset() {
@@ -604,7 +436,7 @@
           deptCheckStrictly: true,
           remark: undefined
         };
-      this.resetForm("form");
+      this.resetForm("elForm");
     },
     /** 鎼滅储鎸夐挳鎿嶄綔 */
     handleQuery() {
@@ -641,65 +473,12 @@
      this.$router.push("/familymodel/jiagenwang/personInfo/" + id);
     },
 
-
     handlePictureCardPreview(file) {
       this.dialogImageUrl = file.url;
       this.dialogVisible = true;
     },
-    /** 鎻愪氦鎸夐挳锛堟暟鎹潈闄愶級 */
-    submitDataScope: function() {
 
-      let ul = this.fileList.map(function (elem){
-        return elem.url.replace(process.env.VUE_APP_BASE_TRUE_API,"")
-      }).join(",")
-      let uls = this.fileListOther.map(function (elem){
-        return elem.url.replace(process.env.VUE_APP_BASE_TRUE_API,"")
-      }).join(",")
-      this.formDat.url = ul+","+uls
-      this.$refs["elForm"].validate(valid => {
-        if (valid) {
 
-          addContact(this.formDat).then(response => {
-            this.$modal.msgSuccess("鏂板鎴愬姛");
-            this.open = false;
-            this.getList();
-          });
-        }
-      });
-    },
-    requestUpload(params)
-    {
-      var file = params.file;
-      var formData = new FormData();
-      formData.append('uploadFile', file);
-      let _this = this
-
-      uploadPic(formData).then(response => {
-        let pth = response.data.originalFilename.substr(response.data.originalFilename.length-4, response.data.originalFilename.length)
-
-        if(_this.fot.includes(pth) === true)
-        {
-          _this.fileList.push({name:response.data.fileName, "url":response.data.url})
-
-        }
-
-        else{
-          _this.fileListOther.push({name:response.data.fileName, url:response.data.url})
-
-        }
-      })
-
-    },
-    /** 鍒犻櫎鎸夐挳鎿嶄綔 */
-    handleDelete(row) {
-      const Ids = row.id || this.ids;
-      this.$modal.confirm('鏄惁纭鍒犻櫎缂栧彿涓�"' + Ids + '"鐨勬暟鎹」锛�').then(function() {
-        return delContact(Ids);
-      }).then(() => {
-        this.getList();
-        this.$modal.msgSuccess("鍒犻櫎鎴愬姛");
-      }).catch(() => {});
-    },
     /** 瀵煎嚭鎸夐挳鎿嶄綔 */
     // handleExport() {
     //   this.download('/self/user/export/genealogy', {
@@ -716,35 +495,24 @@
           ...this.queryParams
         }, `zGenealogy_${new Date().getTime()}.xlsx`)
       }else{
-        this.download('/self/user/export/genealogy/'+Ids, {
+        this.download('/self/user/export/genealogy1/'+Ids, {
 
         }, `zGenealogy_${new Date().getTime()}.xlsx`)
       }
     },
 
-    /** 瀵煎叆鎿嶄綔*/
-    // handleEnport(params){
-    //   var file = params.file;
-    //   var formData = new FormData();
-    //   formData.append('excelImport', file);
-    //   let _this = this
-    //   enload(formData).then(response => {
-    //     _this.getList();
-    //     Message({ message: "瀵煎叆鎴愬姛", type: 'warning' })
-    //
-    //   }).catch(err)
-    //   {
-    //     Message({ message: "瀵煎叆澶辫触", type: 'error' })
-    //   }
-    //
-    // }
   }
 };
 </script>
 
-<style >
+<style scoped>
 .app-container{
   background-color: #FEF7FC;
+   background: url("../../assets/images/shuzi.png") no-repeat center center;
+  background-size: cover;
+  padding: 20px; /* 鐣欏嚭杈硅窛 */
+  border-radius: 4px; /* 鍦嗚鍖归厤Element椋庢牸 */
+  z-index:100
 }
 
 .el-table__row.statistics-warning-row {
@@ -757,4 +525,13 @@
 }
 
 
+/* 琛ㄦ牸閫忔槑鍖� */
+.el-table {
+  background-color: transparent !important;
+}
+/* 琛ㄥご鏍峰紡璋冩暣 */
+:deep(.el-table__header th) {
+  background-color: rgba(0, 0, 0, 0.1) !important;
+}
+
 </style>

--
Gitblit v1.9.1