From 0ba6a10aed87c4f05d076ee66c3189627bb5b858 Mon Sep 17 00:00:00 2001 From: web <candymxq888@outlook.com> Date: 星期二, 25 三月 2025 09:02:23 +0800 Subject: [PATCH] fix:修改返回菜单按钮 --- src/assets/images/messageInfo-left.png | 0 src/screen/flow.vue | 20 ++ src/assets/images/tempture-bg.png | 0 src/views/facility/monitorList/index.vue | 40 +++ src/assets/images/flow-bg.png | 0 src/views/screen/temperature/home/index.vue | 74 ++++--- /dev/null | 0 src/screen/temp.vue | 21 ++ src/api/facility/monitorType.js | 50 +++++ src/assets/images/messageInfo-right.png | 0 src/views/screen/flow/home/index.vue | 46 +++-- src/views/facility/monitorType/index.vue | 279 +++++++++++++++++++++++++++++++ src/assets/images/exit.png | 0 13 files changed, 471 insertions(+), 59 deletions(-) diff --git a/src/api/facility/monitorType.js b/src/api/facility/monitorType.js new file mode 100644 index 0000000..6610d6d --- /dev/null +++ b/src/api/facility/monitorType.js @@ -0,0 +1,50 @@ +import { publicRequest } from '@/utils/request' + + +/** + * 获取监控点列表 + */ +export const getMonitorTypeList = (data) => { + return publicRequest({ + url: `/waterMonitoryPointType/search`, + method: 'post', + data + }); +} + + +/** + * 创建监控点 + */ + +export const createMonitor = (data) => { + return publicRequest({ + url: '/waterMonitoryPointType/create', + method: 'post', + data + }) +} + + +/** + * 修改监控点 + */ + +export const updateMonitor = (data) => { + return publicRequest({ + url: '/waterMonitoryPointType/modify', + method: 'post', + data + }) +} + +/** + * 查询单个监控点 + */ + +export const getSingleMonitor = () => { + return publicRequest({ + url: `/waterMonitoryPointType/get/${id}`, + method: 'get' + }) +} \ No newline at end of file diff --git a/src/assets/images/exit.png b/src/assets/images/exit.png new file mode 100644 index 0000000..f3592ca --- /dev/null +++ b/src/assets/images/exit.png Binary files differ diff --git a/src/assets/images/flow-bg.png b/src/assets/images/flow-bg.png new file mode 100644 index 0000000..d86ca48 --- /dev/null +++ b/src/assets/images/flow-bg.png Binary files differ diff --git a/src/assets/images/map-bg.png b/src/assets/images/map-bg.png deleted file mode 100644 index 474c290..0000000 --- a/src/assets/images/map-bg.png +++ /dev/null Binary files differ diff --git a/src/assets/images/messageInfo-box.png b/src/assets/images/messageInfo-left.png similarity index 100% rename from src/assets/images/messageInfo-box.png rename to src/assets/images/messageInfo-left.png Binary files differ diff --git a/src/assets/images/messageInfo-right.png b/src/assets/images/messageInfo-right.png new file mode 100644 index 0000000..7548bf9 --- /dev/null +++ b/src/assets/images/messageInfo-right.png Binary files differ diff --git a/src/assets/images/tempture-bg.png b/src/assets/images/tempture-bg.png new file mode 100644 index 0000000..c2a87ab --- /dev/null +++ b/src/assets/images/tempture-bg.png Binary files differ diff --git a/src/screen/flow.vue b/src/screen/flow.vue index c2bd3f7..d8e80dc 100644 --- a/src/screen/flow.vue +++ b/src/screen/flow.vue @@ -2,6 +2,10 @@ <div class="main"> <div class="header"> <div class="top"> + <div class="top-exit" v-if="userType === '1'" @click="() => { router.push('/screen') }"> + <img src="@/assets/images/exit.png" alt="" /> + <span>选择系统</span> + </div> <div class="top-name">金川水电站生态流量监测系统</div> <div class="top-modal"> 公告弹窗提示 @@ -27,6 +31,7 @@ import{ useRouter,useRoute } from 'vue-router' import useUserStore from '@/store/modules/user.js' import {onMounted, ref, watch} from "vue"; +import { getUserType } from '@/utils/auth' const userStore = useUserStore() @@ -40,6 +45,7 @@ {name:'报警管理',url:'/flow/warning'}, {name:'报表管理',url:'/flow/report'}, ]) +const userType = ref(getUserType()) const openWarn = ref(false) const text = ref('新扎沟口流量监测点水位到达下限值, 金川水电站生态流量监测点水位到达下限值,流量监测点水位到达下限值') @@ -91,6 +97,17 @@ color: #fff; position: relative; z-index: 100; + .top-exit{ + position: absolute; + left: 100px; + cursor: pointer; + font-size: 20px; + img{ + width: 30px; + vertical-align: top; + margin-right: 10px; + } + } .top-name{ font-size: 48px; } @@ -125,11 +142,10 @@ .content{ width: 100%; height: 86%; - position: relative; .warningBox{ position: absolute; left: 0; - top: 2%; + top: 15.5%; z-index: 100; width: 100%; padding: 0 150px; diff --git a/src/screen/temp.vue b/src/screen/temp.vue index 9b933c0..da37d43 100644 --- a/src/screen/temp.vue +++ b/src/screen/temp.vue @@ -1,7 +1,15 @@ <template> <div class="main"> <div class="header"> - <div class="top">金川水电站水温监测系统 </div> + <div class="top"> + <div class="top-exit" @click="() => { router.push('/screen') }"> + <img src="@/assets/images/exit.png" alt="" /> + <span>选择系统</span> + </div> + <div class="top-name"> + 金川水电站水温监测系统 + </div> + </div> <div class="nav"> <div v-for="(item,index) in btnList" :key="index" @click="navTo(item)" class="plain" :class="item.url === route.path ? 'active' : ''">{{ item.name }}</div> </div> @@ -50,6 +58,17 @@ color: #fff; position: relative; z-index: 100; + .top-exit{ + position: absolute; + left: 100px; + cursor: pointer; + font-size: 20px; + img{ + width: 30px; + vertical-align: top; + margin-right: 10px; + } + } } .nav{ display: flex; diff --git a/src/views/facility/monitorList/index.vue b/src/views/facility/monitorList/index.vue index fcaccc3..e757b17 100644 --- a/src/views/facility/monitorList/index.vue +++ b/src/views/facility/monitorList/index.vue @@ -8,7 +8,8 @@ --> <script setup> import pointApi from "@/api/facility/point"; -import {ref} from "vue"; +import {getMonitorTypeList} from '@/api/facility/monitorType.js' +import {ref, onMounted} from "vue"; import setPostParams from "@/utils/searchParams.js"; const route = useRoute(); @@ -42,6 +43,7 @@ let tableHeader = ref({ pointName: '监控点名称', pointCode: '监控点编号', + pointTypeName: '监控类型', address: '详细地址', createTimeView: '创建时间', imageUrl: '图片', @@ -52,7 +54,7 @@ async function getList(val) { loading.value = true; let postParam = setPostParams(val) - await pointApi().search(postParam).then((res) => { + await pointApi().search({ ...postParam, ...searchParams.value}).then((res) => { tableData.value = res.data.list pageParam.value.total = res.data.total pageParam.value.limit = res.data.limit @@ -67,6 +69,7 @@ const formLabel = ({ pointName: '监控点名称', pointCode: '监控点编号', + pointTypeId: '监控类型', address: '详细地址', imageUrl: '图片', remark: '备注' @@ -74,10 +77,12 @@ const rules = ref({ pointName: [{required: true, message: `请输入${ formLabel.pointName}`, trigger: "blur"}], pointCode: [{required: true, message: `请输入${ formLabel.address}`, trigger: "blur"}], + pointTypeId: [{required: true, message: `请输入${ formLabel.pointTypeId}`, trigger: "blur"}], }); const form = ref({ pointName: '', pointCode: '', + pointTypeId: '', address: '', imageUrl: '', remark: '' @@ -85,6 +90,8 @@ const searchParams = ref({ keywords: '', }); +// 监控点类型 +const monityTypeList = ref([]); /** 新增按钮操作 */ async function handleAdd() { reset(); @@ -108,7 +115,7 @@ /** 删除按钮操作 */ function handleDelete(row) { proxy.$modal.confirm('是否确认删除名称为"' + row.contact + '"的数据项?').then(function () { - return pointApi().remove(row.id); + // return pointApi().remove(row.id); }).then(() => { getList(); proxy.$modal.msgSuccess("删除成功"); @@ -116,6 +123,13 @@ }); } +// 获取监控点类型 +const getMonitryType = () => { + let postParam = { limit: 100, page: 1 } + getMonitorTypeList(postParam).then(res => { + monityTypeList.value = res.data.list; + }) +} /** * 新增/修改弹窗Form表单相关 @@ -167,6 +181,7 @@ form.value = { pointName: '', pointCode: '', + pointTypeId: '', address: '', imageUrl: '', remark: '' @@ -174,14 +189,17 @@ proxy.resetForm("formRef"); } -getList(); +onMounted(() => { + getList(); + getMonitryType() +}) </script> <template> <div class="app-container"> <el-form :model="searchParams" ref="queryRef" :inline="true"> <el-form-item label="" prop=""> <el-input - v-model="searchParams.pointName" + v-model="searchParams.keywords" placeholder="请输入搜索信息" clearable style="width: 200px" @@ -244,9 +262,18 @@ <el-form-item :label="formLabel.pointName" prop="pointName"> <el-input v-model="form.pointName" :placeholder="'请输入'+formLabel.pointName"/> </el-form-item> - <el-form-item :label="formLabel.pointCode" prop="pointCode"> <el-input v-model="form.pointCode" :placeholder="'请输入'+formLabel.pointCode"/> + </el-form-item> + <el-form-item :label="formLabel.pointTypeId" prop="pointTypeId"> + <el-select v-model="form.pointTypeId" :placeholder="'请输入'+formLabel.pointTypeId"> + <el-option + v-for="(item,index) in monityTypeList" + :label="item.name" + :value="item.id" + :key="index" + ></el-option> + </el-select> </el-form-item> <el-form-item :label="formLabel.address" prop="address"> <el-input v-model="form.address" :placeholder="'请输入'+formLabel.address"/> @@ -254,6 +281,7 @@ <el-form-item :label="formLabel.remark" prop="address"> <el-input v-model="form.remark" :placeholder="'请输入'+formLabel.remark"/> </el-form-item> + <el-form-item></el-form-item> <el-form-item label="图片" prop="imageUrl" style="flex: 1"> <upload-icons @uploadData="uploadData" :imageList="form.imageUrl" :limit="1"></upload-icons> <span style="display: block;">(请上传1张设备图片)</span> diff --git a/src/views/facility/monitorType/index.vue b/src/views/facility/monitorType/index.vue new file mode 100644 index 0000000..9e23852 --- /dev/null +++ b/src/views/facility/monitorType/index.vue @@ -0,0 +1,279 @@ +<!-- + * @Author: hqs elkers@163.com + * @Date: 2024-08-06 14:47:41 + * @LastEditors: hqs elkers@163.com + * @LastEditTime: 2024-08-14 16:50:56 + * @FilePath: \water-qinghe-web\src\views\facilit\index.vue + * @Description: 监控点 +--> +<script setup> +import { getMonitorTypeList, createMonitor, updateMonitor } from "@/api/facility/monitorType.js"; +import {ref} from "vue"; +import setPostParams from "@/utils/searchParams.js"; + +const route = useRoute(); +const {proxy} = getCurrentInstance(); + +/** + * 搜索相关 + */ +/** 搜索按钮操作 */ +function handleQuery() { + getList({keywords: searchParams.value.keywords}) +} + +/** 重置按钮操作 */ +function resetQuery() { + proxy.resetForm("queryRef"); + handleQuery(); +} + +/** + * Table表格权限数据列表相关 + */ + +const pageParam = ref({ + total: 0, + limit: 0, + page: 1, +}) +const tableData = ref([]); + +let tableHeader = ref({ + name: '监控点名称', + type: '类型', + address: '详细地址', + createTimeView: '创建时间', + imageUrl: '图片', + remark: '备注' +}) + +/** 获取权限列表 */ +async function getList(val) { + loading.value = true; + let postParam = setPostParams(val) + await getMonitorTypeList(postParam).then((res) => { + tableData.value = res.data.list + pageParam.value.total = res.data.total + pageParam.value.limit = res.data.limit + pageParam.value.page = res.data.page + }) + loading.value = false; +} + +/** + * 表单相关 + */ +const formLabel = ({ + name: '监控点名称', + type: '监控点编号', + address: '详细地址', + imageUrl: '图片', + remark: '备注' +}) +const rules = ref({ + name: [{required: true, message: `请输入${ formLabel.name}`, trigger: "blur"}], + type: [{required: true, message: `请输入${ formLabel.type}`, trigger: "blur"}], +}); +const form = ref({ + name: '', + type: '', + address: '', + imageUrl: '', + remark: '' +}); +const searchParams = ref({ + keywords: '', +}); +/** 新增按钮操作 */ +async function handleAdd() { + reset(); + open.value = true; + title.value = "新增"; +} + +/** 修改按钮操作 */ +async function handleUpdate(row) { + reset(); + Object.keys(form.value).forEach(key => { + if (row.hasOwnProperty(key)) { + form.value[key] = row[key]; + } + }); + form.value.id = row.id + open.value = true; + title.value = "修改"; +} + +/** 删除按钮操作 */ +function handleDelete(row) { + proxy.$modal.confirm('是否确认删除名称为"' + row.contact + '"的数据项?').then(function () { + return pointApi().remove(row.id); + }).then(() => { + getList(); + proxy.$modal.msgSuccess("删除成功"); + }).catch(() => { + }); +} + + +/** + * 新增/修改弹窗Form表单相关 + */ +const open = ref(false); +const loading = ref(false); +const title = ref(""); + +//上传文件,添加图片地址信息 +const uploadData = (data) => { + form.value.imageUrl = data.toString(); +} + +/** 提交按钮 */ +function submitForm() { + proxy.$refs["formRef"].validate(valid => { + if (valid) { + if (form.value.id != undefined) { + updateMonitor(form.value).then(res => { + proxy.$modal.msgSuccess("修改成功"); + open.value = false; + getList(); + }).catch(() => { + open.value = false; + proxy.$modal.msgError("修改失败"); + }); + } else { + createMonitor(form.value).then(res => { + proxy.$modal.msgSuccess("新增成功"); + open.value = false; + getList(); + }).catch(() => { + open.value = false; + proxy.$modal.msgError("新增失败"); + }); + } + } + }); +} + +/** 取消按钮 */ +function cancel() { + open.value = false; + reset(); +} + +/** 表单重置 */ +function reset() { + form.value = { + name: '', + type: '', + address: '', + imageUrl: '', + remark: '' + }; + proxy.resetForm("formRef"); +} + +getList(); +</script> +<template> + <div class="app-container"> + <el-form :model="searchParams" ref="queryRef" :inline="true"> + <el-form-item label="" prop=""> + <el-input + v-model="searchParams.name" + placeholder="请输入搜索信息" + clearable + style="width: 200px" + @keyup.enter="handleQuery" + /> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button> + <el-button icon="Refresh" @click="resetQuery">重置</el-button> + </el-form-item> + </el-form> + + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button + type="primary" + plain + icon="Plus" + @click="handleAdd" + >新增 + </el-button> + </el-col> + </el-row> + <!--表格及分页--> + <el-table v-loading="loading" :data="tableData"> + <el-table-column + v-for="(item, key, index) of tableHeader" + :prop="key.toString()" + :label="item" + :key="index" + align="center" + > + <template #default="scope"> + <div v-if="key === 'imageUrl'"> + <img :src="scope.row.headImg" class="table-headImg"/> + </div> + <div v-else-if="key === 'type'"> + {{ scope.row.type === 1 ? '水温监测点' : '生态流量监测点' }} + </div> + </template> + </el-table-column> + <el-table-column label="操作" align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-button link type="primary" icon="Edit" v-has="['update',route]" + @click="handleUpdate(scope.row)">修改 + </el-button> + <el-button link type="primary" icon="Delete" v-has="['delete',route]" + @click="handleDelete(scope.row)">删除 + </el-button> + </template> + </el-table-column> + </el-table> + <pagination + :total="pageParam.total" + v-model:page="pageParam.page" + v-model:limit="pageParam.limit" + :page-sizes="[10,20,30]" + @pagination="getList" + /> + <!-- 添加/修改表单 --> + <el-dialog :title="title" v-model="open" append-to-body center> + <el-form class="form-box" ref="formRef" :model="form" :rules="rules" label-width='auto'> + <el-form-item :label="formLabel.name" prop="name"> + <el-input v-model="form.name" :placeholder="'请输入'+formLabel.name"/> + </el-form-item> + + <el-form-item :label="formLabel.type" prop="type"> + <el-input v-model="form.type" :placeholder="'请输入'+formLabel.type"/> + </el-form-item> + <el-form-item :label="formLabel.address" prop="address"> + <el-input v-model="form.address" :placeholder="'请输入'+formLabel.address"/> + </el-form-item> + <el-form-item :label="formLabel.remark" prop="address"> + <el-input v-model="form.remark" :placeholder="'请输入'+formLabel.remark"/> + </el-form-item> + <el-form-item label="图片" prop="imageUrl" style="flex: 1"> + <upload-icons @uploadData="uploadData" :imageList="form.imageUrl" :limit="1"></upload-icons> + <span style="display: block;">(请上传1张设备图片)</span> + </el-form-item> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button type="primary" @click="submitForm">确 定</el-button> + <el-button @click="cancel">取 消</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<style lang="scss" scoped> +.form-box{ + justify-content: normal; +} +</style> \ No newline at end of file diff --git a/src/views/screen/flow/home/index.vue b/src/views/screen/flow/home/index.vue index 5d8d975..cf61680 100644 --- a/src/views/screen/flow/home/index.vue +++ b/src/views/screen/flow/home/index.vue @@ -2,17 +2,17 @@ <div class="home"> <div class="home-bg"></div> <div class="home-c"> - <div class="point"> + <div class="point" v-for="(item, index) in pointList" :key="index" :style="{left: item.left, top: item.top}"> <div class="point-address"></div> <div class="point-message"> <div class="video-box"> <el-icon><VideoPlay /></el-icon> </div> <div class="info-box"> - <div class="info-t">水电站流量监测点</div> - <div class="info-sw">水位:<span>500</span>m</div> - <div class="info-ls">流速:<span>15</span>m/s</div> - <div class="info-ssls">瞬时流速:<span>150</span>m/s</div> + <div class="info-t">{{ item.name }}</div> + <div class="info-sw">水位:<span>{{ item.shuiwei }}</span>m</div> + <div class="info-ls">流速:<span>{{item.liushu}}</span>m/s</div> + <div class="info-ssls">瞬时流速:<span>{{ item.ssls }}</span>m/s</div> <div class="info-ljll"> 累计流量: <el-select @@ -23,13 +23,13 @@ style="width: 240px" > <el-option - v-for="(item, idx) in liuliangOptions" + v-for="(item, idx) in item.liuliangOptions" :key="idx" :label="item.label" :value="idx" /> </el-select> - <span>{{ liuliangOptions[selectll].value }}</span>m/s + <span>{{ item.liuliangOptions[selectll].value }}</span>m/s </div> </div> </div> @@ -40,17 +40,29 @@ <script setup> - import {ref} from "vue"; const selectll = ref(0) -const liuliangOptions = [ - { label: '总计流量', value: 500 }, - { label: '日累计流量', value: 1000 }, - { label: '周累计流量', value: 10000 }, - { label: '月累计流量', value: 300000 }, - { label: '年累计流量', value: 3600000 }, +const pointList = [ + { name: '电站尾水出口水温监测点', liushu: 22, ssls: '38', shuiwei: 1000, device: 1, left: '46%', top: '70%', + liuliangOptions: [ + { label: '总计流量', value: 500 }, + { label: '日累计流量', value: 1000 }, + { label: '周累计流量', value: 10000 }, + { label: '月累计流量', value: 300000 }, + { label: '年累计流量', value: 3600000 }, + ] + }, + { name: '电站尾水出口水温监测点', liushu: 22, ssls: '38', shuiwei: 1000, device: 2, left: '55%', top: '10%', + liuliangOptions: [ + { label: '总计流量', value: 500 }, + { label: '日累计流量', value: 1000 }, + { label: '周累计流量', value: 10000 }, + { label: '月累计流量', value: 300000 }, + { label: '年累计流量', value: 3600000 }, + ] + }, ] </script> @@ -65,7 +77,7 @@ top: 0; width: 100%; height: 100%; - background: url("@/assets/images/map-bg.png") no-repeat; + background: url("@/assets/images/flow-bg.png") no-repeat; background-size: 100% 100%; z-index: 11; } @@ -76,8 +88,6 @@ z-index: 20; .point{ position: absolute; - left: 58%; - top: 30%; .point-address{ width: 35px; height: 40px; @@ -87,7 +97,7 @@ .point-message{ width: 600px; height: 200px; - background: url("@/assets/images/messageInfo-box.png") no-repeat; + background: url("@/assets/images/messageInfo-left.png") no-repeat; background-size: 100% 100%; position: absolute; left: -600px; diff --git a/src/views/screen/temperature/home/index.vue b/src/views/screen/temperature/home/index.vue index 7613418..664e1f7 100644 --- a/src/views/screen/temperature/home/index.vue +++ b/src/views/screen/temperature/home/index.vue @@ -2,23 +2,27 @@ <div class="home"> <div class="home-bg"></div> <div class="home-c"> - <div class="point"> - <div class="point-address"></div> - <div class="point-message"> - <div class="msg-t">电站尾水出口水温监测点</div> - <div class="num"> - <div class="item"> - <div class="item-t">水温:</div> - <div class="item-num"><span>10</span>°C</div> - </div> - <div class="item"> - <div class="item-t">水位:</div> - <div class="item-num"><span>1000</span>m</div> - </div> - </div> - <div class="shebei"> - 监测设备: <span>监测设备运行正常(点击跳转)</span> - </div> + <div class="point" v-for="(item, index) in pointList" :key="index" :style="{left: item.left, top: item.top}"> + <div class="point-address" @click="handleShow(index)"></div> + <div class="point-message" v-show="item.showMsg"> + <div class="msg-box"> + <div class="msg-t">{{ item.name }}</div> + <div class="num"> + <div class="item"> + <div class="item-t">水温:</div> + <div class="item-num"><span>{{item.temputer}}</span>°C</div> + </div> + <div class="item"> + <div class="item-t">水位:</div> + <div class="item-num"><span>{{ item.shuiwei }}</span>m</div> + </div> + </div> + <div class="shebei"> + 监测设备: + <span v-if="item.device === 1" style="color: #1ab394">监测设备运行正常(点击跳转)</span> + <span v-else style="color: #ff0a0a">设备异常</span> + </div> + </div> </div> </div> </div> @@ -27,6 +31,15 @@ <script setup> + +const pointList = reactive([ + { name: '电站尾水出口水温监测点', temputer: 22, shuiwei: 1000, device: 1, left: '17%', top: '50%', showMsg: false }, + { name: '电站尾水出口水温监测点', temputer: 22, shuiwei: 1000, device: 2, left: '25%', top: '40%', showMsg: false }, +]) + +const handleShow = (index) => { + pointList[index].showMsg = !pointList[index].showMsg; +} </script> @@ -40,7 +53,7 @@ top: 0; width: 100%; height: 100%; - background: url("@/assets/images/map-bg.png") no-repeat; + background: url("@/assets/images/tempture-bg.png") no-repeat; background-size: 100% 100%; z-index: 11; } @@ -51,8 +64,6 @@ z-index: 20; .point{ position: absolute; - left: 58%; - bottom: 10%; .point-address{ width: 35px; height: 40px; @@ -61,17 +72,21 @@ } .point-message{ width: 500px; - height: 200px; - background: url("@/assets/images/messageInfo-box.png") no-repeat; + height: 180px; + background: url("@/assets/images/messageInfo-right.png") no-repeat; background-size: 100% 100%; position: absolute; - left: -500px; - top: -100px; + left: 30px; + top: -60px; padding: 30px 50px; color: #fff; - display: flex; - flex-direction: column; - justify-content: space-between; + .msg-box{ + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: space-between; + } .msg-t{ font-size: 26px; font-weight: bold; @@ -89,11 +104,6 @@ font-size: 22px; font-weight: bold; } - } - } - .shebei{ - span{ - color: #1ab394; } } } -- Gitblit v1.9.3