许成详 6 years ago
parent
commit
2fd06f8f0a

+ 1
- 1
dist/index.html View File

@@ -1 +1 @@
1
-<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel=stylesheet href=//at.alicdn.com/t/font_775069_dwqa9wy3lkh.css><title>城的空间后台管理系统</title><link href=./static/css/app.3f22746ff9befe9fe6f3e4011c66377b.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.992319e39e0ff64940a3.js></script><script type=text/javascript src=./static/js/app.c8c5753171ab375d2925.js></script></body></html>
1
+<!DOCTYPE html><html><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1"><link rel=stylesheet href=//at.alicdn.com/t/font_775069_dwqa9wy3lkh.css><title>城的空间后台管理系统</title><link href=./static/css/app.9da93fc0afa1628cf2ccaf4da55cc10e.css rel=stylesheet></head><body><div id=app></div><script type=text/javascript src=./static/js/manifest.3ad1d5771e9b13dbdad2.js></script><script type=text/javascript src=./static/js/vendor.992319e39e0ff64940a3.js></script><script type=text/javascript src=./static/js/app.d18f63f8de3ea0e97eda.js></script></body></html>

+ 1
- 1
dist/static/js/manifest.3ad1d5771e9b13dbdad2.js.map View File

@@ -1 +1 @@
1
-{"version":3,"sources":["webpack:///webpack/bootstrap 90ac201ee119caeae796"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,KAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.3ad1d5771e9b13dbdad2.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"./\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap 90ac201ee119caeae796"],"sourceRoot":""}
1
+{"version":3,"sources":["webpack:///webpack/bootstrap ec401281f26b415a60ed"],"names":["parentJsonpFunction","window","chunkIds","moreModules","executeModules","moduleId","chunkId","result","i","resolves","length","installedChunks","push","Object","prototype","hasOwnProperty","call","modules","shift","__webpack_require__","s","installedModules","2","exports","module","l","m","c","d","name","getter","o","defineProperty","configurable","enumerable","get","n","__esModule","object","property","p","oe","err","console","error"],"mappings":"aACA,IAAAA,EAAAC,OAAA,aACAA,OAAA,sBAAAC,EAAAC,EAAAC,GAIA,IADA,IAAAC,EAAAC,EAAAC,EAAAC,EAAA,EAAAC,KACQD,EAAAN,EAAAQ,OAAoBF,IAC5BF,EAAAJ,EAAAM,GACAG,EAAAL,IACAG,EAAAG,KAAAD,EAAAL,GAAA,IAEAK,EAAAL,GAAA,EAEA,IAAAD,KAAAF,EACAU,OAAAC,UAAAC,eAAAC,KAAAb,EAAAE,KACAY,EAAAZ,GAAAF,EAAAE,IAIA,IADAL,KAAAE,EAAAC,EAAAC,GACAK,EAAAC,QACAD,EAAAS,OAAAT,GAEA,GAAAL,EACA,IAAAI,EAAA,EAAYA,EAAAJ,EAAAM,OAA2BF,IACvCD,EAAAY,IAAAC,EAAAhB,EAAAI,IAGA,OAAAD,GAIA,IAAAc,KAGAV,GACAW,EAAA,GAIA,SAAAH,EAAAd,GAGA,GAAAgB,EAAAhB,GACA,OAAAgB,EAAAhB,GAAAkB,QAGA,IAAAC,EAAAH,EAAAhB,IACAG,EAAAH,EACAoB,GAAA,EACAF,YAUA,OANAN,EAAAZ,GAAAW,KAAAQ,EAAAD,QAAAC,IAAAD,QAAAJ,GAGAK,EAAAC,GAAA,EAGAD,EAAAD,QAKAJ,EAAAO,EAAAT,EAGAE,EAAAQ,EAAAN,EAGAF,EAAAS,EAAA,SAAAL,EAAAM,EAAAC,GACAX,EAAAY,EAAAR,EAAAM,IACAhB,OAAAmB,eAAAT,EAAAM,GACAI,cAAA,EACAC,YAAA,EACAC,IAAAL,KAMAX,EAAAiB,EAAA,SAAAZ,GACA,IAAAM,EAAAN,KAAAa,WACA,WAA2B,OAAAb,EAAA,SAC3B,WAAiC,OAAAA,GAEjC,OADAL,EAAAS,EAAAE,EAAA,IAAAA,GACAA,GAIAX,EAAAY,EAAA,SAAAO,EAAAC,GAAsD,OAAA1B,OAAAC,UAAAC,eAAAC,KAAAsB,EAAAC,IAGtDpB,EAAAqB,EAAA,KAGArB,EAAAsB,GAAA,SAAAC,GAA8D,MAApBC,QAAAC,MAAAF,GAAoBA","file":"static/js/manifest.3ad1d5771e9b13dbdad2.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tvar parentJsonpFunction = window[\"webpackJsonp\"];\n \twindow[\"webpackJsonp\"] = function webpackJsonpCallback(chunkIds, moreModules, executeModules) {\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [], result;\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(chunkIds, moreModules, executeModules);\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n \t\tif(executeModules) {\n \t\t\tfor(i=0; i < executeModules.length; i++) {\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = executeModules[i]);\n \t\t\t}\n \t\t}\n \t\treturn result;\n \t};\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// objects to store loaded and loading chunks\n \tvar installedChunks = {\n \t\t2: 0\n \t};\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, {\n \t\t\t\tconfigurable: false,\n \t\t\t\tenumerable: true,\n \t\t\t\tget: getter\n \t\t\t});\n \t\t}\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"./\";\n\n \t// on error function for async loading\n \t__webpack_require__.oe = function(err) { console.error(err); throw err; };\n\n\n\n// WEBPACK FOOTER //\n// webpack/bootstrap ec401281f26b415a60ed"],"sourceRoot":""}

+ 22
- 0
src/pages/system/cardAndCouponManager/couponManager/edit.vue View File

@@ -748,6 +748,28 @@ export default {
748 748
         if (this.couponInfo.ValidDays) {
749 749
           this.couponInfo.StartDate = undefined
750 750
           this.couponInfo.EndDate = undefined
751
+        } else {
752
+          if (this.couponInfo.StartDate === '') {
753
+            this.$message({
754
+              type: 'error',
755
+              message: '开始时间不能为空'
756
+            })
757
+            return false
758
+          }
759
+          if (this.couponInfo.EndDate === '') {
760
+            this.$message({
761
+              type: 'error',
762
+              message: '截止时间不能为空'
763
+            })
764
+            return false
765
+          }
766
+          if (new Date(this.couponInfo.StartDate).getTime() > new Date(this.couponInfo.EndDate).getTime()) {
767
+            this.$message({
768
+              type: 'error',
769
+              message: '开始时间不能大于截止时间'
770
+            })
771
+            return false
772
+          }
751 773
         }
752 774
         if (!this.checkInfo()) {
753 775
           return false

+ 6
- 1
src/pages/system/cardAndCouponManager/couponManager/index.vue View File

@@ -8,6 +8,11 @@
8 8
         <ul>
9 9
           <li>
10 10
             <el-select v-model="CaseId" placeholder="请选择案场">
11
+              <el-option
12
+                key="all"
13
+                label="所有案场"
14
+                value="all">
15
+              </el-option>
11 16
               <el-option
12 17
                 v-for="item in cases"
13 18
                 :key="item.CaseId"
@@ -295,7 +300,7 @@ export default {
295 300
     getList () { // 获取列表
296 301
       this.GetCouponList({
297 302
         ...this.postData,
298
-        caseid: this.CaseId || this.defaultCaseId
303
+        caseid: this.postData.caseid === 'all' || this.postData.caseid === '' ? '' : this.postData.caseid
299 304
       }).then((res) => {
300 305
         this.total = res.pagenum
301 306
         // console.log(JSON.stringify(res))

+ 7
- 7
src/pages/system/cmsManager/majorProjects/edit.vue View File

@@ -266,7 +266,7 @@ export default {
266 266
     },
267 267
     checkFn (arr) {
268 268
       for (var n = 0; n < arr.length; n++) {
269
-        if ((arr[n].type === 'isNull' && arr[n].target === '') || (arr[n].type === 'Array' && arr[n].target.length)) {
269
+        if (arr[n].type === 'isNull' && arr[n].target === '') {
270 270
           this.$message({
271 271
             message: arr[n].errorMsg,
272 272
             type: 'error'
@@ -278,15 +278,15 @@ export default {
278 278
     },
279 279
     submit () {
280 280
       var checkOff = this.checkFn([{
281
-        target: (this.CaseId || ''),
281
+        target: this.CaseId || '',
282 282
         errorMsg: '对应案场不能为空',
283 283
         type: 'isNull'
284 284
       }, {
285
-        target: (this.detail.Name || ''),
285
+        target: this.detail.Name || '',
286 286
         errorMsg: '名称不能为空',
287 287
         type: 'isNull'
288 288
       }, {
289
-        target: (this.imgShow || ''),
289
+        target: this.imgShow || '',
290 290
         errorMsg: '图片不能为空',
291 291
         type: 'isNull'
292 292
       }, {
@@ -294,15 +294,15 @@ export default {
294 294
         errorMsg: '详细图片不能为空',
295 295
         type: 'isNull'
296 296
       }, {
297
-        target: (this.detail.DetailContent || ''),
297
+        target: this.detail.DetailContent || '',
298 298
         errorMsg: '专题简介不能为空',
299 299
         type: 'isNull'
300 300
       }, {
301
-        target: (this.detail.IsAllCourse || ''),
301
+        target: this.detail.IsAllCourse || '',
302 302
         errorMsg: '展示课程不能为空',
303 303
         type: 'isNull'
304 304
       }, {
305
-        target: ((this.detail.Status === 0 || this.detail.Status) || ''),
305
+        target: this.detail.Status === 0 || this.detail.Status || '',
306 306
         errorMsg: '是否前台展示不能为空',
307 307
         type: 'isNull'
308 308
       }])

+ 53
- 5
src/pages/system/dashboard/index.vue View File

@@ -22,7 +22,7 @@
22 22
           <pieDiagram :data="subItem" :index="index + '-' + subIndex"></pieDiagram>
23 23
         </div>
24 24
         <div v-if="subItem.type === 'brokenLineGraph' && typeof(subItem.value) === 'object' && subItem.value.length">
25
-          <brokenLineGraph :data="subItem.value" :index="index + '-' + subIndex"></brokenLineGraph>
25
+          <brokenLineGraph :data="subItem" :index="index + '-' + subIndex"></brokenLineGraph>
26 26
         </div>
27 27
         <div v-if="subItem.type === 'ringChart' && typeof(subItem.value) === 'object' && subItem.value.length">
28 28
           <ringChart :data="subItem.value" :index="index + '-' + subIndex"></ringChart>
@@ -35,6 +35,29 @@
35 35
         </div>
36 36
       </div>
37 37
     </div>
38
+    <div class="bottomData">
39
+      <div class="flex-h">
40
+        <div class="flex-item">
41
+          <h1>数据统计</h1>
42
+        </div>
43
+        <el-select v-model="bottomSelectValue" placeholder="请选择" @change="bottomChange">
44
+          <el-option
45
+            v-for="item in bottomSelect"
46
+            :key="item.id"
47
+            :label="item.value"
48
+            :value="item.id">
49
+          </el-option>
50
+        </el-select>
51
+      </div>
52
+      <ul>
53
+        <li v-for="(item,index) in bottomNav" :key="index" :class="{'active': bottomActive === index}" @click="bottomActive = index">{{item}}</li>
54
+      </ul>
55
+      <div style="height: 400px;" v-if="bottomData.length">
56
+        <div v-for="(item,index) in bottomData" :key="index" v-if="bottomActive === index && bottomData.length">
57
+          <brokenLineGraph :data="item.data" :index="'bottomData-' + index"></brokenLineGraph>
58
+        </div>
59
+      </div>
60
+    </div>
38 61
   </div>
39 62
 </template>
40 63
 
@@ -57,6 +80,17 @@ export default {
57 80
       postData: {
58 81
         caseid: ''
59 82
       },
83
+      bottomSelect: [{
84
+        value: '最近一周',
85
+        id: 'week'
86
+      }, {
87
+        value: '最近一个月',
88
+        id: 'month'
89
+      }],
90
+      bottomSelectValue: 'week',
91
+      bottomActive: 0,
92
+      bottomNav: ['推荐会员新增', '排课数', '课程预约量', '饮品下单量', '到场人次'],
93
+      bottomData: [],
60 94
       pageData: [
61 95
         [
62 96
           { type: 'dashboardList', remark: '列表面板', data: { title: '', list: [{ name: '会员总数', value: '1000', }, { name: '课程预约总量', value: '1000', }, { name: '饮品下单总量', value: '1000', }] } }
@@ -109,14 +143,14 @@ export default {
109 143
         this.postData.caseid = val
110 144
       }
111 145
       this.getData(val)
112
-      this.getBottomData(val, 'week')
146
+      this.getBottomData(val, this.bottomSelectValue)
113 147
     },
114 148
   },
115 149
   mounted () {
116 150
     this.$nextTick(function () {
117 151
       if (this.defaultCaseId !== null) {
118 152
         this.getData(this.defaultCaseId)
119
-        this.getBottomData(this.defaultCaseId, 'week')
153
+        this.getBottomData(this.defaultCaseId, this.bottomSelectValue)
120 154
       }
121 155
     })
122 156
   },
@@ -125,9 +159,12 @@ export default {
125 159
       'getDashboardData',
126 160
       'getDashboardBottomData',
127 161
     ]),
162
+    bottomChange () {
163
+      this.getBottomData(this.postData.caseid, this.bottomSelectValue)
164
+    },
128 165
     caseChange () {
129 166
       this.getData(this.postData.caseid)
130
-      this.getBottomData(this.postData.caseid, 'week')
167
+      this.getBottomData(this.postData.caseid, this.bottomSelectValue)
131 168
     },
132 169
     getData (id) {
133 170
       this.getDashboardData({
@@ -150,7 +187,18 @@ export default {
150 187
         caseid: id,
151 188
         statype: type
152 189
       }).then((res) => {
153
-        console.log(JSON.stringify(res))
190
+        this.bottomData = []
191
+        for (var n = 0; n < res.length; n++) {
192
+          this.bottomData.push({
193
+            type: 'brokenLineGraph',
194
+            remark: '折线图',
195
+            data: {
196
+              title: '',
197
+              value: res[n]
198
+            }
199
+          })
200
+        }
201
+        console.log(JSON.stringify(this.bottomData))
154 202
       })
155 203
     },
156 204
   }

+ 36
- 0
src/pages/system/dashboard/page.scss View File

@@ -22,6 +22,42 @@
22 22
   .top{
23 23
     
24 24
   }
25
+  .bottomData{
26
+    width: calc(100% - 40px);
27
+    margin: 0 auto;
28
+    position: relative;
29
+    overflow: hidden;
30
+    >ul{
31
+      width: 100%;
32
+      position: relative;
33
+      overflow: hidden;
34
+      font-size: 0;
35
+      white-space: nowrap;
36
+      margin: 20px auto 0;
37
+      >li{
38
+        display: inline-block;
39
+        line-height: 40px;
40
+        padding: 0 15px;
41
+        border: 1px solid #ccc;
42
+        border-left: none;
43
+        &:first-child{
44
+          border-left: 1px solid #ccc;
45
+          border-radius: 6px 0 0 6px;
46
+        }
47
+        &:last-child{
48
+          border-radius: 0 6px 6px 0;
49
+        }
50
+        &:hover{
51
+          cursor: pointer;
52
+          background: #f8f8f8;
53
+        }
54
+        &.active{
55
+          background: rgb(64, 158, 255);
56
+          color: #fff;
57
+        }
58
+      }
59
+    }
60
+  }
25 61
 }
26 62
 
27 63