From d6001eac15349a55a01b5ff781b1fcf285b32efe Mon Sep 17 00:00:00 2001
From: shuishen <1109946754@qq.com>
Date: Tue, 31 Oct 2023 19:06:44 +0800
Subject: [PATCH] Merge branch 'master' of http://s16s652780.51mypc.cn:49896/r/jczz_app
---
api/doorplateAddress/doorplateAddress.js | 32 +
subPackage/house/roomDetails/index.vue | 89 +-
pages/home/index.vue | 868 ++++++++++++++--------------
subPackage/bs/views/rentDetail.vue | 116 +++
subPackage/house/family/index.vue | 475 +++++----------
subPackage/house/list/index.vue | 187 +++--
6 files changed, 885 insertions(+), 882 deletions(-)
diff --git a/api/doorplateAddress/doorplateAddress.js b/api/doorplateAddress/doorplateAddress.js
index a8c9cf3..5ad328d 100644
--- a/api/doorplateAddress/doorplateAddress.js
+++ b/api/doorplateAddress/doorplateAddress.js
@@ -10,4 +10,36 @@
roleName
}
})
+}
+
+export const getHouseList = (type, name) => {
+ return http.request({
+ url: '/blade-doorplateAddress/doorplateAddress/getHousesList',
+ method: 'GET',
+ params: {
+ type,
+ name
+ }
+ })
+}
+
+export const getHouseInfoList = (type, code) => {
+ return http.request({
+ url: '/blade-doorplateAddress/doorplateAddress/getHousesList',
+ method: 'GET',
+ params: {
+ type,
+ code
+ }
+ })
+}
+
+export const getHouseRentInfo = (code) => {
+ return http.request({
+ url: '/blade-doorplateAddress/doorplateAddress/getHouseRentInfo',
+ method: 'GET',
+ params: {
+ code
+ }
+ })
}
\ No newline at end of file
diff --git a/pages/home/index.vue b/pages/home/index.vue
index 14c76d4..7c720ab 100644
--- a/pages/home/index.vue
+++ b/pages/home/index.vue
@@ -1,430 +1,440 @@
-<template>
- <view class="container">
- <u-navbar height="48" bgColor="#5887f9" :autoBack="false" safeAreaInsetTop placeholder>
- <view slot="left">
- <u--text color="#ffffff" text="基层智治" size="18" />
- </view>
- </u-navbar>
-
- <view class="main">
- <view class="main-bg">
-
- </view>
-
- <view class="main-select" @click="selectBoxShow = !selectBoxShow">
- <u-icon name="map" color="#fff"></u-icon>
- <view>
- 当前场所:{{curSelectSite.name?curSelectSite.name:'暂无绑定场所信息'}}
- </view>
-
- <u-picker title="场所" :show="selectBoxShow" keyName="name" ref="uPicker" :columns="siteColumns"
- @confirm="confirm" @change="changeHandler"></u-picker>
- </view>
-
- <view class="main-btn">
- <menu-list :menuData="btnList"></menu-list>
- </view>
-
- <view class="main-phone-house">
- <view v-if="gridDataList.length>0" class="phone-box">
- <grid-menu :gridData='item' v-for="(item, index) in gridDataList" :key='index'></grid-menu>
- </view>
-
- <view v-if="hasMenu('楼盘表').length>0" class="house-box">
- <box-title :title="'楼盘表'"></box-title>
- <view class="content">
- <grid-menu :gridData='item' v-for="(item, index) in houseDataList" :key='index'></grid-menu>
- </view>
- </view>
- </view>
-
- <view class="main-bt pb-40">
- <view v-if="liveList.length>0" class="mt-20">
- <box-title :title="'生活'">
- <template slot="titleMore">
- <view style="color: red;">titleMore</view>
- </template>
- </box-title>
- <view class="mt-20">
- <view class="mt-20 b-c-w">
- <menu-list :menuData="liveList"></menu-list>
- </view>
- </view>
- </view>
-
- <view v-if="jobList.length>0" class="mt-20">
- <box-title :title="'工作台'"></box-title>
-
- <view class="mt-20 b-c-w">
- <menu-list :border='true' :menuData="jobList"></menu-list>
- </view>
- </view>
-
- <view class="mt-20 main-taska">
- <box-title :title="'我的任务'"></box-title>
-
- <view class="mt-20 b-c-w">
- <view class="flex">
- <view class="flex-1" v-for="(item, index) in taskTypeList" :key='index'>
- <cur-menu class='boder-f7f8f9-1 p-all-16' :curMenu="item" :imgShow="false"
- :textShow="true"></cur-menu>
- </view>
- </view>
- <u-cell-group :border='false'>
- <u-cell class="boder-f7f8f9-1" :border='false' :title="item.title"
- v-for="(item, index) in taskList" :key="index">
- <view slot="right-icon">待处理 {{item.num}}</view>
- </u-cell>
- </u-cell-group>
- </view>
-
- </view>
- </view>
- </view>
-
- <tabBar @change='change' :currentTab="0"></tabBar>
- </view>
-</template>
-
-<script>
- import tabBar from "@/components/tabBar/tabBar.vue";
- import curMenu from "@/components/curMenu/index.vue";
- import menuList from "@/components/menuList/index.vue";
- import gridMenu from "@/components/gridMenu/index.vue";
- import {
- getFuncList
- } from "@/api/doorplateAddress/doorplateAddress";
-
- export default {
- components: {
- tabBar,
- curMenu,
- menuList,
- gridMenu
- },
-
- data() {
- return {
- menuList: [],
- selectRole: {},
- selectBoxShow: false,
- siteColumns: [],
- curSelectSite: {},
- columnData: [],
- btnList: [{
- imgUrl: '/static/img/sys.png',
- title: '扫一扫',
- imgWidth: 54,
- imgHeight: 54
- },
- {
- imgUrl: '/static/img/bs.png',
- title: '报事',
- imgWidth: 54,
- imgHeight: 54
- }
- ],
- gridDataList: [],
-
- houseDataList: [{
- title: '万达广场',
- useSlot: true
- },
- {
- title: '万达晶座',
- useSlot: true
- },
- {
- title: '万达华府',
- useSlot: true
- },
- {
- title: '万达华府',
- useSlot: true
- }
- ],
-
- liveList: [],
-
- jobList: [],
-
- taskTypeList: [{
- title: '一次性',
- num: 1,
- },
- {
- title: '周期性',
- num: 0,
- }
- ],
-
- taskList: [{
- title: '综治任务',
- num: 0
- },
- {
- title: '住建任务',
- num: 0
- },
- {
- title: '公安任务',
- num: 0
- },
- ],
- }
- },
-
- onShow() {
- this.init()
- },
-
- computed: {
- hasMenu() {
- return (name) => {
- let resultArr = []
- resultArr = this.getMenu(name, this.menuList, resultArr)
- if (resultArr.length > 0) {
- return resultArr
- } else {
- return []
- }
-
- }
- }
- },
-
- methods: {
- //初始化
- init() {
- this.curSelectSite = {}
- this.menuList = uni.getStorageSync("menu")
- this.selectRole = uni.getStorageSync("activeRole")
- this.getMenuList()
- this.getSiteList()
- uni.hideTabBar()
- },
- //获取场所列表
- async getSiteList() {
- console.log(this.selectRole)
- let type = null
- let roleName = this.selectRole.roleName
- console.log("roleName", roleName)
- if (roleName == '网格员' || roleName == '系统管理员') {
- type = 1
- } else if (roleName == '场所负责人') {
- type = 2
- } else if (roleName == '居民') {
- type = 3
- }
-
- const res = await getFuncList(type, roleName)
- console.log(res, "-----------")
- let data = res.data
- this.siteColumns = []
-
- this.buildSiteColumn(data, 0)
- console.log(this.siteColumns)
-
- },
-
- buildSiteColumn(dataList, index) {
- if (dataList.length > 0) {
- this.siteColumns[index] = dataList
- if (dataList[0].children && dataList[0].children.length > 0) {
- this.buildSiteColumn(dataList[0].children, index + 1)
- }
- }
- },
-
- //获取首页菜单
- getMenuList() {
- console.log("当前角色菜单", this.menuList)
- this.getPhoneList()
- this.getLiveList()
- this.getWorkbenchList()
- },
- getPhoneList() {
- this.gridDataList = []
- const resultArr = this.hasMenu('快捷拨号')
- if (resultArr.length == 0) {
- return
- }
-
- const topMenu = resultArr[0]
-
- topMenu.children.forEach(menu => {
- this.gridDataList.push({
- title: menu.name,
- data: "无数据",
- phone: "无"
- })
- })
- },
-
- //获取生活菜单
- getLiveList() {
- this.liveList = []
- const resultArr = this.hasMenu('生活')
- if (resultArr.length == 0) {
- return
- }
-
- const topMenu = resultArr[0]
-
- topMenu.children.forEach(menu => {
- this.liveList.push({
- imgUrl: menu.source,
- title: menu.name,
- })
- })
- },
-
- //获取工作台菜单
- getWorkbenchList() {
- this.jobList = []
- const resultArr = this.hasMenu('工作台')
- if (resultArr.length == 0) {
- return
- }
-
- const topMenu = resultArr[0]
-
- topMenu.children.forEach(menu => {
- this.jobList.push({
- imgUrl: menu.source,
- title: menu.name,
- })
- })
- },
-
-
-
-
-
- getMenu(menuName, menuList, resultArr) {
- // console.log(menuList, menuName)
- for (var i = 0; i < menuList.length; i++) {
- if (menuList[i].name == menuName) {
- resultArr.push(menuList[i])
- } else {
- if (menuList[i].children && menuList[i].children.length) {
- this.getMenu(menuName, menuList[i].children, resultArr);
- }
- }
- }
-
- return resultArr
-
- },
-
- change(index) {
- let url = index
- this.$u.func.globalNavigator(url, "switchTab")
- },
- changeHandler(e) {
- const {
- columnIndex,
- value,
- values, // values为当前变化列的数组内容
- index,
- // 微信小程序无法将picker实例传出来,只能通过ref操作
- picker = this.$refs.uPicker
- } = e
- // 当第一列值发生变化时,变化第二列(后一列)对应的选项
- if (columnIndex === 0 && this.columnData.length > 0) {
- // picker为选择器this实例,变化第二列对应的选项
- picker.setColumnValues(1, this.columnData[index])
- }
- },
- // 回调参数为包含columnIndex、value、values
- confirm(e) {
- console.log('confirm', e)
- this.curSelectSite = e.value[e.value.length - 1]
- this.selectBoxShow = false
- }
- }
- }
-</script>
-
-<style lang="scss" scoped>
- .container {
- width: 100%;
- height: 100%;
-
- display: flex;
- flex-direction: column;
- background: #F9F9FA;
- color: #fff;
- font-size: 32rpx;
-
- .main {
- position: relative;
- height: 0;
- flex: 1;
- overflow-y: auto;
-
- .main-bg {
- height: 36%;
- background: royalblue;
- }
-
- .main-select {
- margin: 0 6%;
- position: absolute;
- bottom: 74%;
- display: flex;
- align-items: center;
- }
-
- .main-btn {
- margin: 0 6%;
- position: absolute;
- top: 28%;
- width: 88%;
- height: 20%;
- background: #fff;
- border-radius: 10rpx;
- color: #000;
- }
-
- .main-phone-house {
- margin-top: 180rpx;
- width: 100%;
-
- .phone-box {
- display: flex;
-
- &>view {
- margin: 0 16rpx;
- height: 116rpx;
- flex: 1;
- background: linear-gradient(to right, #407BE9, #73A2F9);
- border-radius: 10rpx;
- }
- }
-
- .house-box {
- .content {
- display: flex;
- flex-wrap: wrap;
-
- &>view {
- margin: 0 16rpx;
- margin-top: 20rpx;
- min-width: calc((100% - 16rpx * 6) / 3);
- height: 66rpx;
- background: linear-gradient(to right, #407BE9, #73A2F9);
- border-radius: 33rpx;
- }
- }
- }
- }
-
- .main-bt {
- margin-top: 2%;
- width: 100%;
- color: #000;
- }
- }
- }
+<template>
+ <view class="container">
+ <u-navbar height="48" bgColor="#5887f9" :autoBack="false" safeAreaInsetTop placeholder>
+ <view slot="left">
+ <u--text color="#ffffff" text="基层智治" size="18" />
+ </view>
+ </u-navbar>
+
+ <view class="main">
+ <view class="main-bg">
+
+ </view>
+
+ <view class="main-select" @click="selectBoxShow = !selectBoxShow">
+ <u-icon name="map" color="#fff"></u-icon>
+ <view>
+ 当前场所:{{curSelectSite.name?curSelectSite.name:'暂无绑定场所信息'}}
+ </view>
+
+ <u-picker title="场所" :show="selectBoxShow" keyName="name" ref="uPicker" :columns="siteColumns"
+ @confirm="confirm" @change="changeHandler"></u-picker>
+ </view>
+
+ <view class="main-btn">
+ <menu-list :menuData="btnList"></menu-list>
+ </view>
+
+ <view class="main-phone-house">
+ <view v-if="gridDataList.length>0" class="phone-box">
+ <grid-menu :gridData='item' v-for="(item, index) in gridDataList" :key='index'></grid-menu>
+ </view>
+
+ <view v-if="hasMenu('楼盘表').length>0" class="house-box">
+ <box-title :title="'楼盘表'"></box-title>
+ <view class="content">
+ <grid-menu :gridData='item' v-for="(item, index) in houseDataList.slice(0, 6)" :key='index'
+ @click.native="pushPage(item)"></grid-menu>
+ </view>
+ </view>
+ </view>
+
+ <view class="main-bt pb-40">
+ <view v-if="liveList.length>0" class="mt-20">
+ <box-title :title="'生活'">
+ <template slot="titleMore">
+ <view style="color: red;">titleMore</view>
+ </template>
+ </box-title>
+ <view class="mt-20">
+ <view class="mt-20 b-c-w">
+ <menu-list :menuData="liveList"></menu-list>
+ </view>
+ </view>
+ </view>
+
+ <view v-if="jobList.length>0" class="mt-20">
+ <box-title :title="'工作台'"></box-title>
+
+ <view class="mt-20 b-c-w">
+ <menu-list :border='true' :menuData="jobList"></menu-list>
+ </view>
+ </view>
+
+ <view class="mt-20 main-taska">
+ <box-title :title="'我的任务'"></box-title>
+
+ <view class="mt-20 b-c-w">
+ <view class="flex">
+ <view class="flex-1" v-for="(item, index) in taskTypeList" :key='index'>
+ <cur-menu class='boder-f7f8f9-1 p-all-16' :curMenu="item" :imgShow="false"
+ :textShow="true"></cur-menu>
+ </view>
+ </view>
+ <u-cell-group :border='false'>
+ <u-cell class="boder-f7f8f9-1" :border='false' :title="item.title"
+ v-for="(item, index) in taskList" :key="index">
+ <view slot="right-icon">待处理 {{item.num}}</view>
+ </u-cell>
+ </u-cell-group>
+ </view>
+
+ </view>
+ </view>
+ </view>
+
+ <tabBar @change='change' :currentTab="0"></tabBar>
+ </view>
+</template>
+
+<script>
+ import tabBar from "@/components/tabBar/tabBar.vue";
+ import curMenu from "@/components/curMenu/index.vue";
+ import menuList from "@/components/menuList/index.vue";
+ import gridMenu from "@/components/gridMenu/index.vue";
+ import {
+ getFuncList,
+ getHouseList
+ } from "@/api/doorplateAddress/doorplateAddress";
+
+ export default {
+ components: {
+ tabBar,
+ curMenu,
+ menuList,
+ gridMenu
+ },
+
+ data() {
+ return {
+ menuList: [],
+ selectRole: {},
+ selectBoxShow: false,
+ siteColumns: [],
+ curSelectSite: {},
+ columnData: [],
+ btnList: [{
+ imgUrl: '/static/img/sys.png',
+ title: '扫一扫',
+ imgWidth: 54,
+ imgHeight: 54
+ },
+ {
+ imgUrl: '/static/img/bs.png',
+ title: '报事',
+ imgWidth: 54,
+ imgHeight: 54
+ }
+ ],
+ gridDataList: [],
+ houseDataList: [{
+ title: '-',
+ useSlot: true
+ }],
+
+ liveList: [],
+
+ jobList: [],
+
+ taskTypeList: [{
+ title: '一次性',
+ num: 1,
+ },
+ {
+ title: '周期性',
+ num: 0,
+ }
+ ],
+
+ taskList: [{
+ title: '综治任务',
+ num: 0
+ },
+ {
+ title: '住建任务',
+ num: 0
+ },
+ {
+ title: '公安任务',
+ num: 0
+ },
+ ],
+ }
+ },
+
+ onShow() {
+ this.init()
+ },
+
+ computed: {
+ hasMenu() {
+ return (name) => {
+ let resultArr = []
+ resultArr = this.getMenu(name, this.menuList, resultArr)
+ if (resultArr.length > 0) {
+ return resultArr
+ } else {
+ return []
+ }
+
+ }
+ }
+ },
+
+ methods: {
+ //初始化
+ init() {
+ this.curSelectSite = {}
+ this.menuList = uni.getStorageSync("menu")
+ this.selectRole = uni.getStorageSync("activeRole")
+ this.getMenuList()
+ this.getSiteList()
+ uni.hideTabBar()
+ },
+ //获取场所列表
+ async getSiteList() {
+ console.log(this.selectRole)
+ let type = null
+ let roleName = this.selectRole.roleName
+ console.log("roleName", roleName)
+ if (roleName == '网格员' || roleName == '系统管理员') {
+ type = 1
+ } else if (roleName == '场所负责人') {
+ type = 2
+ } else if (roleName == '居民') {
+ type = 3
+ }
+
+ const res = await getFuncList(type, roleName)
+ console.log(res, "-----------")
+ let data = res.data
+ this.siteColumns = []
+
+ this.buildSiteColumn(data, 0)
+ console.log(this.siteColumns)
+
+ },
+
+ buildSiteColumn(dataList, index) {
+ if (dataList.length > 0) {
+ this.siteColumns[index] = dataList
+ if (dataList[0].children && dataList[0].children.length > 0) {
+ this.buildSiteColumn(dataList[0].children, index + 1)
+ }
+ }
+ },
+
+ //获取首页菜单
+ getMenuList() {
+ console.log("当前角色菜单", this.menuList)
+ this.getPhoneList()
+ this.getLiveList()
+ this.getWorkbenchList()
+ },
+ getPhoneList() {
+ this.gridDataList = []
+ const resultArr = this.hasMenu('快捷拨号')
+ if (resultArr.length == 0) {
+ return
+ }
+
+ const topMenu = resultArr[0]
+
+ topMenu.children.forEach(menu => {
+ this.gridDataList.push({
+ title: menu.name,
+ data: "无数据",
+ phone: "无"
+ })
+ })
+ },
+
+ //获取生活菜单
+ getLiveList() {
+ this.liveList = []
+ const resultArr = this.hasMenu('生活')
+ if (resultArr.length == 0) {
+ return
+ }
+
+ const topMenu = resultArr[0]
+
+ topMenu.children.forEach(menu => {
+ this.liveList.push({
+ imgUrl: menu.source,
+ title: menu.name,
+ })
+ })
+ },
+
+ //获取工作台菜单
+ getWorkbenchList() {
+ this.jobList = []
+ const resultArr = this.hasMenu('工作台')
+ if (resultArr.length == 0) {
+ return
+ }
+
+ const topMenu = resultArr[0]
+
+ topMenu.children.forEach(menu => {
+ this.jobList.push({
+ imgUrl: menu.source,
+ title: menu.name,
+ })
+ })
+ },
+
+ // 获取楼盘表
+ async getHouseDataList(name) {
+ const res = await getHouseList(1, name)
+ // 数据处理
+ res.data.forEach(item => {
+ item.title = item.name
+ item.useSlot = true
+ delete item.name
+ })
+ this.houseDataList = res.data || [{
+ title: '-',
+ useSlot: true
+ }]
+ },
+
+
+
+ getMenu(menuName, menuList, resultArr) {
+ // console.log(menuList, menuName)
+ for (var i = 0; i < menuList.length; i++) {
+ if (menuList[i].name == menuName) {
+ resultArr.push(menuList[i])
+ } else {
+ if (menuList[i].children && menuList[i].children.length) {
+ this.getMenu(menuName, menuList[i].children, resultArr);
+ }
+ }
+ }
+
+ return resultArr
+
+ },
+
+ change(index) {
+ let url = index
+ this.$u.func.globalNavigator(url, "switchTab")
+ },
+ changeHandler(e) {
+ const {
+ columnIndex,
+ value,
+ values, // values为当前变化列的数组内容
+ index,
+ // 微信小程序无法将picker实例传出来,只能通过ref操作
+ picker = this.$refs.uPicker
+ } = e
+ // 当第一列值发生变化时,变化第二列(后一列)对应的选项
+ if (columnIndex === 0 && this.columnData.length > 0) {
+ // picker为选择器this实例,变化第二列对应的选项
+ picker.setColumnValues(1, this.columnData[index])
+ }
+ },
+ // 回调参数为包含columnIndex、value、values
+ confirm(e) {
+ console.log('confirm', e)
+ this.curSelectSite = e.value[e.value.length - 1]
+ this.selectBoxShow = false
+ this.getHouseDataList(e.value[1].name)
+ },
+
+ // 页面跳转
+ pushPage({id, title}) {
+ if (id !== void 0) {
+ let url = `/subPackage/house/list/index?id=${id}&title=${title}`
+ this.$u.func.globalNavigator(url, "navTo")
+ }
+ }
+ }
+ }
+</script>
+
+<style lang="scss" scoped>
+ .container {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ flex-direction: column;
+ background: #F9F9FA;
+ color: #fff;
+ font-size: 32rpx;
+
+ .main {
+ position: relative;
+ height: 0;
+ flex: 1;
+ overflow-y: auto;
+
+ .main-bg {
+ height: 36%;
+ background: royalblue;
+ }
+
+ .main-select {
+ margin: 0 6%;
+ position: absolute;
+ bottom: 74%;
+ display: flex;
+ align-items: center;
+ }
+
+ .main-btn {
+ margin: 0 6%;
+ position: absolute;
+ top: 28%;
+ width: 88%;
+ height: 20%;
+ background: #fff;
+ border-radius: 10rpx;
+ color: #000;
+ }
+
+ .main-phone-house {
+ margin-top: 180rpx;
+ width: 100%;
+
+ .phone-box {
+ display: flex;
+
+ &>view {
+ margin: 0 16rpx;
+ height: 116rpx;
+ flex: 1;
+ background: linear-gradient(to right, #407BE9, #73A2F9);
+ border-radius: 10rpx;
+ }
+ }
+
+ .house-box {
+ .content {
+ display: flex;
+ flex-wrap: wrap;
+
+ &>view {
+ margin: 0 16rpx;
+ margin-top: 20rpx;
+ min-width: calc((100% - 16rpx * 6) / 3);
+ height: 66rpx;
+ background: linear-gradient(to right, #407BE9, #73A2F9);
+ border-radius: 33rpx;
+ }
+ }
+ }
+ }
+
+ .main-bt {
+ margin-top: 2%;
+ width: 100%;
+ color: #000;
+ }
+ }
+ }
</style>
\ No newline at end of file
diff --git a/subPackage/bs/views/rentDetail.vue b/subPackage/bs/views/rentDetail.vue
index 1e1df41..7625d76 100644
--- a/subPackage/bs/views/rentDetail.vue
+++ b/subPackage/bs/views/rentDetail.vue
@@ -6,17 +6,33 @@
</view>
<view class="basic-info">
- <u-form-item @click="showList.relation = true" class="form-item" labelWidth="100" label="租客关系:" required
- prop="type">
- <u--input border="none" v-model="nameList.relation" disabled disabledColor="#ffffff"
- placeholder="请选择租客关系">
+
+
+ <u-form-item @click="showSelectBus(dataList.relation, '租客关系', 'relationName','relation')"
+ class="form-item" labelWidth="100" label="租客关系" required prop="type">
+ <u--input border="none" v-model="relationName" disabled disabledColor="#ffffff" placeholder="请选择">
</u--input>
<u-icon slot="right" name="arrow-right"></u-icon>
</u-form-item>
- <u-form-item @click="typeShow = true" class="form-item" labelWidth="100" label="事件类型:" required
+ <u-form-item @click="showSelectBus(dataList.houseType, '房屋状态', 'houseTypeName','houseType')"
+ class="form-item" labelWidth="100" label="房屋状态:" required prop="type">
+ <u--input border="none" v-model="houseTypeName" disabled disabledColor="#ffffff" placeholder="请选择">
+ </u--input>
+ <u-icon slot="right" name="arrow-right"></u-icon>
+ </u-form-item>
+
+
+ <u-form-item @click="showSelectBus(dataList.rentalUse, '租房用途', 'rentalUseName','rentalUse')"
+ class="form-item" labelWidth="100" label="租房用途:" required prop="type">
+ <u--input border="none" v-model="rentalUseName" disabled disabledColor="#ffffff" placeholder="请选择">
+ </u--input>
+ <u-icon slot="right" name="arrow-right"></u-icon>
+ </u-form-item>
+
+ <u-form-item @click="rentTimeShow = true" class="form-item" labelWidth="100" label="租房时间:" required
prop="type">
- <u--input border="none" v-model="typeName" disabled disabledColor="#ffffff" placeholder="请选择事件类型">
+ <u--input border="none" v-model="form.rentTime" disabled disabledColor="#ffffff" placeholder="请选择">
</u--input>
<u-icon slot="right" name="arrow-right"></u-icon>
</u-form-item>
@@ -48,11 +64,12 @@
</u-form>
- <!-- 租客关系下拉框 -->
- <my-select v-if="showList.relation" :show="showList.relation" v-model="form.relation" type="radio"
- popupTitle="请选择租客关系" :dataLists="dataList.relation" @cancel="showList.relation = false">
- </my-select>
-
+ <!-- 事件类型下拉框 -->
+ <select-bus v-if="typeShow" :show="typeShow" v-model="form[selectBusModel]" type="radio"
+ :popupTitle="selectBusTitle" :dataLists="selectBusList" @cancel="typeShow = false" @submit="typeSelect">
+ </select-bus>
+ <!--出租时间选择-->
+ <u-datetime-picker :show="rentTimeShow" v-model="form.rentTime" mode="date"></u-datetime-picker>
@@ -62,23 +79,68 @@
</template>
<script>
+ import selectBus from "@/components/my-components/selectBus.vue"
import uploadMixin from "@/mixin/uploadMixin";
export default {
mixins: [uploadMixin],
+ components: {
+ selectBus
+ },
data() {
return {
form: {
- relation: ""
+ relation: "",
+ houseTyep: "",
+ rentTime: "",
},
- showList: {
- relation: false
- },
- nameList: {
- relation: ""
- },
+ rules: {},
+ rentTimeShow: false,
+
+ relationName: "",
+ houseTypeName: "",
+ rentalUseName: "",
dataList: {
- relation: []
- }
+ relation: [{
+ name: "同一户",
+ value: "1"
+ },
+ {
+ name: "不同户",
+ value: "2"
+ }
+ ],
+ houseType: [{
+ name: "部分出租",
+ value: "1"
+ },
+ {
+ name: "全部出租",
+ value: "2"
+ }
+ ],
+ rentalUse: [{
+ name: "仓库",
+ value: "1"
+ },
+ {
+ name: "办公",
+ value: "2"
+ },
+ {
+ name: "商用",
+ value: "3"
+ },
+ {
+ name: "居住",
+ value: "4"
+ }
+ ]
+ },
+ selectBusList: [],
+ selectBusTitle: '',
+ selectBusModel: '',
+ selectBusKey: '',
+ typeShow: false
}
@@ -96,7 +158,19 @@
},
methods: {
-
+ showSelectBus(data, title, model, key) {
+ this.selectBusList = data
+ this.selectBusTitle = title
+ this.selectBusModel = model
+ this.selectBusKey = key
+ this.typeShow = true
+ },
+ //类型选择确认
+ typeSelect(item) {
+ this[this.selectBusModel] = item.name
+ this.form[this.selectBusKey] = item.value
+ this.typeShow = !this.typeShow
+ },
}
}
</script>
diff --git a/subPackage/house/family/index.vue b/subPackage/house/family/index.vue
index e3fd773..1a5393f 100644
--- a/subPackage/house/family/index.vue
+++ b/subPackage/house/family/index.vue
@@ -1,310 +1,171 @@
-<template>
- <view class="container">
- <view class="flex f-d-c main">
- <view class="cur-header">
- <u-icon name="home" color="#fff"></u-icon>
- {{housingName}}/{{buildingName}}栋
- </view>
- <view class="h0 flex-1 build-list-box">
- <u-collapse :border="false">
- <u-collapse-item style="border: none;" :title="item.unitName" :name="index"
- v-for="(item, index) in buildingList" :key="index">
- <view class="flex floor-content" v-for="(floor, floorIndex) in item.floorList"
- :key="floorIndex">
- <view class="floor-num-box flex a-i-c j-c-c">
- {{floor.floorName}}
- </view>
- <view class="room-content">
- <u-grid class="flex flex-wrap" col="2" :border="true">
- <u-grid-item v-for="(family, familyIndex) in floor.familyList" :key="familyIndex">
- <view class="room-box flex f-d-c">
-
- <view class="flex a-i-c j-c-s-b" v-show="family.resideStatus">
- <view class="l">{{family.houseHoldName}}</view>
- <view class="r flex">
- <view v-show="family.resideStatus">
- <u-icon name="photo"></u-icon>
- </view>
-
- <view v-show="family.isOwner">
- <u-icon name="photo"></u-icon>
- </view>
- </view>
- </view>
-
- <view class="flex">
- <view class="l flex">
- <u-icon name="home" color="blue"></u-icon>
- {{family.roomNumber}}
- </view>
- <view class="r">
-
- </view>
- </view>
-
- </view>
- </u-grid-item>
- </u-grid>
- </view>
- </view>
- </u-collapse-item>
- </u-collapse>
-
- <u-divider text="已经到底了"></u-divider>
- </view>
- </view>
- </view>
-</template>
-
+<template>
+ <view class="container">
+ <view class="flex f-d-c main">
+ <view class="cur-header">
+ <u-icon name="home" color="#fff"></u-icon>
+ {{housingName}}/{{buildingName}}栋
+ </view>
+ <view class="h0 flex-1 build-list-box">
+ <u-collapse :border="false">
+ <u-collapse-item style="border: none;" :title="item.unitName" :name="index"
+ v-for="(item, index) in buildingList" :key="index">
+ <view class="flex floor-content" v-for="(cItem, cIndex) in item.children"
+ :key="cIndex">
+ <view class="floor-num-box flex a-i-c j-c-c">
+ {{cItem.floor}}
+ </view>
+ <view class="room-content">
+ <u-grid class="flex flex-wrap" col="2" :border="true">
+ <u-grid-item v-for="(scItem, scIndex) in cItem.children" :key="scItem.id" @click.native="pushPage(scItem)">
+ <view class="room-box flex f-d-c">
+ <view class="flex a-i-c j-c-s-b" v-show="scItem.resideStatus">
+ <view class="l">{{scItem.realName}}</view>
+ <view class="r flex">
+ <view v-show="scItem.resideStatus">
+ <u-icon name="photo"></u-icon>
+ </view>
+
+ <view v-show="!!scItem.roleType === '业主'">
+ <u-icon name="photo"></u-icon>
+ </view>
+ </view>
+ </view>
+
+ <view class="flex">
+ <view class="l flex">
+ <u-icon name="home" color="blue"></u-icon>
+ {{scItem.houseNo}}
+ </view>
+ <view class="r">
+
+ </view>
+ </view>
+
+ </view>
+ </u-grid-item>
+ </u-grid>
+ </view>
+ </view>
+ </u-collapse-item>
+ </u-collapse>
+
+ <u-divider text="已经到底了"></u-divider>
+ </view>
+ </view>
+ </view>
+</template>
+
<script>
- export default {
- components: {},
-
- data() {
+ import {
+ getHouseInfoList
+ } from "@/api/doorplateAddress/doorplateAddress";
+ export default {
+ components: {},
+
+ data() {
return {
- housingName: '万达晶座',
- buildingName: 11,
- buildingList: [{
- unitName: '一单元',
- floorList: [{
- floorName: '1层',
- familyList: [{
- houseHoldName: '王子豪1',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪2',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪3',
- resideStatus: 0, // 1居住,0未居住
- isOwner: 0, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪4',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪5',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪6',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- }
- ]
- },
- {
- floorName: '2层',
- familyList: [{
- houseHoldName: '王子豪1',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪2',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪3',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪4',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪5',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪6',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- }
- ]
- }
- ]
- },
- {
- unitName: '二单元',
- floorList: [{
- floorName: '1层',
- familyList: [{
- houseHoldName: '王子豪1',
- resideStatus: 0, // 1居住,0未居住
- isOwner: 0, // 1业主, 0不是业主
- roomNumber: 301
- }]
- },
- {
- floorName: '2层',
- familyList: [{
- houseHoldName: '王子豪1',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪2',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪3',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪4',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪5',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪6',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- },
- {
- houseHoldName: '王子豪',
- resideStatus: 1, // 1居住,0未居住
- isOwner: 1, // 1业主, 0不是业主
- roomNumber: 301
- }
- ]
- }
- ]
- }
- ]
- }
- },
-
- onShow() {},
-
- methods: {
-
- }
- }
-</script>
-
-<style lang="scss" scoped>
- .container {
- width: 100%;
- height: 100%;
-
- display: flex;
- flex-direction: column;
- background: #F9F9FA;
- font-size: 26rpx;
-
-
- .main {
- position: relative;
- height: 0;
- flex: 1;
- overflow-y: auto;
-
- .cur-header {
- padding-left: 16rpx;
- display: flex;
- align-items: center;
- min-height: 96rpx;
- color: #fff;
- background: #6A9DFD;
- }
-
- .build-list-box {
- /deep/ .u-cell {
- background: #A0C0FC !important;
- }
-
- /deep/ .u-collapse-item__content__text {
- padding: 0 !important;
- }
- }
-
- /deep/ .floor-content {
- border-bottom: 1rpx solid #ccc;
-
- .floor-num-box {
- padding: 0 20rpx !important;
- background: #EAECF0;
- }
-
- .room-content {
- width: 0;
- flex: 1;
- background: #FEFEFF;
-
- .room-box {
- padding: 8rpx;
- justify-content: center;
- align-items: center;
- width: 100%;
- min-height: 116rpx;
- box-sizing: border-box;
-
- &>view {
- margin: auto;
- width: 100%;
- }
- }
-
- .u-grid-item:nth-child(2n-1) {
- border-right: 1rpx solid #dadbde !important;
- }
- }
- }
- }
- }
+ currentId: '',
+ housingName: '',
+ buildingName: 0,
+ buildingList: []
+ }
+ },
+ onLoad(e) {
+ const { id, housingName, buildingName } = e
+ this.currentId = id
+ this.housingName = housingName
+ this.buildingName = buildingName
+
+ },
+ onShow() {
+ this.getBuildingList()
+ },
+ methods: {
+ async getBuildingList() {
+ const res = await getHouseInfoList(3, '9cedfffba380fc19f88ede2323aca651')
+ res.data.forEach(item => {
+ item.children && item.children.sort((a, b) => a.floor - b.floor)
+ })
+ console.log(res.data)
+ this.buildingList = res.data || []
+ },
+ pushPage(value) {
+ const { addressCode } = value
+ let url = `/subPackage/house/roomDetails/index?id=${addressCode}`
+ this.$u.func.globalNavigator(url, "navTo")
+ }
+ }
+ }
+</script>
+
+<style lang="scss" scoped>
+ .container {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ flex-direction: column;
+ background: #F9F9FA;
+ font-size: 26rpx;
+
+
+ .main {
+ position: relative;
+ height: 0;
+ flex: 1;
+ overflow-y: auto;
+
+ .cur-header {
+ padding-left: 16rpx;
+ display: flex;
+ align-items: center;
+ min-height: 96rpx;
+ color: #fff;
+ background: #6A9DFD;
+ }
+
+ .build-list-box {
+ /deep/ .u-cell {
+ background: #A0C0FC !important;
+ }
+
+ /deep/ .u-collapse-item__content__text {
+ padding: 0 !important;
+ }
+ }
+
+ /deep/ .floor-content {
+ border-bottom: 1rpx solid #ccc;
+
+ .floor-num-box {
+ padding: 0 20rpx !important;
+ background: #EAECF0;
+ }
+
+ .room-content {
+ width: 0;
+ flex: 1;
+ background: #FEFEFF;
+
+ .room-box {
+ padding: 8rpx;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ min-height: 116rpx;
+ box-sizing: border-box;
+
+ &>view {
+ margin: auto;
+ width: 100%;
+ }
+ }
+
+ .u-grid-item:nth-child(2n-1) {
+ border-right: 1rpx solid #dadbde !important;
+ }
+ }
+ }
+ }
+ }
</style>
\ No newline at end of file
diff --git a/subPackage/house/list/index.vue b/subPackage/house/list/index.vue
index c08138d..c8cd711 100644
--- a/subPackage/house/list/index.vue
+++ b/subPackage/house/list/index.vue
@@ -1,83 +1,106 @@
-<template>
- <view class="container">
- <view class="flex f-d-c main">
- <view class="flex house-container">
- <view class="house-list-box" v-for="(item, index) in houseList">
- <view class="l">
- <u-icon name="home" color="#fff"></u-icon>
- </view>
- <view class="r">
- {{item.title}}栋
- </view>
- </view>
- </view>
-
- <u-divider text="已经到底了"></u-divider>
- </view>
- </view>
-</template>
-
-<script>
- export default {
- components: {},
-
- data() {
- return {
- houseList: [{
- title: 11
- },
- {
- title: 12
- },
- {
- title: 13
- }
- ]
- }
- },
-
- onShow() {},
-
- methods: {
-
- }
- }
-</script>
-
-<style lang="scss" scoped>
- .container {
- width: 100%;
- height: 100%;
-
- display: flex;
- flex-direction: column;
- background: #F9F9FA;
- font-size: 26rpx;
-
-
- .main {
- position: relative;
- height: 0;
- flex: 1;
- overflow-y: auto;
-
- .house-container {
- flex-wrap: wrap;
-
- .house-list-box {
- margin: 16rpx;
- padding: 0 16rpx;
- display: flex;
- justify-content: space-between;
- align-items: center;
- width: calc((100% - 96rpx) / 3);
- height: 68rpx;
- border-radius: 34rpx;
- color: #fff;
- background: linear-gradient(to right, #417BE9, #6D9FFB);
- box-sizing: border-box;
- }
- }
- }
- }
+<template>
+ <view class="container">
+ <view class="flex f-d-c main">
+ <view class="flex house-container">
+ <view class="house-list-box" v-for="(item, index) in houseList" @click="pushPage(item)">
+ <view class="l">
+ <u-icon name="home" color="#fff"></u-icon>
+ </view>
+ <view class="r">
+ {{item.title}}栋
+ </view>
+ </view>
+ </view>
+
+ <u-divider text="已经到底了"></u-divider>
+ </view>
+ </view>
+</template>
+
+<script>
+ import {
+ getHouseInfoList
+ } from "@/api/doorplateAddress/doorplateAddress";
+ export default {
+ components: {},
+
+ data() {
+ return {
+ currentId: '',
+ curHouseTitle: '',
+ houseList: [{
+ title: '-'
+ }]
+ }
+ },
+ onLoad(e) {
+ const { id, title } = e
+ this.currentId = id
+ this.curHouseTitle = title
+
+ },
+ onShow() {
+ this.getHouseInfo()
+ },
+
+ methods: {
+ async getHouseInfo() {
+ const res = await getHouseInfoList(2, this.currentId)
+ // 删除栋字
+ const reg = new RegExp('栋', 'g')
+ res.data.forEach(item => {
+ item.title = item['name'].replace(reg, '')
+ delete item.name
+ })
+ this.houseList = res.data || [{
+ title: '-'
+ }]
+ },
+ pushPage(value) {
+ const { id, title } = value
+ if (id !== void 0) {
+ let url = `/subPackage/house/family/index?id=${id}&housingName=${this.curHouseTitle}&buildingName=${title}`
+ this.$u.func.globalNavigator(url, "navTo")
+ }
+ }
+ }
+ }
+</script>
+
+<style lang="scss" scoped>
+ .container {
+ width: 100%;
+ height: 100%;
+
+ display: flex;
+ flex-direction: column;
+ background: #F9F9FA;
+ font-size: 26rpx;
+
+
+ .main {
+ position: relative;
+ height: 0;
+ flex: 1;
+ overflow-y: auto;
+
+ .house-container {
+ flex-wrap: wrap;
+
+ .house-list-box {
+ margin: 16rpx;
+ padding: 0 16rpx;
+ display: flex;
+ justify-content: space-between;
+ align-items: center;
+ width: calc((100% - 96rpx) / 3);
+ height: 68rpx;
+ border-radius: 34rpx;
+ color: #fff;
+ background: linear-gradient(to right, #417BE9, #6D9FFB);
+ box-sizing: border-box;
+ }
+ }
+ }
+ }
</style>
\ No newline at end of file
diff --git a/subPackage/house/roomDetails/index.vue b/subPackage/house/roomDetails/index.vue
index 657e006..e089107 100644
--- a/subPackage/house/roomDetails/index.vue
+++ b/subPackage/house/roomDetails/index.vue
@@ -4,11 +4,12 @@
<view class="content">
<view class="base b-c-w">
<view class="flex a-i-c">
- <u-icon name="photo"></u-icon> 万达晶座:11栋
+ <u-icon name="photo"></u-icon> {{ houseTitle }}
</view>
<view class="flex j-c-s-b">
<view>
- 一单元单元 2901室(共2人)
+ {{ unitName }}单元 {{ houseName }}室
+ <!-- (共2人) -->
</view>
<view class="flex a-i-c">
<u-button size='small' shape="circle" type="primary" :plain="true" text="房屋管理"></u-button>
@@ -28,13 +29,13 @@
<view class="info">
<view>姓名:{{item.name}}</view>
<view class="flex">
- 手机:{{item.phone}} <u-icon name="phone-fill" color="#4586FE"></u-icon>
+ 手机:{{item.phoneNumber}} <u-icon name="phone-fill" color="#4586FE"></u-icon>
</view>
<view class="flex">
关系:
<view class="flex a-i-c">
- <u-tag :text="item.relation" size="mini"
- :bgColor="item.relationType == 1 ? '#07C160' : '#1989FA'"></u-tag>
+ <u-tag :text="item.relationship" size="mini"
+ :bgColor="item.residentialStatus == 1 ? '#07C160' : '#1989FA'"></u-tag>
</view>
</view>
</view>
@@ -65,7 +66,7 @@
<view class="mt-40 rent-out-list b-c-w" v-for="(item, index) in rentOutList" :key="index">
<view class="t flex j-c-s-b a-i-c">
<view class="l">
- 租客:{{item.name}}(共{{item.allNum}}人)
+ 租客:{{item.tenant}}(共{{item.allNum}}人)
</view>
<view class="r">
<u-icon name="trash-fill" color="red"></u-icon>
@@ -73,7 +74,7 @@
</view>
<view class="t flex j-c-s-b a-i-c">
<view class="l">
- {{item.startTime}} - {{item.endTime}}
+ {{item.rentalTime}} - {{item.dueTime}}
</view>
<view class="r">
{{item.status == 1 ? '已到期' : '未到期'}}
@@ -91,9 +92,9 @@
</view>
<view class="edit-btn">
- <veiw>
+ <view>
<u-button type="primary" text="添加成员"></u-button>
- </veiw>
+ </view>
<view>
<u-button type="primary" :plain="true" text="添加租赁信息"></u-button>
@@ -104,50 +105,52 @@
</template>
<script>
+ import {
+ getHouseRentInfo
+ } from "@/api/doorplateAddress/doorplateAddress";
export default {
components: {},
data() {
return {
- ownerInfoList: [{
- src: 'https://cdn.uviewui.com/uview/album/1.jpg',
- name: '郑洪峰',
- phone: 13566687549,
- relationType: 1,
- relation: '业主'
- },
- {
- src: 'https://cdn.uviewui.com/uview/album/1.jpg',
- name: '郑小峰',
- phone: 13547687549,
- relationType: 3,
- relation: '儿子'
- }
- ],
-
- rentOutList: [
- {
- name: '皇阿玛',
- startTime: '2023-01-01',
- endTime: '2024-01-01',
- status: 0, // 0 未到期,1已到期
- allNum: 1
- },
- {
- name: '皇阿玛two',
- startTime: '2023-01-01',
- endTime: '2024-01-01',
- status: 0, // 0 未到期,1已到期
- allNum: 2
- }
- ]
+ houseTitle: '',
+ currentId: '',
+ houseName: '',
+ unitName: '',
+ ownerInfoList: [],
+ rentOutList: []
}
},
- onShow() {},
+ onLoad(e) {
+ const { id } = e
+ this.currentId = id
+ },
+ onShow() {
+ this.getHouseRentInfoList()
+ },
methods: {
-
+ async getHouseRentInfoList() {
+ const res = await getHouseRentInfo(this.currentId)
+ const { districtName, doorplateName, buildingName, houseName, unitName, houseRentalList, householdList } = res.data
+ this.houseTitle = districtName + ':' + buildingName
+ this.rentOutList = houseRentalList
+ this.ownerInfoList = householdList
+ this.houseName = houseName
+ this.unitName = unitName
+ // 判断当前租客有没有过期
+ this.rentOutList.forEach(item => {
+ // 事件格式处理
+ item.rentalTime = item.rentalTime.split(' ')[0]
+ item.dueTime = item.dueTime.split(' ')[0]
+ // 当前房间租客数量
+ item.allNum = item.houseTenantVOList.length
+ // 多人个租客将第一个作为显示
+ item.tenant = item.houseTenantVOList.length > 0 ? item.houseTenantVOList[0].name : ''
+ })
+
+ }
}
}
</script>
--
Gitblit v1.9.3