From 012c84b59018018cd75f0b8c70f7492fcb3e3e6f Mon Sep 17 00:00:00 2001 From: zhangzengfei <zhangzengfei@smartai.com> Date: 星期五, 05 八月 2022 16:18:29 +0800 Subject: [PATCH] 添加整改 --- src/views/manageCenter/index.vue | 1047 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 files changed, 1,043 insertions(+), 4 deletions(-) diff --git a/src/views/manageCenter/index.vue b/src/views/manageCenter/index.vue index 892093a..61c89a1 100644 --- a/src/views/manageCenter/index.vue +++ b/src/views/manageCenter/index.vue @@ -1,10 +1,1049 @@ <template> - <div class="manageCenter">绠$悊涓績</div> + <div class="manageCenter"> + <!-- 椤靛ご --> + <IndexHeader :opacity="false"></IndexHeader> + + <div class="centerTitle"> + <div class="heart"> + <div class="welcome">{{ userName }}, 娆㈣繋鎮ㄥ洖鍒扮鐞嗕腑蹇冦��</div> + <div class="time">{{ timeMsg }}</div> + </div> + </div> + + <!-- 鐗堝績 --> + <div class="heart"> + <div class="products"> + <div class="title">鍏ㄩ儴浜у搧</div> + <div class="productList"> + <div class="productItem" v-for="(item, index) in productList" :key="index" @click="jump(item)"> + <img :src="item.icon" alt="" /> + <div class="name">{{ item.name }}</div> + </div> + </div> + </div> + + <div class="heart"> + <div class="products"> + <div class="title">缁熻鍒嗘瀽</div> + <div class="productList"> + <p class="p-statis" style=" vertical-align: top"> + <span>鏃堕棿锛�</span> + <el-date-picker + size="mini" + v-model="searchTime" + @change="searchHandler" + type="datetimerange" + start-placeholder="寮�濮嬫棩鏈�" + end-placeholder="缁撴潫鏃ユ湡" + :default-time="['00:00:00', '23:59:59']" + ></el-date-picker> + </p> + <!-- <p class="p-statis" style="margin-left: 10px"> + <b style="width: 60px">鍦烘櫙锛�</b> + <el-select + v-model="taskValues" + multiple + @change="searchingBtn" + :disabled="typeDisable" + collapse-tags + size="mini" + placeholder="璇烽�夋嫨" + > + <el-option + v-for="item in VideoPhotoData.tasks" + style="font-size: 12px" + :key="item.id + 'x'" + :value="item.id" + :label="item.isDelete ? item.name + '锛堝凡鍒犻櫎锛�' : item.name" + :title="item.isDelete ? item.name + '锛堝凡鍒犻櫎锛�' : item.name" + ></el-option> + </el-select> + </p> --> + + <p class="p-statis" style="margin-left: 20px"> + <span>閮ㄩ棬锛�</span> + <el-cascader + size="mini" + style="width:400px" + v-model="searchTree" + :options="menuTree" + :props="{ value: 'id', label: 'name', checkStrictly: true }" + collapse-tags + clearable + @change="handleTreeChange" + ></el-cascader> + </p> + <p class="p-statis" style="margin-left: 20px"> + <span>绛夌骇锛�</span> + <el-select + v-model="alarmValues" + clearable + collapse-tags + size="mini" + style="width:140px" + placeholder="璇烽�夋嫨" + > + <el-option + v-for="item in levelOptions" + :key="item.id" + :label="item.label" + :value="item.value" + ></el-option> + </el-select> + </p> + <p class="p-statis" style=""> + <el-button type="primary" size="mini" @click="searchHandler">鎼滅储</el-button> + </p> + </div> + </div> + </div> + + <div class="equipmentInfo"> + <div class="equipmentCard"> + <div class="label">棰勮鎬婚噺</div> + <div class="number"> + {{ warningTotal }} + <div class="upIcon iconfont"></div> + </div> + + <img src="/images/manageCenter/total2.png" alt="" /> + </div> + + <div class="equipmentCard"> + <div class="label">鎺掓煡鏁伴噺</div> + <div class="number"> + {{ warningChecked }} + <div class="upIcon iconfont"></div> + </div> + + <img src="/images/manageCenter/total3.png" alt="" /> + </div> + + <div class="equipmentCard"> + <div class="label">鏁存敼鏁伴噺</div> + <div class="number"> + {{ warningSolved }} + <div class="downIcon iconfont"></div> + </div> + + <img src="/images/manageCenter/total4.png" alt="" /> + </div> + + <div class="equipmentCard"> + <div class="label">澶勭悊鐜�</div> + <div class="number"> + {{ warningManage }} + <div class="downIcon iconfont"></div> + </div> + + <img src="/images/manageCenter/total1.png" alt="" /> + </div> + </div> + + <div class="equipmentStatus"> + <div class="bar-chart"> + <div class="title">棰勮鏁伴噺瓒嬪娍</div> + <!-- <div class="control"> + <div class="label" @click="select('day', 'selectBar')" :class="{ active: selectBar === 'day' }"> + 浠婃棩 + </div> + <div class="label" @click="select('week', 'selectBar')" :class="{ active: selectBar === 'week' }"> + 鏈懆 + </div> + <div class="label" @click="select('month', 'selectBar')" :class="{ active: selectBar === 'month' }"> + 鏈湀 + </div> + </div> --> + <div id="bar"></div> + </div> + </div> + + <div class="hashRate"> + <div class="left"> + <div class="title">棰勮鏁版嵁鍗犳瘮:</div> + <div class="info"> + <div class="equipmentInfo" style="margin-top:25px"> + <div class="equipmentCard"> + <div class="label">鏁存敼鎬婚噺</div> + <div class="number"> + {{ solvedTotal }} + <!-- <div class="upIcon iconfont"> 2</div> --> + </div> + + <!-- <img src="/images/manageCenter/total2.png" alt="" /> --> + </div> + <div class="equipmentCard"> + <div class="label">鏃ュ潎娆℃暟</div> + <div class="number"> + {{ solvedPre }} + <!-- <div class="upIcon iconfont"> 2</div> --> + </div> + + <!-- <img src="/images/manageCenter/total2.png" alt="" /> --> + </div> + </div> + + <div class="table-area"> + <el-table + id="table" + ref="table" + tooltip-effect="dark" + :data="tableDataList" + :fit="true" + :stripe="true" + :max-height="350" + class="gutter" + > + <el-table-column prop="date" label="鏃ユ湡" show-overflow-tooltip></el-table-column> + + <el-table-column prop="count" align="center" label="鏁存敼鏁伴噺" show-overflow-tooltip></el-table-column> + </el-table> + <el-pagination + @current-change="refrash" + @size-change="handleSizeChange" + :current-page="page" + :page-size="size" + layout="total, sizes, prev, pager, next, jumper" + :page-sizes="[5, 10, 15, 20, 25]" + :total="solvedTotal" + background + ></el-pagination> + </div> + </div> + </div> + <div class="right"> + <div class="title">绠楁硶棰勮鏁版嵁鍗犳瘮</div> + <div id="pieChart"></div> + </div> + </div> + </div> + + <!-- 椤靛熬 --> + <Footer :isBlack="true"></Footer> + </div> </template> <script> -export default {}; +import IndexHeader from "@/components/IndexHeader" +import Footer from "@/components/Footer" +import * as echarts from "echarts" +import "echarts/map/js/china.js" +import * as Base64 from "js-base64" + +import { analysisReport } from "@/api/es" +import { getLocalCameraTree } from "@/api/area" +import { getClusterDevList } from "@/api/clusterManage" + +export default { + components: { + IndexHeader, + Footer + }, + computed: { + solvedPre() { + if (this.solvedTotal == 0 || this.tableDataList.length == 0) { + return 0 + } + return parseInt(this.solvedTotal / this.tableDataList.length) + }, + warningManage() { + if (this.warningChecked == 0 || this.warningTotal == 0) { + return 0 + } + return parseInt(this.warningChecked / this.warningTotal) * 100 + "%" + } + }, + data() { + return { + lineChart: {}, + pieChart: {}, + searchTree: "", + selectedOrg: "", + selectNodes: [], + searchTime: [ + this.$moment() + .subtract(6, "days") + .format("YYYY-MM-DD 00:00:00"), + this.$moment().format("YYYY-MM-DD HH:mm:ss") + ], + alarmValues: "", + userName: "", + timeMsg: "", + selectBar: "day", + selectForm: "day", + productList: [ + { + name: "璁惧绠$悊", + icon: "/images/manageCenter/manage.png", + openPath: "/equipmentManagement", + path: "/equipmentList", + permission: "deviceMng" + }, + + { + name: "绠楀姏绠$悊", + icon: "/images/manageCenter/manage2.png", + openPath: "/hashrate", + path: "/hashrateDetail", + permission: "analysisMng" + }, + + { + name: "缁熻鏌ヨ", + icon: "/images/manageCenter/search.png", + openPath: "/searchOpen", + path: "/search", + permission: "statisticMng" + }, + + { + name: "鎺ㄩ�佺鐞�", + icon: "/images/manageCenter/manage2.png", + openPath: "/report", + path: "/report", + permission: "statisticMng" + } + ], + cameraTree: [], + menuTree: [], + levelOptions: [ + { id: 0, value: "", label: "鍏ㄩ儴" }, + { id: 1, value: "涓�绾�", label: "涓�绾�" }, + { id: 2, value: "浜岀骇", label: "浜岀骇" }, + { id: 3, value: "涓夌骇", label: "涓夌骇" }, + { id: 4, value: "鍥涚骇", label: "鍥涚骇" }, + { id: 5, value: "浜旂骇", label: "浜旂骇" } + ], + barOption: { + grid: { + left: "3%", + right: "3%", + bottom: "10%", + containLabel: true + }, + legend: { + x: "right", + y: "top", + itemHeight: 2, + itemWidth: 2, + icon: "circle" + }, + tooltip: {}, + xAxis: { + type: "category", + boundaryGap: false, + axisTick: { + show: false + }, + axisLabel: { + color: "#666" + }, + data: [] + }, + yAxis: { + axisTick: { + show: false + }, + axisLine: { + //y杞� + show: false + }, + axisLabel: { + color: "#666" + }, + splitLine: { + //缃戞牸绾� + lineStyle: { + color: "rgb(230, 230, 230)", + type: "dashed" //璁剧疆缃戞牸绾跨被鍨� dotted锛氳櫄绾� solid:瀹炵嚎 + }, + show: true //闅愯棌鎴栨樉绀� + } + }, + // Declare several bar series, each will be mapped + // to a column of dataset.source by default. + series: [ + { + type: "line", + data: [], + areaStyle: { + color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ + { + offset: 0, + color: "#0066FF" + }, + { + offset: 1, + color: "rgba(0, 102, 255, 0.25)" + } + ]) + }, + color: { + type: "linear", + x: 0.02, + y: 0.02, + x2: 1, + y2: 1, + colorStops: [ + { + offset: 0, + color: "#0066FF" // 0% 澶勭殑棰滆壊 + // radius: ["50%", "80%"] + }, + { + offset: 1, + color: "rgba(0, 102, 255, 0.25)" // 100% 澶勭殑棰滆壊 + } + ], + global: false // 缂虹渷涓� false + }, + itemStyle: { + //鏌卞舰鍥惧渾瑙掞紝榧犳爣绉讳笂鍘绘晥鏋滐紝濡傛灉鍙槸涓�涓暟瀛楀垯璇存槑鍥涗釜鍙傛暟鍏ㄩ儴璁剧疆涓洪偅涔堝 + normal: { + //鏌卞舰鍥惧渾瑙掞紝鍒濆鍖栨晥鏋� + barBorderRadius: [15, 15, 0, 0] + } + } + } + ] + }, + pieOption: { + legend: { + top: "bottom" + }, + color: [ + "rgb(54, 60, 231)", + "rgb(54, 178, 74)", + "rgb(255, 178, 36)", + "rgb(240, 190, 231)", + "rgb(255, 124, 31)", + "rgb(165, 96, 255)" + ], + series: [ + { + name: "Nightingale Chart", + type: "pie", + radius: [20, 160], + center: ["50%", "50%"], + roseType: "area", + itemStyle: { + borderRadius: 8 + }, + label: { + show: false + }, + data: [] + } + ] + }, + tableDataList: [], + page: 1, + size: 5, + solvedTotal: 0, + warningTotal: 0, + warningChecked: 0, + warningSolved: 0 + } + }, + created() { + this.getInfo() + }, + mounted() { + this.searchHandler() + this.initBar() + this.initPie() + this.getCameras() + }, + methods: { + async getCameras() { + let clusterId = "" + let clusterReq = await getClusterDevList() + if (clusterReq && clusterReq.success) { + if (clusterReq.data.clusterList.length > 0) { + clusterId = clusterReq.data.clusterList[0].cluster_id + } + } + let camereReq = await getLocalCameraTree({ clusterId: clusterId }) + if (camereReq && camereReq.success) { + this.cameraTree = camereReq.data.treeMenu + let tmpTree = JSON.parse(JSON.stringify(camereReq.data.treeMenu)) + for (let i = 0; i < tmpTree.length; i++) this.clearNode(tmpTree[i]) + this.menuTree = tmpTree + } + }, + clearNode(tree) { + if (tree.children) { + tree.children = tree.children.filter((item) => { + return item.type == "MENU" + }) + } + if (tree.children && tree.children.length > 0) { + for (let i = 0; i < tree.children.length; i++) this.clearNode(tree.children[i]) + } else { + delete tree.children + } + }, + collSelectedNodes() { + let selectedNodeId = this.selectedOrg + let selectedNode = {} + let orgNodeIds = [] + + if (this.selectedOrg == "") { + return orgNodeIds + } + + function findNode(node) { + if (node.id == selectedNodeId) { + selectedNode = node + + return + } + + if (node.children) { + node.children.forEach((n) => { + findNode(n) + }) + } + } + + function collNode(node) { + if (node.type != "MENU") { + orgNodeIds.push(node.id) + return + } + + if (node.children) { + node.children.forEach((n) => { + collNode(n) + }) + } + } + + this.cameraTree.forEach((n) => { + findNode(n) + }) + + collNode(selectedNode) + + return orgNodeIds + }, + searchHandler() { + let query = { + treeNodes: this.collSelectedNodes(), + searchTime: this.format(this.searchTime), + alarmLevel: this.alarmValues + } + + analysisReport(query).then((rsp) => { + if (rsp && rsp.success) { + this.decodeWarningRate(rsp.data.warningRate) + this.decodeWarningChartRate(rsp.data.warningChartRate) + this.decodeWarningStatics(rsp.data.warningTable) + this.decodeWarningTable(rsp.data.warningStatics) + } + }) + }, + decodeWarningTable(b64data) { + this.solvedTotal = 0 + this.tableDataList = [] + if (b64data) { + let decodeString = Base64.decode(b64data) + if (decodeString != "") { + let decodeResult = JSON.parse(decodeString) + decodeResult = [] + if (decodeResult) { + decodeResult.forEach((element) => { + this.solvedTotal = this.solvedTotal + element.doc_count + this.tableDataList.push({ date: element.key_as_string, count: element.doc_count }) + }) + } + } + } + }, + // 鎶樼嚎鍥� + decodeWarningStatics(b64data) { + this.lineChart.clear() + this.barOption.xAxis.data = [] + this.barOption.series[0].data = [] + if (b64data) { + let decodeString = Base64.decode(b64data) + if (decodeString != "") { + let decodeResult = JSON.parse(decodeString) + if (decodeResult) { + decodeResult.forEach((element) => { + this.barOption.xAxis.data.push(element.key_as_string) + this.barOption.series[0].data.push(element.doc_count) + }) + } + } + } + + this.lineChart.setOption(this.barOption) + }, + // 楗煎浘 + decodeWarningChartRate(b64data) { + this.pieChart.clear() + this.pieOption.series[0].data = [] + if (b64data) { + let decodeString = Base64.decode(b64data) + if (decodeString != "") { + let decodeResult = JSON.parse(decodeString) + if (decodeResult) { + decodeResult.forEach((element) => { + this.pieOption.series[0].data.push({ value: element.doc_count, name: element.key }) + }) + } + } + } + this.pieChart.setOption(this.pieOption) + }, + // "warningRate": {"buckets":[{"doc_count":4,"key":3},{"doc_count":3,"key":2},{"doc_count":1,"key":1}],"total":3257} + //key 1=璇姤鏁版嵁,2=宸叉暣鏀�,3=鏈暣鏀�,4=宸叉帓鏌� doc_count=鏁伴噺 total=鎬婚噺 + decodeWarningRate(b64data) { + if (b64data) { + this.warningTotal = 0 + this.warningSolved = 0 + this.warningChecked = 0 + + let decodeString = Base64.decode(b64data) + if (decodeString != "") { + let decodeResult = JSON.parse(decodeString) + if (decodeResult && decodeResult.total > 0) { + this.warningTotal = decodeResult.total + decodeResult.buckets.forEach((element) => { + switch (element.key) { + case 2: + this.warningSolved += element.doc_count + break + case 4: + this.warningChecked += element.doc_count + break + default: + break + } + }) + } + // console.log("WarningRate:", decodeResult) + } + } + }, + handleTreeChange(value) { + this.selectedOrg = value[value.length - 1] + }, + getInfo() { + if (sessionStorage.getItem("userInfo")) { + this.userName = JSON.parse(sessionStorage.getItem("userInfo")).username + } + + let date = new Date() + let year = date.getFullYear() //鑾峰彇瀹屾暣鐨勫勾浠�(4浣�) + let month = date.getMonth() + 1 //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�) + let day = date.getDate() //鑾峰彇褰撳墠鏈堜唤(0-11,0浠h〃1鏈�) + let weekDay = "" + switch (date.getDay()) { + case 0: + weekDay = "鏄熸湡鏃�" + break + + case 1: + weekDay = "鏄熸湡涓�" + break + + case 2: + weekDay = "鏄熸湡浜�" + break + + case 3: + weekDay = "鏄熸湡涓�" + break + + case 4: + weekDay = "鏄熸湡鍥�" + break + + case 5: + weekDay = "鏄熸湡浜�" + break + + case 6: + weekDay = "鏄熸湡鍏�" + break + } + this.timeMsg = "浠婃棩, " + year + "骞�" + month + "鏈�" + day + "鏃�" + weekDay + }, + select(value, type) { + this[type] = value + }, + initBar() { + let bartDom = document.getElementById("bar") + this.lineChart = echarts.init(bartDom) + this.lineChart.setOption(this.barOption) + }, + + initPie() { + let pieDom = document.getElementById("pieChart") + this.pieChart = echarts.init(pieDom) + this.pieChart.setOption(this.pieOption) + }, + jump(route) { + const userInfo = JSON.parse(sessionStorage.getItem("userInfo")) + + const val = userInfo.permissions.find((item) => { + return item == route.permission + }) + if (val) { + if (route.path === "/search") { + const { href } = this.$router.resolve({ + path: "/search" + }) + window.open(href, "_blank") + return + } + this.$router.push(route.path) + } else if (!userInfo.parentId) { + this.$router.push(route.openPath) + } + }, + refrash() {}, + handleSizeChange() {}, + format(array) { + if (!array || array.length === 0) { + return [] + } + return [ + this.$moment(array[0]).format("YYYY-MM-DD HH:mm:ss"), + this.$moment(array[1]).format("YYYY-MM-DD HH:mm:ss") + ] + } + } +} </script> -<style> -</style> \ No newline at end of file +<style lang="scss" scoped> +.manageCenter { + box-sizing: border-box; + min-width: 1346px; + background-color: rgb(243, 245, 248); + + .p-statis { + display: flex; + padding-right: 10px; + box-sizing: border-box; + margin-top: 20px; + b:hover { + color: #2249b4; + } + } + .title { + margin-bottom: 20px; + box-sizing: border-box; + padding-left: 10px; + border-left: 4px solid #0064ff; + font-size: 16px; + font-weight: 700; + } + + .control { + position: absolute; + display: flex; + top: 20px; + right: 20px; + + .label { + margin-left: 10px; + width: 44px; + height: 24px; + line-height: 24px; + font-size: 14px; + text-align: center; + color: #666; + cursor: pointer; + + &.active { + background: #0064ff; + border-radius: 12px; + color: #fff; + } + } + } + + .centerTitle { + box-sizing: border-box; + padding-top: 47px; + height: 150px; + background-image: url("/images/manageCenter/Rectangle 2180.png"); + + .welcome { + font-size: 14px; + font-weight: 700; + } + + .time { + margin-top: 5px; + font-size: 12px; + color: #999; + } + } + + .products { + box-sizing: border-box; + margin: 24px 0; + padding: 20px; + max-height: 282px; + background-color: #fff; + + .productList { + display: flex; + + .productItem { + margin-right: 20px; + width: 190px; + height: 90px; + display: flex; + justify-content: center; + align-items: center; + border-radius: 5px; + border: 1px solid #e9ebee; + cursor: pointer; + + img { + width: 60px; + height: 60px; + } + + .name { + font-size: 14px; + color: #666; + } + + &:hover { + box-shadow: 0px 2px 16px 0px rgba(0, 43, 106, 0.25); + } + + &:nth-child(6n) { + margin-right: 0px; + } + } + } + } + + .equipmentInfo { + display: flex; + justify-content: space-between; + + .equipmentCard { + position: relative; + overflow: hidden; + box-sizing: border-box; + padding: 20px 0 20px 40px; + width: 302px; + height: 100px; + border-radius: 5px; + font-size: 14px; + color: #fff; + + .number { + display: flex; + font-size: 32px; + font-weight: 700; + align-items: end; + } + + .iconfont { + padding: 0 5px 0 2px; + margin-left: 10px; + font-size: 12px; + font-weight: normal; + margin-bottom: 6px; + background-color: #fff; + border-radius: 7px; + + &.upIcon { + color: #ff6a00; + } + + &.downIcon { + color: #3fb54a; + } + } + + img { + position: absolute; + width: 96px; + height: 96px; + top: 10px; + right: -10px; + opacity: 0.2; + } + + &:nth-child(1) { + background: linear-gradient(108deg, #0065ff -8%, #0065ff -8%, #99cfff 100%, #99cfff 100%); + } + + &:nth-child(2) { + background: linear-gradient(108deg, #ff6a00 0%, #ff6a00 0%, #ffb599 100%, #ffb599 100%); + } + + &:nth-child(3) { + background: linear-gradient(108deg, #6d44e5 1%, #6d44e5 1%, #b299ff 100%, #b299ff 100%); + } + + &:nth-child(4) { + background: linear-gradient(108deg, #40b63a 0%, #40b63a 0%, #89e5bc 100%, #89e5bc 100%); + } + } + } + + .equipmentStatus { + display: flex; + justify-content: space-between; + margin: 24px 0; + height: 466px; + + .bar-chart { + box-sizing: border-box; + position: relative; + padding: 20px; + background-color: #fff; + width: 100%; + height: 466px; + + #bar { + height: 440px; + } + } + + .right { + box-sizing: border-box; + padding: 20px; + width: 411px; + height: 466px; + background: #ffffff; + } + } + + .performence { + box-sizing: border-box; + position: relative; + padding: 20px; + background-color: #fff; + width: 1280px; + height: 570px; + + .el-pagination ::v-deep { + margin-left: 650px; + margin-top: 30px; + text-align: center; + height: 24px; + .el-pagination__sizes { + margin-right: 0; + } + + button { + margin: 0; + background-color: #fff; + border: 1px solid #c0c5cc; + border-radius: 2px; + } + + .number { + background-color: #fff; + + &:not(.disabled):hover { + color: #0065ff; + } + + &:not(.disabled).active { + background-color: #0065ff; + color: #fff; + } + } + + .el-input .el-input__inner { + padding-left: 0; + + &:hover, + &:focus { + border-color: #0065ff; + } + } + } + } + + .map { + overflow: hidden; + box-sizing: border-box; + padding: 20px; + margin: 24px 0; + background-color: #fff; + height: 598px; + + #mapChart { + margin-top: -100px; + width: 1100px; + height: 600px; + } + } + + .hashRate { + margin-bottom: 20px; + display: flex; + height: 540px; + + .left { + position: relative; + box-sizing: border-box; + padding: 20px; + margin-right: 24px; + width: 737px; + background-color: #fff; + + #scatterChart { + height: 500px; + } + + .table-area { + margin-top: 10px; + margin-bottom: 5px; + width: 700px; + } + } + + .right { + box-sizing: border-box; + padding: 20px; + width: 519px; + height: 540px; + background: #ffffff; + + #pieChart { + margin-top: -40px; + height: 500px; + } + } + + .info { + position: absolute; + top: 20px; + right: 20px; + + .item { + display: flex; + justify-content: flex-end; + align-items: center; + + .label { + margin-right: 8px; + font-size: 14px; + color: #666; + } + + .data { + font-size: 18px; + font-weight: 700; + } + } + } + } +} +</style> -- Gitblit v1.8.0