Jelajahi Sumber

中网小程序微信国际(香港)支付admin模块提交

hyq 6 tahun lalu
induk
melakukan
5ec0d25116
100 mengubah file dengan 16545 tambahan dan 0 penghapusan
  1. 9 0
      kmall-admin/src/main/webapp/WEB-INF/dispatcher-servlet.xml
  2. 118 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/ad.html
  3. 33 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/address.html
  4. 60 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/adposition.html
  5. 79 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/attribute.html
  6. 57 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/attributecategory.html
  7. 186 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/brand.html
  8. 87 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/cart.html
  9. 206 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/category.html
  10. 84 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/channel.html
  11. 63 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/collect.html
  12. 42 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/comment.html
  13. 97 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/coupon.html
  14. 92 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/coupongrads.html
  15. 28 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/couponshare.html
  16. 29 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/exportexceptiondata.html
  17. 64 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/feedback.html
  18. TEMPAT SAMPAH
      kmall-admin/src/main/webapp/WEB-INF/page/shop/file/general_goods_export_yyyy_mm_dd_v1.0.0.xls
  19. TEMPAT SAMPAH
      kmall-admin/src/main/webapp/WEB-INF/page/shop/file/goods_export_yyyy_mm_dd_v1.0.0.xls
  20. 57 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/footprint.html
  21. 127 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/freight.html
  22. 488 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goods.html
  23. 50 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsattribute.html
  24. 142 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsgroup.html
  25. 27 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsgroupopen.html
  26. 31 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goodshistory.html
  27. 64 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsissue.html
  28. 86 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsspecification.html
  29. 74 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/helpissue.html
  30. 55 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/helptype.html
  31. 97 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/keywords.html
  32. 76 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/merch.html
  33. 258 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/offilineOrderList.html
  34. 437 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/order.html
  35. 124 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/orderPrint.html
  36. 157 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/orderrefund.html
  37. 110 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/product.html
  38. 110 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/scannShop.html
  39. 148 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/scannShop2.html
  40. 60 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/searchhistory.html
  41. 107 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/shopuser.html
  42. 55 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/specification.html
  43. 94 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/store.html
  44. 177 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/storeProductStock.html
  45. 77 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/supplier.html
  46. 74 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/syscusnationcode.html
  47. 67 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/syscusunitcode.html
  48. 142 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/topic.html
  49. 74 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/topiccategory.html
  50. 66 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/usercoupon.html
  51. 54 0
      kmall-admin/src/main/webapp/WEB-INF/page/shop/userlevel.html
  52. 50 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/config.html
  53. 66 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/dept.html
  54. 28 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/generator.html
  55. 61 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/header.html
  56. 4144 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/icon.html
  57. 24 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/log.html
  58. 84 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/macro.html
  59. 340 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/main.html
  60. 99 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/menu.html
  61. 92 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/notice.html
  62. 62 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/noticeuser.html
  63. 114 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/oss.html
  64. 63 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/printer.html
  65. 83 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/region.html
  66. 72 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/role.html
  67. 97 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/schedule.html
  68. 25 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/schedule_log.html
  69. 70 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/sendsms.html
  70. 61 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/smslog.html
  71. 95 0
      kmall-admin/src/main/webapp/WEB-INF/page/sys/user.html
  72. 206 0
      kmall-admin/src/main/webapp/WEB-INF/page/test/iviewDemo.html
  73. 15 0
      kmall-admin/src/main/webapp/WEB-INF/velocity-toolbox.xml
  74. 124 0
      kmall-admin/src/main/webapp/WEB-INF/web.xml
  75. 465 0
      kmall-admin/src/main/webapp/index.html
  76. 470 0
      kmall-admin/src/main/webapp/js/common.js
  77. 119 0
      kmall-admin/src/main/webapp/js/navtab.js
  78. 207 0
      kmall-admin/src/main/webapp/js/shop/ad.js
  79. 97 0
      kmall-admin/src/main/webapp/js/shop/address.js
  80. 137 0
      kmall-admin/src/main/webapp/js/shop/adposition.js
  81. 170 0
      kmall-admin/src/main/webapp/js/shop/attribute.js
  82. 162 0
      kmall-admin/src/main/webapp/js/shop/attributecategory.js
  83. 249 0
      kmall-admin/src/main/webapp/js/shop/brand.js
  84. 137 0
      kmall-admin/src/main/webapp/js/shop/cart.js
  85. 248 0
      kmall-admin/src/main/webapp/js/shop/category.js
  86. 173 0
      kmall-admin/src/main/webapp/js/shop/channel.js
  87. 124 0
      kmall-admin/src/main/webapp/js/shop/collect.js
  88. 149 0
      kmall-admin/src/main/webapp/js/shop/comment.js
  89. 230 0
      kmall-admin/src/main/webapp/js/shop/coupon.js
  90. 184 0
      kmall-admin/src/main/webapp/js/shop/coupongrads.js
  91. 36 0
      kmall-admin/src/main/webapp/js/shop/couponshare.js
  92. 106 0
      kmall-admin/src/main/webapp/js/shop/exportexceptiondata.js
  93. 160 0
      kmall-admin/src/main/webapp/js/shop/feedback.js
  94. 121 0
      kmall-admin/src/main/webapp/js/shop/footprint.js
  95. 285 0
      kmall-admin/src/main/webapp/js/shop/freight.js
  96. 621 0
      kmall-admin/src/main/webapp/js/shop/goods.js
  97. 155 0
      kmall-admin/src/main/webapp/js/shop/goodsattribute.js
  98. 151 0
      kmall-admin/src/main/webapp/js/shop/goodscrash.js
  99. 226 0
      kmall-admin/src/main/webapp/js/shop/goodsgroup.js
  100. 189 0
      kmall-admin/src/main/webapp/js/shop/goodsgroupopen.js

+ 9 - 0
kmall-admin/src/main/webapp/WEB-INF/dispatcher-servlet.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
+	xsi:schemaLocation="
+        http://www.springframework.org/schema/beans 
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
+
+
+</beans>

+ 118 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/ad.html

@@ -0,0 +1,118 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("ad:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("ad:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("ad:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="ad" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="ad.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="ad.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="广告位置" prop="adPositionId">
+                <i-select v-model="ad.adPositionId" filterable>
+                    <i-option v-for="adPosition in adPositions" :value="adPosition.id" :key="adPosition.id">
+                        {{adPosition.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="广告名称" prop="name">
+                <i-input v-model="ad.name" placeholder="广告名称"/>
+            </Form-item>
+            <Form-item label="链接" prop="link">
+                <i-input v-model="ad.link" placeholder="链接"/>
+            </Form-item>
+            <Row style="height: 30px">
+                <i-col span="16">
+                    <Form-item label="图片" prop="imageUrl">
+                        <i-input v-model="ad.imageUrl" placeholder="图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccess" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImage">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Row>
+                <i-col span="16" style="margin-top: -20px;">
+                    <span style="margin-left: 80px;color: red;font-size: 12px;">尺寸建议750*280像素以内,大小2M以下</span>
+                </i-col>
+            </Row>
+            <Form-item label="内容" prop="content">
+                <i-input type="textarea" v-model="ad.content" placeholder="内容"/>
+            </Form-item>
+            <Form-item label="结束时间" prop="endTime">
+                <Date-picker v-model="ad.endTime" placeholder="结束时间"></Date-picker>
+            </Form-item>
+            <Form-item label="排序" prop="content">
+                <i-input v-model="ad.sortOrder" placeholder="排序"/>
+            </Form-item>
+            <Form-item label="状态" prop="enabled">
+                <Radio-group v-model="ad.enabled">
+                    <Radio label="0">
+                        <span>禁用</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>启用</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/ad.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 33 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/address.html

@@ -0,0 +1,33 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.userName" @on-enter="query" placeholder="联系人"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.telNumber" @on-enter="query" placeholder="联系电话"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                <!--#if($shiro.hasPermission("address:delete"))-->
+                <!--<i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>-->
+                <!--#end-->
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+</div>
+
+<script src="${rc.contextPath}/js/shop/address.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 60 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/adposition.html

@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("adposition:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("adposition:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("adposition:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="adPosition" :rules="ruleValidate" :label-width="80">
+            <Form-item label="位置名称" prop="name">
+                <i-input v-model="adPosition.name" placeholder="位置名称"/>
+            </Form-item>
+            <Form-item label="宽度" prop="width">
+                <Input-number :min="0" :step="10" v-model="adPosition.width" placeholder="宽度" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="高度" prop="height">
+                <Input-number :min="0" :step="10" v-model="adPosition.height" placeholder="高度" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="描述" prop="desc">
+                <i-input type="textarea" v-model="adPosition.desc" placeholder="描述"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/adposition.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 79 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/attribute.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.categoryName" @on-enter="query" placeholder="所属分类"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("attribute:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("attribute:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("attribute:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="attribute" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="attribute.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="attribute.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="名称" prop="name">
+                <i-input v-model="attribute.name" placeholder="名称"/>
+            </Form-item>
+            <Form-item label="所属分类" prop="attributeCategoryId">
+                <i-select v-model="attribute.attributeCategoryId" filterable>
+                    <i-option v-for="category in categories" :value="category.id" :key="category.id">{{category.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <!--<Form-item label="类型" prop="inputType">
+            <i-input v-model="attribute.inputType" placeholder="类型"/>
+            </Form-item>
+            <Form-item label="值" prop="value">
+            <i-input v-model="attribute.value" placeholder="值"/>
+            </Form-item>-->
+            <Form-item label="排序" prop="sortOrder">
+                <Input-number :min="0" :step="1" v-model="attribute.sortOrder" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/attribute.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 57 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/attributecategory.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("attributecategory:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("attributecategory:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("attributecategory:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="attributeCategory" :rules="ruleValidate" :label-width="80">
+            <Form-item label="名称" prop="name">
+                <i-input v-model="attributeCategory.name" placeholder="名称"/>
+            </Form-item>
+            <Form-item label="是否可用" prop="enabled">
+                <i-switch v-model="status" size="large" @on-change="changeEnable">
+                    <span slot="open">启用</span>
+                    <span slot="close">禁用</span>
+                </i-switch>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/attributecategory.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 186 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/brand.html

@@ -0,0 +1,186 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="品牌名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("brand:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("brand:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("brand:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="brand" :rules="ruleValidate" :label-width="100">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="brand.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="brand.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="品牌名称" prop="name">
+                <i-input v-model="brand.name" placeholder="品牌名称"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="图片" prop="listPicUrl">
+                        <i-input v-model="brand.listPicUrl" placeholder="图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessListPicUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageListPicUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="描述" prop="simpleDesc">
+                <i-input type="textarea" v-model="brand.simpleDesc" placeholder="描述"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="图片" prop="picUrl">
+                        <i-input v-model="brand.picUrl" placeholder="图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessPicUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImagePicUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="排序" prop="sortOrder">
+                <Input-number :min="0" :step="1" v-model="brand.sortOrder" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="显示" prop="isShow">
+                <Radio-group v-model="brand.isShow">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="展示价格" prop="floorPrice">
+                <Input-number :min="0" v-model="brand.floorPrice" placeholder="展示价格" style="width: 188px;"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="app显示图片" prop="appListPicUrl">
+                        <i-input v-model="brand.appListPicUrl" placeholder="app显示图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessAppListPicUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageAppListPicUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="新品牌" prop="isNew">
+                <Radio-group v-model="brand.isNew">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="新品牌图片" prop="newPicUrl">
+                        <i-input v-model="brand.newPicUrl" placeholder="新品牌图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessNewPicUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageNewPicUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="新品牌排序" prop="newSortOrder">
+                <Input-number :min="0" :step="1" v-model="brand.newSortOrder" placeholder="新品牌排序"
+                              style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/brand.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 87 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/cart.html

@@ -0,0 +1,87 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("cart:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("cart:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("cart:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form :model="cart" :label-width="80">
+            <Form-item label="会员Id" prop="userId">
+                <i-input v-model="cart.userId" placeholder="会员Id"/>
+            </Form-item>
+            <Form-item label="sessionId" prop="sessionId">
+                <i-input v-model="cart.sessionId" placeholder="sessionId"/>
+            </Form-item>
+            <Form-item label="商品Id" prop="goodsId">
+                <i-input v-model="cart.goodsId" placeholder="商品Id"/>
+            </Form-item>
+            <Form-item label="商品序列号" prop="goodsSn">
+                <i-input v-model="cart.goodsSn" placeholder="商品序列号"/>
+            </Form-item>
+            <Form-item label="产品Id" prop="productId">
+                <i-input v-model="cart.productId" placeholder="产品Id"/>
+            </Form-item>
+            <Form-item label="产品名称" prop="goodsName">
+                <i-input v-model="cart.goodsName" placeholder="产品名称"/>
+            </Form-item>
+            <Form-item label="市场价" prop="marketPrice">
+                <i-input v-model="cart.marketPrice" placeholder="市场价"/>
+            </Form-item>
+            <Form-item label="零售价格" prop="retailPrice">
+                <i-input v-model="cart.retailPrice" placeholder="零售价格"/>
+            </Form-item>
+            <Form-item label="数量" prop="number">
+                <i-input v-model="cart.number" placeholder="数量"/>
+            </Form-item>
+            <Form-item label="规格属性组成的字符串,用来显示用" prop="goodsSpecificationNameValue">
+                <i-input v-model="cart.goodsSpecificationNameValue" placeholder="规格属性组成的字符串,用来显示用"/>
+            </Form-item>
+            <Form-item label="product表对应的goods_specifition_ids" prop="goodsSpecificationIds">
+                <i-input v-model="cart.goodsSpecificationIds" placeholder="product表对应的goods_specifition_ids"/>
+            </Form-item>
+            <Form-item label="" prop="checked">
+                <i-input v-model="cart.checked" placeholder=""/>
+            </Form-item>
+            <Form-item label="商品图片" prop="listPicUrl">
+                <i-input v-model="cart.listPicUrl" placeholder="商品图片"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/cart.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 206 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/category.html

@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+                </i-col>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("category:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("category:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("category:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="category" :rules="ruleValidate" :label-width="100">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="category.merchSn" placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="category.storeId" placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="分类名称" prop="name">
+                <i-input v-model="category.name" placeholder="分类名称"/>
+            </Form-item>
+            <Form-item label="关键字" prop="keywords">
+                <i-input v-model="category.keywords" placeholder="关键字"/>
+            </Form-item>
+            <Form-item label="描述" prop="frontDesc">
+                <i-input type="textarea" v-model="category.frontDesc" placeholder="描述"/>
+            </Form-item>
+            <Form-item label="级别" prop="level">
+                <Radio-group v-model="category.level">
+                    <Radio label="L1">
+                        <span>L1</span>
+                    </Radio>
+                    <Radio label="L2">
+                        <span>L2</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item v-if="category.level == 'L2'" label="父节点" prop="parentId" style="width: 288px;">
+                <i-select v-model="category.parentId">
+                    <i-option value="" key="">请选择</i-option>
+                    <i-option v-for="category in categoryList" :value="category.id"
+                              :key="category.id">{{category.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="排序" prop="sortOrder">
+                <Input-number :min="0" :step="1" v-model="category.sortOrder" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="首页展示排序" prop="showIndex">
+                <Input-number :min="0" :step="1" v-model="category.showIndex" placeholder="首页展示排序"
+                              style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="显示" prop="isShow">
+                <Radio-group v-model="category.isShow">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="banner图片" prop="bannerUrl">
+                        <i-input v-model="category.bannerUrl" placeholder="banner图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessBannerUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageBannerUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="icon链接" prop="iconUrl">
+                        <i-input v-model="category.iconUrl" placeholder="icon链接" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessIconUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageIconUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="图片" prop="imgUrl">
+                        <i-input v-model="category.imgUrl" placeholder="图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessImgUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageImgUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="手机banner" prop="wapBannerUrl">
+                        <i-input v-model="category.wapBannerUrl" placeholder="手机banner" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessWapBannerUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageWapBannerUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <!--<Form-item label="类型" prop="type">-->
+            <!--<Radio-group v-model="category.type">-->
+            <!--<Radio label="0">-->
+            <!--<span>0</span>-->
+            <!--</Radio>-->
+            <!--<Radio label="1">-->
+            <!--<span>1</span>-->
+            <!--</Radio>-->
+            <!--</Radio-group>-->
+            <!--</Form-item>-->
+            <Form-item label="frontName" prop="frontName">
+                <i-input type="textarea" v-model="category.frontName" placeholder="frontName"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/category.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 84 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/channel.html

@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("channel:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("channel:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("channel:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="channel" :rules="ruleValidate" :label-width="80">
+            <Form-item label="名称" prop="name" style="width: 288px;">
+                <i-select v-model="channel.name">
+                    <i-option v-for="category in categoryList" :value="category.name"
+                              :key="category.name">{{category.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="url" prop="url">
+                <i-input v-model="channel.url" placeholder="url"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="icon链接" prop="iconUrl">
+                        <i-input v-model="channel.iconUrl" placeholder="icon链接" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="50"
+                                :on-success="handleSuccessIconUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageIconUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="排序" prop="sortOrder">
+                <Input-number :min="0" :step="1" v-model="channel.sortOrder" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/channel.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 63 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/collect.html

@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="用户名"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("collect:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("collect:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("collect:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form :model="collect" :label-width="80">
+            <Form-item label="用户Id" prop="userId">
+                <i-input v-model="collect.userId" placeholder="用户Id"/>
+            </Form-item>
+            <Form-item label="商品" prop="valueId">
+                <i-input v-model="collect.valueId" placeholder="产品Id"/>
+            </Form-item>
+            <Form-item label="添加时间" prop="addTime">
+                <i-input v-model="collect.addTime" placeholder="添加时间"/>
+            </Form-item>
+            <Form-item label="提醒" prop="isAttention">
+                <i-input v-model="collect.isAttention" placeholder="提醒"/>
+            </Form-item>
+            <Form-item label="" prop="typeId">
+                <i-input v-model="collect.typeId" placeholder=""/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/collect.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 42 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/comment.html

@@ -0,0 +1,42 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.userName" @on-enter="query" placeholder="会员名称"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.valueName" @on-enter="query" placeholder="商品名称"/>
+                </i-col>
+                <Checkbox-group v-model="q.picUrl" @on-change="query" class="inline">
+                    <Checkbox label="true"><span>有图评论</span></Checkbox>
+                </Checkbox-group>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("comment:toggleStatus"))
+                <i-button type="warning" @click="toggleStatus"><i class="fa fa-pencil-square-o"></i>&nbsp;展示/隐藏
+                </i-button>
+                #end
+                #if($shiro.hasPermission("comment:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+                <i-button v-if="q.picUrl == true" type="info" @click="seePic"><i class="fa fa-eye"></i>&nbsp;预览图片
+                </i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+</div>
+
+<script src="${rc.contextPath}/js/shop/comment.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 97 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/coupon.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="优惠券名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("coupon:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("coupon:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("coupon:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+                <!--#if($shiro.hasPermission("coupon:publish"))-->
+                <!--<i-button type="primary" @click="publish">-->
+                <!--<Icon type="android-send"></Icon>-->
+                <!--</i>&nbsp;发放-->
+                <!--</i-button>-->
+                <!--#end-->
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="showCard">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="coupon" :rules="ruleValidate" :label-width="100">
+            <Form-item label="优惠券名称" prop="name">
+                <i-input v-model="coupon.name" placeholder="优惠券名称"/>
+            </Form-item>
+            <Form-item label="配送金额" prop="typeMoney">
+                <Input-number :min="0" v-model="coupon.typeMoney" placeholder="配送金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="最小金额" prop="minAmount">
+                <Input-number :min="0" v-model="coupon.minAmount" placeholder="最小金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="最大金额" prop="maxAmount">
+                <Input-number :min="0" v-model="coupon.maxAmount" placeholder="最大金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="是否适用全场" prop="isAll">
+                <Radio-group v-model="coupon.isAll">
+                    <Radio label="0" checked>
+                        <span>否</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
+            </Form-item>
+        </i-form>
+    </Card>
+    <Card id="sendDiv" v-show="showGoods">
+        <i-form :label-width="100">
+            <Form-item v-if="selectData.sendType == 3" label="下发商品">
+                <i-select v-model="goods" filterable multiple>
+                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item v-if="selectData.sendType == 1" label="下发会员">
+                <i-select v-model="user" filterable multiple>
+                    <i-option v-for="user in users" :value="user.id" :key="user.id">{{user.username}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item v-if="selectData.sendType == 1" label="短信通知">
+                <Checkbox v-model="sendSms">发送短信</Checkbox>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="publishSubmit">提交</i-button>
+                <i-button type="warning" @click="reload"/>
+                返回</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/coupon.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 92 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/coupongrads.html

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showDiv == 1">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="优惠券名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                <!--#if($shiro.hasPermission("coupon:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end-->
+                #if($shiro.hasPermission("coupon:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                <!--#if($shiro.hasPermission("coupon:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end-->
+                <!--#if($shiro.hasPermission("coupon:publish"))-->
+                <!--<i-button type="primary" @click="publish">-->
+                <!--<Icon type="android-send"></Icon>-->
+                <!--</i>&nbsp;发放-->
+                <!--</i-button>-->
+                <!--#end-->
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+    </div>
+
+    <Card v-show="showDiv == 2">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="coupon" :rules="ruleValidate" :label-width="160">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="coupon.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="coupon.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="优惠券名称" prop="name">
+                <i-input v-model="coupon.name" placeholder="优惠券名称"/>
+            </Form-item>
+            <!--<Form-item label="状态" prop="status">
+                <Radio-group v-model="coupon.status">
+                    <Radio label="1">
+                        <span>正常</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>失效</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>-->
+            <Form-item label="赠送金额" prop="typeMoney">
+                <Input-number :min="0" v-model="coupon.typeMoney" placeholder="赠送金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="订单最小金额" prop="minAmount">
+                <Input-number :min="0" v-model="coupon.minAmount" placeholder="订单最小金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="订单最大金额" prop="maxAmount">
+                <Input-number :min="0" v-model="coupon.maxAmount" placeholder="订单最大金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="最小商品金额" prop="minGoodsAmount">
+                <Input-number :min="0" v-model="coupon.minGoodsAmount" placeholder="最小商品金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="有效期(天)" prop="invalidDays">
+                <Input-number :min="1" v-model="coupon.invalidDays" placeholder="领取之后的有效天数" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+
+</div>
+
+<script src="${rc.contextPath}/js/shop/coupongrads.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 28 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/couponshare.html

@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <Card>
+        <p slot="title">分享优惠</p>
+        <i-form ref="formValidate" :model="coupon" :rules="ruleValidate" :label-width="120">
+
+            <Form-item label="赠送最小金额">
+                <Input-number :min="0" v-model="coupon.minAmount" placeholder="赠送最小金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="赠送最大金额">
+                <Input-number :min="0" v-model="coupon.maxAmount" placeholder="最大金额" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="saveOrUpdate">保存</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/couponshare.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 29 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/exportexceptiondata.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>数据导入异常数据记录</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-select v-model="q.exportDataType" placeholder="导入数据类型">
+                        <i-option value="1">商品导入</i-option>
+                        <i-option value="2">普通商品导入</i-option>
+                    </i-select>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+</div>
+
+<script src="${rc.contextPath}/js/shop/exportexceptiondata.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 64 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/feedback.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <i-col span="4">
+                <i-input v-model="q.userName" @on-enter="query" placeholder="名称"/>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+            <!--#if($shiro.hasPermission("feedback:save"))-->
+            <!--<i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>-->
+            <!--#end-->
+            <!--#if($shiro.hasPermission("feedback:update"))-->
+            <!--<i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>-->
+            <!--#end-->
+            <!--#if($shiro.hasPermission("feedback:delete"))-->
+            <!--<i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>-->
+            <!--#end-->
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="feedback" :rules="ruleValidate" :label-width="80">
+            <Form-item label="会员Id" prop="userId">
+                <i-input v-model="feedback.userId" placeholder="会员Id"/>
+            </Form-item>
+            <Form-item label="会员会员名称" prop="userName">
+                <i-input v-model="feedback.userName" placeholder="会员名称"/>
+            </Form-item>
+            <Form-item label="手机" prop="mobile">
+                <i-input v-model="feedback.mobile" placeholder="手机"/>
+            </Form-item>
+            <Form-item label="反馈类型" prop="feedType">
+                <i-input v-model="feedback.feedType" placeholder="反馈类型"/>
+            </Form-item>
+            <Form-item label="详细内容" prop="content">
+                <i-input v-model="feedback.content" placeholder="详细内容"/>
+            </Form-item>
+            <Form-item label="状态" prop="status">
+                <i-input v-model="feedback.status" placeholder="状态"/>
+            </Form-item>
+            <Form-item label="反馈时间" prop="addTime">
+                <i-input v-model="feedback.addTime" placeholder="反馈时间"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/feedback.js?_${date.systemTime}"></script>
+</body>
+</html>

TEMPAT SAMPAH
kmall-admin/src/main/webapp/WEB-INF/page/shop/file/general_goods_export_yyyy_mm_dd_v1.0.0.xls


TEMPAT SAMPAH
kmall-admin/src/main/webapp/WEB-INF/page/shop/file/goods_export_yyyy_mm_dd_v1.0.0.xls


+ 57 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/footprint.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="用户名"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("footprint:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("footprint:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("footprint:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form :model="footprint" :label-width="80">
+            <Form-item label="会员Id" prop="userId">
+                <i-input v-model="footprint.userId" placeholder="会员Id"/>
+            </Form-item>
+            <Form-item label="商品id" prop="goodsId">
+                <i-input v-model="footprint.goodsId" placeholder="商品id"/>
+            </Form-item>
+            <Form-item label="记录时间" prop="addTime">
+                <i-input v-model="footprint.addTime" placeholder="记录时间"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/footprint.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 127 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/freight.html

@@ -0,0 +1,127 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+                </i-col>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("freight:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("freight:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("freight:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="freight" :rules="ruleValidate" :label-width="140">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="freight.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="freight.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="模版名称" prop="name">
+                <i-input v-model="freight.name" placeholder="模版名称"/>
+            </Form-item>
+            <Form-item label="模版类型" prop="templateType">
+                <Radio-group v-model="freight.templateType">
+                    <Radio label="0">
+                        <span>买家承担运费</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>卖家包邮</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="计价方式" prop="pricingManner">
+                <Radio-group v-model="freight.pricingManner" @on-change="changeUnit">
+                    <Radio label="0">
+                        <span>按件数</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>按重量</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>按体积</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="配送区域及运费" prop="freightItem">
+                <table class="table table-bordered">
+                    <tr>
+                        <td style="text-align: center; width: 400px">可配送区域</td>
+                        <td id="first" style="text-align: center; width: 100px">首件(个)</td>
+                        <td style="text-align: center; width: 100px">运费</td>
+                        <td id="continue" style="text-align: center; width: 100px">续件(个)</td>
+                        <td style="text-align: center; width: 100px">续费</td>
+                        <!--<td style="text-align: center; width: 90px">操作</td>-->
+                    </tr>
+                    <tr v-for="(item,index) in freightItemEntityList" v-show="item.isDelete==0">
+                        <td>
+                            <Checkbox v-model="item.deliveryArea" disabled />所有地区默认配送
+                        </td>
+                        <td>
+                            <Input-number :min="0" :step="1" v-model="item.firstPiece" style="width: 260px;" />
+                        </td>
+                        <td>
+                            <Input-number :min="0" :step="1" v-model="item.freight" style="width: 260px;" />
+                        </td>
+                        <td>
+                            <Input-number :min="0" :step="1" v-model="item.continuePiece" style="width: 260px;" />
+                        </td>
+                        <td>
+                            <Input-number :min="0" :step="1" v-model="item.renew" style="width: 260px;" />
+                        </td>
+                        <!--<td align="center">
+                            <button v-if="index == 0" class="btn btn-primary btn-sm" type="button"
+                                    @click="addItemRow">
+                                <i class="fa fa-plus"></i>
+                            </button>
+                            <button class="btn red btn-sm" type="button" @click="delItemRow(index)">
+                                <i class="fa fa-trash-o"></i>
+                            </button>
+                        </td>-->
+                    </tr>
+                </table>
+            </Form-item>
+            <Form-item label="" prop="isDefault">
+                <Checkbox v-model="freight.isDefault"/>设为新商品默认模板
+            </Form-item>
+        </i-form>
+        <div style="padding-left: 20px">
+            <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+        </div>
+    </Card>
+</div>
+
+<!-- 选择类型 -->
+<div id="categoryLayer" style="display: none;padding:10px;">
+    <ul id="categoryTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/shop/freight.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 488 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goods.html

@@ -0,0 +1,488 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+    <style>
+        .upload-list {
+            display: inline-block;
+            width: 60px;
+            height: 60px;
+            text-align: center;
+            line-height: 60px;
+            border: 1px solid transparent;
+            border-radius: 4px;
+            overflow: hidden;
+            background: #fff;
+            position: relative;
+            box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
+            margin-right: 4px;
+        }
+
+        .upload-list img {
+            width: 100%;
+            height: 100%;
+        }
+
+        .upload-list-cover {
+            display: none;
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            right: 0;
+            background: rgba(0, 0, 0, .6);
+        }
+
+        .upload-list:hover .upload-list-cover {
+            display: block;
+        }
+
+        .upload-list-cover i {
+            color: #fff;
+            font-size: 20px;
+            cursor: pointer;
+            margin: 0 2px;
+        }
+
+        .hselect {
+            margin: 0;
+            padding: 0;
+        }
+    </style>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="3">
+                    <i-input v-model="q.goodsSn" @on-enter="query" placeholder="商品编码"/>
+                </i-col>
+                <i-col span="3">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.category" placeholder="商品分类" filterable @on-change="changeQueryCategories"
+                              label-in-value>
+                        <i-option v-for="category in queryCategories" :value="category.id"
+                                  :key="category.id">{{category.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="3">
+                    <i-select v-model="q.categoryTwo" placeholder="商品二级分类" filterable label-in-value>
+                        <i-option v-for="category in queryCategoriesTwo" :value="category.id"
+                                  :key="category.id">{{category.name}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group" style="width: 100%;margin-top: 8px; padding-left: 10px;">
+                #if($shiro.hasPermission("goods:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("goods:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("goods:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+                <i-button type="primary" @click="enSale"><i class="fa fa-hand-o-up"></i>&nbsp;上架</i-button>
+                <i-button type="dashed" @click="unSale"><i class="fa fa-hand-o-down"></i>&nbsp;下架</i-button>
+                <!--<i-button type="info" @click="goodsExport"><i class="fa fa-plus"></i>&nbsp;商品导入</i-button>-->
+                <!--<i-button type="info" @click="sameGoodsExport"><i class="fa fa-plus"></i>&nbsp;普货商品导入</i-button>-->
+
+                #if($shiro.hasPermission("goods:upload"))
+                <i-col style="display: inline-grid;">
+                    <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
+                            :format="['xls','xlsx']"
+                            action="../goods/upload">
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">商品导入</i-button>
+                    </Upload>
+                </i-col>
+                #end
+                #if($shiro.hasPermission("goods:generalGoodsUpload"))
+                <i-col style="display: inline-grid;">
+                    <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError" :on-format-error="uploadExcelFormatError"
+                            :format="['xls','xlsx']"
+                            action="../goods/generalGoodsUpload">
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">普货商品导入</i-button>
+                    </Upload>
+                </i-col>
+                #end
+                &nbsp;&nbsp;&nbsp;&nbsp;
+                <a href="file/goods_export_yyyy_mm_dd_v1.0.0.xls">商品模板下载</a>&nbsp;&nbsp;&nbsp;&nbsp;
+                <a href="file/general_goods_export_yyyy_mm_dd_v1.0.0.xls">普货商品模板下载</a>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="140">
+        <Tabs value="name1">
+            <Tab-Pane label="通用信息" name="name1">
+                <Row>
+                    <i-col span="16" style="margin-top: -10px;">
+                        <span style="margin-left: 140px;color: red;font-size: 12px;">* 修改商品二级分类将清空商品参数列表</span>
+                    </i-col>
+                </Row>
+                <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
+                    <Form-item label="商户" prop="merchSn">
+                        <i-select v-model="goods.merchSn" filterable placeholder="商户" @on-change="showMerchInfo" label-in-value>
+                            <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="商品类型" prop="categoryId" style="height: 30px;">
+                        <!--<i-input v-model="goods.categoryName" @on-click="categoryTree" icon="eye" readonly="readonly" placeholder="商品类型"/>-->
+                        <i-select v-model="goods.attributeCategory" placeholder="商品分类" @on-change="changeCategories"
+                                  label-in-value style="width: 268px;height: 30px;">
+                            <i-option v-for="category in categories" :value="category.id"
+                                      :key="category.id">{{category.name}}
+                            </i-option>
+                        </i-select>
+                        <i-select v-model="goods.categoryId" placeholder="商品二级分类" @on-change="getAttributes"
+                                  label-in-value style="width: 268px;height: 30px;">
+                            <i-option v-for="category in categoriesTwo" :value="category.id"
+                                      :key="category.id">{{category.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="商品编码" prop="goodsSn">
+                        <i-input v-model="goods.goodsSn" placeholder="商品编码"/>
+                    </Form-item>
+                    <Form-item label="名称" prop="name">
+                        <i-input v-model="goods.name" placeholder="名称"/>
+                    </Form-item>
+                    <Form-item label="商品单位" prop="goodsUnit">
+                        <i-input v-model="goods.goodsUnit" placeholder="商品单位" style="width: 268px;"/>
+                    </Form-item>
+                    <!--<Form-item label="类别" prop="attributeCategory" style="width: 268px;">
+                        <i-select v-model="goods.attributeCategory" filterable label-in-value>
+                            <i-option v-for="attributeCategory in attributeCategories" :value="attributeCategory.id" :key="attributeCategory.id">{{attributeCategory.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>-->
+                    <Form-item label="SKU" prop="sku">
+                        <i-input v-model="goods.sku" placeholder="SKU" style="width: 268px;"/>
+                    </Form-item>
+                    <Form-item label="产品条码" prop="prodBarcode">
+                        <i-input v-model="goods.prodBarcode" placeholder="产品条码"/>
+                    </Form-item>
+                    <Form-item label="货品业务类型" prop="goodsBizType" >
+                        <i-select v-model="goods.goodsBizType" filterable placeholder="货品业务类型"
+                                  label-in-value style="width: 268px;" @on-change="changeGoodsBizType">
+                            <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="品牌" prop="brandId">
+                        <i-select v-model="goods.brandId" placeholder="品牌"
+                                  label-in-value style="width: 268px;">
+                            <i-option v-for="brand in brands" :value="brand.id" :key="brand.id">{{brand.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                <Form-item label="供应商" prop="supplierId">
+                    <i-select v-model="goods.supplierId" placeholder="供应商"
+                              label-in-value style="width: 268px;">
+                        <i-option v-for="supplier in suppliers" :value="supplier.id" :key="supplier.id">{{supplier.childSupplierName}}
+                        </i-option>
+                    </i-select>
+                </Form-item>
+                    <Form-item label="运费模版" prop="freightId">
+                        <i-select v-model="goods.freightId" placeholder="运费模版"
+                                  label-in-value style="width: 268px;">
+                            <i-option v-for="freight in freights" :value="freight.id" :key="freight.id">{{freight.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="市场价" prop="marketPrice">
+                        <Input-number :min="0.1" :step="0.01" v-model="goods.marketPrice" placeholder="市场价" style="width: 268px;"/>
+                    </Form-item>
+                    <Form-item label="零售价" prop="retailPrice">
+                        <Input-number :min="0.1" :step="0.01" v-model="goods.retailPrice" placeholder="零售价" style="width: 268px;"/>
+                    </Form-item>
+                    <Form-item label="商品税率(0.00)" prop="goodsRate">
+                        <Input-number :min="0.001" :step="0.001" v-model="goods.goodsRate" placeholder="商品税率" style="width: 268px;"/>
+                    </Form-item>
+                    <Row>
+                        <i-col span="16">
+                            <Form-item label="商品主图" prop="primaryPicUrl">
+                                <i-input v-model="goods.primaryPicUrl" placeholder="商品主图" readonly/>
+                            </Form-item>
+                        </i-col>
+                        <i-col span="4">
+                            <Form-item :label-width="1">
+                                <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                        max-size="2048"
+                                        :on-success="handleSuccessPicUrl" :on-format-error="handleFormatError"
+                                        :show-upload-list="false"
+                                        :on-exceeded-size="handleMaxSize">
+                                    <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                                </Upload>
+                            </Form-item>
+                        </i-col>
+                        <i-col span="4">
+                            <Form-item :label-width="1">
+                                <i-button icon="eye" @click="eyeImagePicUrl">预览图片</i-button>
+                            </Form-item>
+                        </i-col>
+                    </Row>
+                    <Row>
+                        <i-col span="16" style="margin-top: -30px;">
+                            <span style="margin-left: 140px;color: red;font-size: 12px;">* 尺寸建议200x200(正方形模式)像素以内,大小2M以下</span>
+                        </i-col>
+                    </Row>
+                    <Row>
+                        <i-col span="16">
+                            <Form-item label="商品列表图" prop="listPicUrl">
+                                <i-input v-model="goods.listPicUrl" placeholder="商品列表图" readonly/>
+                            </Form-item>
+                        </i-col>
+                        <i-col span="4">
+                            <Form-item :label-width="1">
+                                <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                        max-size="2048"
+                                        :on-success="handleSuccessListPicUrl" :on-format-error="handleFormatError"
+                                        :show-upload-list="false"
+                                        :on-exceeded-size="handleMaxSize">
+                                    <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                                </Upload>
+                            </Form-item>
+                        </i-col>
+                        <i-col span="4">
+                            <Form-item :label-width="1">
+                                <i-button icon="eye" @click="eyeImageListPicUrl">预览图片</i-button>
+                            </Form-item>
+                        </i-col>
+                    </Row>
+                    <Row>
+                        <i-col span="16" style="margin-top: -30px;">
+                            <span style="margin-left: 140px;color: red;font-size: 12px;">* 尺寸建议200x200(正方形模式)像素以内,大小2M以下</span>
+                        </i-col>
+                    </Row>
+                <Row>
+                    <i-col span="16">
+                        <Form-item label="上传视频" prop="listPicUrl">
+                            <i-input v-model="goods.videoUrl" placeholder="主视频" readonly/>
+                        </Form-item>
+                    </i-col>
+                    <i-col span="4">
+                        <Form-item :label-width="1">
+                            <Upload style="width: 300px;" action="../sys/oss/upload" :format="['mp4']"
+                                    max-size="2048"
+                                    :on-success="handleSuccessListVideoUrl" :on-format-error="handleVideoFormatError"
+                                    :show-upload-list="false"
+                                    :on-exceeded-size="handleVideoMaxSize">
+                                <i-button icon="ios-cloud-upload-outline">本地上传</i-button>
+                            </Upload>
+                        </Form-item>
+                    </i-col>
+                    <i-col span="4">
+                        <Form-item :label-width="1">
+                            <i-button icon="eye" @click="eyeImageListVideoUrl">预览视频</i-button>
+                        </Form-item>
+                    </i-col>
+                </Row>
+                <Row>
+                    <i-col span="16" style="margin-top: -30px;">
+                            <span style="margin-left: 140px;color: red;font-size: 12px;">* 视频不能超过10M,视频时限20秒内,支持mp4视频格式</span>
+                    </i-col>
+                </Row>
+                <!--</i-form>-->
+            </Tab-Pane>
+            <Tab-Pane label="海关信息" name="name2">
+                <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
+                    <Form-item label="产品品牌" prop="brand">
+                        <i-input v-model="goods.brand" placeholder="产品品牌"/>
+                    </Form-item>
+                    <Form-item label="海关备案编号" prop="cusRecCode">
+                        <i-input v-model="goods.cusRecCode" placeholder="海关备案编号"/>
+                    </Form-item>
+                    <Form-item label="计量单位" prop="unitCode">
+                        <i-select v-model="goods.unitCode" filterable placeholder="计量单位"
+                                  label-in-value>
+                            <i-option v-for="cusUnitCode in cusUnitCodeList" :value="cusUnitCode.code" :key="cusUnitCode.sn">{{cusUnitCode.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="海关商品编码" prop="cusGoodsCode">
+                        <i-input v-model="goods.cusGoodsCode" placeholder="海关商品编码"/>
+                    </Form-item>
+                    <Form-item label="国检规格型号" prop="ciqProdModel" >
+                        <i-input v-model="goods.ciqProdModel" placeholder="国检规格型号"/>
+                    </Form-item>
+                    <Form-item label="原产国" prop="oriCntCode">
+                        <i-select v-model="goods.oriCntCode" filterable placeholder="原产国"
+                                  label-in-value>
+                            <i-option v-for="cusNationCode in cusNationCodeList" :value="cusNationCode.code" :key="cusNationCode.sn">{{cusNationCode.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="海关申报要素" prop="cusDeclEle">
+                        <i-input v-model="goods.cusDeclEle" placeholder="海关申报要素"/>
+                    </Form-item>
+                <!--</i-form>-->
+            </Tab-Pane>
+            <!--<Tab-Pane label="规格" name="name3">
+                &lt;!&ndash;<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">&ndash;&gt;
+                    <table class="table table-bordered">
+                        <tr>
+                            <td style="text-align: center; width: 200px">编码</td>
+                            <td style="text-align: center; width: 100px">商品默认</td>
+                            &lt;!&ndash;<td style="text-align: center; width: 100px">规格</td>&ndash;&gt;
+                            <td style="text-align: center;">规格说明</td>
+                            <td style="text-align: center; width: 90px">操作</td>
+                        </tr>
+                        <tr v-for="(item,index) in productEntityList" v-show="item.isDelete==0">
+                            <td>
+                                <i-input v-model="item.goodsSn" placeholder="商品编码"/>
+                            </td>
+                            <td>
+                                <select class="hselect" v-model="item.goodsDefault" filterable label-in-value>
+                                    <option value="1">是</option>
+                                    <option value="0">否</option>
+                                </select>
+                            </td>
+                            <td>
+                                <i-input v-model="item.goodsSpecificationNameValue" placeholder="规格说明"/>
+                            </td>
+                            <td>
+                                <button v-if="index == 0" class="btn btn-primary btn-sm" type="button"
+                                        @click="addSpeRow">
+                                    <i class="fa fa-plus"></i>
+                                </button>
+                                <button class="btn red btn-sm" type="button" @click="delSpeRow(index)">
+                                    <i class="fa fa-trash-o"></i>
+                                </button>
+                            </td>
+                        </tr>
+                    </table>
+                &lt;!&ndash;</i-form>&ndash;&gt;
+            </Tab-Pane>-->
+            <Tab-Pane label="详细描述" name="name4">
+                <template>
+                    <div class="upload-list" v-for="item in uploadList">
+                        <template v-if="item.status === 'finished'">
+                            <img :src="item.imgUrl"/>
+                            <div class="upload-list-cover">
+                                <Icon type="ios-eye-outline" @click.native="handleView(item.imgUrl)"></Icon>
+                                <Icon type="ios-trash-outline" @click.native="handleRemove(item)"></Icon>
+                            </div>
+                        </template>
+                        <template v-else>
+                            <Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
+                        </template>
+                    </div>
+                    <Upload
+                            ref="upload"
+                            :show-upload-list="false"
+                            :default-file-list="uploadList"
+                            :on-success="handleSuccess"
+                            :format="['jpg','jpeg','png']"
+                            :max-size="2048"
+                            :on-format-error="handleFormatError"
+                            :on-exceeded-size="handleMaxSize"
+                            :before-upload="handleBeforeUpload"
+                            multiple
+                            type="drag"
+                            action="../sys/oss/upload"
+                            style="display: inline-block;width:58px;">
+                        <div style="width: 58px;height:58px;line-height: 58px;">
+                            <Icon type="camera" size="20"></Icon>
+                        </div>
+                    </Upload>
+                    <Modal title="查看图片" v-model="visible">
+                        <img :src="imgName" v-if="visible" style="width: 100%"/>
+                    </Modal>
+                    <span style="color: red;font-size: 12px;">* 商品详情轮播图,尺寸建议750x750(正方形模式)像素以内,大小2M以下</span>
+                </template>
+                <div id="goodsDesc"></div>
+            </Tab-Pane>
+            <Tab-Pane label="参数" name="name5">
+                <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
+                    <div v-for="(item,index) in attributeEntityList" v-show="item.isDelete==0">
+                        <div class="row">
+                            <div class="col-md-3">
+                                <label class="ivu-form-item-label">属性:</label>
+                                <div class="col-md-7 input-icon right">
+                                    <i-select v-model="item.attributeId" filterable>
+                                        <i-option v-for="attribute in attributes" :value="attribute.id"
+                                                  :key="attribute.id">{{attribute.name}}
+                                        </i-option>
+                                    </i-select>
+                                </div>
+                            </div>
+                            <div class="col-md-3">
+                                <label class="ivu-form-item-label">属性值:</label>
+                                <div class="col-md-7 input-icon right">
+                                    <i-input type="text" v-model="item.value"/>
+                                </div>
+                            </div>
+                            <button v-if="index == 0" class="btn btn-primary btn-sm" type="button" @click="addAttrRow">
+                                <i class="fa fa-plus"></i>
+                            </button>
+                            <button class="btn red btn-sm" type="button" @click="delAttrRow(index)">
+                                <i class="fa fa-trash-o"></i>
+                            </button>
+                        </div>
+                    </div>
+                <!--</i-form>-->
+            </Tab-Pane>
+            <Tab-Pane label="其他信息" name="name6">
+                <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">-->
+                    <Form-item label="排序" prop="sortOrder">
+                        <Input-number :min="1" :step="1" v-model="goods.sortOrder" placeholder="排序" style="width: 188px;"/>
+                    </Form-item>
+                    <Form-item label="上架" prop="isOnSale">
+                        <Radio-group v-model="goods.isOnSale">
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item v-if="showInput" label="热销" prop="isHot">
+                        <Radio-group v-model="goods.isHot">
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="推广描述" prop="promotionDesc">
+                        <i-input v-model="goods.promotionDesc" placeholder="推广描述"/>
+                    </Form-item>
+                    <Form-item label="简明介绍" prop="goodsBrief">
+                        <i-input v-model="goods.goodsBrief" placeholder="简明介绍"/>
+                    </Form-item>
+                <!--</i-form>-->
+            </Tab-Pane>
+        </Tabs>
+        </i-form>
+        <div style="padding-left: 20px">
+            <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
+        </div>
+    </Card>
+</div>
+
+<!-- 选择类型 -->
+<div id="categoryLayer" style="display: none;padding: 10px;">
+    <ul id="categoryTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/shop/goods.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 50 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsattribute.html

@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="buttons-group">
+                #if($shiro.hasPermission("goodsattribute:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("goodsattribute:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("goodsattribute:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="goodsAttribute" :rules="ruleValidate" :label-width="80">
+            <Form-item label="所属" prop="attributeId" style="width: 268px;">
+                <i-select v-model="goodsAttribute.attributeId" filterable>
+                    <i-option v-for="attribute in attributes" :value="attribute.id" :key="attribute.id">{{attribute.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="属性值" prop="value">
+                <i-input v-model="goodsAttribute.value" placeholder="属性值"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/goodsattribute.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 142 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsgroup.html

@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.title" @on-enter="query" placeholder="标题"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.subtitle" @on-enter="query" placeholder="子标题"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.goodsName" @on-enter="query" placeholder="商品名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                <i-button type="info" @click="toRecord">&nbsp;团购记录</i-button>
+                #if($shiro.hasPermission("goodsgroup:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("goodsgroup:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("goodsgroup:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="goodsGroup" :rules="ruleValidate" :label-width="100">
+            <Form-item label="团购主题" prop="title">
+                <i-input v-model="goodsGroup.title" placeholder="团购主题"/>
+            </Form-item>
+            <Form-item label="子标题" prop="subtitle">
+                <i-input v-model="goodsGroup.subtitle" placeholder="子标题"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="活动图片" prop="itemPicUrl">
+                        <i-input v-model="goodsGroup.itemPicUrl" placeholder="活动条例图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccess" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImage">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="缩列图" prop="abbrPicUrl">
+                        <i-input v-model="goodsGroup.abbrPicUrl" placeholder="缩列图" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleAbbrSuccess" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeAbbrImage">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="广告语" prop="adDesc">
+                <i-input type="textarea" v-model="goodsGroup.adDesc" placeholder="广告语"/>
+            </Form-item>
+            <!--<Form-item label="开团次数" prop="launchNum">-->
+                <!--<Input-number :min="0" v-model="goodsGroup.launchNum" placeholder="开团次数" style="width: 188px;"/>-->
+            <!--</Form-item>-->
+            <Form-item label="商品" prop="goodsId">
+                <i-select v-model="goodsGroup.goodsId" filterable style="width: 188px;">
+                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="最低开团人数" prop="minOpenGroup">
+                <Input-number :min="0" :step="1" v-model="goodsGroup.minOpenGroup" placeholder="最低开团人数"
+                              style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="团购价格" prop="retailMinPrice">
+                <i-input v-model="goodsGroup.retailMinPrice" placeholder="团购价格"/>
+            </Form-item>
+            <Form-item label="开团时间" prop="openTime">
+                <Date-picker v-model="goodsGroup.openTime" placeholder="开团时间"/>
+            </Form-item>
+            <Form-item label="结束时间" prop="endTime">
+                <Date-picker v-model="goodsGroup.endTime" placeholder="结束时间"/>
+            </Form-item>
+            <Form-item label="状态" prop="openStatus">
+                <i-select v-model="goodsGroup.openStatus" style="width: 188px;">
+                    <i-option v-for="status in selStatus" :value="status.id" :key="status.id">{{status.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="开团有效期" prop="validDays">
+                <i-input v-model="goodsGroup.validDays" placeholder="开团有效期"/>
+            </Form-item>
+            <Form-item label="排序" prop="sortOrder">
+                <Input-number :min="0" v-model="goodsGroup.sortOrder" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/goodsgroup.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 27 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsgroupopen.html

@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("goodsgroup:update"))
+                <i-button type="warning" @click="cancelGroup"><i class="fa fa-pencil-square-o"></i>&nbsp;取消团购</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+</div>
+
+<script src="${rc.contextPath}/js/shop/goodsgroupopen.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 31 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goodshistory.html

@@ -0,0 +1,31 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("goods:back"))
+                <i-button type="warning" @click="back"><i class="fa fa-pencil-square-o"></i>&nbsp;恢复</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+</div>
+
+<script src="${rc.contextPath}/js/shop/goodshistory.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 64 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsissue.html

@@ -0,0 +1,64 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.question" @on-enter="query" placeholder="问题"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("goodsissue:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("goodsissue:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("goodsissue:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="goodsIssue" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="goodsIssue.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="goodsIssue.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="问题" prop="question">
+                <i-input v-model="goodsIssue.question" placeholder="问题"/>
+            </Form-item>
+            <Form-item label="回答" prop="answer">
+                <i-input v-model="goodsIssue.answer" placeholder="回答"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/goodsissue.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 86 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/goodsspecification.html

@@ -0,0 +1,86 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>商品对应规格表值表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("goodsspecification:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("goodsspecification:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("goodsspecification:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="goodsSpecification" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商品" prop="goodsId">
+                <i-select v-model="goodsSpecification.goodsId" filterable style="width: 288px;">
+                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="规格" prop="specificationId" style="width: 368px;">
+                <i-select v-model="goodsSpecification.specificationId" filterable label-in-value>
+                    <i-option v-for="specification in specifications" :value="specification.id"
+                              :key="specification.id">{{specification.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="规格说明" prop="value">
+                <i-input type="textarea" v-model="goodsSpecification.value" placeholder="规格说明"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="规格图片" prop="picUrl">
+                        <i-input v-model="goodsSpecification.picUrl" placeholder="规格图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccess" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImage">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/goodsspecification.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 74 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/helpissue.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.typeName" @on-enter="query" placeholder="问题分类"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("helpissue:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("helpissue:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("helpissue:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="helpIssue" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="helpIssue.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="helpIssue.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="问题分类" prop="typeId">
+                <i-select v-model="helpIssue.typeId" filterable style="width: 188px;">
+                    <i-option v-for="helpType in helpTypes" :value="helpType.id" :key="helpType.id">{{helpType.typeName}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="问" prop="question">
+                <i-input v-model="helpIssue.question" placeholder="问题"/>
+            </Form-item>
+            <Form-item label="答" prop="answer">
+                <i-input type="textarea" v-model="helpIssue.answer" placeholder="回答"/>
+            </Form-item>
+            <Form-item label="排序" prop="sort">
+                <Input-number :min="0" v-model="helpIssue.sort" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/helpissue.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 55 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/helptype.html

@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.typeName" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("helptype:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("helptype:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("helptype:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="helpType" :rules="ruleValidate" :label-width="80">
+            <Form-item label="问题分类" prop="typeName">
+                <i-input v-model="helpType.typeName" placeholder="问题分类"/>
+            </Form-item>
+            <Form-item label="排序" prop="sort">
+                <Input-number :min="0" v-model="helpType.sort" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/helptype.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 97 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/keywords.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>关键词</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.keyword" @on-enter="query" placeholder="关键词"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("keywords:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("keywords:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("keywords:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="keywords" :rules="ruleValidate" :label-width="80">
+            <Form-item label="关键词" prop="keyword">
+                <i-input v-model="keywords.keyword" placeholder="关键词"/>
+            </Form-item>
+            <Form-item label="热销" prop="isHot">
+                <Radio-group v-model="keywords.isHot">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="默认" prop="isDefault">
+                <Radio-group v-model="keywords.isDefault">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="显示" prop="isShow">
+                <Radio-group v-model="keywords.isShow">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="排序" prop="sortOrder">
+                <i-input v-model="keywords.sortOrder" placeholder="排序"/>
+            </Form-item>
+            <Form-item label="跳转链接" prop="schemeUrl">
+                <i-input v-model="keywords.schemeUrl" placeholder="关键词的跳转链接"/>
+            </Form-item>
+            <Form-item label="类型" prop="type">
+                <Radio-group v-model="keywords.type">
+                    <Radio label="0">
+                        <span>0</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>1</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/keywords.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 76 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/merch.html

@@ -0,0 +1,76 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="3">
+                    <i-input v-model="q.merchName" @on-enter="query" placeholder="商户名称"/>
+                </i-col>
+                <i-col span="3">
+                    <i-input v-model="q.merchSn" @on-enter="query" placeholder="商户编号"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("merch:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("merch:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("merch:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="merch" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商户编号" prop="merchSn">
+                <i-input v-model="merch.merchSn" placeholder="商户编号"/>
+            </Form-item>
+            <Form-item label="商户名称" prop="merchName">
+                <i-input v-model="merch.merchName" placeholder="商户名称"/>
+            </Form-item>
+            <Form-item label="商户简称" prop="merchShortName">
+                <i-input v-model="merch.merchShortName" placeholder="商户简称"/>
+            </Form-item>
+            <Form-item label="排序" prop="sortOrder">
+                <i-input v-model="merch.sortOrder" placeholder="排序"/>
+            </Form-item>
+            <Form-item label="显示" prop="isShow">
+                <Radio-group v-model="merch.isShow">
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input v-model="merch.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/merch.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 258 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/offilineOrderList.html

@@ -0,0 +1,258 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showDiv == 1">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.orderSn" @on-enter="query" placeholder="订单号"/>
+                </i-col>
+                <i-col span="4">
+                    <i-select v-model="q.orderStatus" placeholder="订单状态">
+                        <i-option value="0">待付款</i-option>
+                        <i-option value="101">订单已取消</i-option>
+                        <i-option value="102">订单已删除</i-option>
+                        <i-option value="201">订单已付款</i-option>
+                        <i-option value="300">订单已发货</i-option>
+                        <i-option value="301">用户确认收货</i-option>
+                        <i-option value="401">退款</i-option>
+                        <i-option value="402">完成</i-option>
+                    </i-select>
+                </i-col>
+                <!--<i-col span="4">
+                    <i-select v-model="q.orderType">
+                        <i-option value="1">普通订单</i-option>
+                        <i-option value="2">团购订单</i-option>
+                    </i-select>
+                </i-col>-->
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            #if($shiro.hasPermission("order:wxMicropayPay"))
+            <div class="buttons-group">
+                <i-button type="error" @click="showInputAuthCode">微信付款</i-button>
+            </div>
+            #end
+            #if($shiro.hasPermission("order:confirmPay"))
+            <div class="buttons-group">
+                <i-button type="error" @click="confirm">现金付款</i-button>
+            </div>
+            #end
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="showDiv == 2">
+        <p slot="title" style="height: auto">{{title}}</p>
+        <Tabs>
+            <Tab-Pane label="订单信息" name="name1">
+                <i-form ref="formValidate" :model="order" :label-width="100">
+                    <Form-item label="订单号" prop="orderSn">
+                        <i-input v-model="order.orderSn" readonly/>
+                    </Form-item>
+                    <Form-item label="会员" prop="userName">
+                        <i-input v-model="order.userName" readonly/>
+                    </Form-item>
+                    <Form-item label="订单业务类型" prop="orderBizType" >
+                        <i-select v-model="order.orderBizType" filterable placeholder="订单业务类型"
+                                  label-in-value disabled>
+                            <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="订单状态" prop="orderStatus" readonly>
+                        <Radio-group v-model="order.orderStatus">
+                            <Radio label="0" disabled>
+                                <span>待付款</span>
+                            </Radio>
+                            <Radio label="101" disabled>
+                                <span>订单已取消</span>
+                            </Radio>
+                            <Radio label="102" disabled>
+                                <span>订单已删除</span>
+                            </Radio>
+                            <Radio label="201" disabled>
+                                <span>订单已付款</span>
+                            </Radio>
+                            <Radio label="300" disabled>
+                                <span>订单已发货</span>
+                            </Radio>
+                            <Radio label="301" disabled>
+                                <span>用户确认收货</span>
+                            </Radio>
+                            <Radio label="401" disabled>
+                                <span>退款</span>
+                            </Radio>
+                            <Radio label="402" disabled>
+                                <span>完成</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <!--<Form-item label="发货状态" prop="shippingStatus">-->
+                        <!--<Radio-group v-model="order.shippingStatus">-->
+                            <!--<Radio label="0" disabled>-->
+                                <!--<span>待发货</span>-->
+                            <!--</Radio>-->
+                            <!--<Radio label="1" disabled>-->
+                                <!--<span>已发货</span>-->
+                            <!--</Radio>-->
+                            <!--<Radio label="2" disabled>-->
+                                <!--<span>已收货</span>-->
+                            <!--</Radio>-->
+                            <!--<Radio label="4" disabled>-->
+                                <!--<span>退货</span>-->
+                            <!--</Radio>-->
+                        <!--</Radio-group>-->
+                    <!--</Form-item>-->
+                    <Form-item label="付款状态" prop="payStatus">
+                        <Radio-group v-model="order.payStatus">
+                            <Radio label="0" disabled>
+                                <span>待付款</span>
+                            </Radio>
+                            <Radio label="1" disabled>
+                                <span>付款中</span>
+                            </Radio>
+                            <Radio label="2" disabled>
+                                <span>已付款</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <!--<Form-item label="收货人" prop="consignee">-->
+                        <!--<i-input v-model="order.consignee" readonly/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="收货地址" prop="address">-->
+                        <!--<i-input v-model="order.address" readonly/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="联系电话" prop="mobile">-->
+                        <!--<i-input v-model="order.mobile" readonly/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="客户留言" prop="postscript">-->
+                        <!--<i-input v-model="order.postscript" readonly/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="快递公司" prop="shippingName">-->
+                        <!--<i-input v-model="order.shippingName" readonly/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="配送单号" prop="shippingNo">-->
+                        <!--<i-input v-model="order.shippingNo" readonly/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="配送费用" prop="shippingFee">-->
+                        <!--<i-input v-model="order.shippingFee" readonly/>-->
+                    <!--</Form-item>-->
+                    <Form-item label="实际支付" prop="actualPrice">
+                        <i-input v-model="order.actualPrice" readonly/>
+                    </Form-item>
+                    <Form-item label="订单总价" prop="orderPrice">
+                        <i-input v-model="order.orderPrice" readonly/>
+                    </Form-item>
+                    <Form-item label="商品总价" prop="goodsPrice">
+                        <i-input v-model="order.goodsPrice" readonly/>
+                    </Form-item>
+                    <Form-item label="下单时间" prop="addTime">
+                        <Date-picker format="yyyy-MM-dd HH:mm:ss" v-model="order.addTime" placeholder="使用时间" readonly/>
+                    </Form-item>
+                    <!--<Form-item label="付款时间" prop="payTime">-->
+                        <!--<Date-picker format="yyyy-MM-dd HH:mm:ss" v-model="order.payTime" placeholder="使用时间" readonly/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="配送费用" prop="freightPrice">-->
+                        <!--<i-input v-model="order.freightPrice" readonly/>-->
+                    <!--</Form-item>-->
+                    <Form-item>
+                        <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                        返回</i-button>
+                    </Form-item>
+                </i-form>
+            </Tab-Pane>
+            <Tab-Pane label="商品" name="name2">
+                <table class="table">
+                    <tr>
+                        <td style="text-align: left; width: 600px; font-weight: bold;" colspan="2">商品</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">小计</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">优惠抵扣金额(元)</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">应收金额(元)</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">实收金额(元)</td>
+                    </tr>
+                    <tr v-for="(item,index) in orderGoodsList">
+                        <td width="120px">
+                            <img :src="item.listPicUrl" width="100px" height="100px" />
+                        </td>
+                        <td>
+                            <p style="line-height: 30px;">{{item.goodsName}}</p>
+                            <p style="line-height: 30px;">数量:{{item.number}}</p>
+                            <p style="line-height: 30px;">单价:¥{{item.retailPrice}}</p>
+                            <p style="line-height: 30px;">SKU:{{item.sku}}</p>
+                        </td>
+                        <td align="center">¥{{item.number * item.retailPrice}}</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                    </tr>
+                    <tr>
+                        <td align="left" style="font-weight: bold;">运费</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                        <td align="center">¥{{order.freightPrice}}</td>
+                        <td align="center">-</td>
+                    </tr>
+                    <tr>
+                        <td align="left" colspan="2" style="font-weight: bold;">总计</td>
+                        <td align="center">¥{{order.orderPrice}}</td>
+                        <td align="center">¥{{order.couponPrice}}</td>
+                        <td align="center">¥{{order.actualPrice}}</td>
+                        <td align="center" v-show="order.payStatus == 0">未付款</td>
+                        <td align="center" v-show="order.payStatus == 1">付款中</td>
+                        <td align="center" v-show="order.payStatus == 2 || order.payStatus == 4">¥{{order.actualPrice}}</td>
+                    </tr>
+                </table>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            </Tab-Pane>
+            <Tab-Pane label="支付记录" name="name3">
+                <table class="table">
+                    <tr>
+                        <td style="text-align: left; width: 240px; font-weight: bold;">支付编号</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">支付金额(分)</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">交易状态</td>
+                        <td style="text-align: center; width: 600px; font-weight: bold;">描述</td>
+                    </tr>
+                    <tr v-for="(item,index) in payRecordList">
+                        <td align="left">{{item.outTradeNoWX}}</td>
+                        <td align="center">{{item.totalFee}}</td>
+                        <td align="center" v-show="item.tradeState == 'SUCCESS'">支付成功</td>
+                        <td align="center" v-show="item.tradeState == 'REFUND'">转入退款</td>
+                        <td align="center" v-show="item.tradeState == 'NOTPAY'">未支付</td>
+                        <td align="center" v-show="item.tradeState == 'CLOSED'">已关闭</td>
+                        <td align="center" v-show="item.tradeState == 'REVOKED'">已撤销</td>
+                        <td align="center" v-show="item.tradeState == 'USERPAYING'">用户支付中</td>
+                        <td align="center" v-show="item.tradeState == 'PAYERROR'">支付失败</td>
+                        <td align="center">{{item.errCodeDes}}</td>
+                    </tr>
+                </table>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            </Tab-Pane>
+        </Tabs>
+    </Card>
+
+    <Card v-show="showDiv == 5">
+        <p slot="title">退款</p>
+        <i-form :model="order" :label-width="100">
+            <Form-item label="退款金额" prop="refundMoney">
+                <i-input v-model="refundMoney" placeholder="退款金额"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="refundUpdate">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+
+</div>
+<script src="${rc.contextPath}/js/shop/offilineOrderList.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 437 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/order.html

@@ -0,0 +1,437 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showDiv == 1">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.orderSn" @on-enter="query" placeholder="订单号"/>
+                </i-col>
+                <i-col span="4">
+                    <i-select v-model="q.orderStatus" placeholder="订单状态">
+                        <i-option value="0">待付款</i-option>
+                        <i-option value="101">订单已取消</i-option>
+                        <i-option value="102">订单已删除</i-option>
+                        <i-option value="201">订单已付款</i-option>
+                        <i-option value="300">订单已发货</i-option>
+                        <i-option value="301">用户确认收货</i-option>
+                        <i-option value="401">退款</i-option>
+                        <i-option value="402">完成</i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="4">
+                    <i-select v-model="q.payFlag" placeholder="支付方式">
+                        <i-option value="weixin">微信</i-option>
+                        <i-option value="pingan">平安支付</i-option>
+                        <i-option value="wxglobalpay">微信国际支付</i-option>
+                    </i-select>
+                </i-col>
+                <!--<i-col span="4">
+                    <i-select v-model="q.orderType">
+                        <i-option value="1">普通订单</i-option>
+                        <i-option value="2">团购订单</i-option>
+                    </i-select>
+                </i-col>-->
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("order:getProcess"))
+                <i-button type="success" @click="getProcess">查看清关信息</i-button>
+                #end
+                #if($shiro.hasPermission("order:getLogistics"))
+                <i-button type="warning" @click="getLogistics">查看快递信息</i-button>
+                #end
+                #if($shiro.hasPermission("order:confirm"))
+                <i-button type="error" @click="confirm">确认收货</i-button>
+                #end
+                <i-button type="info" @click="openComment">评价</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="showDiv == 7">
+        <p slot="title">清关信息</p>
+        <i-form :label-width="150">
+            <!--<Timeline style="margin-left: 100px;">-->
+                <!--<Timeline-item>-->
+                    <!--<p class="time">订单编号: {{orderProcessRecordEntity.orderSn}}</p>-->
+                    <!--<p class="content">下单开始时间:{{orderProcessRecordEntity.addOrderStartTimeStr}}</p>-->
+                    <!--<p class="content">下单成功时间:{{orderProcessRecordEntity.addOrderSuccTimeStr}}</p>-->
+                    <!--<p class="content">下单状态:{{orderProcessRecordEntity.isAddOrderSend==1?"成功":""}}-->
+                        <!--{{orderProcessRecordEntity.isAddOrderSend==0?"失败":""}}-->
+                        <!--{{orderProcessRecordEntity.isAddOrderSend==2?"下单中":""}}</p>-->
+                <!--</Timeline-item>-->
+                <!--<Timeline-item>-->
+                    <!--<p class="time">支付单号: {{orderProcessRecordEntity.payTransactionId}}</p>-->
+                    <!--<p class="content">支付开始时间:{{orderProcessRecordEntity.payStartTimeStr}}</p>-->
+                    <!--<p class="content">支付成功时间:{{orderProcessRecordEntity.paySuccTimeStr}}</p>-->
+                <!--</Timeline-item>-->
+                <!--<Timeline-item>-->
+                    <!--<p class="time">支付单开始时间:{{orderProcessRecordEntity.paymentStartTimeStr}}</p>-->
+                    <!--<p class="time">支付单成功时间:{{orderProcessRecordEntity.paymentSuccTimeStr}}</p>-->
+                    <!--<p class="content">支付单状态:{{orderProcessRecordEntity.isPaymentSend==1?"成功":""}}-->
+                        <!--{{orderProcessRecordEntity.isPaymentSend==0?"失败":""}}-->
+                        <!--{{orderProcessRecordEntity.isPaymentSend==2?"下单中":""}}</p>-->
+                <!--</Timeline-item>-->
+            <!--</Timeline>-->
+            <Form-item label="订单编号:" prop="orderSn" style="height: 14px">
+                {{orderProcessRecordEntity.orderSn}}
+            </Form-item>
+            <Form-item label="下单开始时间:" prop="addOrderStartTime" style="height: 14px">
+                {{orderProcessRecordEntity.addOrderStartTimeStr}}
+            </Form-item>
+            <Form-item label="下单成功时间:" prop="addOrderSuccTime" style="height: 14px">
+                {{orderProcessRecordEntity.addOrderSuccTimeStr}}
+            </Form-item>
+            <Form-item label="下单状态:" prop="isAddOrderSend" style="height: 14px">
+                <Radio-group v-model="orderProcessRecordEntity.isAddOrderSend">
+                    <Radio label="0">
+                        <span>失败</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>成功</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>下单中</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <div style="padding-top:10px;">
+            <Form-item label="支付单号:" prop="payTransactionId" style="margin-top:10px;height: 14px">
+                {{orderProcessRecordEntity.payTransactionId}}
+            </Form-item>
+            <Form-item label="支付开始时间:" prop="payStartTime" style="height: 14px">
+                {{orderProcessRecordEntity.payStartTimeStr}}
+            </Form-item>
+            <Form-item label="支付成功时间:" prop="paySuccTime" style="height: 14px">
+                {{orderProcessRecordEntity.paySuccTimeStr}}
+            </Form-item>
+            </div>
+
+            <div style="padding-top:10px;">
+            <Form-item label="海关支付单开始时间:" prop="paymentStartTime" style="margin-top:10px;height: 14px">
+                {{orderProcessRecordEntity.paymentStartTimeStr}}
+            </Form-item>
+            <Form-item label="海关支付单成功时间:" prop="paymentSuccTime" style="height: 14px">
+                {{orderProcessRecordEntity.paymentSuccTimeStr}}
+            </Form-item>
+            <Form-item label="海关支付单状态:" prop="isPaymentSend" style="height: 14px">
+                <Radio-group v-model="orderProcessRecordEntity.isPaymentSend">
+                    <Radio label="0">
+                        <span>失败</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>成功</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>支付单申报中</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            </div>
+
+            <div style="padding-top:10px;">
+            <Form-item label="电子订单开始时间:" prop="eleOrderStartTime" style="margin-top:10px;height: 14px">
+                {{orderProcessRecordEntity.eleOrderStartTimeStr}}
+            </Form-item>
+            <Form-item label="电子订单成功时间:" prop="eleOrderSuccTime" style="height: 14px">
+                {{orderProcessRecordEntity.eleOrderSuccTimeStr}}
+            </Form-item>
+            <Form-item label="电子订单状态:" prop="isEleOrderSend" style="height: 14px">
+                <Radio-group v-model="orderProcessRecordEntity.isEleOrderSend">
+                    <Radio label="0">
+                        <span>失败</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>成功</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>电子订单申报中</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            </div>
+
+            <div style="padding-top:10px;">
+            <Form-item label="运单编号:" prop="logisticsNo" style="margin-top:10px;height: 14px">
+                {{orderProcessRecordEntity.logisticsNo}}
+            </Form-item>
+            <Form-item label="运单开始时间:" prop="waybillStartTime" style="height: 14px">
+                {{orderProcessRecordEntity.waybillStartTimeStr}}
+            </Form-item>
+            <Form-item label="运单成功时间:" prop="waybillSuccTime" style="height: 14px">
+                {{orderProcessRecordEntity.waybillSuccTimeStr}}
+            </Form-item>
+            </div>
+
+            <div style="padding-top:10px;">
+            <Form-item label="清单编号:" prop="invtNo" style="margin-top:10px;height: 14px">
+                {{orderProcessRecordEntity.invtNo}}
+            </Form-item>
+            <Form-item label="清单开始时间:" prop="customsStartTime" style="height: 14px">
+                {{orderProcessRecordEntity.customsStartTimeStr}}
+            </Form-item>
+            <Form-item label="清单成功时间:" prop="customsSuccTime" style="height: 14px">
+                {{orderProcessRecordEntity.customsSuccTimeStr}}
+            </Form-item>
+            <Form-item label="清关状态:" prop="isCustomsSend" style="height: 14px">
+                <Radio-group v-model="orderProcessRecordEntity.isCustomsSend">
+                    <Radio label="0">
+                        <span>失败</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>成功</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>清关中</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            </div>
+            <div style="padding-top:10px;">
+                <Form-item label="出货开始时间:" prop="shipmentStartTime" style="height: 14px">
+                    {{orderProcessRecordEntity.shipmentStartTimeStr}}
+                </Form-item>
+                <Form-item label="出货成功时间:" prop="shipmentSuccTime" style="height: 14px">
+                    {{orderProcessRecordEntity.shipmentSuccTimeStr}}
+                </Form-item>
+            </div>
+            <Form-item label="订单流转信息:" prop="processContent" style="padding-top:10px;">
+                <i-input type="textarea" v-model="orderProcessRecordEntity.processContent" readonly placeholder="订单流转信息"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+
+    <Card v-show="showDiv == 3">
+        <p slot="title">{{title}}</p>
+        <i-form :label-width="100">
+            <Form-item label="快递公司" prop="name">
+                <i-select v-model="logisticsInfo.shipperCode" disabled  @on-change="shippingChange" label-in-value filterable >
+                    <i-option v-for="item in shippings" :value="item.code" :key="item.code">{{item.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="配送单号" prop="name">
+                <i-input v-model="logisticsInfo.logisticCode" placeholder="快递单号"/>
+            </Form-item>
+            <Timeline style="margin-left: 100px;">
+                <Timeline-item v-for="item in logisticsInfo.tracesList">
+                    <p class="time">{{item.acceptTime}}</p>
+                    <p class="content">{{item.acceptStation}}</p>
+                </Timeline-item>
+            </Timeline>
+            <Form-item>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+
+    <Card v-show="showDiv == 2">
+        <p slot="title" style="height: auto">{{title}}</p>
+        <Tabs>
+            <Tab-Pane label="订单信息" name="name1">
+                <i-form ref="formValidate" :model="order" :label-width="100">
+                    <Form-item label="订单号" prop="orderSn">
+                        <i-input v-model="order.orderSn" readonly/>
+                    </Form-item>
+                    <Form-item label="会员" prop="userName">
+                        <i-input v-model="order.userName" readonly/>
+                    </Form-item>
+                    <Form-item label="订单业务类型" prop="orderBizType" >
+                        <i-select v-model="order.orderBizType" filterable placeholder="订单业务类型"
+                                  label-in-value disabled>
+                            <i-option v-for="macro in macros" :value="macro.value" :key="macro.id">{{macro.name}}
+                            </i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="订单状态" prop="orderStatus" readonly>
+                        <Radio-group v-model="order.orderStatus">
+                            <Radio label="0" disabled>
+                                <span>待付款</span>
+                            </Radio>
+                            <Radio label="101" disabled>
+                                <span>订单已取消</span>
+                            </Radio>
+                            <Radio label="102" disabled>
+                                <span>订单已删除</span>
+                            </Radio>
+                            <Radio label="201" disabled>
+                                <span>订单已付款</span>
+                            </Radio>
+                            <Radio label="300" disabled>
+                                <span>订单已发货</span>
+                            </Radio>
+                            <Radio label="301" disabled>
+                                <span>用户确认收货</span>
+                            </Radio>
+                            <Radio label="401" disabled>
+                                <span>退款</span>
+                            </Radio>
+                            <Radio label="402" disabled>
+                                <span>完成</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="发货状态" prop="shippingStatus">
+                        <Radio-group v-model="order.shippingStatus">
+                            <Radio label="0" disabled>
+                                <span>待发货</span>
+                            </Radio>
+                            <Radio label="1" disabled>
+                                <span>已发货</span>
+                            </Radio>
+                            <Radio label="2" disabled>
+                                <span>已收货</span>
+                            </Radio>
+                            <Radio label="4" disabled>
+                                <span>退货</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="付款状态" prop="payStatus">
+                        <Radio-group v-model="order.payStatus">
+                            <Radio label="0" disabled>
+                                <span>待付款</span>
+                            </Radio>
+                            <Radio label="1" disabled>
+                                <span>付款中</span>
+                            </Radio>
+                            <Radio label="2" disabled>
+                                <span>已付款</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="收货人" prop="consignee">
+                        <i-input v-model="order.consignee" readonly/>
+                    </Form-item>
+                    <Form-item label="收货地址" prop="address">
+                        <i-input v-model="order.address" readonly/>
+                    </Form-item>
+                    <Form-item label="联系电话" prop="mobile">
+                        <i-input v-model="order.mobile" readonly/>
+                    </Form-item>
+                    <Form-item label="客户留言" prop="postscript">
+                        <i-input v-model="order.postscript" readonly/>
+                    </Form-item>
+                    <Form-item label="快递公司" prop="shippingName">
+                        <i-input v-model="order.shippingName" readonly/>
+                    </Form-item>
+                    <Form-item label="配送单号" prop="shippingNo">
+                        <i-input v-model="order.shippingNo" readonly/>
+                    </Form-item>
+                    <Form-item label="配送费用" prop="shippingFee">
+                        <i-input v-model="order.shippingFee" readonly/>
+                    </Form-item>
+                    <Form-item label="实际支付" prop="actualPrice">
+                        <i-input v-model="order.actualPrice" readonly/>
+                    </Form-item>
+                    <Form-item label="订单总价" prop="orderPrice">
+                        <i-input v-model="order.orderPrice" readonly/>
+                    </Form-item>
+                    <Form-item label="商品总价" prop="goodsPrice">
+                        <i-input v-model="order.goodsPrice" readonly/>
+                    </Form-item>
+
+                    <Form-item label="订单标价币种" prop="feeType">
+                        <i-input v-model="order.feeType"  readonly/>
+                    </Form-item>
+                    <Form-item label="用户支付金额" prop="cashFee">
+                        <i-input v-model="order.cashFee" readonly/>
+                    </Form-item>
+                    <Form-item label="用户支付币种" prop="cashFeeType">
+                        <i-input v-model="order.cashFeeType" readonly/>
+                    </Form-item>
+                    <Form-item label="汇率值" prop="rate">
+                        <i-input v-model="order.rate" readonly/>
+                    </Form-item>
+
+                    <Form-item label="下单时间" prop="addTime">
+                        <Date-picker format="yyyy-MM-dd HH:mm:ss" v-model="order.addTime" placeholder="使用时间" readonly/>
+                    </Form-item>
+                    <Form-item label="付款时间" prop="payTime">
+                        <Date-picker format="yyyy-MM-dd HH:mm:ss" v-model="order.payTime" placeholder="使用时间" readonly/>
+                    </Form-item>
+                    <Form-item label="配送费用" prop="freightPrice">
+                        <i-input v-model="order.freightPrice" readonly/>
+                    </Form-item>
+                    <Form-item>
+                        <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                        返回</i-button>
+                    </Form-item>
+                </i-form>
+            </Tab-Pane>
+            <Tab-Pane label="商品" name="name2">
+                <table class="table">
+                    <tr>
+                        <td style="text-align: left; width: 600px; font-weight: bold;" colspan="2">商品</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">小计</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">优惠抵扣金额(元)</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">应收金额(元)</td>
+                        <td style="text-align: center; width: 240px; font-weight: bold;">实收金额(元)</td>
+                    </tr>
+                    <tr v-for="(item,index) in orderGoodsList">
+                        <td width="120px">
+                            <img :src="item.listPicUrl" width="100px" height="100px" />
+                        </td>
+                        <td>
+                            <p style="line-height: 30px;">{{item.goodsName}}</p>
+                            <p style="line-height: 30px;">数量:{{item.number}}</p>
+                            <p style="line-height: 30px;">单价:¥{{item.retailPrice}}</p>
+                            <p style="line-height: 30px;">SKU:{{item.sku}}</p>
+                        </td>
+                        <td align="center">¥{{item.number * item.retailPrice}}</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                    </tr>
+                    <tr>
+                        <td align="left" style="font-weight: bold;">运费</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                        <td align="center">-</td>
+                        <td align="center">¥{{order.freightPrice}}</td>
+                        <td align="center">-</td>
+                    </tr>
+                    <tr>
+                        <td align="left" colspan="2" style="font-weight: bold;">总计</td>
+                        <td align="center">¥{{order.orderPrice}}</td>
+                        <td align="center">¥{{order.couponPrice}}</td>
+                        <td align="center">¥{{order.actualPrice}}</td>
+                        <td align="center" v-show="order.payStatus == 0">未付款</td>
+                        <td align="center" v-show="order.payStatus == 1">付款中</td>
+                        <td align="center" v-show="order.payStatus == 2 || order.payStatus == 4">¥{{order.actualPrice}}</td>
+                    </tr>
+                </table>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+            </Tab-Pane>
+        </Tabs>
+    </Card>
+
+    <Card v-show="showDiv == 5">
+        <p slot="title">退款</p>
+        <i-form :model="order" :label-width="100">
+            <Form-item label="退款金额" prop="refundMoney">
+                <i-input v-model="refundMoney" placeholder="退款金额"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="refundUpdate">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+
+</div>
+<script src="${rc.contextPath}/js/shop/order.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 124 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/orderPrint.html

@@ -0,0 +1,124 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>商城票据</title>
+    #parse("sys/header.html")
+</head>
+<body class="gray-bg">
+<div id="rrapp" v-cloak class="wrapper wrapper-content animated fadeInRight">
+    <div class="row">
+        <div class="col-sm-12">
+            <div class="ibox-content p-xl">
+                <div class="row">
+                    <div class="col-sm-6">
+                        <address>
+                            <strong>{{order.consignee}}</strong><br>
+                            {{order.address}}<br>
+                            <abbr title="Phone">联系方式:</abbr> {{order.mobile}}<br>
+                            客户留言:{{order.postscript}}<br>
+                            送达时间:{{null!=order.deliveryDate?order.deliveryDate:""}} {{null!=order.deliveryRemark?order.deliveryRemark:""}}
+                        </address>
+                    </div>
+
+                    <div class="col-sm-6 text-right">
+                        <h4>单据编号:</h4>
+                        <h4 class="text-navy">{{order.orderSn}}</h4>
+                        <address>
+                            <strong>商城</strong><br>
+                            商城地址<br>
+                            <abbr title="Phone">总机:</abbr> (86) xxxxxxxx
+                        </address>
+                        <p>
+                            <span><strong>日期:</strong> {{nowDate}}</span>
+                        </p>
+                    </div>
+                </div>
+
+                <div class="table-responsive m-t">
+                    <table class="table table-hover table-responsive table-bordered">
+                        <thead>
+                        <tr>
+                            <th>清单</th>
+                            <th>数量</th>
+                            <th>单价</th>
+                            <th>总价</th>
+                        </tr>
+                        </thead>
+                        <tbody>
+                        <tr v-for="goods in orderGoods">
+                            <td>
+                                <div><strong>{{goods.goodsName}}</strong>
+                                </div>
+                            </td>
+                            <td>{{goods.number}}</td>
+                            <td>&yen;{{goods.retailPrice}}</td>
+                            <td>&yen;{{goods.retailPrice*goods.number}}</td>
+                        </tr>
+                        </tbody>
+                    </table>
+                </div>
+
+                <table class="table invoice-total">
+                    <tbody>
+                    <tr>
+                        <td><strong>总计</strong>
+                        </td>
+                        <td>&yen;{{sumRetailPrice}}</td>
+                    </tr>
+                    </tbody>
+                </table>
+                <div style="float: right;">
+                    <i-button v-if="showBtn" class="btn btn-warning dim" @click="print"><i class="fa fa-print"></i>打印
+                    </i-button>
+                </div>
+            </div>
+        </div>
+    </div>
+</div>
+
+<script type="text/javascript">
+    let orderId = getQueryString("orderId");
+    var vm = new Vue({
+        el: '#rrapp',
+        data: {
+            showBtn: true,
+            order: {},
+            orderGoods: {},
+            sumRetailPrice: 0,
+            nowDate: transDate(new Date())
+        },
+        methods: {
+            print: function () {
+                confirm('确定连接打票机打印出票?', function () {
+                    $.ajax({
+                        type: "POST",
+                        url: "../order/printMsg",
+                        contentType: "application/json",
+                        data: JSON.stringify(orderId),
+                        success: function (r) {
+                            if (r.ticket != null) {
+                                alert('打印小票完成');
+                            }
+                        }
+                    });
+                })
+            }
+        },
+        created: function () {
+            $.get("../order/info/" + orderId, function (r) {
+                vm.order = r.order;
+            });
+            $.get("../ordergoods/queryAll?orderId=" + orderId, function (r) {
+                vm.orderGoods = r.list;
+                // debugger;
+                for (let i = 0; i < r.list.length; i++) {
+                    vm.sumRetailPrice += r.list[i].retailPrice * r.list[i].number
+                }
+            });
+        }
+    });
+</script>
+
+</body>
+
+</html>

+ 157 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/orderrefund.html

@@ -0,0 +1,157 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>订单退款记录表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList == 0">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.orderSn" @on-enter="query" placeholder="订单编号"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <!--<div class="buttons-group">
+                #if($shiro.hasPermission("orderrefund:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("orderrefund:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("orderrefund:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>-->
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="showList == 1">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="orderRefund" :label-width="180">
+            <Form-item label="订单编号" prop="orderSn">
+                <i-input v-model="orderRefund.orderSn" placeholder="订单编号" readonly/>
+            </Form-item>
+            <Form-item label="用户名称" prop="userName">
+                <i-input v-model="orderRefund.userName" placeholder="用户名称" readonly/>
+            </Form-item>
+            <Form-item label="商户退款单号" prop="outRefundNo">
+                <i-input v-model="orderRefund.outRefundNo" placeholder="商户退款单号" readonly/>
+            </Form-item>
+            <Form-item label="微信退款单号" prop="refundId">
+                <i-input v-model="orderRefund.refundId" placeholder="微信退款单号" readonly/>
+            </Form-item>
+            <Form-item label="退款类型" prop="refundType" readonly>
+                <Radio-group v-model="orderRefund.refundType">
+                    <Radio label="1" disabled>
+                        <span>用户全额退款</span>
+                    </Radio>
+                    <Radio label="2" disabled>
+                        <span>系统部分退款</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="退款时间" prop="refundTime">
+                <Date-picker format="yyyy-MM-dd HH:mm:ss" v-model="orderRefund.refundTime" placeholder="退款时间" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="申请退款金额" prop="refundMoney">
+                <i-input v-model="orderRefund.refundMoney" placeholder="退款金额" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="申请退款币种" prop="refundFeeType">
+                <i-input v-model="orderRefund.refundFeeType" placeholder="申请退款币种" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="订单标价总金额" prop="totalFee">
+                <i-input v-model="orderRefund.totalFee" placeholder="订单标价总金额" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="订单标价币种" prop="feeType">
+                <i-input v-model="orderRefund.feeType" placeholder="订单标价币种" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="用户支付金额" prop="cashFee">
+                <i-input v-model="orderRefund.cashFee" placeholder="用户支付金额" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="用户支付币种" prop="cashFeeType">
+                <i-input v-model="orderRefund.cashFeeType" placeholder="用户支付币种" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="用户支付退款金额" prop="cashRefundFee">
+                <i-input v-model="orderRefund.cashRefundFee" placeholder="用户支付退款金额" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="用户支付退款币种" prop="cashRefundFeeType">
+                <i-input v-model="orderRefund.cashRefundFeeType" placeholder="用户支付退款币种" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="汇率值" prop="rate">
+                <i-input v-model="orderRefund.rate" placeholder="汇率值" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="退款状态" prop="refundStatus">
+                <Radio-group v-model="orderRefund.refundStatus">
+                    <Radio label="1" disabled>
+                        <span>申请中</span>
+                    </Radio>
+                    <Radio label="2" disabled>
+                        <span>退款成功</span>
+                    </Radio>
+                    <Radio label="3" disabled>
+                        <span>已拒绝</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="退款原因" prop="refundReason">
+                <i-input v-model="orderRefund.refundReason" placeholder="退款原因" readonly/>
+            </Form-item>
+            <Form-item label="退款入账账户" prop="refundRecvAccout">
+                <Radio-group v-model="orderRefund.refundRecvAccout">
+                    <Radio label="1" disabled>
+                        <span>退回银行卡</span>
+                    </Radio>
+                    <Radio label="2" disabled>
+                        <span>退回支付用户零钱</span>
+                    </Radio>
+                    <Radio label="3" disabled>
+                        <span>退还商户</span>
+                    </Radio>
+                    <Radio label="4" disabled>
+                        <span>退回支付用户零钱通</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="微信退款状态" prop="wechatRefundStatusDes">
+                <i-input v-model="orderRefund.wechatRefundStatusDes" placeholder="微信退款状态" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="审核人" prop="approver">
+                <i-input v-model="orderRefund.approver" placeholder="审核人" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="审核时间" prop="approvalTime">
+                <Date-picker format="yyyy-MM-dd HH:mm:ss" v-model="orderRefund.approvalTime" placeholder="审核时间" readonly style="width: 240px;"/>
+            </Form-item>
+            <Form-item label="审核备注" prop="approvalRemark">
+                <i-input type="textarea" v-model="orderRefund.approvalRemark" placeholder="审核备注" readonly/>
+            </Form-item>
+            <Form-item label="申请时间" prop="createTime">
+                <Date-picker format="yyyy-MM-dd HH:mm:ss" v-model="orderRefund.createTime" placeholder="申请时间" readonly style="width: 240px;"/>
+            </Form-item>
+                <!--<i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>-->
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
+            </Form-item>
+        </i-form>
+	</Card>
+
+    <Card v-show="showList == 2">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="orderRefund" :rules="ruleValidate" :label-width="80">
+            <Form-item label="审核备注" prop="approvalRemark">
+                <i-input type="textarea" v-model="orderRefund.approvalRemark" placeholder="审核备注"/>
+            </Form-item>
+            <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/orderrefund.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 110 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/product.html

@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.goodsName" @on-enter="query" placeholder="商品名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("product:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("product:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("product:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="product" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商品" prop="goodsId">
+                <i-select v-model="product.goodsId" filterable @on-change="changeGoods" label-in-value>
+                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <div v-for="(item,index) in goodsSpecificationEntityList">
+                <div class="row">
+                    <div class="col-md-3">
+                        <label class="ivu-form-item-label">规格:</label>
+                        <div class="col-md-7 input-icon right">
+                            <i-select v-model="item.specificationId" filterable label-in-value>
+                                <i-option v-for="specification in specifications" :value="specification.id"
+                                          :key="specification.id">{{specification.name}}
+                                </i-option>
+                            </i-select>
+                        </div>
+                    </div>
+                    <div class="col-md-3">
+                        <label class="ivu-form-item-label">规格说明:</label>
+                        <div class="col-md-7 input-icon right">
+                            <i-input type="text" v-model="item.value"/>
+                        </div>
+                    </div>
+                    <button v-if="index == 0" class="btn btn-primary btn-sm" type="button" @click="addSpeRow">
+                        <i class="fa fa-plus"></i>
+                    </button>
+                    <button class="btn red btn-sm" type="button" @click="delSpeRow(index)">
+                        <i class="fa fa-trash-o"></i>
+                    </button>
+                </div>
+            </div>
+            <Form-item label="商品规格" prop="goodsSpecificationIds">
+                <Checkbox-group v-model="attribute">
+                    <Checkbox :label="1">颜色</Checkbox>
+                    <Checkbox :label="2">规格</Checkbox>
+                    <Checkbox :label="4">重量</Checkbox>
+                </Checkbox-group>
+            </Form-item>
+            <Form-item label="颜色" v-if="attribute.indexOf(1)>-1" prop="color">
+                <i-input v-model="color" placeholder="颜色"/>
+            </Form-item>
+            <Form-item label="规格" v-if="attribute.indexOf(2)>-1" prop="guige">
+                <i-input v-model="guige" placeholder="规格"/>
+            </Form-item>
+            <Form-item label="重量" v-if="attribute.indexOf(4)>-1" prop="weight">
+                <i-input v-model="weight" placeholder="重量"/>
+            </Form-item>
+            <Form-item label="商品序列号" prop="goodsSn">
+                <i-input v-model="product.goodsSn" placeholder="商品序列号"/>
+            </Form-item>
+            <Form-item label="商品库存" prop="goodsNumber">
+                <Input-number :min="0" :step="1" v-model="product.goodsNumber" placeholder="商品库存"
+                              style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="零售价格" prop="retailPrice">
+                <Input-number :min="0" :step="1" v-model="product.retailPrice" placeholder="零售价格"
+                              style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="市场价格" prop="marketPrice">
+                <Input-number :min="0" :step="1" v-model="product.marketPrice" placeholder="市场价格"
+                              style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/product.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 110 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/scannShop.html

@@ -0,0 +1,110 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+    <style>
+        .upload-list {
+            display: inline-block;
+            width: 60px;
+            height: 60px;
+            text-align: center;
+            line-height: 60px;
+            border: 1px solid transparent;
+            border-radius: 4px;
+            overflow: hidden;
+            background: #fff;
+            position: relative;
+            box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
+            margin-right: 4px;
+        }
+
+        .upload-list img {
+            width: 100%;
+            height: 100%;
+        }
+
+        .upload-list-cover {
+            display: none;
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            right: 0;
+            background: rgba(0, 0, 0, .6);
+        }
+
+        .upload-list:hover .upload-list-cover {
+            display: block;
+        }
+
+        .upload-list-cover i {
+            color: #fff;
+            font-size: 20px;
+            cursor: pointer;
+            margin: 0 2px;
+        }
+
+        .hselect {
+            margin: 0;
+            padding: 0;
+        }
+    </style>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.prodBarcode" @on-enter="query" placeholder="商品编码"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                <i-button type="info" @click="getTotal"><i class="fa"></i>&nbsp;全选</i-button>
+                #if($shiro.hasPermission("goods:update"))
+                <i-button type="info" @click="getInfo"><i class="fa fa-plus"></i>&nbsp;普货订单生成</i-button>
+                <i-button class="btn btn-outline btn-primary" onclick="vm.removeData()"><i class="fa fa-remove"></i>批量删除</i-button>&nbsp;
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <!--<div id="jqGridPager">-->
+            <!--商品合计:{{goodsTotalPrice}}-->
+            <!--实收:{{applyPrice}}-->
+        <!--</div>-->
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="offlineCart" :rules="ruleValidate" :label-width="140">
+            <table class="table">
+                <tr>
+                    <th style="text-align: left; width: 600px; font-weight: bold;" colspan="2">商品名称</th>
+                    <th style="text-align: center; width: 240px; font-weight: bold;">单价</th>
+                    <th style="text-align: center; width: 240px; font-weight: bold;">数量</th>
+                    <th style="text-align: center; width: 240px; font-weight: bold;">小计</th>
+                </tr>
+                <tr v-for="(item,index) in offlineCartList">
+                    <td colspan="2"><p style="line-height: 30px;">{{item.goodsName}}</p></td>
+                    <td align="center"><p style="line-height: 30px;">¥{{item.retailPrice}}</p></td>
+                    <td align="center"><p style="line-height: 30px;">{{item.number}}</p></td>
+                    <td align="center">¥{{item.number * item.retailPrice}}</td>
+                </tr>
+                <tr>
+                    <td align="left" colspan="2" style="font-weight: bold;">总计</td>
+                    <td align="center">-</td>
+                    <td align="center">-</td>
+                    <td align="center">¥{{goodsTotalPrice}}</td>
+                </tr>
+            </table>
+            <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            <i-button type="warning" @click="back" style="margin-left: 8px"/>返回</i-button>
+        </i-form>
+    </Card>
+</div>
+<script src="${rc.contextPath}/js/shop/scannShop.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 148 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/scannShop2.html

@@ -0,0 +1,148 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+    <style>
+        .upload-list {
+            display: inline-block;
+            width: 60px;
+            height: 60px;
+            text-align: center;
+            line-height: 60px;
+            border: 1px solid transparent;
+            border-radius: 4px;
+            overflow: hidden;
+            background: #fff;
+            position: relative;
+            box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
+            margin-right: 4px;
+        }
+
+        .upload-list img {
+            width: 100%;
+            height: 100%;
+        }
+
+        .upload-list-cover {
+            display: none;
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            right: 0;
+            background: rgba(0, 0, 0, .6);
+        }
+
+        .upload-list:hover .upload-list-cover {
+            display: block;
+        }
+
+        .upload-list-cover i {
+            color: #fff;
+            font-size: 20px;
+            cursor: pointer;
+            margin: 0 2px;
+        }
+
+        .hselect {
+            margin: 0;
+            padding: 0;
+        }
+    </style>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.goodsSn" @on-enter="query" placeholder="商品编码"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("goods:update"))
+                <i-button type="info" @click="update"><i class="fa fa-plus"></i>&nbsp;普货订单生成</i-button>
+                <i-button class="btn btn-outline btn-primary" onclick="vm.removeData()"><i class="fa fa-remove"></i>批量删除</i-button>&nbsp;
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager">
+            商品合计:{{goodsTotalPrice}}
+            实收:{{applyPrice}}
+        </div>
+
+        <!--<table id="scannTable" class="scannTable" style="width: 100%;">-->
+            <!--<tr>-->
+                <!--<th>门店</th>-->
+                <!--<th>SKU</th>-->
+                <!--<th>名称</th>-->
+                <!--<th>货品业务类型</th>-->
+                <!--<th>零售价格</th>-->
+                <!--<th>库存</th>-->
+                <!--<th>商品图</th>-->
+                <!--<th>销售量</th>-->
+            <!--</tr>-->
+            <!--<tr></tr>-->
+
+        <!--</table>-->
+    </div>
+
+    <!--<Card v-show="!showList">-->
+        <!--<p slot="title">{{title}}</p>-->
+        <!--<i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="140">-->
+            <!--<Tabs value="name1">-->
+                <!--<Tab-Pane label="" name="name1">-->
+                    <!--<Form-item label="名称:" prop="name">-->
+                        <!--{{goods.name}}-->
+                    <!--</Form-item>-->
+                    <!--&lt;!&ndash;<Form-item label="品牌" prop="brandId">&ndash;&gt;-->
+                        <!--&lt;!&ndash;<i-select v-model="goods.brandId" filterable placeholder="品牌"&ndash;&gt;-->
+                                  <!--&lt;!&ndash;label-in-value style="width: 268px;">&ndash;&gt;-->
+                            <!--&lt;!&ndash;<i-option v-for="brand in brands" :value="brand.id" :key="brand.id">{{brand.name}}&ndash;&gt;-->
+                            <!--&lt;!&ndash;</i-option>&ndash;&gt;-->
+                        <!--&lt;!&ndash;</i-select>&ndash;&gt;-->
+                    <!--&lt;!&ndash;</Form-item>&ndash;&gt;-->
+                    <!--&lt;!&ndash;<Form-item label="供应商" prop="supplierId">&ndash;&gt;-->
+                        <!--&lt;!&ndash;<i-select v-model="goods.supplierId" filterable placeholder="供应商"&ndash;&gt;-->
+                                  <!--&lt;!&ndash;label-in-value style="width: 268px;">&ndash;&gt;-->
+                            <!--&lt;!&ndash;<i-option v-for="supplier in suppliers" :value="supplier.id" :key="supplier.id">{{supplier.childSupplierSn}}&ndash;&gt;-->
+                            <!--&lt;!&ndash;</i-option>&ndash;&gt;-->
+                        <!--&lt;!&ndash;</i-select>&ndash;&gt;-->
+                    <!--&lt;!&ndash;</Form-item>&ndash;&gt;-->
+                    <!--<Form-item label="零售价:" prop="retailPrice">-->
+                        <!--{{goods.retailPrice}}-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="商品税率(0.00):" prop="goodsRate">-->
+                        <!--{{goods.goodsRate}}-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="商品主图:" prop="listPicUrl">-->
+                        <!--<img id=logo src="{{goods.listPicUrl}}" />-->
+                    <!--</Form-item>-->
+                <!--</Tab-Pane>-->
+            <!--</Tabs>-->
+        <!--</i-form>-->
+        <!--<div style="padding-left: 20px">-->
+            <!--<i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>-->
+            <!--<i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>-->
+        <!--</div>-->
+    <!--</Card>-->
+</div>
+<script src="${rc.contextPath}/js/shop/scannShop.js?_${date.systemTime}"></script>
+<style>
+    .scannTable tr{
+        border: 1px solid #cccccc;
+        background: #c1c1c1;
+    }
+    .scannTable tr th{
+        border: 1px solid #cccccc;
+        background: #c1c1c1;
+        height: 30px;
+    }
+
+</style>
+</body>
+</html>

+ 60 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/searchhistory.html

@@ -0,0 +1,60 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("searchhistory:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("searchhistory:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("searchhistory:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form :model="searchHistory" :label-width="80">
+            <Form-item label="关键字" prop="keyword">
+                <i-input v-model="searchHistory.keyword" placeholder="关键字"/>
+            </Form-item>
+            <Form-item label="搜索来源,如PC、小程序、APP等" prop="from">
+                <i-input v-model="searchHistory.from" placeholder="搜索来源,如PC、小程序、APP等"/>
+            </Form-item>
+            <Form-item label="搜索时间" prop="addTime">
+                <i-input v-model="searchHistory.addTime" placeholder="搜索时间"/>
+            </Form-item>
+            <Form-item label="会员Id" prop="userId">
+                <i-input v-model="searchHistory.userId" placeholder="会员Id"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/searchhistory.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 107 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/shopuser.html

@@ -0,0 +1,107 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.username" @on-enter="query" placeholder="会员名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                <!--#if($shiro.hasPermission("user:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("user:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end-->
+                #if($shiro.hasPermission("user:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+                #if($shiro.hasPermission("user:export"))
+                <i-button type="info" @click="exportUser"><i class="fa fa-cloud-download"></i>&nbsp;导出</i-button>
+                #end
+                <i-button type="primary" @click="coupon"><i class="fa fa-cc-visa"></i>&nbsp;优惠券</i-button>
+                <i-button type="primary" @click="shopCart"><i class="fa fa-shopping-cart"></i>&nbsp;购物车</i-button>
+                <i-button type="primary" @click="address"><i class="fa fa-map"></i>&nbsp;收货地址</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="user" :rules="ruleValidate" :label-width="80">
+            <Form-item label="会员名称" prop="username">
+                <i-input v-model="user.username" placeholder="会员名称"/>
+            </Form-item>
+            <!--<Form-item label="会员密码" prop="password">-->
+            <!--<i-input v-model="user.password" placeholder="会员密码"/>-->
+            <!--</Form-item>-->
+            <Form-item label="性别" prop="gender">
+                <Radio-group v-model="user.gender">
+                    <Radio label="1">
+                        <span>男</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>女</span>
+                    </Radio>
+                    <Radio label="">
+                        <span>未知</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="出生日期" prop="birthday">
+                <Date-picker v-model="user.birthday" placeholder="出生日期"></Date-picker>
+            </Form-item>
+            <!--<Form-item label="注册时间" prop="registerTime">-->
+            <!--<Date-picker v-model="user.registerTime" placeholder="注册时间"></Date-picker>-->
+            <!--</Form-item>-->
+            <!--<Form-item label="最后登录时间" prop="lastLoginTime">-->
+            <!--<Date-picker v-model="user.lastLoginTime" placeholder="最后登录时间"></Date-picker>-->
+            <!--</Form-item>-->
+            <!--<Form-item label="最后登录Ip" prop="lastLoginIp">-->
+            <!--<i-input v-model="user.lastLoginIp" placeholder="最后登录Ip"/>-->
+            <!--</Form-item>-->
+            <Form-item label="会员等级" prop="userLevelId" style="width: 268px;">
+                <i-select v-model="user.userLevelId" filterable>
+                    <i-option v-for="userLevel in userLevels" :value="userLevel.id" :key="userLevel.id">
+                        {{userLevel.name}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <!--<Form-item label="微信名" prop="nickname">-->
+            <!--<i-input v-model="user.nickname" placeholder="微信名"/>-->
+            <!--</Form-item>-->
+            <Form-item label="手机号码" prop="mobile">
+                <i-input v-model="user.mobile" placeholder="手机号码"/>
+            </Form-item>
+            <!--<Form-item label="注册Ip" prop="registerIp">-->
+            <!--<i-input v-model="user.registerIp" placeholder="注册Ip"/>-->
+            <!--</Form-item>-->
+            <!--<Form-item label="头像" prop="avatar">-->
+            <!--<i-input v-model="user.avatar" placeholder="头像"/>-->
+            <!--</Form-item>-->
+            <!--<Form-item label="微信Id" prop="weixinOpenid">-->
+            <!--<i-input v-model="user.weixinOpenid" placeholder="微信Id"/>-->
+            <!--</Form-item>-->
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/shopuser.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 55 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/specification.html

@@ -0,0 +1,55 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>规格表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("specification:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("specification:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("specification:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="specification" :rules="ruleValidate" :label-width="80">
+            <Form-item label="规格名称" prop="name">
+                <i-input v-model="specification.name" placeholder="规范名称"/>
+            </Form-item>
+            <Form-item label="排序" prop="sortOrder">
+                <Input-number :min="0" :step="1" v-model="specification.sortOrder" placeholder="排序"
+                              style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/specification.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 94 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/store.html

@@ -0,0 +1,94 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.storeName" @on-enter="query" placeholder="门店名称"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.storeNumber" @on-enter="query" placeholder="门店编号"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("store:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("store:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("store:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="store" :rules="ruleValidate" :label-width="80">
+            <Form-item label="商户编号" prop="merchSn">
+                <i-select v-model="store.merchSn" filterable placeholder="商户编号" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店名称" prop="storeName">
+                <i-input v-model="store.storeName" placeholder="门店名称"/>
+            </Form-item>
+            <Form-item label="门店编号" prop="storeNumber">
+                <i-input v-model="store.storeNumber" placeholder="门店编号"/>
+            </Form-item>
+            <Form-item label="第三方商户编号" prop="thirdPartyMerchCode">
+                <i-input v-model="store.thirdPartyMerchCode" placeholder="第三方商户编号"/>
+            </Form-item>
+            <Form-item label="第三方商户名称" prop="thirdPartyMerchName">
+                <i-input v-model="store.thirdPartyMerchName" placeholder="第三方商户名称"/>
+            </Form-item>
+            <Form-item label="门店地址" prop="storeAddress">
+                <i-input v-model="store.storeAddress" placeholder="门店地址"/>
+            </Form-item>
+            <Form-item label="省份" prop="provinceName">
+                <i-input v-model="store.provinceName" placeholder=""/>
+            </Form-item>
+            <Form-item label="城市" prop="cityName">
+                <i-input v-model="store.cityName" placeholder=""/>
+            </Form-item>
+            <Form-item label="区" prop="countyName">
+                <i-input v-model="store.countyName" placeholder=""/>
+            </Form-item>
+            <a href="https://lbs.qq.com/tool/getpoint/" target="_blank" style="margin-left: 82px; font-size: 12px;">坐标拾取器</a>
+            <Form-item label="纬度" prop="latitude">
+                <i-input v-model="store.latitude" placeholder="纬度"/>
+            </Form-item>
+            <Form-item label="经度" prop="longitude">
+                <i-input v-model="store.longitude" placeholder="经度"/>
+            </Form-item>
+            <Form-item label="配送半径(km)" prop="coverRadius">
+                <i-input v-model="store.coverRadius" placeholder="配送半径(km)"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="store.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/store.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 177 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/storeProductStock.html

@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+    <style>
+        .upload-list {
+            display: inline-block;
+            width: 60px;
+            height: 60px;
+            text-align: center;
+            line-height: 60px;
+            border: 1px solid transparent;
+            border-radius: 4px;
+            overflow: hidden;
+            background: #fff;
+            position: relative;
+            box-shadow: 0 1px 1px rgba(0, 0, 0, .2);
+            margin-right: 4px;
+        }
+
+        .upload-list img {
+            width: 100%;
+            height: 100%;
+        }
+
+        .upload-list-cover {
+            display: none;
+            position: absolute;
+            top: 0;
+            bottom: 0;
+            left: 0;
+            right: 0;
+            background: rgba(0, 0, 0, .6);
+        }
+
+        .upload-list:hover .upload-list-cover {
+            display: block;
+        }
+
+        .upload-list-cover i {
+            color: #fff;
+            font-size: 20px;
+            cursor: pointer;
+            margin: 0 2px;
+        }
+    </style>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-select v-model="q.storeId" placeholder="门店" filterable label-in-value>
+                        <i-option v-for="store in stores" :value="store.id"
+                                  :key="store.id">{{store.storeName}}
+                        </i-option>
+                    </i-select>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.goodsName" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.goodsSn" @on-enter="query" placeholder="商品编码"/>
+                </i-col>
+                <!--<i-col span="4">
+                    <i-input v-model="q.productSn" @on-enter="query" placeholder="规格编码"/>
+                </i-col>-->
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                <!--#if($shiro.hasPermission("productstorerela:upload"))
+                <i-col style="display: inline-grid;">
+                    <Upload :show-upload-list="false" :on-success="uploadExcelSuccess" :on-error="uploadExcelError"
+                            action="../goods/upload">
+                        <i-button type="ghost" icon="ios-cloud-upload-outline">导入</i-button>
+                    </Upload>
+                </i-col>
+                #end-->
+                #if($shiro.hasPermission("productstorerela:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("productstorerela:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("productstorerela:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="productStoreRela" :rules="ruleValidate" :label-width="80">
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="productStoreRela.storeId" placeholder="门店" filterable @on-change="getGoods"
+                          label-in-value>
+                    <i-option v-for="store in stores" :value="store.id"
+                              :key="store.id">{{store.storeName}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="商品" prop="goodsId">
+                <i-select v-model="productStoreRela.goodsId" filterable @on-change="changeGoods" label-in-value>
+                    <i-option v-for="goods in goodss" :value="goods.id" :key="goods.id">{{goods.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="库存" prop="stockNum">
+                <Input-number :min="0" :step="1" v-model="productStoreRela.stockNum" placeholder="总库存"
+                              style="width: 268px;"/>
+            </Form-item>
+            <Form-item v-if="showInput" label="规格" prop="specification">
+                <i-input v-model="productStoreRela.specification" placeholder="规格"/>
+            </Form-item>
+            <Form-item  v-if="showInput" label="零售价" prop="retailPrice">
+                <Input-number :min="0.1" :step="0.01" v-model="productStoreRela.retailPrice" placeholder="零售价格"
+                              style="width: 268px;"/>
+            </Form-item>
+            <Form-item  v-if="showInput" label="市场价" prop="marketPrice">
+                <Input-number :min="0.1" :step="0.01" v-model="productStoreRela.marketPrice" placeholder="零售价格"
+                              style="width: 268px;"/>
+            </Form-item>
+        </i-form>
+        <div style="padding-left: 20px">
+            <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+            返回</i-button>
+            <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+        </div>
+    </Card>
+</div>
+
+<!-- 选择类型 -->
+<div id="categoryLayer" style="display: none;padding:10px;">
+    <ul id="categoryTree" class="ztree"></ul>
+</div>
+
+<div id="qrcode" style="display: none;padding: 10px;">
+    <div id="qrcodeCanvas" style="margin: 53px 0 0 93px"></div>
+</div>
+
+
+<div id="qrcImg" style="display:none">
+    <img class="qrcImg align-center" src="">
+    <img class="upLogo align-center-middle" src="" >
+</div>
+
+<script src="${rc.contextPath}/js/shop/storeProductStock.js?_${date.systemTime}"></script>
+</body>
+
+<style>
+    .align-center {
+        position:absolute;
+        margin: auto;
+        top:0px;
+        bottom: 0px;
+        right: 0px;
+        left: 0px;
+    }
+
+    .align-center-middle {
+        position:absolute;
+        height: 30px;
+        width: 30px;
+        margin: auto;
+        top:0px;
+        bottom: 0px;
+        right: 0px;
+        left: 0px;
+    }
+</style>
+</html>

+ 77 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/supplier.html

@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("supplier:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("supplier:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("supplier:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="supplier" :rules="ruleValidate" :label-width="150">
+            <Form-item label="一级商户编号" prop="levelMerchSn">
+                <i-select v-model="supplier.levelMerchSn" filterable placeholder="一级商户编号" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+
+            <!--<Form-item label="一级商户标识" prop="levelMerchFlag">-->
+                <!--<i-input v-model="supplier.levelMerchFlag" placeholder="一级商户标识" readonly/>-->
+            <!--</Form-item>-->
+            <Form-item label="二级供货商名称" prop="childSupplierName">
+                <i-input v-model="supplier.childSupplierName" placeholder="二级供货商名称"/>
+            </Form-item>
+            <Form-item label="二级供货商标识" prop="childSupplierFlag">
+                <i-input v-model="supplier.childSupplierFlag" placeholder="二级供货商标识"/>
+            </Form-item>
+            <Form-item label="排序" prop="sortOrder">
+                <i-input v-model="supplier.sortOrder" placeholder="排序"/>
+            </Form-item>
+            <Form-item label="是否禁用" prop="isShow">
+                <!--<i-input v-model="supplier.isShow" placeholder="是否禁用:0:否;1:是"/>-->
+                <Radio-group v-model="supplier.isShow">
+                    <Radio label="0">
+                        <span>否</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>是</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <!--<i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>-->
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/supplier.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 74 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/syscusnationcode.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>国别地区代码</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("syscusnationcode:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("syscusnationcode:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("syscusnationcode:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="sysCusNationCode" :rules="ruleValidate" :label-width="80">
+            <Form-item label="代码" prop="code">
+                <i-input v-model="sysCusNationCode.code" placeholder="代码"/>
+            </Form-item>
+            <Form-item label="名称(简称)" prop="name">
+                <i-input v-model="sysCusNationCode.name" placeholder="名称(简称)"/>
+            </Form-item>
+            <Form-item label="英文名(简称)" prop="ename">
+                <i-input v-model="sysCusNationCode.ename" placeholder="英文名(简称)"/>
+            </Form-item>
+            <Form-item label="优普税率类型" prop="discountsTaxType">
+                <i-input v-model="sysCusNationCode.discountsTaxType" placeholder="优普税率类型"/>
+            </Form-item>
+            <Form-item label="是否有效" prop="isValid">
+                <Radio-group v-model="sysCusNationCode.isValid">
+                    <Radio label="1">
+                        <span>无效</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>有效</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input v-model="sysCusNationCode.remark" placeholder="备注"/>
+            </Form-item>
+
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/syscusnationcode.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 67 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/syscusunitcode.html

@@ -0,0 +1,67 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>计量单位代码</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("syscusunitcode:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("syscusunitcode:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("syscusunitcode:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="sysCusUnitCode" :rules="ruleValidate" :label-width="80">
+            <Form-item label="代码" prop="code">
+                <i-input v-model="sysCusUnitCode.code" placeholder="代码"/>
+            </Form-item>
+            <Form-item label="名称" prop="name">
+                <i-input v-model="sysCusUnitCode.name" placeholder="名称"/>
+            </Form-item>
+            <Form-item label="是否有效" prop="isValid">
+                <Radio-group v-model="sysCusUnitCode.isValid">
+                    <Radio label="1">
+                        <span>无效</span>
+                    </Radio>
+                    <Radio label="0">
+                        <span>有效</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input v-model="sysCusUnitCode.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/syscusunitcode.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 142 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/topic.html

@@ -0,0 +1,142 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.title" @on-enter="query" placeholder="活动主题"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("topic:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("topic:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("topic:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <div id="edit"></div>
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="topic" :rules="ruleValidate" :label-width="100">
+            <Form-item label="活动主题" prop="title">
+                <i-input v-model="topic.title" placeholder="活动主题"/>
+            </Form-item>
+            <Form-item label="活动内容" prop="content">
+                <div id="content" placeholder="活动内容"></div>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="图像" prop="avatar">
+                        <i-input v-model="topic.avatar" placeholder="图像" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessAvatar" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageAvatar">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="活动条例图片" prop="itemPicUrl">
+                        <i-input v-model="topic.itemPicUrl" placeholder="活动条例图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessItemPicUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageItemPicUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="子标题" prop="subtitle">
+                <i-input v-model="topic.subtitle" placeholder="子标题"/>
+            </Form-item>
+            <Form-item label="活动类别" prop="topicCategoryId">
+                <i-input v-model="topic.topicCategoryId" placeholder="活动类别"/>
+            </Form-item>
+            <Form-item label="活动价格" prop="priceInfo">
+                <i-input v-model="topic.priceInfo" placeholder="活动价格"/>
+            </Form-item>
+            <Form-item label="readCount" prop="readCount">
+                <i-input v-model="topic.readCount" placeholder="readCount"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="场景图片" prop="scenePicUrl">
+                        <i-input v-model="topic.scenePicUrl" placeholder="场景图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccessScenePicUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImageScenePicUrl">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item label="活动模板Id" prop="topicTemplateId">
+                <i-input v-model="topic.topicTemplateId" placeholder="活动模板Id"/>
+            </Form-item>
+            <Form-item label="活动标签Id" prop="topicTagId">
+                <i-input v-model="topic.topicTagId" placeholder="活动标签Id"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/topic.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 74 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/topiccategory.html

@@ -0,0 +1,74 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.title" @on-enter="query" placeholder="活动类别主题"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("topiccategory:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("topiccategory:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("topiccategory:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="topicCategory" :rules="ruleValidate" :label-width="120">
+            <Form-item label="活动类别主题" prop="title">
+                <i-input v-model="topicCategory.title" placeholder="活动类别主题"/>
+            </Form-item>
+            <Row>
+                <i-col span="16">
+                    <Form-item label="活动类别图片链接" prop="picUrl">
+                        <i-input v-model="topicCategory.picUrl" placeholder="点击上传图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="2048"
+                                :on-success="handleSuccess" :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                            <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </Form-item>
+                </i-col>
+                <i-col span="4">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImage">预览图片</i-button>
+                    </Form-item>
+                </i-col>
+            </Row>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/topiccategory.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 66 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/usercoupon.html

@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.userName" @on-enter="query" placeholder="会员"/>
+                </i-col>
+                <i-col span="4">
+                    <i-input v-model="q.couponName" @on-enter="query" placeholder="优惠劵"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                <!--#if($shiro.hasPermission("usercoupon:save"))-->
+                <!--<i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>-->
+                <!--#end-->
+                <!--#if($shiro.hasPermission("usercoupon:update"))-->
+                <!--<i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>-->
+                <!--#end-->
+                #if($shiro.hasPermission("usercoupon:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form :model="userCoupon" :label-width="80">
+            <Form-item label="优惠券Id" prop="couponId">
+                <i-input v-model="userCoupon.couponId" placeholder="优惠券Id"/>
+            </Form-item>
+            <Form-item label="优惠券数量" prop="couponNumber">
+                <i-input v-model="userCoupon.couponNumber" placeholder="优惠券数量"/>
+            </Form-item>
+            <Form-item label="会员Id" prop="userId">
+                <i-input v-model="userCoupon.userId" placeholder="会员Id"/>
+            </Form-item>
+            <Form-item label="使用时间" prop="usedTime">
+                <Date-picker v-model="userCoupon.usedTime" placeholder="使用时间"/>
+            </Form-item>
+            <Form-item label="订单Id" prop="orderId">
+                <i-input v-model="userCoupon.orderId" placeholder="订单Id"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/usercoupon.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 54 - 0
kmall-admin/src/main/webapp/WEB-INF/page/shop/userlevel.html

@@ -0,0 +1,54 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("userlevel:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("userlevel:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("userlevel:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="userLevel" :rules="ruleValidate" :label-width="80">
+            <Form-item label="名称" prop="name">
+                <i-input v-model="userLevel.name" placeholder="名称"/>
+            </Form-item>
+            <Form-item label="描述" prop="description">
+                <i-input v-model="userLevel.description" placeholder="描述"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/userlevel.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 50 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/config.html

@@ -0,0 +1,50 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>参数管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.key" @on-enter="query" placeholder="参数名"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="config" :rules="ruleValidate" :label-width="80">
+            <Form-item label="参数名" prop="key">
+                <i-input v-model="config.key" placeholder="参数名"/>
+            </Form-item>
+            <Form-item label="参数值" prop="value">
+                <i-input v-model="config.value" placeholder="参数值"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="config.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/config.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 66 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/dept.html

@@ -0,0 +1,66 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>部门管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+                </i-col>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:dept:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:dept:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:dept:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="deptTable" data-mobile-responsive="true" data-click-to-select="true">
+            <thead>
+            <tr>
+                <th data-field="selectItem" data-checkbox="true"></th>
+            </tr>
+            </thead>
+        </table>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="dept" :rules="ruleValidate" :label-width="80">
+            <Form-item label="部门名称" prop="name">
+                <i-input v-model="dept.name" placeholder="部门名称"/>
+            </Form-item>
+
+            <Form-item label="上级部门" prop="deptName">
+                <i-input type="text" v-model="dept.parentName" icon="eye" readonly="readonly"
+                         @on-click="deptTree" readonly="readonly" placeholder="一级部门"/>
+            </Form-item>
+            <Form-item label="排序号" prop="orderNum">
+                <Input-number :min="0" :step="1" v-model="dept.orderNum" placeholder="排序号" style="width: 188px;"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/sys/dept.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 28 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/generator.html

@@ -0,0 +1,28 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>代码生成器</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp">
+    <Row :gutter="16">
+        <div class="search-group">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.tableName" @on-enter="query" placeholder="表名"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                <i-button type="primary" @click="generator"><i class="fa fa-file-code-o"></i>&nbsp;生成代码</i-button>
+            </div>
+        </div>
+    </Row>
+    <table id="jqGrid"></table>
+    <div id="jqGridPager"></div>
+</div>
+
+<script src="${rc.contextPath}/js/sys/generator.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 61 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/header.html

@@ -0,0 +1,61 @@
+<meta charset="UTF-8">
+<meta http-equiv="X-UA-Compatible" content="IE=edge">
+<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
+<!--bootstrap-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/bootstrap.min.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/font-awesome.min.css">
+<!--jqgrid-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/plugins/jqgrid/ui.jqgrid-bootstrap.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/plugins/ztree/css/metroStyle/metroStyle.css">
+<!--main-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/main.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/iview.css">
+<link rel="stylesheet" href="${rc.contextPath}/statics/css/style.css">
+<!--treegrid-->
+<link rel="stylesheet" href="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.css">
+<!--富文本-->
+<link rel="stylesheet" href='${rc.contextPath}/statics/plugins/froala_editor/css/froala_editor.min.css'/>
+
+<!--jquery-->
+<script src="${rc.contextPath}/statics/libs/jquery.min.js"></script>
+<!--layer-->
+<script src="${rc.contextPath}/statics/plugins/layer/layer.js"></script>
+<!--bootstrap-->
+<script src="${rc.contextPath}/statics/libs/bootstrap.min.js"></script>
+<!--vue-->
+<script src="${rc.contextPath}/statics/libs/vue.min.js"></script>
+<script src="${rc.contextPath}/statics/libs/iview.min.js"></script>
+<!--qrcode-->
+<script src="${rc.contextPath}/statics/qrcode/jquery.qrcode.min.js"></script>
+<script src="${rc.contextPath}/statics/qrcode/utf.js"></script>
+<!-- print -->
+<script src="${rc.contextPath}/statics/jquery.print.js"></script>
+<!--jqgrid-->
+<script src="${rc.contextPath}/statics/plugins/jqgrid/grid.locale-cn.js"></script>
+<script src="${rc.contextPath}/statics/plugins/jqgrid/jquery.jqGrid.min.js"></script>
+<!--ztree-->
+<script src="${rc.contextPath}/statics/plugins/ztree/jquery.ztree.all.min.js"></script>
+<!--treegrid-->
+<script src="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.extension.js"></script>
+<script src="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/treegrid/jquery.treegrid.bootstrap3.js"></script>
+<script src="${rc.contextPath}/statics/plugins/treegrid/tree.table.js"></script>
+
+<!--simplemde富文本-->
+<script src='${rc.contextPath}/statics/plugins/froala_editor/js/froala_editor.min.js'></script>
+<!--[if lt IE 9]>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/froala_editor_ie8.min.js"></script>
+<![endif]-->
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/tables.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/lists.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/colors.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/media_manager.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/font_family.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/font_size.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/block_styles.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/plugins/video.min.js"></script>
+<script src="${rc.contextPath}/statics/plugins/froala_editor/js/langs/zh_cn.js"></script>
+
+<script src="${rc.contextPath}/statics/libs/jquery-extend.js"></script>
+<script src="${rc.contextPath}/statics/libs/iNotify.js"></script>
+<script src="${rc.contextPath}/js/common.js"></script>

+ 4144 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/icon.html

@@ -0,0 +1,4144 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>选取图标-菜单管理</title>
+    #parse("sys/header.html")
+    <style>
+        body {
+            font-family: 'Microsoft Yahei', Helvetica, Arial, sans-serif;
+            font-size: 10px;
+            color: #333333;
+            padding-top: 10px;
+        }
+
+        .fontawesome-icon-list .fa-hover a {
+            display: block;
+            color: #222222;
+            line-height: 32px;
+            height: 32px;
+            padding-left: 10px;
+            border-radius: 4px;
+            text-decoration: none;
+        }
+
+        .fontawesome-icon-list .fa-hover a .fa {
+            width: 32px;
+            font-size: 14px;
+            display: inline-block;
+            text-align: right;
+            margin-right: 10px;
+        }
+
+        .fontawesome-icon-list .fa-hover a:hover {
+            background-color: #286090;
+            color: #fff;
+            cursor: pointer;
+        }
+
+        .fontawesome-icon-list .fa-hover a:hover i {
+            font-size: 28px;
+            vertical-align: -6px;
+        }
+    </style>
+</head>
+<body>
+<div id="icons">
+    <div id="new" class="mainParts">
+        <h2 class="page-header">4.7.0版新增41个全新的图标</h2>
+
+        <div class="row fontawesome-icon-list">
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-address-book"></i>address-book</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-address-book-o"></i>address-book-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-address-card"></i>address-card</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-address-card-o"></i>address-card-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-bandcamp"></i>bandcamp</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-bath"></i>bath</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-bathtub"></i>bathtub</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-drivers-license"></i>drivers-license</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-drivers-license-o"></i>drivers-license-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-eercast"></i>eercast</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-envelope-open"></i>envelope-open</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-envelope-open-o"></i>envelope-open-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-etsy"></i>etsy</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-free-code-camp"></i>free-code-camp</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-grav"></i>grav</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-handshake-o"></i>handshake-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-id-badge"></i>id-badge</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-id-card"></i>id-card</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-id-card-o"></i>id-card-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-imdb"></i>imdb</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-linode"></i>linode</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-meetup"></i>meetup</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-microchip"></i>microchip</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-podcast"></i>podcast</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-quora"></i>quora</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-ravelry"></i>ravelry</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-s15"></i>s15</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-shower"></i>shower</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-snowflake-o"></i>snowflake-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-superpowers"></i>superpowers</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-telegram"></i>telegram</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer"></i>thermometer</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-0"></i>thermometer-0</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-1"></i>thermometer-1</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-2"></i>thermometer-2</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-3"></i>thermometer-3</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-4"></i>thermometer-4</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-empty"></i>thermometer-empty</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-full"></i>thermometer-full</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-half"></i>thermometer-half</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-thermometer-quarter"></i>thermometer-quarter</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i
+                        class="fa fa-thermometer-three-quarters"
+                        title="thermometer-three-quarters"></i>three-quarters</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-times-rectangle"></i>times-rectangle</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-times-rectangle-o"></i>times-rectangle-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-user-circle"></i>user-circle</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-user-circle-o"></i>user-circle-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-user-o"></i>user-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-vcard"></i>vcard</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-vcard-o"></i>vcard-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-window-close"></i>window-close</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-window-close-o"></i>window-close-o</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-window-maximize"></i>window-maximize</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-window-minimize"></i>window-minimize</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-window-restore"></i>window-restore</a>
+            </div>
+
+            <div class="fa-hover col-md-3 col-sm-4">
+                <a class="col-xs-11"><i class="fa fa-wpexplorer"></i>wpexplorer</a>
+            </div>
+
+        </div>
+
+    </div>
+    <div>
+        <section id="web-application" class="mainParts">
+            <h2 class="page-header">网页</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-address-book"></i>address-book</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-address-book-o"></i>address-book-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-address-card"></i>address-card</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-address-card-o"></i>address-card-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-adjust"></i>adjust</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i
+                            class="fa fa-american-sign-language-interpreting"
+                            title="american-sign-language-interpreting"></i>sign-language</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-anchor"></i>anchor</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-archive"></i>archive</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-area-chart"></i>area-chart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows"></i>arrows</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows-h"></i>arrows-h</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows-v"></i>arrows-v</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-asl-interpreting"></i>asl-interpreting</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i
+                            class="fa fa-assistive-listening-systems"
+                            title="assistive-listening-systems"></i>listening-systems</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-asterisk"></i>asterisk</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-at"></i>at</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-audio-description"></i>audio-description</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-automobile"></i>automobile</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-balance-scale"></i>balance-scale</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ban"></i>ban</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bank"></i>bank</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bar-chart"></i>bar-chart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bar-chart-o"></i>bar-chart-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-barcode"></i>barcode</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bars"></i>bars</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bath"></i>bath</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bathtub"></i>bathtub</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery"></i>battery</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-0"></i>battery-0</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-1"></i>battery-1</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-2"></i>battery-2</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-3"></i>battery-3</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-4"></i>battery-4</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-empty"></i>battery-empty</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-full"></i>battery-full</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-half"></i>battery-half</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-quarter"></i>battery-quarter</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-battery-three-quarters"></i>battery-three-quarters</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bed"></i>bed</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-beer"></i>beer</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bell"></i>bell</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bell-o"></i>bell-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bell-slash"></i>bell-slash</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bell-slash-o"></i>bell-slash-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bicycle"></i>bicycle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-binoculars"></i>binoculars</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-birthday-cake"></i>birthday-cake</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-blind"></i>blind</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bluetooth"></i>bluetooth</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bluetooth-b"></i>bluetooth-b</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bolt"></i>bolt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bomb"></i>bomb</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-book"></i>book</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bookmark"></i>bookmark</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bookmark-o"></i>bookmark-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-braille"></i>braille</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-briefcase"></i>briefcase</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bug"></i>bug</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-building"></i>building</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-building-o"></i>building-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bullhorn"></i>bullhorn</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bullseye"></i>bullseye</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bus"></i>bus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cab"></i>cab</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-calculator"></i>calculator</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-calendar"></i>calendar</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-calendar-check-o"></i>calendar-check-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-calendar-minus-o"></i>calendar-minus-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-calendar-o"></i>calendar-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-calendar-plus-o"></i>calendar-plus-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-calendar-times-o"></i>calendar-times-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-camera"></i>camera</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-camera-retro"></i>camera-retro</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-car"></i>car</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-down"></i>caret-square-o-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-left"></i>caret-square-o-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-right"></i>caret-square-o-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-up"></i>caret-square-o-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cart-arrow-down"></i>cart-arrow-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cart-plus"></i>cart-plus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc"></i>cc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-certificate"></i>certificate</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-check"></i>check</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-check-circle"></i>check-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-check-circle-o"></i>check-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-check-square"></i>check-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-check-square-o"></i>check-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-child"></i>child</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-circle"></i>circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-circle-o"></i>circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-circle-o-notch"></i>circle-o-notch</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-circle-thin"></i>circle-thin</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-clock-o"></i>clock-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-clone"></i>clone</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-close"></i>close</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cloud"></i>cloud</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cloud-download"></i>cloud-download</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cloud-upload"></i>cloud-upload</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-code"></i>code</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-code-fork"></i>code-fork</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-coffee"></i>coffee</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cog"></i>cog</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cogs"></i>cogs</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-comment"></i>comment</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-comment-o"></i>comment-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-commenting"></i>commenting</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-commenting-o"></i>commenting-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-comments"></i>comments</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-comments-o"></i>comments-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-compass"></i>compass</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-copyright"></i>copyright</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-creative-commons"></i>creative-commons</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-credit-card"></i>credit-card</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-credit-card-alt"></i>credit-card-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-crop"></i>crop</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-crosshairs"></i>crosshairs</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cube"></i>cube</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cubes"></i>cubes</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cutlery"></i>cutlery</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dashboard"></i>dashboard</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-database"></i>database</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-deaf"></i>deaf</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-deafness"></i>deafness</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-desktop"></i>desktop</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-diamond"></i>diamond</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dot-circle-o"></i>dot-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-download"></i>download</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-drivers-license"></i>drivers-license</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-drivers-license-o"></i>drivers-license-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-edit"></i>edit</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ellipsis-h"></i>ellipsis-h</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ellipsis-v"></i>ellipsis-v</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-envelope"></i>envelope</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-envelope-o"></i>envelope-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-envelope-open"></i>envelope-open</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-envelope-open-o"></i>envelope-open-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-envelope-square"></i>envelope-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eraser"></i>eraser</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-exchange"></i>exchange</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-exclamation"></i>exclamation</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-exclamation-circle"></i>exclamation-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-exclamation-triangle"></i>exclamation-triangle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-external-link"></i>external-link</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-external-link-square"></i>external-link-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eye"></i>eye</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eye-slash"></i>eye-slash</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eyedropper"></i>eyedropper</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fax"></i>fax</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-feed"></i>feed</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-female"></i>female</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fighter-jet"></i>fighter-jet</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-archive-o"></i>file-archive-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-audio-o"></i>file-audio-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-code-o"></i>file-code-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-excel-o"></i>file-excel-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-image-o"></i>file-image-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-movie-o"></i>file-movie-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-pdf-o"></i>file-pdf-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-photo-o"></i>file-photo-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-picture-o"></i>file-picture-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-powerpoint-o"></i>file-powerpoint-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-sound-o"></i>file-sound-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-video-o"></i>file-video-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-word-o"></i>file-word-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-zip-o"></i>file-zip-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-film"></i>film</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-filter"></i>filter</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fire"></i>fire</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fire-extinguisher"></i>fire-extinguisher</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-flag"></i>flag</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-flag-checkered"></i>flag-checkered</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-flag-o"></i>flag-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-flash"></i>flash</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-flask"></i>flask</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-folder"></i>folder</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-folder-o"></i>folder-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-folder-open"></i>folder-open</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-folder-open-o"></i>folder-open-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-frown-o"></i>frown-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-futbol-o"></i>futbol-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gamepad"></i>gamepad</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gavel"></i>gavel</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gear"></i>gear</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gears"></i>gears</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gift"></i>gift</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-glass"></i>glass</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-globe"></i>globe</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-graduation-cap"></i>graduation-cap</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-group"></i>group</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-grab-o"></i>hand-grab-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-lizard-o"></i>hand-lizard-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-paper-o"></i>hand-paper-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-peace-o"></i>hand-peace-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-pointer-o"></i>hand-pointer-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-rock-o"></i>hand-rock-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-scissors-o"></i>hand-scissors-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-spock-o"></i>hand-spock-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-stop-o"></i>hand-stop-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-handshake-o"></i>handshake-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hard-of-hearing"></i>hard-of-hearing</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hashtag"></i>hashtag</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hdd-o"></i>hdd-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-headphones"></i>headphones</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-heart"></i>heart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-heart-o"></i>heart-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-heartbeat"></i>heartbeat</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-history"></i>history</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-home"></i>home</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hotel"></i>hotel</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass"></i>hourglass</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass-1"></i>hourglass-1</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass-2"></i>hourglass-2</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass-3"></i>hourglass-3</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass-end"></i>hourglass-end</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass-half"></i>hourglass-half</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass-o"></i>hourglass-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hourglass-start"></i>hourglass-start</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-i-cursor"></i>i-cursor</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-id-badge"></i>id-badge</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-id-card"></i>id-card</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-id-card-o"></i>id-card-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-image"></i>image</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-inbox"></i>inbox</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-industry"></i>industry</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-info"></i>info</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-info-circle"></i>info-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-institution"></i>institution</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-key"></i>key</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-keyboard-o"></i>keyboard-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-language"></i>language</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-laptop"></i>laptop</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-leaf"></i>leaf</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-legal"></i>legal</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-lemon-o"></i>lemon-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-level-down"></i>level-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-level-up"></i>level-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-life-bouy"></i>life-bouy</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-life-buoy"></i>life-buoy</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-life-ring"></i>life-ring</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-life-saver"></i>life-saver</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-lightbulb-o"></i>lightbulb-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-line-chart"></i>line-chart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-location-arrow"></i>location-arrow</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-lock"></i>lock</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-low-vision"></i>low-vision</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-magic"></i>magic</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-magnet"></i>magnet</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mail-forward"></i>mail-forward</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mail-reply"></i>mail-reply</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mail-reply-all"></i>mail-reply-all</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-male"></i>male</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-map"></i>map</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-map-marker"></i>map-marker</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-map-o"></i>map-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-map-pin"></i>map-pin</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-map-signs"></i>map-signs</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-meh-o"></i>meh-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-microchip"></i>microchip</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-microphone"></i>microphone</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-microphone-slash"></i>microphone-slash</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-minus"></i>minus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-minus-circle"></i>minus-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-minus-square"></i>minus-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-minus-square-o"></i>minus-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mobile"></i>mobile</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mobile-phone"></i>mobile-phone</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-money"></i>money</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-moon-o"></i>moon-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mortar-board"></i>mortar-board</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-motorcycle"></i>motorcycle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mouse-pointer"></i>mouse-pointer</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-music"></i>music</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-navicon"></i>navicon</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-newspaper-o"></i>newspaper-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-object-group"></i>object-group</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-object-ungroup"></i>object-ungroup</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paint-brush"></i>paint-brush</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paper-plane"></i>paper-plane</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paper-plane-o"></i>paper-plane-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paw"></i>paw</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pencil"></i>pencil</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pencil-square"></i>pencil-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pencil-square-o"></i>pencil-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-percent"></i>percent</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-phone"></i>phone</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-phone-square"></i>phone-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-photo"></i>photo</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-picture-o"></i>picture-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pie-chart"></i>pie-chart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plane"></i>plane</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plug"></i>plug</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plus"></i>plus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plus-circle"></i>plus-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plus-square"></i>plus-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plus-square-o"></i>plus-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-podcast"></i>podcast</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-power-off"></i>power-off</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-print"></i>print</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-puzzle-piece"></i>puzzle-piece</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-qrcode"></i>qrcode</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-question"></i>question</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-question-circle"></i>question-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-question-circle-o"></i>question-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-quote-left"></i>quote-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-quote-right"></i>quote-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-random"></i>random</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-recycle"></i>recycle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-refresh"></i>refresh</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-registered"></i>registered</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-remove"></i>remove</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-reorder"></i>reorder</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-reply"></i>reply</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-reply-all"></i>reply-all</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-retweet"></i>retweet</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-road"></i>road</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rocket"></i>rocket</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rss"></i>rss</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rss-square"></i>rss-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-s15"></i>s15</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-search"></i>search</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-search-minus"></i>search-minus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-search-plus"></i>search-plus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-send"></i>send</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-send-o"></i>send-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-server"></i>server</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-share"></i>share</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-share-alt"></i>share-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-share-alt-square"></i>share-alt-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-share-square"></i>share-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-share-square-o"></i>share-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-shield"></i>shield</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ship"></i>ship</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-shopping-bag"></i>shopping-bag</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-shopping-basket"></i>shopping-basket</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-shopping-cart"></i>shopping-cart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-shower"></i>shower</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sign-in"></i>sign-in</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sign-language"></i>sign-language</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sign-out"></i>sign-out</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-signal"></i>signal</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-signing"></i>signing</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sitemap"></i>sitemap</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sliders"></i>sliders</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-smile-o"></i>smile-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-snowflake-o"></i>snowflake-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-soccer-ball-o"></i>soccer-ball-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort"></i>sort</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-alpha-asc"></i>sort-alpha-asc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-alpha-desc"></i>sort-alpha-desc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-amount-asc"></i>sort-amount-asc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-amount-desc"></i>sort-amount-desc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-asc"></i>sort-asc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-desc"></i>sort-desc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-down"></i>sort-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-numeric-asc"></i>sort-numeric-asc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-numeric-desc"></i>sort-numeric-desc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sort-up"></i>sort-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-space-shuttle"></i>space-shuttle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-spinner"></i>spinner</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-spoon"></i>spoon</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-square"></i>square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-square-o"></i>square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-star"></i>star</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-star-half"></i>star-half</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-star-half-empty"></i>star-half-empty</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-star-half-full"></i>star-half-full</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-star-half-o"></i>star-half-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-star-o"></i>star-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sticky-note"></i>sticky-note</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sticky-note-o"></i>sticky-note-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-street-view"></i>street-view</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-suitcase"></i>suitcase</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sun-o"></i>sun-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-support"></i>support</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tablet"></i>tablet</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tachometer"></i>tachometer</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tag"></i>tag</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tags"></i>tags</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tasks"></i>tasks</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-taxi"></i>taxi</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-television"></i>television</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-terminal"></i>terminal</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer"></i>thermometer</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-0"></i>thermometer-0</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-1"></i>thermometer-1</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-2"></i>thermometer-2</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-3"></i>thermometer-3</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-4"></i>thermometer-4</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-empty"></i>thermometer-empty</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-full"></i>thermometer-full</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-half"></i>thermometer-half</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thermometer-quarter"></i>thermometer-quarter</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i
+                            class="fa fa-thermometer-three-quarters"
+                            title="thermometer-three-quarters"></i>thermometer-three</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumb-tack"></i>thumb-tack</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-down"></i>thumbs-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-o-down"></i>thumbs-o-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-o-up"></i>thumbs-o-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-up"></i>thumbs-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ticket"></i>ticket</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-times"></i>times</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-times-circle"></i>times-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-times-circle-o"></i>times-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-times-rectangle"></i>times-rectangle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-times-rectangle-o"></i>times-rectangle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tint"></i>tint</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-down"></i>toggle-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-left"></i>toggle-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-off"></i>toggle-off</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-on"></i>toggle-on</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-right"></i>toggle-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-up"></i>toggle-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-trademark"></i>trademark</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-trash"></i>trash</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-trash-o"></i>trash-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tree"></i>tree</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-trophy"></i>trophy</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-truck"></i>truck</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tty"></i>tty</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tv"></i>tv</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-umbrella"></i>umbrella</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-universal-access"></i>universal-access</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-university"></i>university</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-unlock"></i>unlock</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-unlock-alt"></i>unlock-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-unsorted"></i>unsorted</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-upload"></i>upload</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user"></i>user</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user-circle"></i>user-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user-circle-o"></i>user-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user-o"></i>user-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user-plus"></i>user-plus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user-secret"></i>user-secret</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user-times"></i>user-times</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-users"></i>users</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-vcard"></i>vcard</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-vcard-o"></i>vcard-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-video-camera"></i>video-camera</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-volume-control-phone"></i>volume-control-phone</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-volume-down"></i>volume-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-volume-off"></i>volume-off</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-volume-up"></i>volume-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-warning"></i>warning</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair"></i>wheelchair</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair-alt"></i>wheelchair-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wifi"></i>wifi</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-window-close"></i>window-close</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-window-close-o"></i>window-close-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-window-maximize"></i>window-maximize</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-window-minimize"></i>window-minimize</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-window-restore"></i>window-restore</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wrench"></i>wrench</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="accessibility">
+            <h2 class="page-header">辅助功能</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i
+                            class="fa fa-american-sign-language-interpreting"
+                            title="american-sign-language-interpreting"></i>language-interpreting</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-asl-interpreting"></i>asl-interpreting</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i
+                            class="fa fa-assistive-listening-systems"
+                            title="assistive-listening-systems"></i>assistive-listening</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-audio-description"></i>audio-description</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-blind"></i>blind</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-braille"></i>braille</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc"></i>cc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-deaf"></i>deaf</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-deafness"></i>deafness</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hard-of-hearing"></i>hard-of-hearing</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-low-vision"></i>low-vision</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-question-circle-o"></i>question-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sign-language"></i>sign-language</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-signing"></i>signing</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tty"></i>tty</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-universal-access"></i>universal-access</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-volume-control-phone"></i>volume-control-phone</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair"></i>wheelchair</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair-alt"></i>wheelchair-alt</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="hand" class="mainParts">
+            <h2 class="page-header">手势</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-grab-o"></i>hand-grab-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-lizard-o"></i>hand-lizard-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-down"></i>hand-o-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-left"></i>hand-o-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-right"></i>hand-o-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-up"></i>hand-o-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-paper-o"></i>hand-paper-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-peace-o"></i>hand-peace-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-pointer-o"></i>hand-pointer-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-rock-o"></i>hand-rock-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-scissors-o"></i>hand-scissors-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-spock-o"></i>hand-spock-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-stop-o"></i>hand-stop-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-down"></i>thumbs-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-o-down"></i>thumbs-o-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-o-up"></i>thumbs-o-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-thumbs-up"></i>thumbs-up</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="transportation" class="mainParts">
+            <h2 class="page-header">运输</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ambulance"></i>ambulance</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-automobile"></i>automobile</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bicycle"></i>bicycle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bus"></i>bus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cab"></i>cab</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-car"></i>car</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fighter-jet"></i>fighter-jet</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-motorcycle"></i>motorcycle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plane"></i>plane</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rocket"></i>rocket</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ship"></i>ship</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-space-shuttle"></i>space-shuttle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-subway"></i>subway</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-taxi"></i>taxi</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-train"></i>train</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-truck"></i>truck</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair"></i>wheelchair</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair-alt"></i>wheelchair-alt</a>
+                </div>
+
+            </div>
+        </section>
+
+
+        <section id="gender" class="mainParts">
+            <h2 class="page-header">性别</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-genderless"></i>genderless</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-intersex"></i>intersex</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mars"></i>mars</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mars-double"></i>mars-double</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mars-stroke"></i>mars-stroke</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mars-stroke-h"></i>mars-stroke-h</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mars-stroke-v"></i>mars-stroke-v</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mercury"></i>mercury</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-neuter"></i>neuter</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-transgender"></i>transgender</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-transgender-alt"></i>transgender-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-venus"></i>venus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-venus-double"></i>venus-double</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-venus-mars"></i>venus-mars</a>
+                </div>
+
+            </div>
+        </section>
+
+
+        <section id="file-type" class="mainParts">
+            <h2 class="page-header">文件类型</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file"></i>file</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-archive-o"></i>file-archive-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-audio-o"></i>file-audio-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-code-o"></i>file-code-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-excel-o"></i>file-excel-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-image-o"></i>file-image-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-movie-o"></i>file-movie-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-o"></i>file-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-pdf-o"></i>file-pdf-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-photo-o"></i>file-photo-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-picture-o"></i>file-picture-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-powerpoint-o"></i>file-powerpoint-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-sound-o"></i>file-sound-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-text"></i>file-text</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-text-o"></i>file-text-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-video-o"></i>file-video-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-word-o"></i>file-word-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-zip-o"></i>file-zip-o</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="spinner" class="mainParts">
+            <h2 class="page-header">可旋转</h2>
+
+            <div class="alert alert-success">
+                <ul class="fa-ul">
+                    <li><i class="fa fa-info-circle fa-lg fa-li"></i> 这些图标在<code>fa-spin</code>类的作用下表现优异。您可以查阅
+                        <a href="#spinning" class="alert-link">可旋转图标案例</a>.
+                    </li>
+                </ul>
+            </div>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-circle-o-notch"></i>circle-o-notch</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cog"></i>cog</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gear"></i>gear</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-refresh"></i>refresh</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-spinner"></i>spinner</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="form-control" class="mainParts">
+            <h2 class="page-header">表单</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-check-square"></i>check-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-check-square-o"></i>check-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-circle"></i>circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-circle-o"></i>circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dot-circle-o"></i>dot-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-minus-square"></i>minus-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-minus-square-o"></i>minus-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plus-square"></i>plus-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plus-square-o"></i>plus-square-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-square"></i>square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-square-o"></i>square-o</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="payment" class="mainParts">
+            <h2 class="page-header">支付</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-amex"></i>cc-amex</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-diners-club"></i>cc-diners-club</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-discover"></i>cc-discover</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-jcb"></i>cc-jcb</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-mastercard"></i>cc-mastercard</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-paypal"></i>cc-paypal</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-stripe"></i>cc-stripe</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-visa"></i>cc-visa</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-credit-card"></i>credit-card</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-credit-card-alt"></i>credit-card-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-google-wallet"></i>google-wallet</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paypal"></i>paypal</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="chart" class="mainParts">
+            <h2 class="page-header">图表</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-area-chart"></i>area-chart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bar-chart"></i>bar-chart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bar-chart-o"></i>bar-chart-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-line-chart"></i>line-chart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pie-chart"></i>pie-chart</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="currency" class="mainParts">
+            <h2 class="page-header">货币</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bitcoin"></i>bitcoin</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-btc"></i>btc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cny"></i>cny</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dollar"></i>dollar</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eur"></i>eur</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-euro"></i>euro</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gbp"></i>gbp</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gg"></i>gg</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gg-circle"></i>gg-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ils"></i>ils</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-inr"></i>inr</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-jpy"></i>jpy</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-krw"></i>krw</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-money"></i>money</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rmb"></i>rmb</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rouble"></i>rouble</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rub"></i>rub</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ruble"></i>ruble</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rupee"></i>rupee</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-shekel"></i>shekel</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sheqel"></i>sheqel</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-try"></i>try</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-turkish-lira"></i>turkish-lira</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-usd"></i>usd</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-won"></i>won</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-yen"></i>yen</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="text-editor" class="mainParts">
+            <h2 class="page-header">文本编辑</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-align-center"></i>align-center</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-align-justify"></i>align-justify</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-align-left"></i>align-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-align-right"></i>align-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bold"></i>bold</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chain"></i>chain</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chain-broken"></i>chain-broken</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-clipboard"></i>clipboard</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-columns"></i>columns</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-copy"></i>copy</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cut"></i>cut</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dedent"></i>dedent</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eraser"></i>eraser</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file"></i>file</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-o"></i>file-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-text"></i>file-text</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-file-text-o"></i>file-text-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-files-o"></i>files-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-floppy-o"></i>floppy-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-font"></i>font</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-header"></i>header</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-indent"></i>indent</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-italic"></i>italic</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-link"></i>link</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-list"></i>list</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-list-alt"></i>list-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-list-ol"></i>list-ol</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-list-ul"></i>list-ul</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-outdent"></i>outdent</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paperclip"></i>paperclip</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paragraph"></i>paragraph</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paste"></i>paste</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-repeat"></i>repeat</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rotate-left"></i>rotate-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rotate-right"></i>rotate-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-save"></i>save</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-scissors"></i>scissors</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-strikethrough"></i>strikethrough</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-subscript"></i>subscript</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-superscript"></i>superscript</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-table"></i>table</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-text-height"></i>text-height</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-text-width"></i>text-width</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-th"></i>th</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-th-large"></i>th-large</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-th-list"></i>th-list</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-underline"></i>underline</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-undo"></i>undo</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-unlink"></i>unlink</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="directional" class="mainParts">
+            <h2 class="page-header">指示方向</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-double-down"></i>angle-double-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-double-left"></i>angle-double-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-double-right"></i>angle-double-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-double-up"></i>angle-double-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-down"></i>angle-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-left"></i>angle-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-right"></i>angle-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angle-up"></i>angle-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-down"></i>arrow-circle-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-left"></i>arrow-circle-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-o-down"></i>arrow-circle-o-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-o-left"></i>arrow-circle-o-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-o-right"></i>arrow-circle-o-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-o-up"></i>arrow-circle-o-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-right"></i>arrow-circle-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-circle-up"></i>arrow-circle-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-down"></i>arrow-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-left"></i>arrow-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-right"></i>arrow-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrow-up"></i>arrow-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows"></i>arrows</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows-alt"></i>arrows-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows-h"></i>arrows-h</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows-v"></i>arrows-v</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-down"></i>caret-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-left"></i>caret-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-right"></i>caret-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-down"></i>caret-square-o-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-left"></i>caret-square-o-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-right"></i>caret-square-o-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-square-o-up"></i>caret-square-o-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-caret-up"></i>caret-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-circle-down"></i>chevron-circle-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-circle-left"></i>chevron-circle-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-circle-right"></i>chevron-circle-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-circle-up"></i>chevron-circle-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-down"></i>chevron-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-left"></i>chevron-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-right"></i>chevron-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chevron-up"></i>chevron-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-exchange"></i>exchange</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-down"></i>hand-o-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-left"></i>hand-o-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-right"></i>hand-o-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hand-o-up"></i>hand-o-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-long-arrow-down"></i>long-arrow-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-long-arrow-left"></i>long-arrow-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-long-arrow-right"></i>long-arrow-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-long-arrow-up"></i>long-arrow-up</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-down"></i>toggle-down</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-left"></i>toggle-left</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-right"></i>toggle-right</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-toggle-up"></i>toggle-up</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="video-player" class="mainParts">
+            <h2 class="page-header">视频播放</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-arrows-alt"></i>arrows-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-backward"></i>backward</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-compress"></i>compress</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eject"></i>eject</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-expand"></i>expand</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fast-backward"></i>fast-backward</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fast-forward"></i>fast-forward</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-forward"></i>forward</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pause"></i>pause</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pause-circle"></i>pause-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pause-circle-o"></i>pause-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-play"></i>play</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-play-circle"></i>play-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-play-circle-o"></i>play-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-random"></i>random</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-step-backward"></i>step-backward</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-step-forward"></i>step-forward</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stop"></i>stop</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stop-circle"></i>stop-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stop-circle-o"></i>stop-circle-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-youtube-play"></i>youtube-play</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="brand" class="mainParts">
+            <h2 class="page-header">标志</h2>
+
+            <div class="alert alert-success">
+                <ul class="margin-bottom-none padding-left-lg">
+                    <li>所有标志图标都分别是其所有者的注册商标。</li>
+                    <li>使用这些商标并不代表Font Awesome拥有它们。</li>
+                    <li>商标只应用在被提及相应的公司或产品时使用。</li>
+                </ul>
+
+            </div>
+
+            <div class="alert alert-warning">
+                <h4>
+                    <i class="fa fa-warning"></i> 特别注意!
+                </h4>
+                Adblock Plus 插件会通过设置“Remove Social Media Buttons”来移除 Font Awesome
+                的这些标志图标。 然而我们并不会用一些特殊方法来强行显示。如果您认为这是一个错误,请 <a
+                    href="https://adblockplus.org/en/bugs" class="alert-link"
+                    target="_blank">向 Adblock Plus 报告这个问题</a>。 在Adblock
+                Plus修复这个问题之前,您需要自行修改这些图标的类名来解决这个问题。
+
+            </div>
+
+            <div class="row fontawesome-icon-list margin-bottom-lg">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-500px"></i>500px</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-adn"></i>adn</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-amazon"></i>amazon</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-android"></i>android</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-angellist"></i>angellist</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-apple"></i>apple</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bandcamp"></i>bandcamp</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-behance"></i>behance</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-behance-square"></i>behance-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bitbucket"></i>bitbucket</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bitbucket-square"></i>bitbucket-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bitcoin"></i>bitcoin</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-black-tie"></i>black-tie</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bluetooth"></i>bluetooth</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-bluetooth-b"></i>bluetooth-b</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-btc"></i>btc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-buysellads"></i>buysellads</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-amex"></i>cc-amex</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-diners-club"></i>cc-diners-club</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-discover"></i>cc-discover</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-jcb"></i>cc-jcb</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-mastercard"></i>cc-mastercard</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-paypal"></i>cc-paypal</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-stripe"></i>cc-stripe</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-cc-visa"></i>cc-visa</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-chrome"></i>chrome</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-codepen"></i>codepen</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-codiepie"></i>codiepie</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-connectdevelop"></i>connectdevelop</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-contao"></i>contao</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-css3"></i>css3</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dashcube"></i>dashcube</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-delicious"></i>delicious</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-deviantart"></i>deviantart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-digg"></i>digg</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dribbble"></i>dribbble</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-dropbox"></i>dropbox</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-drupal"></i>drupal</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-edge"></i>edge</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-eercast"></i>eercast</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-empire"></i>empire</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-envira"></i>envira</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-etsy"></i>etsy</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-expeditedssl"></i>expeditedssl</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fa"></i>fa</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-facebook"></i>facebook</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-facebook-f"></i>facebook-f</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-facebook-official"></i>facebook-official</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-facebook-square"></i>facebook-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-firefox"></i>firefox</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-first-order"></i>first-order</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-flickr"></i>flickr</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-font-awesome"></i>font-awesome</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fonticons"></i>fonticons</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-fort-awesome"></i>fort-awesome</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-forumbee"></i>forumbee</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-foursquare"></i>foursquare</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-free-code-camp"></i>free-code-camp</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ge"></i>ge</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-get-pocket"></i>get-pocket</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gg"></i>gg</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gg-circle"></i>gg-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-git"></i>git</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-git-square"></i>git-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-github"></i>github</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-github-alt"></i>github-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-github-square"></i>github-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gitlab"></i>gitlab</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gittip"></i>gittip</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-glide"></i>glide</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-glide-g"></i>glide-g</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-google"></i>google</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-google-plus"></i>google-plus</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-google-plus-circle"></i>google-plus-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-google-plus-official"></i>google-plus-official</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-google-plus-square"></i>google-plus-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-google-wallet"></i>google-wallet</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-gratipay"></i>gratipay</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-grav"></i>grav</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hacker-news"></i>hacker-news</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-houzz"></i>houzz</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-html5"></i>html5</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-imdb"></i>imdb</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-instagram"></i>instagram</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-internet-explorer"></i>internet-explorer</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ioxhost"></i>ioxhost</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-joomla"></i>joomla</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-jsfiddle"></i>jsfiddle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-lastfm"></i>lastfm</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-lastfm-square"></i>lastfm-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-leanpub"></i>leanpub</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-linkedin"></i>linkedin</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-linkedin-square"></i>linkedin-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-linode"></i>linode</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-linux"></i>linux</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-maxcdn"></i>maxcdn</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-meanpath"></i>meanpath</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-medium"></i>medium</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-meetup"></i>meetup</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-mixcloud"></i>mixcloud</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-modx"></i>modx</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-odnoklassniki"></i>odnoklassniki</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-odnoklassniki-square"></i>odnoklassniki-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-opencart"></i>opencart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-openid"></i>openid</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-opera"></i>opera</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-optin-monster"></i>optin-monster</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pagelines"></i>pagelines</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-paypal"></i>paypal</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pied-piper"></i>pied-piper</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pied-piper-alt"></i>pied-piper-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pied-piper-pp"></i>pied-piper-pp</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pinterest"></i>pinterest</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pinterest-p"></i>pinterest-p</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-pinterest-square"></i>pinterest-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-product-hunt"></i>product-hunt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-qq"></i>qq</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-quora"></i>quora</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ra"></i>ra</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ravelry"></i>ravelry</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-rebel"></i>rebel</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-reddit"></i>reddit</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-reddit-alien"></i>reddit-alien</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-reddit-square"></i>reddit-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-platform"></i>platform</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-resistance"></i>resistance</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-safari"></i>safari</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-scribd"></i>scribd</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-sellsy"></i>sellsy</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-share-alt"></i>share-alt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-share-alt-square"></i>share-alt-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-shirtsinbulk"></i>shirtsinbulk</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-simplybuilt"></i>simplybuilt</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-skyatlas"></i>skyatlas</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-skype"></i>skype</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-slack"></i>slack</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-slideshare"></i>slideshare</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-snapchat"></i>snapchat</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-snapchat-ghost"></i>snapchat-ghost</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-snapchat-square"></i>snapchat-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-soundcloud"></i>soundcloud</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-spotify"></i>spotify</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stack-exchange"></i>stack-exchange</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stack-overflow"></i>stack-overflow</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-steam"></i>steam</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-steam-square"></i>steam-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stumbleupon"></i>stumbleupon</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stumbleupon-circle"></i>stumbleupon-circle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-superpowers"></i>superpowers</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-telegram"></i>telegram</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tencent-weibo"></i>tencent-weibo</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-themeisle"></i>themeisle</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-trello"></i>trello</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tripadvisor"></i>tripadvisor</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tumblr"></i>tumblr</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-tumblr-square"></i>tumblr-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-twitch"></i>twitch</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-twitter"></i>twitter</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-twitter-square"></i>twitter-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-usb"></i>usb</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-viacoin"></i>viacoin</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-viadeo"></i>viadeo</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-viadeo-square"></i>viadeo-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-vimeo"></i>vimeo</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-vimeo-square"></i>vimeo-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-vine"></i>vine</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-vk"></i>vk</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wechat"></i>wechat</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-weibo"></i>weibo</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-weixin"></i>weixin</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-whatsapp"></i>whatsapp</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wikipedia-w"></i>wikipedia-w</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-windows"></i>windows</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wordpress"></i>wordpress</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wpbeginner"></i>wpbeginner</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wpexplorer"></i>wpexplorer</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wpforms"></i>wpforms</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-xing"></i>xing</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-xing-square"></i>xing-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-y-combinator"></i>y-combinator</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-y-combinator-square"></i>y-combinator-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-yahoo"></i>yahoo</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-yc"></i>yc</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-yc-square"></i>yc-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-yelp"></i>yelp</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-yoast"></i>yoast</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-youtube"></i>youtube</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-youtube-play"></i>youtube-play</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-youtube-square"></i>youtube-square</a>
+                </div>
+
+            </div>
+        </section>
+
+        <section id="medical" class="mainParts">
+            <h2 class="page-header">医疗</h2>
+
+            <div class="row fontawesome-icon-list">
+
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-ambulance"></i>ambulance</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-h-square"></i>h-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-heart"></i>heart</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-heart-o"></i>heart-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-heartbeat"></i>heartbeat</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-hospital-o"></i>hospital-o</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-medkit"></i>medkit</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-plus-square"></i>plus-square</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-stethoscope"></i>stethoscope</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-user-md"></i>user-md</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair"></i>wheelchair</a>
+                </div>
+
+                <div class="fa-hover col-md-3 col-sm-4">
+                    <a class="col-xs-11"><i class="fa fa-wheelchair-alt"></i>wheelchair-alt</a>
+                </div>
+
+            </div>
+        </section>
+    </div>
+</div>
+</body>
+</html>

+ 24 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/log.html

@@ -0,0 +1,24 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>系统日志</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <Row :gutter="16">
+        <i-col span="4">
+            <i-input v-model="q.key" @on-enter="query" placeholder="用户名、用户操作"/>
+        </i-col>
+        <Checkbox-group v-model="isLogin" @on-change="query" class="inline">
+            <Checkbox label="登录"><span>登录日志</span></Checkbox>
+        </Checkbox-group>
+        <i-button @click="query">查询</i-button>
+    </Row>
+    <table id="jqGrid"></table>
+    <div id="jqGridPager"></div>
+</div>
+
+<script src="${rc.contextPath}/js/sys/log.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 84 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/macro.html

@@ -0,0 +1,84 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>通用字典表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+                </i-col>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:macro:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:macro:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:macro:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="macro" :rules="ruleValidate" :label-width="80">
+            <Form-item label="类型" prop="type">
+                <Radio-group v-model="macro.type">
+                    <Radio label="0">
+                        <span>目录</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>参数配置</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="状态">
+                <Radio-group v-model="macro.status">
+                    <Radio label="0">
+                        <span>隐藏</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>显示</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item v-if="macro.type==1" label="父级" prop="parentId" style="width: 268px;">
+                <i-select v-model="macro.parentId" filterable>
+                    <i-option v-for="macro in macros" :value="macro.id" :key="macro.id">{{macro.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="名称" prop="name">
+                <i-input v-model="macro.name" placeholder="名称"/>
+            </Form-item>
+            <Form-item label="值" prop="value">
+                <i-input v-model="macro.value" placeholder="值"/>
+            </Form-item>
+            <Form-item label="排序" prop="orderNum">
+                <Input-number :min="0" :step="1" v-model="macro.orderNum" placeholder="排序" style="width: 188px;"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="macro.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/macro.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 340 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/main.html

@@ -0,0 +1,340 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>欢迎页</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div class="wrapper-content animated fadeIn" id="rrapp">
+    <div class="row">
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-red">
+                <div class="inner">
+                    <h3>{{orderSum}}</h3>
+                    <p>所有订单</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-shopping-bag"></i>
+                </div>
+                <a onclick="vm.toOrderByShipStatus()" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-yellow">
+                <div class="inner">
+                    <h3>{{dfOrderSum}}</h3>
+                    <p>待发货</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-shopping-bag"></i>
+                </div>
+                <a onclick="vm.toOrderByShipStatus(0)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-green">
+                <div class="inner">
+                    <h3>{{yfOrderSum}}</h3>
+                    <p>已发货</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-shopping-bag"></i>
+                </div>
+                <a onclick="vm.toOrderByShipStatus(1)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-light-blue">
+                <div class="inner">
+                    <h3>{{yfkOrderSum}}</h3>
+                    <p>待付款</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-shopping-bag"></i>
+                </div>
+                <a onclick="vm.toOrderByPayStatus(0)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-fuchsia">
+                <div class="inner">
+                    <h3>{{thcOrderSum}}</h3>
+                    <p>退货</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-shopping-bag"></i>
+                </div>
+                <a onclick="vm.toOrderByShipStatus(4)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-aqua">
+                <div class="inner">
+                    <h3>{{ywcOrderSum}}</h3>
+                    <p>已完成</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-shopping-bag"></i>
+                </div>
+                <a onclick="vm.toOrderByOrderStatus(402)" class="small-box-footer">详情 <i
+                        class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-red">
+                <div class="inner">
+                    <h3>{{userSum}}</h3>
+                    <p>所有会员</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-user-md"></i>
+                </div>
+                <a onclick="vm.toUser()" class="small-box-footer">详情 <i class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+        <div class="col-md-3 col-sm-6 col-xs-12">
+            <div class="small-box bg-red">
+                <div class="inner">
+                    <h3>{{goodsSum}}</h3>
+                    <p>所有商品</p>
+                </div>
+                <div class="icon">
+                    <i class="fa fa-ship"></i>
+                </div>
+                <a onclick="vm.toGoods()" class="small-box-footer">详情 <i class="fa fa-arrow-circle-right"></i></a>
+            </div>
+        </div>
+    </div>
+    <table class="table table-hover table-responsive table-bordered">
+        <tr>
+            <th colspan="5">会员购买率:<span style="color: red;">{{hygml}}%</span>(会员购买率=已付款订单会员数÷会员总数)</th>
+        </tr>
+        <tr style='text-align: center;'>
+            <th>会员总数</th>
+            <th>已付款订单会员数</th>
+            <th>有订单会员数</th>
+            <th>今日订单数</th>
+            <th>今日会员购物总额</th>
+        </tr>
+        <tr style='text-align: center;'>
+            <td>{{userSum}}</td>
+            <td>{{yfkOrderUserSum}}</td>
+            <td>{{oderUserSum}}</td>
+            <td>{{todayUserOrder}}</td>
+            <td>{{todayUserSales}}</td>
+        </tr>
+    </table>
+
+    <table class="table table-hover table-responsive table-bordered">
+        <tr>
+            <th colspan="3">每会员平均订单数及购物额(每会员平均订单数=有订单会员数÷会员总数)</th>
+        </tr>
+        <tr style='text-align: center;'>
+            <th>总收入</th>
+            <th>每会员订单数</th>
+            <th>每会员购物数</th>
+        </tr>
+        <tr style='text-align: center;'>
+            <td>{{incomeSum}}</td>
+            <td>{{mhydds}}</td>
+            <td>{{mhygws}}</td>
+        </tr>
+    </table>
+    <table class="table table-hover table-responsive table-bordered">
+        <tr>
+            <th>总点击数:{{hitCount}}; 每千点击订单数:{{average1000}}; 每千点击购物额:{{averageSales1000}}</th>
+        </tr>
+    </table>
+</div>
+
+<script type="text/javascript">
+    var vm = new Vue({
+        el: '#rrapp',
+        data: {
+            orderSum: 0,
+            dfOrderSum: 0,//待发货
+            yfOrderSum: 0,//已发货
+            yfkOrderSum: 0,//待付款
+            ywcOrderSum: 0,//已完成
+            thcOrderSum: 0,//退货
+            userSum: 0,//所有会员数
+            goodsSum: 0,//所有商品数
+            yfkOrderUserSum: 0,//已付款订单会员数
+            oderUserSum: 0,//有订单会员数
+            todayUserOrder: 0,//今日订单数
+            todayUserSales: 0,//今日会员购物总额
+            hygml: 0,//会员购买率
+            incomeSum: 0,//总收入
+            payedOrderCount: 0,//已支付订单数
+            mhydds: 0,//每会员订单数
+            mhygws: 0,//每会员购物数
+            hitCount: 0,//总点击数
+            average1000: 0,//每千点击订单数
+            averageSales1000: 0//每千点击购物额
+        },
+        methods: {
+            toOrderByShipStatus: function (shippingStatus) {
+                if (!shippingStatus && shippingStatus != 0) {
+                    openWindow({
+                        top: true,
+                        type: 2,
+                        title: '订单',
+                        content: '../shop/order.html'
+                    });
+                    return;
+                }
+                let url = '../shop/order.html?shippingStatus=' + shippingStatus;
+
+                if (shippingStatus == 0) {//待发货
+                    url += '&orderStatus=201&payStatus=2';
+                    if (vm.dfOrderSum == 0) {
+                        iview.Message.error('没有数据!');
+                        return;
+                    }
+                } else if (shippingStatus == 1) {//已发货
+                    if (vm.yfOrderSum == 0) {
+                        iview.Message.error('没有数据!');
+                        return;
+                    }
+                } else if (shippingStatus == 4) {//退货
+                    if (vm.thcOrderSum == 0) {
+                        iview.Message.error('没有数据!');
+                        return;
+                    }
+                }
+
+                openWindow({
+                    top: true,
+                    type: 2,
+                    title: '订单',
+                    content: url
+                });
+            },
+            toOrderByPayStatus: function (payStatus) {
+                if (vm.yfkOrderSum == 0) {
+                    iview.Message.error('没有数据!');
+                    return;
+                }
+                openWindow({
+                    top: true,
+                    type: 2,
+                    title: '订单',
+                    content: '../shop/order.html?orderStatus=' + payStatus
+                });
+            },
+            toOrderByOrderStatus: function (orderStatus) {
+                if (vm.ywcOrderSum == 0) {
+                    iview.Message.error('没有数据!');
+                    return;
+                }
+                openWindow({
+                    top: true,
+                    type: 2,
+                    title: '订单',
+                    content: '../shop/order.html?orderStatus=' + orderStatus
+                });
+            },
+            toUser: function () {
+                openWindow({
+                    top: true,
+                    type: 2,
+                    title: '会员列表',
+                    area: ['90%', '95%'],
+                    content: '../shop/shopuser.html'
+                });
+            },
+            toGoods: function () {
+                openWindow({
+                    top: true,
+                    type: 2,
+                    title: '商品',
+                    content: '../shop/goods.html'
+                });
+            }
+        },
+        created: function () {
+            let vue = this;
+            $.getJSON("../order/queryTotal?isOnfiilineOrder=0", function (r) {
+                vue.orderSum = r.sum;
+            });
+            $.getJSON("../order/queryTotal?orderStatus=201&payStatus=2&isOnfiilineOrder=0", function (r) {
+                vue.dfOrderSum = r.sum;
+                if (r.sum > 0) {
+                    iview.Notice.info({
+                        title: '您有待发货订单',
+                        desc: '<a onclick="vm.toOrderByShipStatus(0)" class="small-box-footer">查看</a>',
+                        duration: 0
+                    });
+                    let iN = new iNotify({
+                        effect: 'flash',
+                        interval: 500,
+                        message: "待发订单",
+                        audio: {
+                            file: ['../statics/audio/dforder.mp3']
+                        },
+                        notification: {
+                            title: "通知!",
+                            body: '您有待发订单'
+                        }
+                    });
+                    iN.setTitle(true).player();
+                }
+            });
+            $.getJSON("../order/queryTotal?isOnfiilineOrder=0&shippingStatus=1", function (r) {
+                vue.yfOrderSum = r.sum;
+            });
+            $.getJSON("../order/queryTotal?isOnfiilineOrder=0&orderStatus=0", function (r) {
+                vue.yfkOrderSum = r.sum;
+            });
+            $.getJSON("../order/queryTotal?isOnfiilineOrder=0&orderStatus=402", function (r) {
+                vue.ywcOrderSum = r.sum;
+            });
+            $.getJSON("../order/queryTotal?isOnfiilineOrder=0&shippingStatus=4", function (r) {
+                vue.thcOrderSum = r.sum;
+            });
+            $.getJSON("../order/getUserOrderInfo?type=yfkOrderUserSum", function (r) {
+                vue.yfkOrderUserSum = r.result;
+            });
+            $.getJSON("../order/getUserOrderInfo?type=oderUserSum", function (r) {
+                vue.oderUserSum = r.result;
+            });
+            $.getJSON("../order/getUserOrderInfo?type=todayUserOrder", function (r) {
+                vue.todayUserOrder = r.result;
+            });
+            $.getJSON("../order/getUserOrderInfo?type=todayUserSales", function (r) {
+                vue.todayUserSales = r.result;
+            });
+            $.getJSON("../order/getUserOrderInfo?type=incomeSum", function (r) {
+                vue.incomeSum = r.result;
+            });
+            $.getJSON("../order/getUserOrderInfo?type=payedOrderCount", function (r) {
+                vue.payedOrderCount = r.result;
+            });
+            $.getJSON("../footprint/queryTotal", function (r) {
+                vue.hitCount = r.hitCount;
+            });
+
+            $.getJSON("../user/queryTotal", function (r) {
+                vue.userSum = r.userSum;
+            });
+            $.getJSON("../goods/queryTotal", function (r) {
+                vue.goodsSum = r.goodsSum;
+            });
+        },
+        updated: function () {
+            let vue = this;
+            vue.hygml = (vue.yfkOrderUserSum / vue.userSum * 100).toFixed(4);
+            vue.mhydds = (vue.oderUserSum / vue.userSum).toFixed(4);
+            vue.mhygws = (vue.payedOrderCount / vue.oderUserSum).toFixed(4);
+            vue.average1000 = (vue.orderSum / vue.hitCount * 1000).toFixed(4);
+            vue.averageSales1000 = (vue.incomeSum / vue.hitCount * 1000).toFixed(4);
+        }
+    });
+</script>
+</body>
+</html>

+ 99 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/menu.html

@@ -0,0 +1,99 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>菜单管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-button type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+                </i-col>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:menu:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:menu:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:menu:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="menu" :rules="ruleValidate" :label-width="80">
+            <Form-item label="类型" prop="type">
+                <Radio-group v-model="menu.type">
+                    <Radio label="0">
+                        <span>目录</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>菜单</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>按钮</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="菜单名称" prop="name">
+                <i-input v-model="menu.name" placeholder="菜单名称或按钮名称"/>
+            </Form-item>
+
+            <Form-item label="上级菜单" v-if="menu.type == 2" prop="parentName">
+                <i-input v-model="menu.parentName" @on-click="menuTree" icon="eye" readonly="readonly"
+                         placeholder="一级菜单"/>
+            </Form-item>
+            <Form-item label="上级菜单" v-if="menu.type != 2">
+                <i-input v-model="menu.parentName" @on-click="menuTree" icon="eye" readonly="readonly"
+                         placeholder="一级菜单"/>
+            </Form-item>
+
+            <Form-item v-if="menu.type == 1" label="菜单URL" prop="url">
+                <i-input v-model="menu.url" placeholder="菜单URL"/>
+            </Form-item>
+            <Form-item v-if="menu.type == 1 || menu.type == 2" label="授权标识" prop="perms">
+                <i-input v-model="menu.perms" placeholder="多个用逗号分隔,如:user:list,user:create"/>
+            </Form-item>
+            <Form-item v-if="menu.type != 2" label="排序号" prop="orderNum">
+                <Input-number :min="0" :step="1" v-model="menu.orderNum" placeholder="排序号" style="width: 188px;"/>
+            </Form-item>
+            <Form-item v-if="menu.type != 2" label="图标" prop="icon">
+                <i-input v-model="menu.icon" placeholder="图标,点击右边按钮选取图标" @on-click="selectIcon" icon="eye"/>
+            </Form-item>
+            <Form-item label="状态" prop="status">
+                <Radio-group v-model="menu.status">
+                    <Radio label="0">
+                        <span>有效</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>无效</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<!-- 选择菜单 -->
+<div id="menuLayer" style="display: none;padding:10px;">
+    <ul id="menuTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/sys/menu.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 92 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/notice.html

@@ -0,0 +1,92 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>通知</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <i-col span="4">
+                <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+            #if($shiro.hasPermission("sys:notice:save"))
+            <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+            #end
+            #if($shiro.hasPermission("sys:notice:update"))
+            <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+            #end
+            #if($shiro.hasPermission("sys:notice:delete"))
+            <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+            #end
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="sysNotice" :rules="ruleValidate" :label-width="80">
+            <Form-item label="通知内容" prop="context">
+                <i-input type="textarea" v-model="sysNotice.context" placeholder="通知内容"/>
+            </Form-item>
+            <Form-item label="通知标题" prop="title">
+                <i-input v-model="sysNotice.title" placeholder="通知标题"/>
+            </Form-item>
+            <Form-item label="通知来源" prop="soucre">
+                <Radio-group v-model="sysNotice.soucre">
+                    <Radio label="1">
+                        <span>普通通知</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>下单通知</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="通知状态" prop="status">
+                <Radio-group v-model="sysNotice.status">
+                    <Radio label="0">
+                        <span>已发布</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>草稿</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="是否紧急" prop="isUrgent">
+                <Radio-group v-model="sysNotice.isUrgent">
+                    <Radio label="0">
+                        <span>是</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>否</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="发布时间" prop="releaseTimee">
+                <Date-picker v-model="sysNotice.releaseTimee" placeholder="发布时间"/>
+            </Form-item>
+            <Form-item label="创建时间" prop="createTime">
+                <Date-picker v-model="sysNotice.createTime" placeholder="创建时间"/>
+            </Form-item>
+            <Form-item label="修改时间" prop="updateTime">
+                <Date-picker v-model="sysNotice.updateTime" placeholder="修改时间"/>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="sysNotice.remark" placeholder="备用字段"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/notice.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 62 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/noticeuser.html

@@ -0,0 +1,62 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>通知和用户关系表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+	<div v-show="showList">
+        <Row :gutter="16">
+            <i-col span="4">
+                <i-input v-model="q.userName" @on-enter="query" placeholder="用户"/>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+			<!--#if($shiro.hasPermission("sys:noticeuser:save"))-->
+            <!--<i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>-->
+			<!--#end-->
+			<!--#if($shiro.hasPermission("sys:noticeuser:update"))-->
+            <!--<i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>-->
+			<!--#end-->
+			#if($shiro.hasPermission("sys:noticeuser:delete"))
+            <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+			#end
+        </Row>
+	    <table id="jqGrid"></table>
+	    <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+		<i-form ref="formValidate" :model="sysNoticeUser" :rules="ruleValidate" :label-width="80">
+            <Form-item label="用户id" prop="userId">
+                <i-input v-model="sysNoticeUser.userId" placeholder="用户id"/>
+            </Form-item>
+            <Form-item label="" prop="noticeId">
+                <i-input v-model="sysNoticeUser.noticeId" placeholder=""/>
+            </Form-item>
+            <Form-item label="状态" prop="status">
+                <Radio-group v-model="sysNoticeUser.status">
+                    <Radio label="0">
+                        <span>已读</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>未读</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="备用字段" prop="remark">
+                <i-input type="textarea" v-model="sysNoticeUser.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+	</Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/noticeuser.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 114 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/oss.html

@@ -0,0 +1,114 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>文件上传</title>
+    #parse("sys/header.html")
+    <script src="${rc.contextPath}/statics/libs/ajaxupload.js"></script>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <!--<div class="search-group">
+                <i-button type="success" @click="addConfig"><i class="fa fa-sun-o"></i>&nbsp;云存储配置</i-button>
+                <i-button type="primary" id="upload"><i class="fa fa-plus"></i>&nbsp;上传文件</i-button>
+            </div>-->
+            <div class="buttons-group">
+                <!--<i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>-->
+                <i-button type="success" @click="lookImg"><i class="fa fa-eye"></i>&nbsp;预览</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form :label-width="130">
+            <Form-item label="存储类型" prop="type">
+                <Radio-group v-model="config.type">
+                    <Radio label="2">
+                        <span>阿里云</span>
+                    </Radio>
+                    <Radio label="3">
+                        <span>腾讯云</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>七牛</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <i-form v-if="config.type == 1" ref="formValidate" :label-width="130">
+                <Form-item label="域名" prop="qiniuDomain">
+                    <i-input v-model="config.qiniuDomain" placeholder="七牛绑定的域名"/>
+                </Form-item>
+                <Form-item label="路径前缀" prop="qiniuPrefix">
+                    <i-input v-model="config.qiniuPrefix" placeholder="不设置默认为空"/>
+                </Form-item>
+                <Form-item label="AccessKey" prop="qiniuAccessKey">
+                    <i-input v-model="config.qiniuAccessKey" placeholder="七牛AccessKey"/>
+                </Form-item>
+                <Form-item label="SecretKey" prop="qiniuSecretKey">
+                    <i-input v-model="config.qiniuSecretKey" placeholder="七牛SecretKey"/>
+                </Form-item>
+                <Form-item label="空间名" prop="qiniuBucketName">
+                    <i-input v-model="config.qiniuBucketName" placeholder="七牛存储空间名"/>
+                </Form-item>
+            </i-form>
+            <i-form v-if="config.type == 2" ref="formValidate" :model="config" :rules="aliRuleValidate"
+                    :label-width="130">
+                <Form-item label="域名" prop="aliyunDomain">
+                    <i-input v-model="config.aliyunDomain" placeholder="阿里云绑定的域名"/>
+                </Form-item>
+                <Form-item label="路径前缀" prop="aliyunPrefix">
+                    <i-input v-model="config.aliyunPrefix" placeholder="不设置默认为空"/>
+                </Form-item>
+                <Form-item label="EndPoint" prop="aliyunEndPoint">
+                    <i-input v-model="config.aliyunEndPoint" placeholder="阿里云EndPoint"/>
+                </Form-item>
+                <Form-item label="AccessKeyId" prop="aliyunAccessKeyId">
+                    <i-input v-model="config.aliyunAccessKeyId" placeholder="阿里云AccessKeyId"/>
+                </Form-item>
+                <Form-item label="AccessKeySecret" prop="aliyunAccessKeySecret">
+                    <i-input v-model="config.aliyunAccessKeySecret" placeholder="阿里云AccessKeySecret"/>
+                </Form-item>
+                <Form-item label="BucketName" prop="aliyunBucketName">
+                    <i-input v-model="config.aliyunBucketName" placeholder="阿里云BucketName"/>
+                </Form-item>
+            </i-form>
+            <i-form ref="formValidate" :model="config" :rules="qcloudRuleValidate" v-if="config.type == 3"
+                    :label-width="130">
+                <Form-item label="域名" prop="qcloudDomain">
+                    <i-input v-model="config.qcloudDomain" placeholder="腾讯云绑定的域名"/>
+                </Form-item>
+                <Form-item label="路径前缀" prop="qcloudPrefix">
+                    <i-input v-model="config.qcloudPrefix" placeholder="不设置默认为空"/>
+                </Form-item>
+                <Form-item label="AppId" prop="qcloudAppId">
+                    <i-input v-model="config.qcloudAppId" placeholder="腾讯云AppId"/>
+                </Form-item>
+                <Form-item label="SecretId" prop="qcloudSecretId">
+                    <i-input v-model="config.qcloudSecretId" placeholder="腾讯云SecretId"/>
+                </Form-item>
+                <Form-item label="SecretKey" prop="qcloudSecretKey">
+                    <i-input v-model="config.qcloudSecretKey" placeholder="腾讯云SecretKey"/>
+                </Form-item>
+                <Form-item label="BucketName" prop="qcloudBucketName">
+                    <i-input v-model="config.qcloudBucketName" placeholder="腾讯云BucketName"/>
+                </Form-item>
+                <Form-item label="Bucket所属地区" prop="qcloudRegion">
+                    <i-input v-model="config.qcloudRegion" placeholder="如:sh(可选值 ,华南:gz 华北:tj 华东:sh)"/>
+                </Form-item>
+            </i-form>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/oss.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 63 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/printer.html

@@ -0,0 +1,63 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>飞鸽打印机</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:printer:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:printer:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:printer:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="sysPrinter" :rules="ruleValidate" :label-width="100">
+            <Form-item label="打印机名称" prop="name">
+                <i-input v-model="sysPrinter.name" placeholder="打印机名称"/>
+            </Form-item>
+            <Form-item label="打印机编号" prop="sn">
+                <i-input v-model="sysPrinter.sn" placeholder="打印机编号"/>
+            </Form-item>
+            <Form-item label="所属门店" prop="storeId">
+                <!--<i-input v-model="sysPrinter.storeId" placeholder="所属门店"/>-->
+                <i-select v-model="sysPrinter.storeId" filterable placeholder="所属门店"
+                          label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}
+                    </i-option>
+                </i-select>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/printer.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 83 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/region.html

@@ -0,0 +1,83 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <i-col span="4">
+                <i-input v-model="q.parentName" @on-enter="query" placeholder="上级区域"/>
+            </i-col>
+            <i-col span="4">
+                <i-input v-model="q.name" @on-enter="query" placeholder="区域"/>
+            </i-col>
+            <i-col span="4">
+                <i-select v-model="q.type">
+                    <i-option value="">请选择</i-option>
+                    <i-option value="0">国家</i-option>
+                    <i-option value="1">省份</i-option>
+                    <i-option value="2">地市</i-option>
+                    <i-option value="3">区县</i-option>
+                </i-select>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+            #if($shiro.hasPermission("sys:region:save"))
+            <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+            #end
+            #if($shiro.hasPermission("sys:region:update"))
+            <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+            #end
+            #if($shiro.hasPermission("sys:region:delete"))
+            <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+            #end
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="region" :rules="ruleValidate" :label-width="80">
+            <Form-item label="类型" prop="type">
+                <Radio-group v-model="region.type" @on-change="changeType">
+                    <Radio label="0">
+                        <span>国家</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>省份</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>地市</span>
+                    </Radio>
+                    <Radio label="3">
+                        <span>区县</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="上级区域" prop="parentId">
+                <i-select v-model="region.parentId" filterable>
+                    <i-option v-for="region in regionList" :value="region.id" :key="region.id">{{region.name}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="区域名称" prop="name">
+                <i-input v-model="region.name" placeholder="区域名称"/>
+            </Form-item>
+            <Form-item label="区域代理Id" prop="agencyId">
+                <i-input v-model="region.agencyId" placeholder="区域代理Id"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/region.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 72 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/role.html

@@ -0,0 +1,72 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>角色管理</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.roleName" @on-enter="query" placeholder="角色名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:role:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:role:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:role:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="role" :rules="ruleValidate" :label-width="80">
+            <Form-item label="角色名称" prop="roleName">
+                <i-input v-model="role.roleName" placeholder="角色名称"/>
+            </Form-item>
+            <!--<Form-item label="所属部门" prop="deptName">
+                <i-input type="text" v-model="role.deptName" icon="eye" readonly="readonly"
+                         @on-click="deptTree" readonly="readonly" placeholder="所属部门"/>
+            </Form-item>-->
+            <Form-item label="备注" prop="remark">
+                <i-input type="textarea" v-model="role.remark" placeholder="备注"/>
+            </Form-item>
+            <Form-item label="功能权限">
+                <div style="overflow-y: auto; max-height: 250px; border: 1px solid #cccccc;">
+                    <ul id="menuTree" class="ztree"></ul>
+                </div>
+            </Form-item>
+            <!--<Form-item label="数据权限">
+                <div style="overflow-y: auto; max-height: 250px; border: 1px solid #cccccc;">
+                    <ul id="dataTree" class="ztree"></ul>
+                </div>
+            </Form-item>-->
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+
+<script src="${rc.contextPath}/js/sys/role.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 97 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/schedule.html

@@ -0,0 +1,97 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>定时任务</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <i-col span="4">
+                <i-input v-model="q.methodName" @on-enter="query" placeholder="方法名称"/>
+            </i-col>
+            <i-button @click="query">查询</i-button>
+            #if($shiro.hasPermission("sys:schedule:save"))
+            <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+            #end
+            #if($shiro.hasPermission("sys:schedule:update"))
+            <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+            #end
+            #if($shiro.hasPermission("sys:schedule:delete"))
+            <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+            #end
+            #if($shiro.hasPermission("sys:schedule:pause"))
+            <i-button type="dashed" @click="pause"><i class="fa fa-pause"></i>&nbsp;暂停</i-button>
+            #end
+            #if($shiro.hasPermission("sys:schedule:resume"))
+            <i-button type="primary" @click="resume"><i class="fa fa-play"></i>&nbsp;恢复</i-button>
+            #end
+            #if($shiro.hasPermission("sys:schedule:run"))
+            <i-button type="warning" @click="runOnce"><i class="fa fa-arrow-circle-right"></i>&nbsp;立即执行</i-button>
+            #end
+            #if($shiro.hasPermission("sys:schedule:log"))
+            <a class="btn btn-primary" style="float:right;" href="schedule_log.html">日志列表</a>
+            #end
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+    <Row :gutter="16" v-show="!showList">
+        <i-col span="12">
+            <Card>
+                <p slot="title">{{title}}</p>
+                <i-form ref="formValidate" :model="schedule" :rules="ruleValidate" :label-width="100">
+                    <Form-item label="bean名称" prop="beanName">
+                        <i-input v-model="schedule.beanName" placeholder="spring bean名称,如:testTask"/>
+                    </Form-item>
+                    <Form-item label="方法名称" prop="methodName">
+                        <i-input v-model="schedule.methodName" placeholder="方法名称"/>
+                    </Form-item>
+                    <Form-item label="参数" prop="params">
+                        <i-input v-model="schedule.params" placeholder="参数"/>
+                    </Form-item>
+                    <Form-item label="cron表达式" prop="cronExpression">
+                        <i-input v-model="schedule.cronExpression" placeholder="如:0 0 12 * * ?"/>
+                    </Form-item>
+                    <Form-item label="备注" prop="remark">
+                        <i-input type="textarea" v-model="schedule.remark" placeholder="备注"/>
+                    </Form-item>
+                    <Form-item>
+                        <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                        <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                        <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置
+                        </i-button>
+                    </Form-item>
+                </i-form>
+            </Card>
+        </i-col>
+        <i-col span="12">
+            <Card>
+                <p slot="title" style="text-align: center">常用Cron表达式</p>
+                <div class="panel-body">
+                    <div class="col-sm-4 control-label">0 15 10 * * ? *</div>
+                    <div class="col-sm-8 control-label">每天10点15分触发</div>
+                    <div class="col-sm-4 control-label">0 15 10 * * ? 2017</div>
+                    <div class="col-sm-8 control-label">2017年每天10点15分触发</div>
+                    <div class="col-sm-4 control-label">0 * 14 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点59分每分触发</div>
+                    <div class="col-sm-4 control-label">0 0/5 14 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点59分(整点开始,每隔5分触发)</div>
+                    <div class="col-sm-4 control-label">0 0/5 14,18 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点59分、18点到18点59分(整点开始,每隔5分触发)</div>
+                    <div class="col-sm-4 control-label">0 0-5 14 * * ?</div>
+                    <div class="col-sm-8 control-label">每天下午的 2点到2点05分每分触发</div>
+                    <div class="col-sm-4 control-label">0 15 10 ? * 6L</div>
+                    <div class="col-sm-8 control-label">每月最后一周的星期五的10点15分触发</div>
+                    <div class="col-sm-4 control-label">0 15 10 ? * 6#3</div>
+                    <div class="col-sm-8 control-label">每月的第三周的星期五开始触发</div>
+                </div>
+            </Card>
+        </i-col>
+    </Row>
+</div>
+
+<script src="${rc.contextPath}/js/sys/schedule.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 25 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/schedule_log.html

@@ -0,0 +1,25 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>定时任务日志</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp">
+    <div>
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.jobId" @on-enter="query" placeholder="任务ID"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button type="warning" @click="back">返回</i-button>
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <script src="${rc.contextPath}/js/sys/schedule_log.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 70 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/sendsms.html

@@ -0,0 +1,70 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak style="padding: 5px">
+    <Card>
+        <i-form ref="formValidate" :model="smsLog" :rules="ruleValidate" :label-width="80">
+            <Form-item label="发送时间" prop="stime">
+                <Date-picker type="datetime" v-model="smsLog.stime" placeholder="发送时间,填写时已填写的时间发送,不填时为当前时间发送"
+                             format="yyyy-MM-dd HH:mm:ss" style="width: 40%;"></Date-picker>
+            </Form-item>
+            <Form-item label="手机号码" prop="mobile">
+                <i-input type="textarea" v-model="smsLog.mobile" placeholder="手机号码。多个以英文逗号隔开"/>
+            </Form-item>
+            <Form-item label="发送内容" prop="content">
+                <i-input type="textarea" v-model="smsLog.content" placeholder="发送内容(1-500 个汉字)UTF-8编码"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+<script type="text/javascript">
+    let vm = new Vue({
+        el: '#rrapp',
+        data: {
+            smsLog: {
+                type: 'pt'
+            },
+            ruleValidate: {
+                content: [
+                    {required: true, message: '发送内容不能为空', trigger: 'blur'}
+                ],
+                mobile: [
+                    {required: true, message: '手机号码不能为空', trigger: 'blur'}
+                ]
+            }
+        },
+        methods: {
+            handleSubmit: function (name) {
+                handleSubmitValidate(this, name, function () {
+                    vm.send();
+                });
+            },
+            handleReset: function (name) {
+                handleResetForm(this, name);
+            },
+            send: function () {
+                let url = "../sys/smslog/sendSms";
+                Ajax.request({
+                    url: url,
+                    params: JSON.stringify(vm.smsLog),
+                    contentType: "application/json",
+                    type: 'POST',
+                    successCallback: function () {
+                        alert('提交成功', function (index) {
+                            vm.handleReset('formValidate');
+                        });
+                    }
+                });
+            }
+        }
+    });
+</script>
+</body>
+</html>

+ 61 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/smslog.html

@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.sendId" @on-enter="query" placeholder="发送编号"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+                <i-button @click="reloadSearch">重置</i-button>
+            </div>
+            <div class="buttons-group">
+                <!--<i-button type="success" @click="addConfig"><i class="fa fa-sun-o"></i>&nbsp;短信配置</i-button>
+                <i-button type="info" @click="sendSms"><i class="ivu-icon ivu-icon-android-send"></i>&nbsp;发送短信</i-button>-->
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="config" :rules="ruleValidate" :label-width="80">
+            <Form-item label="短信类型" prop="type">
+                <Radio-group v-model="config.type">
+                    <Radio label="1">
+                        <span>创瑞云SMS</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="发送域名" prop="domain">
+                <i-input v-model="config.domain" placeholder="必填参数。用户签名"/>
+            </Form-item>
+            <Form-item label="用户名" prop="name">
+                <i-input v-model="config.name" placeholder="用户名"/>
+            </Form-item>
+            <Form-item label="接口密钥" prop="pwd">
+                <i-input v-model="config.pwd" placeholder="接口密钥"/>
+            </Form-item>
+            <Form-item label="签名" prop="sign">
+                <i-input v-model="config.sign" placeholder="【公司简称】"/>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/smslog.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 95 - 0
kmall-admin/src/main/webapp/WEB-INF/page/sys/user.html

@@ -0,0 +1,95 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>管理员列表</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="4">
+                    <i-input v-model="q.username" @on-enter="query" placeholder="用户名"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("sys:user:save"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("sys:user:update"))
+                <i-button type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("sys:user:delete"))
+                <i-button type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="user" :rules="ruleValidate" :label-width="120">
+            <Form-item label="用户名" prop="username">
+                <i-input v-model="user.username" placeholder="登录账号"/>
+            </Form-item>
+            <!--<Form-item label="所属部门" prop="deptName">
+                <i-input type="text" v-model="user.deptName" icon="eye" readonly="readonly"
+                         @on-click="deptTree" readonly="readonly" placeholder="所属部门"/>
+            </Form-item>-->
+            <Form-item label="邮箱" prop="email">
+                <i-input v-model="user.email" placeholder="邮箱"/>
+            </Form-item>
+            <Form-item label="手机号" prop="mobile">
+                <i-input v-model="user.mobile" placeholder="手机号"/>
+            </Form-item>
+            <Form-item label="角色" prop="roleId">
+                <i-select v-model="user.roleId" filterable placeholder="角色" label-in-value>
+                    <i-option v-for="role in roleList" :value="role.roleId" :key="role.roleId">{{role.roleName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="数据角色类型" prop="roleType">
+                <Radio-group v-model="user.roleType">
+                    <Radio label="1">操作员</Radio>
+                    <Radio label="2">店员</Radio>
+                    <Radio label="3">商户管理员</Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item label="商户" prop="merchSn">
+                <i-select v-model="user.merchSn" filterable placeholder="商户" @on-change="getStoresByMerch" label-in-value>
+                    <i-option v-for="merch in merchList" :value="merch.merchSn" :key="merch.merchSn">{{merch.merchName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="门店" prop="storeId">
+                <i-select v-model="user.storeId" filterable placeholder="门店" label-in-value>
+                    <i-option v-for="store in storeList" :value="store.id" :key="store.id">{{store.storeName}}</i-option>
+                </i-select>
+            </Form-item>
+            <Form-item label="状态" prop="status">
+                <Radio-group v-model="user.status">
+                    <Radio label="0">
+                        <span>禁用</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>正常</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item>
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置</i-button>
+            </Form-item>
+        </i-form>
+    </Card>
+</div>
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+<script src="${rc.contextPath}/js/sys/user.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 206 - 0
kmall-admin/src/main/webapp/WEB-INF/page/test/iviewDemo.html

@@ -0,0 +1,206 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>iviewDemo</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div id="body">
+        <i-button type="info" @click="api">IVIEW_API</i-button>
+        <i-switch v-model="switch1" @on-change="change"></i-switch>
+        <Row>
+            <i-col span="12">
+                <Date-picker type="date" v-model="data1" placeholder="选择日期" style="width: 200px"></Date-picker>
+                {{data1}}
+            </i-col>
+            <i-col span="12">
+                <Date-picker type="daterange" placement="bottom-end" placeholder="选择日期区间"
+                             style="width: 200px"></Date-picker>
+            </i-col>
+        </Row>
+        <Tabs value="name1">
+            <Tab-pane label="buttons" name="name0">
+                <i-col span="24">
+                    <i-button>Default</i-button>
+                    <i-button type="primary">Primary</i-button>
+                    <i-button type="ghost">Ghost</i-button>
+                    <i-button type="dashed">Dashed</i-button>
+                    <i-button type="text">Text</i-button>
+                    <i-button type="info">信息按钮</i-button>
+                    <i-button type="success">成功按钮</i-button>
+                    <i-button type="warning">警告按钮</i-button>
+                    <i-button type="error">错误按钮</i-button>
+                </i-col>
+                <i-col span="24">
+                    <i-button type="primary" shape="circle" size="large">Large</i-button>
+                    <i-button type="primary" shape="circle">Default</i-button>
+                    <i-button type="primary" shape="circle" size="small">Small</i-button>
+                    <i-button type="ghost" icon="social-facebook"></i-button>
+                    <i-button type="ghost" icon="social-twitter"></i-button>
+                    <i-button type="success" @click="show">Click me!</i-button>
+                    <Modal v-model="visible" title="Welcome">欢迎使用 iView</Modal>
+                </i-col>
+                </i-col>
+                <i-col span="24">
+                    <i-button type="success" shape="circle" icon="ios-search"></i-button>
+                    <i-button type="success" icon="ios-search">搜索</i-button>
+                    <i-button type="success" shape="circle" icon="ios-search">搜索</i-button>
+                    <i-button type="success" shape="circle">圆角按钮</i-button>
+                    <i-button type="ghost" shape="circle" icon="ios-search"></i-button>
+                    <i-button type="ghost" icon="ios-search">搜索</i-button>
+                    <i-button type="ghost" shape="circle" icon="ios-search">搜索</i-button>
+                    <i-button type="ghost" shape="circle">圆角按钮</i-button>
+                    <i-button type="primary">Primary</i-button>
+                    <i-button type="primary" disabled>Primary(Disabled)</i-button>
+                </i-col>
+                <i-col span="24">
+                    <i-button type="primary" loading>Loading...</i-button>
+                    <i-button type="primary" :loading="loading" @click="toLoading">
+                        <span v-if="!loading">Click me!</span>
+                        <span v-else>Loading...</span>
+                    </i-button>
+                    <i-button type="primary" :loading="loading2" icon="checkmark-round" @click="toLoading2">
+                        <span v-if="!loading2">Click me!</span>
+                        <span v-else>Loading...</span>
+                    </i-button>
+                </i-col>
+                <i-col span="6">
+                    <i-button type="success" long>确认提交</i-button>
+                </i-col>
+                <i-col span="6">
+                    <i-button type="error" long>确认删除</i-button>
+                </i-col>
+            </Tab-pane>
+            <Tab-pane label="form表单" name="name1">
+                <i-form ref="formValidate" :model="formValidate" :rules="ruleValidate" :label-width="80">
+                    <Form-item label="姓名" prop="name">
+                        <i-input v-model="formValidate.name" placeholder="请输入姓名"/>
+                    </Form-item>
+                    <Form-item label="邮箱" prop="mail">
+                        <i-input v-model="formValidate.mail" placeholder="请输入邮箱"/>
+                    </Form-item>
+                    <Form-item label="城市" prop="city">
+                        <i-select v-model="formValidate.city" placeholder="请选择所在地">
+                            <i-option value="beijing">北京市</i-option>
+                            <i-option value="shanghai">上海市</i-option>
+                            <i-option value="shenzhen">深圳市</i-option>
+                        </i-select>
+                    </Form-item>
+                    <Form-item label="选择日期">
+                        <Row>
+                            <i-col span="5">
+                                <Form-item prop="date">
+                                    <Date-picker type="date" placeholder="选择日期"
+                                                 v-model="formValidate.date"></Date-picker>
+                                </Form-item>
+                            </i-col>
+                            <i-col span="1" style="text-align: center">-</i-col>
+                            <i-col span="5">
+                                <Form-item prop="time">
+                                    <Time-picker type="time" placeholder="选择时间"
+                                                 v-model="formValidate.time"></Time-picker>
+                                </Form-item>
+                            </i-col>
+                        </Row>
+                    </Form-item>
+                    <Form-item label="性别" prop="gender">
+                        <Radio-group v-model="formValidate.gender">
+                            <Radio label="male">男</Radio>
+                            <Radio label="female">女</Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="爱好" prop="interest">
+                        <Checkbox-group v-model="formValidate.interest">
+                            <Checkbox label="吃饭"></Checkbox>
+                            <Checkbox label="睡觉"></Checkbox>
+                            <Checkbox label="跑步"></Checkbox>
+                            <Checkbox label="看电影"></Checkbox>
+                        </Checkbox-group>
+                    </Form-item>
+                    <Form-item label="介绍" prop="desc">
+                        <i-input v-model="formValidate.desc" type="textarea" :autosize="{minRows: 2,maxRows: 5}"
+                                 placeholder="请输入..."/>
+                    </Form-item>
+                    <Form-item>
+                        <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                        <i-button type="ghost" @click="handleReset('formValidate')" style="margin-left: 8px">重置
+                        </i-button>
+                    </Form-item>
+                </i-form>
+            </Tab-pane>
+            <Tab-pane label="时间轴" name="name2">
+                <Timeline>
+                    <Timeline-item>
+                        <p class="time">1976年</p>
+                        <p class="content">Apple I 问世</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">1984年</p>
+                        <p class="content">发布 Macintosh</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">2007年</p>
+                        <p class="content">发布 iPhone</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">2010年</p>
+                        <p class="content">发布 iPad</p>
+                    </Timeline-item>
+                    <Timeline-item>
+                        <p class="time">2011年10月5日</p>
+                        <p class="content">史蒂夫·乔布斯去世</p>
+                    </Timeline-item>
+                </Timeline>
+            </Tab-pane>
+            <Tab-pane label="slider" name="name3">
+                <Slider v-model="value1"></Slider>
+                <Slider v-model="value2" range></Slider>
+                <Slider v-model="value3" range disabled></Slider>
+                <Slider v-model="value4" :step="10"></Slider>
+                <Slider v-model="value5" :step="10" range></Slider>
+                <Slider v-model="value6" :step="10" show-stops></Slider>
+                <Slider v-model="value7" :step="10" show-stops range></Slider>
+                <Slider v-model="value8" show-input></Slider>
+                <Slider v-model="value9" :tip-format="format"></Slider>
+                <Slider v-model="value10" :tip-format="hideFormat"></Slider>
+            </Tab-pane>
+            <Tab-pane label="Circle 进度环" name="name4">
+                <i-circle
+                        :size="250"
+                        :trail-width="4"
+                        :stroke-width="5"
+                        :percent="75"
+                        stroke-linecap="square"
+                        stroke-color="#43a3fb">
+                    <div class="demo-i-circle-custom">
+                        <h1>42,001,776</h1>
+                        <p>消费人群规模</p>
+                        <span>
+                            总占人数
+                            <i>75%</i>
+                        </span>
+                    </div>
+                </i-circle>
+            </Tab-pane>
+            <Tab-pane label="级联选择" name="name5">
+                <Cascader :data="data" v-model="value11"></Cascader>
+            </Tab-pane>
+            <Tab-pane label="Select" name="name6">
+                <i-select v-model="model2" size="small" style="width:100px">
+                    <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option>
+                </i-select>
+                <i-select v-model="model3" style="width:100px">
+                    <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option>
+                </i-select>
+                <i-select v-model="model4" size="large" style="width:100px">
+                    <i-option v-for="item in cityList" :value="item.value" :key="item.value">{{ item.label }}</i-option>
+                </i-select>
+            </Tab-pane>
+        </Tabs>
+    </div>
+</div>
+
+<script src="${rc.contextPath}/js/test/iviewDemo.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 15 - 0
kmall-admin/src/main/webapp/WEB-INF/velocity-toolbox.xml

@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<toolbox>
+	<!-- velocity 自定义标签 -->
+	<tool>
+	    <key>shiro</key>
+	    <scope>application</scope>
+	    <class>com.kmall.common.shiro.VelocityShiro</class>
+	</tool>
+	<!-- 当前登录用户信息 -->
+	<tool>
+		<key>user</key>
+		<scope>application</scope>
+		<class>com.kmall.common.utils.ShiroUtils</class>
+	</tool>
+</toolbox>

+ 124 - 0
kmall-admin/src/main/webapp/WEB-INF/web.xml

@@ -0,0 +1,124 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
+  http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
+         version="3.1" metadata-complete="false">
+    <context-param>
+        <param-name>contextConfigLocation</param-name>
+        <param-value>
+            classpath:spring/spring-context.xml,
+            classpath:spring/spring-mvc.xml,
+            classpath:spring/spring-express-kdn.xml,
+            classpath:spring/spring-redis.xml,
+            classpath:spring/spring-wx-pay.xml,
+            classpath:spring/spring-wx-global-pay.xml,
+            classpath:spring/spring-pingan-pay.xml,
+            classpath:spring/spring-jdbc.xml,,
+            classpath:spring/spring-oms-merch.xml,
+            classpath:spring/spring-print-ticket.xml,
+            classpath:spring/spring-common.xml,
+            classpath*:kmall-*.xml
+        </param-value>
+    </context-param>
+
+    <!--<context-param>
+        <param-name>log4jRefreshInterval</param-name>
+        <param-value>600000</param-value>
+
+    </context-param>-->
+
+    <!--logback 日志-->
+    <context-param>
+        <param-name>logbackConfigLocation</param-name>
+        <param-value>classpath:logback.xml</param-value>
+    </context-param>
+
+    <context-param>
+        <param-name>webAppRootKey</param-name>
+        <param-value>webPath</param-value>
+    </context-param>
+
+    <listener>
+        <listener-class>org.springframework.web.util.WebAppRootListener</listener-class>
+    </listener>
+
+    <listener>
+        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+    </listener>
+
+    <filter>
+        <filter-name>encodingFilter</filter-name>
+        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+        <init-param>
+            <param-name>encoding</param-name>
+            <param-value>UTF-8</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>encodingFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <!-- 配置Shiro过滤器,先让Shiro过滤系统接收到的请求 -->
+    <!-- 这里filter-name必须对应applicationContext.xml中定义的<bean id="shiroFilter"/> -->
+    <!-- 使用[/*]匹配所有请求,保证所有的可控请求都经过Shiro的过滤 -->
+    <!-- 通常会将此filter-mapping放置到最前面(即其他filter-mapping前面),以保证它是过滤器链中第一个起作用的 -->
+    <filter>
+        <filter-name>shiroFilter</filter-name>
+        <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+        <init-param>
+            <!-- 该值缺省为false,表示生命周期由SpringApplicationContext管理,设置为true则表示由servlet container管理 -->
+            <param-name>targetFilterLifecycle</param-name>
+            <param-value>true</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>shiroFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <filter>
+        <filter-name>xssFilter</filter-name>
+        <filter-class>com.kmall.common.xss.XssFilter</filter-class>
+        <init-param>
+            <!--凡是提交包含html内容的请求都要写在这里,若有多个以逗号隔开-->
+            <param-name>excludedPages</param-name>
+            <param-value>/topic/update,/topic/save,/goods/save,/goods/update</param-value>
+        </init-param>
+    </filter>
+
+    <filter-mapping>
+        <filter-name>xssFilter</filter-name>
+        <url-pattern>/*</url-pattern>
+    </filter-mapping>
+
+    <servlet>
+        <servlet-name>dispatcher</servlet-name>
+        <servlet-class> org.springframework.web.servlet.DispatcherServlet</servlet-class>
+        <load-on-startup>1</load-on-startup>
+    </servlet>
+    <servlet-mapping>
+        <servlet-name>dispatcher</servlet-name>
+        <url-pattern>/</url-pattern>
+    </servlet-mapping>
+
+    <servlet>
+        <servlet-name>DruidStatView</servlet-name>
+        <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
+    </servlet>
+
+    <servlet-mapping>
+        <servlet-name>DruidStatView</servlet-name>
+        <url-pattern>/druid/*</url-pattern>
+    </servlet-mapping>
+
+
+    <error-page>
+        <error-code>404</error-code>
+        <location>/404.html</location>
+    </error-page>
+
+</web-app>

+ 465 - 0
kmall-admin/src/main/webapp/index.html

@@ -0,0 +1,465 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <title>kmall_pt</title>
+    <!-- Tell the browser to be responsive to screen width -->
+    <meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
+    <link rel="shortcut icon" href="statics/img/favicon.ico" type="image/x-icon">
+    <link rel="stylesheet" href="statics/css/bootstrap.min.css">
+    <link rel="stylesheet" href="statics/css/font-awesome.min.css">
+    <link rel="stylesheet" href="statics/css/style.css">
+    <link rel="stylesheet" href="statics/css/login.css">
+    <link rel="stylesheet" href="statics/css/main.css">
+    <!-- HTML5 Shim and Respond.js IE8 support of HTML5 elements and media queries -->
+    <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
+    <link rel="stylesheet" href="statics/css/iview.css">
+    <!--[if lt IE 9]>
+    <script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
+    <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+    <![endif]-->
+</head>
+<!-- ADD THE CLASS layout-boxed TO GET A BOXED LAYOUT -->
+<body class="fixed-sidebar full-height-layout gray-bg" style="overflow:hidden">
+<div id="mainApp" v-cloak>
+    <!--左侧导航开始-->
+    <nav class="navbar-default navbar-static-side" role="navigation">
+        <div class="nav-close"><i class="fa fa-times-circle"></i>
+        </div>
+        <div class="sidebar-collapse">
+            <ul class="nav" id="side-menu">
+                <li class="nav-header">
+                    <div class="dropdown profile-element"
+                         style="text-align: center;font-size: 18px;font-weight: 600;color: white;">
+                        中网管理后台
+                    </div>
+                    <div class="logo-element">ZW
+                    </div>
+                </li>
+                <menu-item :item="item" v-for="item in menuList"></menu-item>
+            </ul>
+        </div>
+    </nav>
+    <!--左侧导航结束-->
+    <!--右侧部分开始-->
+    <div id="page-wrapper" class="gray-bg dashbard-1">
+        <div class="border-bottom">
+            <nav class="navbar navbar-static-top" role="navigation" style="margin-bottom: 0">
+                <div class="navbar-header"><a class="navbar-minimalize minimalize-styl-2 btn btn-primary " href="#"><i
+                        class="fa fa-bars"></i> </a>
+                </div>
+                <ul class="nav navbar-top-links navbar-right">
+                    <li class="dropdown">
+                        <a href="javascript:;" @click="toggleFullScreen"><i class="fa fa-arrows-alt"></i> &nbsp;全屏</a>
+                    </li>
+                    <li><a href="javascript:;" @click="updatePassword"><i class="fa fa-lock"></i> &nbsp;修改密码</a></li>
+                    <li class="dropdown hidden-xs">
+                        <a class="right-sidebar-toggle" aria-expanded="false">
+                            <i class="fa fa-tasks"></i> 主题
+                        </a>
+                    </li>
+                    <li><a @click="logout"><i class="fa fa fa-sign-out"></i>退出</a></li>
+                </ul>
+            </nav>
+        </div>
+        <div class="content-tabs">
+            <button class="roll-nav roll-left J_tabLeft"><i class="fa fa-backward"></i>
+            </button>
+            <nav class="page-tabs J_menuTabs">
+                <div class="page-tabs-content">
+                    <a href="javascript:;" class="active J_menuTab" data-id="main">首页</a>
+                </div>
+            </nav>
+            <button class="roll-nav roll-right J_tabRight"><i class="fa fa-forward"></i>
+            </button>
+            <div class="btn-group roll-nav roll-right">
+                <button class="dropdown J_tabClose" data-toggle="dropdown">关闭操作<span class="caret"></span>
+                </button>
+                <ul role="menu" class="dropdown-menu dropdown-menu-right">
+                    <li class="J_tabShowActive"><a>定位当前选项卡</a></li>
+                    <li class="divider"></li>
+                    <li class="J_tabCloseAll"><a>关闭全部选项卡</a></li>
+                    <li class="J_tabCloseOther"><a>关闭其他选项卡</a>
+                    </li>
+                </ul>
+            </div>
+            <a class="roll-nav roll-right J_tabRefresh"><i class="fa fa-refresh"></i> &nbsp;刷新</a>
+        </div>
+        <div class="J_mainContent" id="content-main">
+            <iframe class="J_iframe" name="iframe0" width="100%" height="100%" src="sys/main.html" frameborder="0"
+                    data-id="main" seamless></iframe>
+        </div>
+        <div class="footer">
+            <div class="pull-right">&copy; 2017-2017 <a href="http://fly2you.cn" target="_blank">中网科技(深圳)有限公司</a>
+            </div>
+        </div>
+    </div>
+    <!--右侧部分结束-->
+    <!--右侧边栏开始-->
+    <div id="right-sidebar">
+        <div class="sidebar-container">
+
+            <ul class="nav nav-tabs navs-3">
+
+                <li class="active">
+                    <a data-toggle="tab" href="#tab-1">
+                        <i class="fa fa-gear"></i> 主题
+                    </a>
+                </li>
+                <li class="">
+                    <a data-toggle="tab" href="#tab-2">通知</a>
+                </li>
+            </ul>
+
+            <div class="tab-content">
+                <div id="tab-1" class="tab-pane active">
+                    <div class="sidebar-title">
+                        <h3><i class="fa fa-comments-o"></i> 主题设置</h3>
+                        <small><i class="fa fa-tim"></i> 你可以从这里选择和预览主题的布局和样式,这些设置会被保存在本地,下次打开的时候会直接应用这些设置。</small>
+                    </div>
+                    <div class="skin-setttings">
+                        <div class="title">主题设置</div>
+                        <div class="setings-item">
+                            <span>收起左侧菜单</span>
+                            <div class="switch">
+                                <div class="onoffswitch">
+                                    <input type="checkbox" name="collapsemenu" class="onoffswitch-checkbox"
+                                           id="collapsemenu">
+                                    <label class="onoffswitch-label" for="collapsemenu">
+                                        <span class="onoffswitch-inner"></span>
+                                        <span class="onoffswitch-switch"></span>
+                                    </label>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="setings-item">
+                            <span>固定顶部</span>
+
+                            <div class="switch">
+                                <div class="onoffswitch">
+                                    <input type="checkbox" name="fixednavbar" class="onoffswitch-checkbox"
+                                           id="fixednavbar">
+                                    <label class="onoffswitch-label" for="fixednavbar">
+                                        <span class="onoffswitch-inner"></span>
+                                        <span class="onoffswitch-switch"></span>
+                                    </label>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="setings-item">
+                            <span>固定宽度</span>
+
+                            <div class="switch">
+                                <div class="onoffswitch">
+                                    <input type="checkbox" name="boxedlayout" class="onoffswitch-checkbox"
+                                           id="boxedlayout">
+                                    <label class="onoffswitch-label" for="boxedlayout">
+                                        <span class="onoffswitch-inner"></span>
+                                        <span class="onoffswitch-switch"></span>
+                                    </label>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="title">皮肤选择</div>
+                        <div class="setings-item default-skin nb">
+                                <span class="skin-name ">
+                         <a href="#" class="s-skin-0">
+                             默认皮肤
+                         </a>
+                    </span>
+                        </div>
+                        <div class="setings-item blue-skin nb">
+                                <span class="skin-name ">
+                        <a href="#" class="s-skin-1">
+                            蓝色主题
+                        </a>
+                    </span>
+                        </div>
+                        <div class="setings-item yellow-skin nb">
+                                <span class="skin-name ">
+                        <a href="#" class="s-skin-3">
+                            黄色/紫色主题
+                        </a>
+                    </span>
+                        </div>
+                    </div>
+                </div>
+                <div id="tab-2" class="tab-pane">
+
+                    <div class="sidebar-title">
+                        <h3><i class="fa fa-comments-o"></i> 最新通知</h3>
+                        <small><i class="fa fa-tim"></i> 您当前有1条未读信息</small>
+                    </div>
+
+                    <div>
+                        <div class="sidebar-message">
+                            <a href="#">
+                                <div class="pull-left text-center">
+
+                                    <div class="m-t-xs">
+                                        <i class="fa fa-star text-warning"></i>
+                                        <i class="fa fa-star text-warning"></i>
+                                    </div>
+                                </div>
+                                <div class="media-body">
+
+                                    这是一条测试消息
+                                    <br>
+                                    <small class="text-muted">今天 4:21</small>
+                                </div>
+                            </a>
+                        </div>
+                    </div>
+
+                </div>
+            </div>
+
+        </div>
+    </div>
+    <!--右侧边栏结束-->
+    <!-- 修改密码 -->
+    <div id="passwordLayer" style="display: none;">
+        <form class="form-horizontal" style="width: 350px;">
+            <div class="form-group">
+                <div class="form-group">
+                    <div class="col-sm-2 control-label">账号</div>
+                    <span class="label label-success" style="vertical-align: bottom;">{{user.username}}</span>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2 control-label">原密码</div>
+                    <div class="col-sm-10">
+                        <input type="password" class="form-control" v-model="password" placeholder="原密码"/>
+                    </div>
+                </div>
+                <div class="form-group">
+                    <div class="col-sm-2 control-label">新密码</div>
+                    <div class="col-sm-10">
+                        <input type="text" class="form-control" v-model="newPassword" placeholder="新密码"/>
+                    </div>
+                </div>
+            </div>
+        </form>
+    </div>
+</div>
+</body>
+
+<body class="hold-transition skin-blue sidebar-mini">
+
+<script src="statics/libs/jquery.min.js"></script>
+<script src="statics/libs/vue.min.js"></script>
+<script src="statics/libs/iview.min.js"></script>
+<script src="statics/libs/bootstrap.min.js"></script>
+<script src="statics/plugins/layer/layer.js"></script>
+<script src="statics/libs/contabs.js"></script>
+<script src="statics/libs/content.js"></script>
+<script src="statics/libs/hplus.js"></script>
+<script src="statics/plugins/metisMenu/jquery.metisMenu.js"></script>
+<script src="statics/plugins/slimscroll/jquery.slimscroll.min.js"></script>
+<script src="js/common.js"></script>
+<script>
+    //生成菜单
+    var menuItem = Vue.extend({
+        name: 'menu-item',
+        props: {item: {}},
+        template: [
+            '<li>',
+            '<a v-if="item.type === 0" href="#">',
+            '<i v-if="item.icon != null" :class="item.icon"></i>',
+            '<span class="nav-label">{{item.name}}</span>',
+            '<span class="fa arrow"></span>',
+            '</a>',
+            '<ul v-if="item.type === 0" class="nav nav-second-level">',
+            '<menu-item :item="item" v-for="item in item.list"></menu-item>',
+            '</ul>',
+            '<a v-if="item.type === 1" class="J_menuItem" :href="item.url"><i :class="item.icon"></i>{{item.name}}</a>',
+            '</li>'
+        ].join('')
+    });
+    //注册菜单组件
+    Vue.component('menuItem', menuItem);
+
+    var vm = new Vue({
+        el: '#mainApp',
+        data: {
+            password: '',
+            newPassword: '',
+            menuList: {},
+            user: {}
+        },
+        methods: {
+            getMenuList: function (event) {
+                $.getJSON("sys/menu/user?_" + $.now(), function (r) {
+                    vm.menuList = r.menuList;
+                });
+            },
+            getUser: function () {
+                $.getJSON("sys/user/info?_" + $.now(), function (r) {
+                    vm.user = r.user;
+                });
+            },
+            updatePassword: function () {
+                openWindow({
+                    title: "修改密码",
+                    area: ['350px', '300px'],
+                    content: jQuery("#passwordLayer"),
+                    btn: ['修改', '取消'],
+                    btn1: function (index) {
+                        var data = "password=" + vm.password + "&newPassword=" + vm.newPassword;
+                        $.ajax({
+                            type: "POST",
+                            url: "sys/user/password",
+                            data: data,
+                            dataType: "json",
+                            success: function (result) {
+                                if (result.code == 0) {
+                                    layer.close(index);
+                                    layer.alert('修改成功', function (index) {
+                                        location.reload();
+                                    });
+                                } else {
+                                    layer.alert(result.msg);
+                                }
+                            }
+                        });
+                    }
+                });
+            },
+            toggleFullScreen: function () {
+                if (!document.fullscreenElement && // alternative standard method
+                    !document.mozFullScreenElement && !document.webkitFullscreenElement) {// current working methods
+                    if (document.documentElement.requestFullscreen) {
+                        document.documentElement.requestFullscreen();
+                    } else if (document.documentElement.mozRequestFullScreen) {
+                        document.documentElement.mozRequestFullScreen();
+                    } else if (document.documentElement.webkitRequestFullscreen) {
+                        document.documentElement.webkitRequestFullscreen(Element.ALLOW_KEYBOARD_INPUT);
+                    }
+                } else {
+                    if (document.cancelFullScreen) {
+                        document.cancelFullScreen();
+                    } else if (document.mozCancelFullScreen) {
+                        document.mozCancelFullScreen();
+                    } else if (document.webkitCancelFullScreen) {
+                        document.webkitCancelFullScreen();
+                    }
+                }
+            },
+            logout: function () {
+                confirm('注:您确定要安全退出本次登录吗?', function () {
+                    dialogLoading(true);
+                    setTimeout(function () {
+                        toUrl('logout?_' + $.now());
+                    }, 500);
+                });
+            }
+        },
+        created: function () {
+            this.getUser();
+            this.getMenuList();
+        },
+        updated: function () {
+            // MetsiMenu
+            $('#side-menu').metisMenu();
+
+            //通过遍历给菜单项加上data-index属性
+            $(".J_menuItem").each(function (index) {
+                if (!$(this).attr('data-index')) {
+                    $(this).attr('data-index', index);
+                }
+            });
+
+            $('.J_menuItem').on('click', menuItem);
+
+            function menuItem() {
+                // 获取标识数据
+                var dataUrl = $(this).attr('href'),
+                    dataIndex = $(this).data('index'),
+                    menuName = $.trim($(this).text()),
+                    flag = true;
+                if (dataUrl == undefined || $.trim(dataUrl).length == 0) return false;
+
+                // 选项卡菜单已存在
+                $('.J_menuTab').each(function () {
+                    if ($(this).data('id') == dataUrl) {
+                        if (!$(this).hasClass('active')) {
+                            $(this).addClass('active').siblings('.J_menuTab').removeClass('active');
+                            scrollToTab(this);
+                            // 显示tab对应的内容区
+                            $('.J_mainContent .J_iframe').each(function () {
+                                if ($(this).data('id') == dataUrl) {
+                                    $(this).show().siblings('.J_iframe').hide();
+                                    return false;
+                                }
+                            });
+                        }
+                        flag = false;
+                        return false;
+                    }
+                });
+
+                // 选项卡菜单不存在
+                if (flag) {
+                    var str = '<a href="javascript:;" class="active J_menuTab" data-id="' + dataUrl + '">' + menuName + ' <i class="fa fa-times-circle"></i></a>';
+                    $('.J_menuTab').removeClass('active');
+
+                    // 添加选项卡对应的iframe
+                    var str1 = '<iframe class="J_iframe" name="iframe' + dataIndex + '" width="100%" height="100%" src="' + dataUrl + '" frameborder="0" data-id="' + dataUrl + '" seamless></iframe>';
+                    $('.J_mainContent').find('iframe.J_iframe').hide().parents('.J_mainContent').append(str1);
+
+                    // 显示loading提示
+                    var loading = layer.load();
+
+                    $('.J_mainContent iframe:visible').load(function () {
+                        //iframe加载完成后隐藏loading提示
+                        layer.close(loading);
+                    });
+                    // 添加选项卡
+                    $('.J_menuTabs .page-tabs-content').append(str);
+                    scrollToTab($('.J_menuTab.active'));
+                }
+                return false;
+            }
+
+            //滚动到指定选项卡
+            function scrollToTab(element) {
+                var marginLeftVal = calSumWidth($(element).prevAll()),
+                    marginRightVal = calSumWidth($(element).nextAll());
+                // 可视区域非tab宽度
+                var tabOuterWidth = calSumWidth($(".content-tabs").children().not(".J_menuTabs"));
+                //可视区域tab宽度
+                var visibleWidth = $(".content-tabs").outerWidth(true) - tabOuterWidth;
+                //实际滚动宽度
+                var scrollVal = 0;
+                if ($(".page-tabs-content").outerWidth() < visibleWidth) {
+                    scrollVal = 0;
+                } else if (marginRightVal <= (visibleWidth - $(element).outerWidth(true) - $(element).next().outerWidth(true))) {
+                    if ((visibleWidth - $(element).next().outerWidth(true)) > marginRightVal) {
+                        scrollVal = marginLeftVal;
+                        var tabElement = element;
+                        while ((scrollVal - $(tabElement).outerWidth()) > ($(".page-tabs-content").outerWidth() - visibleWidth)) {
+                            scrollVal -= $(tabElement).prev().outerWidth();
+                            tabElement = $(tabElement).prev();
+                        }
+                    }
+                } else if (marginLeftVal > (visibleWidth - $(element).outerWidth(true) - $(element).prev().outerWidth(true))) {
+                    scrollVal = marginLeftVal - $(element).prev().outerWidth(true);
+                }
+                $('.page-tabs-content').animate({
+                    marginLeft: 0 - scrollVal + 'px'
+                }, "fast");
+            }
+
+            //计算元素集合的总宽度
+            function calSumWidth(elements) {
+                var width = 0;
+                $(elements).each(function () {
+                    width += $(this).outerWidth(true);
+                });
+                return width;
+            }
+        }
+    });
+</script>
+</body>
+</html>

+ 470 - 0
kmall-admin/src/main/webapp/js/common.js

@@ -0,0 +1,470 @@
+// 存储当前用户的权限
+let permsSet = JSON.parse(sessionStorage.getItem("permsSet"));
+
+//jqGrid的配置信息
+if ($.jgrid) {
+    $.jgrid.defaults.width = 1000;
+    $.jgrid.defaults.responsive = true;
+    $.jgrid.defaults.styleUI = 'Bootstrap';
+}
+
+$.ajaxSetup({
+    dataType: "json",
+    cache: false
+});
+
+//iframe自适应
+$(window).on('resize', function () {
+    var $content = $('#mainApp');
+    $content.height($(this).height());
+    $content.find('iframe').each(function () {
+        $(this).height($content.height() - 150);
+    });
+    var $rrapp = $('#rrapp').parent();
+    $rrapp.height($(this).height());
+    $(this).height($content.height());
+}).resize();
+
+//重写alert
+window.alert = function (msg, callback) {
+    // parent.layer.alert 弹出在iframe外的页面。
+    layer.alert(msg, function (index) {
+        layer.close(index);
+        if (typeof(callback) === "function") {
+            callback("ok");
+        }
+    });
+};
+
+//重写confirm式样框
+window.confirm = function (msg, callback) {
+    layer.confirm(msg, {
+            skin: 'layui-layer-molv', btn: ['确定', '取消']
+        },
+        function () {//确定事件
+            if (typeof(callback) === "function") {
+                callback("ok");
+            }
+        });
+};
+
+/**
+ *
+ * @param options
+ */
+window.openWindow = function (options) {
+    let globalParams = {
+        skin: 'layui-layer-molv',//皮肤
+        title: '标题',//标题
+        type: 1,//打开窗口的类型 1:html里的div内容 2:iframe方式,页面的路径
+        closeBtn: 1, //关闭按钮的形状 0、1
+        anim: -1,
+        isOutAnim: false,
+        shadeClose: false,
+        area: ['90%', '90%'],
+        content: '',
+        btn: false, //按钮
+        top: false //窗口弹出是否在iframe上层
+    };
+    globalParams = $.extend(globalParams, options);
+    if (globalParams.top) {
+        parent.layer.open(globalParams);
+    } else {
+        layer.open(globalParams);
+    }
+};
+
+//获取选中的数据
+function getSelectedRowData() {
+    var id = getSelectedRow();
+    return $("#jqGrid").jqGrid('getRowData', id);
+}
+
+//选择一条记录
+function getSelectedRow() {
+    var grid = $("#jqGrid");
+    var rowKey = grid.getGridParam("selrow");
+    if (!rowKey) {
+        iview.Message.error("请选择一条记录");
+        return;
+    }
+
+    var selectedIDs = grid.getGridParam("selarrrow");
+    if (selectedIDs.length > 1) {
+        iview.Message.error("只能选择一条记录");
+        return;
+    }
+
+    return selectedIDs[0];
+};
+
+//选择多条记录
+function getSelectedRows() {
+    var grid = $("#jqGrid");
+    var rowKey = grid.getGridParam("selrow");
+    if (!rowKey) {
+        iview.Message.error("请选择一条记录");
+        return;
+    }
+    return grid.getGridParam("selarrrow");
+};
+
+/**
+ * 预览图片
+ * @param url
+ */
+function eyeImage(url) {
+    if (!url) {
+        iview.Message.error('请先上传图片');
+        return;
+    }
+    layer.photos({
+        photos: {
+            "title": "预览", //相册标题
+            "start": 0, //初始显示的图片序号,默认0
+            "data": [   //相册包含的图片,数组格式
+                {
+                    "src": url //原图地址
+                }
+            ]
+        }, anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
+    });
+};
+function eyeVideo(url) {
+    if (!url) {
+        iview.Message.error('请先上传视频');
+        return;
+    }
+    var loadstr='<video width="100%" height="100%"  controls="controls" autobuffer="autobuffer"  ' +
+        'autoplay="autoplay" loop="loop" style="position:fixed!important;top:0;left:0;"><source src="'+url+'" type="video/mp4"></source></video>';
+
+    layer.open({
+        type:1,
+        title: "预览",
+        area: ['730px', '460px'],
+        shade: 0,
+        closeBtn: 1,
+        content: loadstr,
+    });
+};
+
+/**
+ * 预览图片
+ * @param data
+ */
+function eyeImages(data) {
+    layer.photos({
+        photos: {
+            "title": "预览", //相册标题
+            "start": 0, //初始显示的图片序号,默认0
+            "data": data
+        }, anim: 5 //0-6的选择,指定弹出图片动画类型,默认随机
+    });
+};
+
+/**
+ * 重置验证
+ * @param vue vue对象
+ * @param name
+ */
+function handleResetForm(vue, name) {
+    vue.$refs[name].resetFields();
+};
+
+/**
+ * 表单验证
+ * @param vue vue对象
+ * @param name 验证规则
+ * @param callback 验证通过回调函数
+ */
+function handleSubmitValidate(vue, name, callback) {
+    vue.$refs[name].validate(function (valid) {
+        if (valid) {
+            callback();
+        } else {
+            iview.Message.error('请填写完整信息!');
+            return false;
+        }
+    })
+};
+
+/**
+ * 翻译日期
+ * @param date
+ * @param fmt
+ * @returns {*}
+ */
+function transDate(date, fmt) {
+    if (!fmt) {
+        fmt = 'yyyy-MM-dd';
+    }
+    if (date) {
+        if (typeof date == 'number') {
+            return new Date(date).dateFormat(fmt);
+        }
+        if (date instanceof Date) {
+            return date.dateFormat(fmt);
+        } else {
+            try {
+                return new Date(date.replace('-', '/').replace('-', '/')).dateFormat(fmt);
+            } catch (e) {
+                return '-';
+            }
+        }
+    } else {
+        return '-';
+    }
+};
+
+/**
+ * 翻译图片
+ * @param url
+ * @returns {*}
+ */
+function transImg(url) {
+    if (url) {
+        return '<img width="50px" height="50px" src="' + url + '">';
+    } else {
+        return '-';
+    }
+};
+
+/**
+ * 翻译性别
+ * @param gender
+ * @returns {*}
+ */
+function transGender(gender) {
+    if (gender == 1) {
+        return '男';
+    }
+    if (gender == 2) {
+        return '女';
+    }
+    return '未知';
+};
+
+function transIsNot(value) {
+    if (value == 1) {
+        return '<span class="label label-success">是</span>';
+    }
+    return '<span class="label label-danger">否</span>';
+};
+
+function transStatus(value) {
+    if (value == 1) {
+        return '<span class="label label-success">有效</span>';
+    }
+    return '<span class="label label-danger">无效</span>';
+};
+
+function toUrl(href) {
+    window.location.href = href;
+}
+
+function dialogLoading(flag) {
+    if (flag) {
+        top.layer.load(0, {
+            shade: [0.5, '#fff'],
+            time: 10000,
+            content: '处理中...'
+        });
+    } else {
+        top.layer.closeAll('loading');
+    }
+}
+
+/**
+ * 用JS获取地址栏参数的方法
+ * 使用示例 location.href = http://localhost:8080/index.html?id=123
+ *          getQueryString('id') --> 123;
+ * @param name
+ * @returns {null}
+ * @constructor
+ */
+function getQueryString(name) {
+    var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)");
+    var r = window.location.search.substr(1).match(reg);
+    if (r != null) {
+        return unescape(r[2]);
+    }
+    return null;
+}
+
+/**
+ * 主要功能:导出功能公共方法
+ *
+ * @param formId 表单ID,带'#'号,如'#formId'
+ * @param url 请求后台地址
+ * @param extraObj 往后台请求额外参数,对象格式,如:{'aaa': 111}
+ */
+function exportFile(formId, url, extraObj) {
+    var form = $('<form>'); //定义一个form表单
+    form.attr('style', 'display: none');
+    form.attr('target', '');
+    form.attr('method', 'post');
+    form.attr('action', url);
+
+    var json = getJson(formId);
+    if (typeof extraObj != 'undefined') {
+        json = $.extend(json, extraObj);
+    }
+
+    $('body').append(form);//将表单放置在web中
+    for (var i in json) {
+        var input = $('<input>');
+        input.attr('type', 'hidden');
+        input.attr('name', i);
+        input.attr('value', json[i]);
+        form.append(input);
+    }
+
+    form.submit();//表单提交
+}
+
+/**
+ * 将form转化为json
+ * @param form 传入 form表单的dom $("#baseFm")
+ * @returns {___anonymous49_50}  序列化的键值对 {key:value,key2:value2,....}
+ */
+function getJson(form) {
+    var o = {};
+    var $form = $(form).find('input,textarea,select');
+    $.each($form, function (i, item) {
+        var $this = $(item);
+
+        if ($this.attr("type") == 'radio') {
+            o[$this.attr("name")] = $("input[name='" + $this.attr("name") + "']:checked").val();
+            return true;
+        }
+        o[$this.attr("name")] = $this.val();
+    })
+    return o;
+}
+
+/**
+ *
+ Ajax.request({
+        url: '', //访问路径
+        dataType: 'json', //访问类型 'json','html'等
+        params: getJson(form),
+        resultMsg: true, false, //是否需要提示信息
+        type: 'GET',//,'get','post'
+        beforeSubmit: function (data) {},//提交前处理
+        successCallback: function (data) {} //提交后处理
+    });
+ */
+Ajax = function () {
+
+    //var opt = { type:'GET',dataType:'json',resultMsg:true };
+    function request(opt) {
+
+        //添加遮罩层
+        dialogLoading(true);
+
+        if (typeof opt.cache == 'undefined') {
+            opt.cache = false;
+        }
+
+        if (typeof opt == 'undefined') {
+            return;
+        }
+        //opt = $.extend(opt, p);
+        if (typeof(opt.type) == 'undefined') {
+            opt.type = 'GET'
+        }
+        if (typeof(opt.async) == 'undefined') {
+            opt.async = false;
+        }
+        if (typeof(opt.dataType) == 'undefined') {
+            opt.dataType = 'json'
+        }
+        if (typeof(opt.contentType) == 'undefined') {
+            opt.contentType = 'application/x-www-form-urlencoded;chartset=UTF-8'
+        }
+        if (typeof(opt.params) == 'undefined' || opt.params == null) {
+            opt.params = {};
+        }
+        opt.params.date = new Date();
+        if (typeof(opt.beforeSubmit) != 'undefined') {
+            var flag = opt.beforeSubmit(opt);
+            if (!flag) {
+                return;
+            }
+        }
+
+        if (typeof(opt.resultMsg) == 'undefined') {
+            opt.resultMsg = true;
+        }
+
+        $.ajax({
+            async: opt.async,
+            url: opt.url,
+            dataType: opt.dataType,
+            contentType: opt.contentType,
+            data: opt.params,
+            crossDomain: opt.crossDomain || false,
+            type: opt.type,
+            cache: opt.cache,
+            success: function (data) {
+                if (typeof data == 'string' && data.indexOf("exception") > 0 || typeof data.code != 'undefined' && data.code != '0') {
+                    var result = {code: null};
+                    if (typeof data == 'string') {
+                        result = eval('(' + data + ')')
+                    } else if (typeof data == 'object') {
+                        result = data;
+                    }
+
+                    if (opt.resultMsg && result.msg) {
+                        layer.alert(result.msg, {icon: 5});
+                    }
+                    return;
+                }
+                if (opt.resultMsg && data.msg) {
+                    layer.alert(data.msg, {icon: 6}, function () {
+                        if (typeof(opt.successCallback) != 'undefined') {
+                            opt.successCallback(data);
+                        }
+                    });
+                    return;
+                }
+
+                if (typeof(opt.successCallback) != 'undefined') {
+                    opt.successCallback(data);
+                }
+                //关闭遮罩
+                dialogLoading(false);
+            },
+            error: function () {
+                layer.alert("此页面发生未知异常,请联系管理员", {icon: 5});
+                //关闭遮罩
+                dialogLoading(false);
+            }
+        });
+    }
+
+    return {
+        /**
+         * Ajax调用request
+         */
+        request: request
+    };
+}();
+
+/**
+ * 判断用户是否用权限
+ * @param perm
+ * @returns {boolean}
+ */
+function hasPermission(perm) {
+    if (null == permsSet || permsSet.length < 1) {
+        return false;
+    }
+
+    for (let i = 0; i < permsSet.length; i++) {
+        if (permsSet[i] == perm) {
+            return true;
+        }
+    }
+    return false;
+}

+ 119 - 0
kmall-admin/src/main/webapp/js/navtab.js

@@ -0,0 +1,119 @@
+layui.define(['element'], function(exports){
+   var  element = layui.element(),
+        $ = layui.jquery,
+		layer = parent.layer === undefined ? layui.layer : parent.layer,
+		module_name = 'navtab',
+	globalTabIdIndex = 0,
+	LarryTab = function(){
+          this.config ={
+          	  elem: undefined,
+			  closed: true 
+          };
+	};
+    var ELEM = {};
+    /**
+     * [参数设置 options]
+     */
+    LarryTab.prototype.set = function(options){
+          var _this = this;
+          $.extend(true, _this.config, options);
+          return _this;
+    };
+    /**
+     * [init 对象初始化]
+     * @return {[type]} [返回对象初始化结果]
+     */
+    LarryTab.prototype.init  = function(){
+         var _this = this;
+         var _config = _this.config;
+         if(typeof(_config.elem) !== 'string' && typeof(_config.elem) !== 'object') {
+		       layer.alert('Tab选项卡错误提示: elem参数未定义或设置出错,具体设置格式请参考文档API.');
+	     }
+	     var $container;
+	     if(typeof(_config.elem) === 'string') {
+		     $container = $('' + _config.elem + '');
+		     //console.log($container);
+	     }
+	     if(typeof(_config.elem) === 'object') {
+		     $container = _config.elem;
+	     }
+	     if($container.length === 0) {
+		     layer.alert('Tab选项卡错误提示:找不到elem参数配置的容器,请检查.');
+	     }
+	     var filter = $container.attr('lay-filter');
+	     if(filter === undefined || filter === '') {
+		      layer.alert('Tab选项卡错误提示:请为elem容器设置一个lay-filter过滤器');
+	     }
+	     _config.elem = $container;
+	     ELEM.titleBox = $container.children('ul.layui-tab-title');
+	     ELEM.contentBox = $container.children('div.layui-tab-content');
+	     ELEM.tabFilter = filter;
+	     return _this;
+    };
+    /**
+     * [exists 在layui-tab中检查对应layui-tab-title是否存在,如果存在则返回索引值,不存在返回-1]
+     * @param  {[type]} title [description]
+     * @return {[type]}       [description]
+     */
+    LarryTab.prototype.exists = function(title){
+        var _this = ELEM.titleBox === undefined ? this.init() : this,
+		    tabIndex = -1;
+		ELEM.titleBox.find('li').each(function(i, e) {
+		    var $em = $(this).children('em');
+		    if($em.text() === title) {
+			      tabIndex = i;
+		    };
+	    });
+	    return tabIndex;
+    };
+    /**
+     * [tabAdd 增加选项卡,如果已存在则增加this样式]
+     * @param  {[type]} data [description]
+     * @return {[type]}      [description]
+     */
+    LarryTab.prototype.tabAdd = function(data){
+        var _this = this;
+	    var tabIndex = _this.exists(data.title);
+	    // 若不存在
+	    if(tabIndex === -1){
+	    	globalTabIdIndex++;
+	    	var content = '<iframe src="' + data.href + '" data-id="' + globalTabIdIndex + '" class="larry-iframe"></iframe>';
+		    var title = '';
+		    // 若icon有定义
+		    if(data.icon !== undefined){
+                if(data.icon.indexOf('fa-') !== -1) {
+				    title += '<i class="' + data.icon + '"></i>';
+			    } else {
+			    	title += '<i class="layui-icon ">' + data.icon + '</i>';
+			    }
+		    }
+		    title += '<em>' + data.title + '</em>';
+		    if(_this.config.closed) {
+			    title += '<i class="layui-icon layui-unselect layui-tab-close" data-id="' + globalTabIdIndex + '">&#x1006;</i>';
+		    }
+		    //添加tab
+		    element.tabAdd(ELEM.tabFilter, {
+			    title: title,
+			    content: content
+		    });
+		    //iframe 自适应
+		    ELEM.contentBox.find('iframe[data-id=' + globalTabIdIndex + ']').each(function() {
+		    	$(this).height(ELEM.contentBox.height());
+		    });
+		    if(_this.config.closed) {
+			//监听关闭事件
+			    ELEM.titleBox.find('li').children('i.layui-tab-close[data-id=' + globalTabIdIndex + ']').on('click', function() {
+			    	element.tabDelete(ELEM.tabFilter, $(this).parent('li').index()).init();
+			    });
+		    };
+		    //切换到当前打开的选项卡
+		    element.tabChange(ELEM.tabFilter, ELEM.titleBox.find('li').length - 1);
+		    }else {
+			    element.tabChange(ELEM.tabFilter, tabIndex);
+		    }
+        };
+    var navtab = new LarryTab();
+    exports(module_name, function(options) {
+		return navtab.set(options);
+	});
+});

+ 207 - 0
kmall-admin/src/main/webapp/js/shop/ad.js

@@ -0,0 +1,207 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../ad/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '广告位置', name: 'adPositionName', index: 'ad_Position_id', width: 80},
+            {label: '广告名称', name: 'name', index: 'name', width: 80},
+            {label: '链接', name: 'link', index: 'link', width: 80},
+            {
+                label: '图片', name: 'imageUrl', index: 'image_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+            },
+            {label: '内容', name: 'content', index: 'content', width: 80},
+            {
+                label: '结束时间', name: 'endTime', index: 'end_time', width: 80, formatter: function (value) {
+                return transDate(value);
+            }
+            },
+            {label: '排序', name: 'sortOrder', index: 'sortOrder', width: 80},
+            {
+                label: '状态', name: 'enabled', index: 'enabled', width: 80, formatter: function (value) {
+                return value === 0 ?
+                    '<span class="label label-danger">禁用</span>' :
+                    '<span class="label label-success">正常</span>';
+            }
+            }],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            //隐藏grid底部滚动条
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        ad: {enabled: 1, imageUrl: '', mediaType: 0},
+        ruleValidate: {
+            name: [
+                {required: true, message: '广告名称不能为空', trigger: 'blur'}
+            ],
+            imageUrl: [
+                {required: true, message: '图片不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        adPositions: [],
+        storeList: [],
+        merchList: []
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.ad = {enabled: 1, imageUrl: '', mediaType: 0};
+            vm.adPosition = [];
+            this.getAdPositions();
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getMerchList();
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id);
+            vm.getMerchList();
+            vm.getStoresByMerch();
+            this.getAdPositions();
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.ad.id == null ? "../ad/save" : "../ad/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.ad),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../ad/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../ad/info/" + id, function (r) {
+                vm.ad = r.ad;
+            });
+        },
+        getStoresByMerch: function (opt) {
+            var value = opt.value;
+            $.get("../store/getStoresByMerch?merchSn=" + value, function (r) {
+                vm.storeList = r.list;
+            });
+        },
+        getMerchList: function() {
+            $.get("../merch/queryAll", function (r) {
+                vm.merchList = r.list;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSuccess: function (res, file) {
+            vm.ad.imageUrl = file.response.url;
+        },
+        handleFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
+            });
+        },
+        handleMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
+            });
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        eyeImage: function () {
+            var url = vm.ad.imageUrl;
+            eyeImage(url);
+        },
+        /**
+         * 获取会员级别
+         */
+        getAdPositions: function () {
+            $.get("../adposition/queryAll", function (r) {
+                vm.adPositions = r.list;
+            });
+        }
+    }
+});

+ 97 - 0
kmall-admin/src/main/webapp/js/shop/address.js

@@ -0,0 +1,97 @@
+$(function () {
+    let userId = getQueryString("userId");
+    let url = '../address/list';
+    if (userId) {
+        url += '?userId=' + userId;
+    }
+    $("#jqGrid").jqGrid({
+        url: url,
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '会员', name: 'shopUserName', index: 'user_id', width: 90},
+            {label: '收货人姓名', name: 'userName', index: 'user_name', width: 80},
+            {label: '手机', name: 'telNumber', index: 'tel_number', width: 80},
+            {label: '收货地址国家码', name: 'nationalCode', index: 'national_Code', width: 80},
+            {label: '省', name: 'provinceName', index: 'province_Name', width: 80},
+            {label: '市', name: 'cityName', index: 'city_Name', width: 80},
+            {label: '区', name: 'countyName', index: 'county_Name', width: 80},
+            {label: '详细收货地址信息', name: 'detailInfo', index: 'detail_Info', width: 150},
+            {label: '邮编', name: 'postalCode', index: 'postal_Code', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            //隐藏grid底部滚动条
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        q: {
+            userName: '',
+            telNumber: ''
+        }
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {
+                    'userName': vm.q.userName,
+                    'telNumber': vm.q.telNumber
+                },
+                page: page
+            }).trigger("reloadGrid");
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../address/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        }
+    }
+});

+ 137 - 0
kmall-admin/src/main/webapp/js/shop/adposition.js

@@ -0,0 +1,137 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../adposition/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '位置名称', name: 'name', index: 'name', width: 80},
+            {label: '宽度', name: 'width', index: 'width', width: 80},
+            {label: '高度', name: 'height', index: 'height', width: 80},
+            {label: '描述', name: 'desc', index: 'desc', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            //隐藏grid底部滚动条
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        adPosition: {},
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        }
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.adPosition = {width: 200, height: 750};
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.adPosition.id == null ? "../adposition/save" : "../adposition/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.adPosition),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../adposition/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../adposition/info/" + id, function (r) {
+                vm.adPosition = r.adPosition;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+    }
+});

+ 170 - 0
kmall-admin/src/main/webapp/js/shop/attribute.js

@@ -0,0 +1,170 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../attribute/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '所属分类', name: 'categoryName', index: 'attribute_category_id', width: 80},
+            {label: '名称', name: 'name', index: 'name', width: 80},
+            // {label: '类型', name: 'inputType', index: 'input_type', width: 80},
+            // {label: '值', name: 'value', index: 'value', width: 80},
+            {label: '排序', name: 'sortOrder', index: 'sort_order', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            //隐藏grid底部滚动条
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        attribute: { sortOrder: '' },
+        ruleValidate: {
+            /*name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]*/
+        },
+        q: {
+            name: '',
+            categoryName: ''
+        },
+        categories: [],
+        storeList: [],
+        merchList: []
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.attribute = {};
+            vm.attribute = { sortOrder: '' };
+            vm.categories = [];
+            this.getCategories();
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getMerchList();
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+            vm.attribute = {};
+            vm.attribute = { sortOrder: '' };
+            vm.categories = [];
+            vm.storeList = [];
+            vm.merchList = [];
+
+            vm.getInfo(id);
+            vm.getMerchList();
+            vm.getStoresByMerch();
+            this.getCategories();
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.attribute.id == null ? "../attribute/save" : "../attribute/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.attribute),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../attribute/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../attribute/info/" + id, function (r) {
+                vm.attribute = r.attribute;
+            });
+        },
+        getStoresByMerch: function (opt) {
+            var value = opt.value;
+            $.get("../store/getStoresByMerch?merchSn=" + value, function (r) {
+                vm.storeList = r.list;
+            });
+        },
+        getMerchList: function() {
+            $.get("../merch/queryAll", function (r) {
+                vm.merchList = r.list;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name, 'categoryName': vm.q.categoryName},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        getCategories: function () {
+            $.get("../category/getCategory?isL2=0", function (r) {
+                vm.categories = r.list;
+            });
+        },
+        handleSubmit: function (name) {
+            vm.saveOrUpdate();
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+    }
+});

+ 162 - 0
kmall-admin/src/main/webapp/js/shop/attributecategory.js

@@ -0,0 +1,162 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../attributecategory/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '名称', name: 'name', index: 'name', width: 80},
+            {
+                label: '是否可用', name: 'enabled', index: 'enabled', width: 80, formatter: function (value, options, row) {
+                return value === 0 ?
+                    '<span class="label label-danger">禁用</span>' :
+                    '<span class="label label-success">启用</span>';
+            }
+            }],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            //隐藏grid底部滚动条
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        attributeCategory: {
+            enabled: '1'
+        },
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        status: ''
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.attributeCategory = {enabled: '1'};
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+            vm.attributeCategory = {enabled: '1'};
+
+            vm.getInfo(id)
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.attributeCategory.id == null ? "../attributecategory/save" : "../attributecategory/update";
+            if (vm.status) {
+                vm.attributeCategory.enabled = '1';
+            } else {
+                vm.attributeCategory.enabled = '0';
+            }
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.attributeCategory),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../attributecategory/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../attributecategory/info/" + id, function (r) {
+                vm.attributeCategory = r.attributeCategory;
+                if (vm.attributeCategory.enabled == 1) {
+                    vm.status = true;
+                } else {
+                    vm.status = false;
+                }
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        changeEnable: function () {
+            if (vm.status) {
+                vm.attributeCategory.enabled = 1;
+            } else {
+                vm.attributeCategory.enabled = 0;
+            }
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+    }
+});

+ 249 - 0
kmall-admin/src/main/webapp/js/shop/brand.js

@@ -0,0 +1,249 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../brand/list',
+        datatype: "json",
+        colModel: [{
+            label: 'id', name: 'id', index: 'id', key: true, hidden: true
+        }, {
+            label: '品牌名称', name: 'name', index: 'name', width: 80
+        }, {
+            label: '图片', name: 'listPicUrl', index: 'list_pic_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+        }, {
+            label: '描述', name: 'simpleDesc', index: 'simple_desc', width: 80
+        }, {
+            label: '图片', name: 'picUrl', index: 'pic_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+        }, {
+            label: '排序', name: 'sortOrder', index: 'sort_order', width: 80
+        }, {
+            label: '显示', name: 'isShow', index: 'is_show', width: 80, formatter: function (value) {
+                return transIsNot(value)
+            }
+        }, {
+            label: '展示价格', name: 'floorPrice', index: 'floor_Price', width: 80
+        }, {
+            label: 'app显示图片', name: 'appListPicUrl', index: 'app_list_pic_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+        }, {
+            label: '新品牌', name: 'isNew', index: 'is_new', width: 80, formatter: function (value) {
+                return transIsNot(value)
+            }
+        }, {
+            label: '新品牌图片', name: 'newPicUrl', index: 'new_pic_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+        }, {
+            label: '新品牌排序', name: 'newSortOrder', index: 'new_sort_order', width: 80
+        }],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        brand: {listPicUrl: '', picUrl: '', appListPicUrl: '', newPicUrl: '', isShow: 1, isNew: 0},
+        ruleValidate: {
+            name: [
+                {required: true, message: '品牌名称不能为空', trigger: 'blur'}
+            ],
+            listPicUrl: [
+                {required: true, message: '品牌图片不能为空', trigger: 'blur'}
+            ],
+            simpleDesc: [
+                {required: true, message: '品牌描述不能为空', trigger: 'blur'}
+            ],
+            picUrl: [
+                {required: true, message: '品牌图片不能为空', trigger: 'blur'}
+            ],
+            // sortOrder: [
+            //     {required: true, message: '排序不能为空', trigger: 'blur'}
+            // ],
+            // floorPrice: [
+            //     {required: true, message: '展示价格不能为空', trigger: 'blur'}
+            // ],
+            appListPicUrl: [
+                {required: true, message: 'app显示图片不能为空', trigger: 'blur'}
+            ],
+            newPicUrl: [
+                {required: true, message: '新品牌图片不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        storeList: [],
+        merchList: []
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.brand = {listPicUrl: '', picUrl: '', appListPicUrl: '', newPicUrl: '', isShow: 1, isNew: 0};
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getMerchList();
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+            vm.brand = {listPicUrl: '', picUrl: '', appListPicUrl: '', newPicUrl: '', isShow: 1, isNew: 0};
+            vm.storeList = [];
+            vm.merchList = [];
+
+            vm.getInfo(id);
+            vm.getMerchList();
+            vm.getStoresByMerch();
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.brand.id == null ? "../brand/save" : "../brand/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.brand),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../brand/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../brand/info/" + id, function (r) {
+                vm.brand = r.brand;
+            });
+        },
+        getStoresByMerch: function (opt) {
+            var value = opt.value;
+            $.get("../store/getStoresByMerch?merchSn=" + value, function (r) {
+                vm.storeList = r.list;
+            });
+        },
+        getMerchList: function() {
+            $.get("../merch/queryAll", function (r) {
+                vm.merchList = r.list;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSuccessListPicUrl: function (res, file) {
+            vm.brand.listPicUrl = file.response.url;
+        },
+        handleSuccessPicUrl: function (res, file) {
+            vm.brand.picUrl = file.response.url;
+        },
+        handleSuccessAppListPicUrl: function (res, file) {
+            vm.brand.appListPicUrl = file.response.url;
+        },
+        handleSuccessNewPicUrl: function (res, file) {
+            vm.brand.newPicUrl = file.response.url;
+        },
+        handleFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
+            });
+        },
+        handleMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
+            });
+        },
+        eyeImageListPicUrl: function () {
+            var url = vm.brand.listPicUrl;
+            eyeImage(url);
+        },
+        eyeImagePicUrl: function () {
+            var url = vm.brand.picUrl;
+            eyeImage(url);
+        },
+        eyeImageAppListPicUrl: function () {
+            var url = vm.brand.appListPicUrl;
+            eyeImage(url);
+        },
+        eyeImageNewPicUrl: function () {
+            var url = vm.brand.newPicUrl;
+            eyeImage(url);
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+    }
+});

+ 137 - 0
kmall-admin/src/main/webapp/js/shop/cart.js

@@ -0,0 +1,137 @@
+$(function () {
+    let userId = getQueryString("userId");
+    let url = '../cart/list';
+    if (userId) {
+        url += '?userId=' + userId;
+    }
+    $("#jqGrid").jqGrid({
+        url: url,
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '会员', name: 'userName', index: 'user_name', width: 20},
+            // {label: 'sessionId', name: 'sessionId', index: 'session_id', width: 80 },
+            {label: '商品', name: 'goodsName', index: 'goods_name', width: 100},
+            {label: '商品序列号', name: 'goodsSn', index: 'goods_sn', width: 30},
+            // {label: '产品Id', name: 'productId', index: 'product_id', width: 80 },
+            {label: '规格名称', name: 'goodsName', index: 'goods_name', width: 80},
+            {label: '市场价', name: 'marketPrice', index: 'market_price', width: 20},
+            {label: '零售价格', name: 'retailPrice', index: 'retail_price', width: 30},
+            {label: '数量', name: 'number', index: 'number', width: 20},
+            {label: '规格属性', name: 'goodsSpecificationNameValue', index: 'goods_specification_name_value', width: 100}
+            // {label: 'product表对应的goods_specifition_ids', name: 'goodsSpecificationIds', index: 'goods_specification_ids', width: 80 },
+            // {label: '', name: 'checked', index: 'checked', width: 80 },
+            // {label: '商品图片', name: 'listPicUrl', index: 'list_pic_url', width: 80 }
+        ],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        cart: {},
+        q: {
+            name: ''
+        }
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.cart = {};
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.cart.id == null ? "../cart/save" : "../cart/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.cart),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../cart/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../cart/info/" + id, function (r) {
+                vm.cart = r.cart;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+        }
+    }
+});

+ 248 - 0
kmall-admin/src/main/webapp/js/shop/category.js

@@ -0,0 +1,248 @@
+$(function () {
+    initialPage();
+    getGrid();
+});
+
+function initialPage() {
+    $(window).resize(function () {
+        TreeGrid.table.resetHeight({height: $(window).height() - 100});
+    });
+}
+
+function getGrid() {
+    var colunms = TreeGrid.initColumn();
+    var table = new TreeTable(TreeGrid.id, '../category/queryAll', colunms);
+    table.setExpandColumn(2);
+    table.setIdField("id");
+    table.setCodeField("id");
+    table.setParentCodeField("parentId");
+    table.setExpandAll(false);
+    table.setHeight($(window).height() - 100);
+    table.init();
+    TreeGrid.table = table;
+}
+
+var TreeGrid = {
+    id: "jqGrid",
+    table: null,
+    layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TreeGrid.initColumn = function () {
+    var columns = [
+        {field: 'selectItem', radio: true},
+        {title: 'id', field: 'id', align: 'id', width: '50px'},
+        // {title: '类型', field: 'type', align: 'center', valign: 'middle', width: '50px'},
+        {title: '级别', field: 'level', align: 'center', valign: 'middle', width: '50px',formatter: function (item, index) {
+            if (item.level == 'L1') {
+                return '一级分类';
+            } else if (item.level == 'L2') {
+                return '二级分类';
+            }
+            return '-';
+        }},
+        {title: '分类名称', field: 'name', align: 'center', valign: 'middle', width: '60px'},
+        {title: '商户编号', field: 'merchSn', align: 'center', valign: 'middle', width: '100px'},
+        {title: '描述', field: 'frontDesc', align: 'center', valign: 'middle', width: '150px'},
+        {title: '首页排序', field: 'sortOrder', align: 'center', valign: 'middle', width: '50px'},
+        {
+            title: '显示',
+            field: 'isShow',
+            align: 'center',
+            valign: 'middle',
+            width: '50px',
+            formatter: function (item, index) {
+                return transIsNot(item.show)
+            }
+        }]
+    return columns;
+};
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        category: {isShow: 1, type: 0, level: 'L1', bannerUrl: '', iconUrl: '', imgUrl: '', wapBannerUrl: ''},
+        ruleValidate: {
+            name: [
+                {required: true, message: '分类名称不能为空', trigger: 'blur'}
+            ],
+            frontDesc: [
+                {required: true, message: '描述不能为空', trigger: 'blur'}
+            ],
+            bannerUrl: [
+                {required: true, message: 'banner图片不能为空', trigger: 'blur'}
+            ],
+            iconUrl: [
+                {required: true, message: 'icon链接不能为空', trigger: 'blur'}
+            ],
+            imgUrl: [
+                {required: true, message: '图片不能为空', trigger: 'blur'}
+            ],
+            wapBannerUrl: [
+                {required: true, message: '手机banner不能为空', trigger: 'blur'}
+            ],
+            frontName: [
+                {required: true, message: 'frontName不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        categoryList: [],
+        storeList: [],
+        merchList: []
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.category = {isShow: 1, type: 0, level: 'L1', bannerUrl: '', iconUrl: '', imgUrl: '', wapBannerUrl: ''};
+            this.getParentCategory();
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getMerchList();
+        },
+        update: function (event) {
+            var id = TreeGrid.table.getSelectedRow();
+            if (id.length == 0) {
+                iview.Message.error("请选择一条记录");
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+            vm.category = {isShow: 1, type: 0, level: 'L1', bannerUrl: '', iconUrl: '', imgUrl: '', wapBannerUrl: ''};
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getInfo(id[0].id);
+            vm.getMerchList();
+            vm.getStoresByMerch();
+            this.getParentCategory();
+        },
+        getParentCategory: function () {
+            $.get("../category/getCategorySelect", function (r) {
+                vm.categoryList = r.list;
+            });
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.category.id == null ? "../category/save" : "../category/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.category),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var id = TreeGrid.table.getSelectedRow(), ids = [];
+            if (id.length == 0) {
+                iview.Message.error("请选择一条记录");
+                return;
+            }
+            $.each(id, function (idx, item) {
+                ids[idx] = item.id;
+            });
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../category/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                vm.reload();
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../category/info/" + id, function (r) {
+                vm.category = r.category;
+            });
+        },
+        getStoresByMerch: function (opt) {
+            var value = opt.value;
+            $.get("../store/getStoresByMerch?merchSn=" + value, function (r) {
+                vm.storeList = r.list;
+            });
+        },
+        getMerchList: function() {
+            $.get("../merch/queryAll", function (r) {
+                vm.merchList = r.list;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            TreeGrid.table.refresh();
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        handleFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
+            });
+        },
+        handleMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
+            });
+        },
+        handleSuccessBannerUrl: function (res, file) {
+            vm.category.bannerUrl = file.response.url;
+        },
+        eyeImageBannerUrl: function () {
+            var url = vm.category.bannerUrl;
+            eyeImage(url);
+        },
+        handleSuccessIconUrl: function (res, file) {
+            vm.category.iconUrl = file.response.url;
+        },
+        eyeImageIconUrl: function () {
+            var url = vm.category.iconUrl;
+            eyeImage(url);
+        },
+        handleSuccessImgUrl: function (res, file) {
+            vm.category.imgUrl = file.response.url;
+        },
+        eyeImageImgUrl: function () {
+            var url = vm.category.imgUrl;
+            eyeImage(url);
+        },
+        handleSuccessWapBannerUrl: function (res, file) {
+            vm.category.wapBannerUrl = file.response.url;
+        },
+        eyeImageWapBannerUrl: function () {
+            var url = vm.category.wapBannerUrl;
+            eyeImage(url);
+        }
+    }
+});

+ 173 - 0
kmall-admin/src/main/webapp/js/shop/channel.js

@@ -0,0 +1,173 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../channel/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '名称', name: 'name', index: 'name', width: 80},
+            {label: 'url', name: 'url', index: 'url', width: 80},
+            {
+                label: 'iconUrl', name: 'iconUrl', index: 'icon_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+            },
+            {label: '排序', name: 'sortOrder', index: 'sort_order', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        channel: {},
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ],
+            url: [
+                {required: true, message: 'url不能为空', trigger: 'blur'}
+            ],
+            iconUrl: [
+                {required: true, message: 'icon链接不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        categoryList: []
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.channel = {};
+            vm.getParentCategory();
+        },
+        getParentCategory: function () {
+            $.get("../category/getCategorySelect", function (r) {
+                vm.categoryList = r.list;
+            });
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+            vm.getParentCategory();
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.channel.id == null ? "../channel/save" : "../channel/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.channel),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../channel/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../channel/info/" + id, function (r) {
+                vm.channel = r.channel;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        handleFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
+            });
+        },
+        handleMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 50k。'
+            });
+        },
+        handleSuccessIconUrl: function (res, file) {
+            vm.channel.iconUrl = file.response.url;
+        },
+        eyeImageIconUrl: function () {
+            var url = vm.channel.iconUrl;
+            eyeImage(url);
+        }
+    }
+});

+ 124 - 0
kmall-admin/src/main/webapp/js/shop/collect.js

@@ -0,0 +1,124 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../collect/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '用户', name: 'userName', index: 'user_name', width: 80},
+            {label: '商品', name: 'valueName', index: 'value_name', width: 80},
+            {label: '添加时间', name: 'addTime', index: 'add_time', width: 80}
+            // {label: '提醒', name: 'isAttention', index: 'is_attention', width: 80}
+            // {label: '类型', name: 'typeId', index: 'type_id', width: 80}
+            ],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        collect: {},
+        q: {
+            name: ''
+        }
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.collect = {};
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.collect.id == null ? "../collect/save" : "../collect/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.collect),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../collect/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../collect/info/" + id, function (r) {
+                vm.collect = r.collect;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+        }
+    }
+});

+ 149 - 0
kmall-admin/src/main/webapp/js/shop/comment.js

@@ -0,0 +1,149 @@
+$(function () {
+    let status = getQueryString("status");
+    let orderId = getQueryString("orderId");
+    let url = '../comment/list?1';
+    if (status) {
+        url += '&status=' + status;
+    }
+    if (orderId) {
+        url += '&orderId=' + orderId;
+    }
+    debugger
+    $("#jqGrid").jqGrid({
+        url: url,
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '商品', name: 'valueName', index: 'value_id', width: 80},
+            {label: '规格', name: 'goodsSpecificationNameValue', index: 'value_id', width: 80},
+            {label: '评价', name: 'content', index: 'content', width: 80},
+            {
+                label: '评论时间', name: 'addTime', index: 'add_time', width: 80, formatter: function (value) {
+                return transDate(value);
+            }
+            },
+            {
+                label: '状态', name: 'status', index: 'status', width: 80, formatter: function (value) {
+                if (value === 0) {
+                    return '<span class="label label-success">隐藏</span>';
+                }
+                return '<span class="label label-danger">显示</span>';
+            }
+            },
+            {label: '会员', name: 'userName', index: 'user_id', width: 80},
+            {label: '评价级别', name: 'evalLevel', index: 'user_id', width: 80},
+            {label: '配送质量', name: 'deliveryLevel', index: 'user_id', width: 80},
+            {label: '商品服务', name: 'goodsLevel', index: 'user_id', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        comment: {id: ''},
+        q: {
+            userName: '',
+            valueName: '',
+            picUrl: ''
+        }
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        toggleStatus: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+            confirm('确定要切换状态?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../comment/toggleStatusBatch",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code === 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../comment/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        seePic: function () {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            $.get("../commentpicture/queryAll?commentId=" + id, function (r) {
+                var data = [];
+                for (var i = 0; i < r.list.length; i++) {
+                    var picUrl = r.list[i].picUrl;
+                    data.push({"src": picUrl});
+                }
+                eyeImages(data);
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'userName': vm.q.userName, 'valueName': vm.q.valueName, 'picUrl': vm.q.picUrl},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        }
+    }
+});

+ 230 - 0
kmall-admin/src/main/webapp/js/shop/coupon.js

@@ -0,0 +1,230 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../coupon/list?sendType=7',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '优惠券名称', name: 'name', index: 'name', width: 120},
+            {label: '配送金额', name: 'typeMoney', index: 'type_money', width: 80},
+            {label: '最小金额', name: 'minAmount', index: 'min_amount', width: 80},
+            {label: '最大金额', name: 'maxAmount', index: 'max_amount', width: 80},
+        ],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            //隐藏grid底部滚动条
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        showCard: false,
+        showGoods: false,
+        title: null,
+        coupon: {sendType: 7},
+        ruleValidate: {
+            name: [
+                {required: true, message: '优惠券名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        goods: [],
+        goodss: [],
+        user: [],
+        users: [],
+        selectData: {},
+        sendSms: '',//是否发送短信
+        startTimeOption: {},
+        endTimeOption: {}
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.showCard = true;
+            vm.showGoods = false;
+            vm.title = "新增";
+            vm.coupon = {sendType: 7};
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.showCard = true;
+            vm.showGoods = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.coupon.id == null ? "../coupon/save" : "../coupon/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.coupon),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../coupon/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../coupon/info/" + id, function (r) {
+                vm.coupon = r.coupon;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            vm.showCard = false;
+            vm.showGoods = false;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        publish: function (id, sendType) {
+            vm.showGoods = true;
+            vm.goods = [];
+            vm.user = [];
+            vm.getGoodss();
+            vm.getUsers();
+            vm.selectData = {id: id, sendType: sendType};
+            vm.sendSms = false;
+            openWindow({
+                title: "发放",
+                area: ['600px', '350px'],
+                content: jQuery("#sendDiv")
+            })
+        },
+        getUsers: function () {
+            $.get("../user/queryAll", function (r) {
+                vm.users = r.list;
+            });
+        },
+        publishSubmit: function () {
+
+            var sendType = vm.selectData.sendType;
+            if (sendType == 1 && vm.user.length == 0) {
+                vm.$Message.error('请选择下发会员');
+                return;
+            }
+            if (sendType == 3 && vm.goods.length == 0) {
+                vm.$Message.error('请选择下发商品');
+                return;
+            }
+            confirm('确定下发优惠券?', function () {
+                $.ajax({
+                    type: "POST",
+                    dataType: 'json',
+                    url: "../coupon/publish",
+                    contentType: "application/json",
+                    data: JSON.stringify({
+                        sendType: vm.selectData.sendType,
+                        couponId: vm.selectData.id,
+                        goodsIds: vm.goods.toString(),
+                        userIds: vm.user.toString(),
+                        sendSms: vm.sendSms
+                    }),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                                vm.showGoods = false;
+                                vm.showList = true;
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getGoodss: function () {
+            $.get("../goods/queryAll/", function (r) {
+                vm.goodss = r.list;
+            });
+        },
+        onStartTimeChange(startTime) {
+            vm.endTimeOption = {
+                disabledDate(endTime) {
+                    return endTime < new Date(startTime)
+                }
+            }
+        },
+        onEndTimeChange(endTime) {
+            vm.startTimeOption = {
+                disabledDate(startTime) {
+                    return startTime > new Date(endTime)
+                }
+            }
+        }
+    }
+});

+ 184 - 0
kmall-admin/src/main/webapp/js/shop/coupongrads.js

@@ -0,0 +1,184 @@
+$(function () {
+    let sendType = getQueryString("sendType");
+    let menuName = getQueryString("menuName");
+    let url = '../coupon/list';
+    if (sendType) {
+        url += '?sendType=' + sendType;
+        vm.sendType = sendType;
+        vm.menuName = menuName;
+    }
+
+    $("#jqGrid").Grid({
+        url: url,
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '优惠券名称', name: 'name', index: 'name', width: 120},
+            /*{
+                label: '优惠券类型', name: 'couponType', index: 'couponType', width: 80,
+                formatter: function (value) {
+                    if (value == 0) {
+                        return '通用优惠券';
+                    } else if (value == 1) {
+                        return '门店优惠券';
+                    } else if (value == 2) {
+                        return '产品优惠券';
+                    }
+                    return '-';
+                }
+            },*/
+            /*{
+                label: '状态', name: 'status', index: 'status', width: 50,
+                formatter: function (value) {
+                    if (value == 0) {
+                        return '失效';
+                    } else if (value == 1) {
+                        return '正常';
+                    }
+                    return '-';
+                }
+            },*/
+            {label: '订单最小金额', name: 'minAmount', index: 'minAmount', width: 80},
+            {label: '订单最大金额', name: 'maxAmount', index: 'maxAmount', width: 80},
+            {label: '金额', name: 'typeMoney', index: 'type_money', width: 80},
+            // {label: '最小商品金额', name: 'minGoodsAmount', index: 'min_goods_amount', width: 80},
+            {label: '有效天数', name: 'invalidDays', index: 'invalidDays', width: 80}
+            /*{
+                label: '操作', width: 70, align: 'center', sortable: false,
+                    formatter: function (value, col, row) {
+                    if (row.couponType == 1) {
+                        return '<button class="btn btn-outline btn-info ivu-btn-small" onclick="vm.lookCouponStoreList(' + row.id + ',\'' + row.name + '\')"><i class="fa fa-info-circle"></i>&nbsp;门店列表</button>&nbsp;';
+                    } else if (row.couponType == 2) {
+                        return '<button class="btn btn-outline btn-info ivu-btn-small" onclick="vm.lookCouponProductList(' + row.id + ',\'' + row.name + '\')"><i class="fa fa-info-circle"></i>&nbsp;产品列表</button>&nbsp;';
+                    }
+                    return '';
+                }
+            }*/
+        ],
+        multiselect: true
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showDiv: 1,// 1List 2edit 3publish 4store 5product
+        title: null,
+        menuName: null,
+        sendType: 0,
+        coupon: {sendType: 0, status: 1, couponType: 0, name: '', minAmount: 0, maxAmount: 0, minGoodsAmount: 0},
+        ruleValidate: {
+            name: [
+                {required: true, message: '优惠券名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        storeList: [],
+        merchList: []
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showDiv = 2;
+            vm.title = "新增";
+            vm.coupon = {
+                sendType: vm.sendType,
+                status: 1,
+                couponType: 0,
+                name: '',
+                minAmount: 0,
+                maxAmount: 0,
+                minGoodsAmount: 0
+            };
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getMerchList();
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showDiv = 2;
+            vm.title = "修改";
+
+            vm.getInfo(id);
+            vm.getMerchList();
+            vm.getStoresByMerch();
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.coupon.id == null ? "../coupon/save" : "../coupon/update";
+            Ajax.request({
+                url: url,
+                params: JSON.stringify(vm.coupon),
+                contentType: "application/json",
+                type: 'POST',
+                successCallback: function () {
+                    alert('操作成功', function (index) {
+                        vm.reload();
+                    });
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                Ajax.request({
+                    url: "../coupon/delete",
+                    params: JSON.stringify(ids),
+                    contentType: "application/json",
+                    type: 'POST',
+                    successCallback: function () {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            Ajax.request({
+                url: "../coupon/info/" + id,
+                async: true,
+                successCallback: function (r) {
+                    vm.coupon = r.coupon;
+                }
+            });
+        },
+        getStoresByMerch: function (opt) {
+            var value = opt.value;
+            $.get("../store/getStoresByMerch?merchSn=" + value, function (r) {
+                vm.storeList = r.list;
+            });
+        },
+        getMerchList: function() {
+            $.get("../merch/queryAll", function (r) {
+                vm.merchList = r.list;
+            });
+        },
+        reload: function (event) {
+            vm.showDiv = 1;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+    }
+});

+ 36 - 0
kmall-admin/src/main/webapp/js/shop/couponshare.js

@@ -0,0 +1,36 @@
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        coupon: {sendType: 0, status: 1, couponType: 0},
+        ruleValidate: {
+            name: [
+                {required: true, message: '优惠券名称不能为空', trigger: 'blur'}
+            ]
+        },
+    },
+    methods: {
+        saveOrUpdate: function (event) {
+            var url = vm.coupon.id == null ? "../coupon/save" : "../coupon/update";
+            Ajax.request({
+                url: url,
+                params: JSON.stringify(vm.coupon),
+                contentType: "application/json",
+                type: 'POST',
+                successCallback: function () {
+                    alert('操作成功', function (index) {
+                        vm.reload();
+                    });
+                }
+            });
+        },
+    },
+    mounted() {
+        Ajax.request({
+            url: "../coupon/info/" + 20,
+            async: true,
+            successCallback: function (r) {
+                vm.coupon = r.coupon;
+            }
+        });
+    }
+});

+ 106 - 0
kmall-admin/src/main/webapp/js/shop/exportexceptiondata.js

@@ -0,0 +1,106 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../exportexceptiondata/list',
+        datatype: "json",
+        colModel: [
+			{label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+			{label: '导入商品异常数据', name: 'exportExceptionData', index: 'export_exception_data', width: 550},
+			{label: '导入数据类型', name: 'exportDataType', index: 'export_data_type', width: 40,align: 'center',
+                formatter: function (value) {
+                    if (value == '1') {
+                        return '商品导入';
+                    } else if (value == '2') {
+                        return '普通商品导入';
+                    }
+                    return '-';
+                }},
+			// {label: '用户id', name: 'userId', index: 'user_id', width: 80},
+			// {label: '创建人编号', name: 'createrSn', index: 'creater_sn', width: 80},
+			{label: '创建时间', name: 'createTime', index: 'create_time', width: 40, align: 'center',formatter: function (value) {
+                return transDate(value);
+            }},
+			// {label: '修改人编号', name: 'moderSn', index: 'moder_sn', width: 80},
+			// {label: '修改时间', name: 'modTime', index: 'mod_time', width: 80},
+			// {label: '时间戳', name: 'tstm', index: 'tstm', width: 80},
+            // {
+             //    label: '操作', width: 180, sortable: false, align: 'center',
+             //    formatter: function (value, col, row) {
+             //        let htmlStr = '<button class="btn btn-outline btn-info" onclick="vm.getInfoData(' + row.id + ')"><i class="fa fa-info-circle"></i>异常详情</button>&nbsp;';
+             //        return htmlStr;
+             //    }
+            // }
+            ],
+		viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+	el: '#rrapp',
+	data: {
+        showList: true,
+        title: null,
+		exportExceptionData: {},
+		ruleValidate: {
+		},
+		q: {
+		    name: ''
+		}
+	},
+	methods: {
+		query: function () {
+			vm.reload();
+		},
+		getInfoData: function (id) {
+            vm.getInfo(id);
+            layer.prompt({title: '异常详情', formType: 3}, function(pass, index){
+
+            	layer.close(index);
+            });
+		},
+		getInfo: function(id){
+			$.get("../exportexceptiondata/info/"+id, function (r) {
+                vm.exportExceptionData = r.exportExceptionData;
+            });
+		},
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+		},
+		reload: function (event) {
+			vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+			$("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+		},
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+	}
+});

+ 160 - 0
kmall-admin/src/main/webapp/js/shop/feedback.js

@@ -0,0 +1,160 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../feedback/list',
+        datatype: "json",
+        colModel: [
+            {label: 'msgId', name: 'msgId', index: 'msg_id', key: true, hidden: true},
+            {label: '商户编号', name: 'merchSn', index: 'merchSn', width: 60},
+            {label: '门店名称', name: 'storeName', index: 'storeName', width: 80},
+            {label: '会员名称', name: 'userName', index: 'user_name', width: 80},
+            {label: '手机', name: 'mobile', index: 'mobile', width: 100},
+            {
+                label: '反馈类型', name: 'feedType', index: 'feed_Type', width: 80, formatter: function (value) {
+                if (value == 1) {
+                    return '商品相关';
+                } else if (value == 2) {
+                    return '物流状况';
+                } else if (value == 3) {
+                    return '客户服务';
+                } else if (value == 4) {
+                    return '优惠活动';
+                } else if (value == 5) {
+                    return '功能异常';
+                } else if (value == 6) {
+                    return '产品建议';
+                } else if (value == 7) {
+                    return '其他';
+                }
+                return '';
+            }
+            },
+            {label: '详细内容', name: 'content', index: 'content', width: 80},
+            {label: '反馈时间', name: 'addTime', index: 'add_time', width: 80,formatter:function (value) {
+                return transDate(value);
+            }}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        feedback: {},
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            userName: ''
+        }
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.feedback = {};
+        },
+        update: function (event) {
+            let msgId = getSelectedRow();
+            if (msgId == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(msgId)
+        },
+        saveOrUpdate: function (event) {
+            let url = vm.feedback.msgId == null ? "../feedback/save" : "../feedback/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.feedback),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            let msgIds = getSelectedRows();
+            if (msgIds == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../feedback/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(msgIds),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (msgId) {
+            $.get("../feedback/info/" + msgId, function (r) {
+                vm.feedback = r.feedback;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'userName': vm.q.userName},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+    }
+});

+ 121 - 0
kmall-admin/src/main/webapp/js/shop/footprint.js

@@ -0,0 +1,121 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../footprint/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '会员', name: 'userName', index: 'user_name', width: 80},
+            {label: '商品', name: 'goodsName', index: 'goods_name', width: 80},
+            {label: '记录时间', name: 'addTime', index: 'add_time', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        footprint: {},
+        q: {
+            name: ''
+        }
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.footprint = {};
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.footprint.id == null ? "../footprint/save" : "../footprint/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.footprint),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../footprint/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../footprint/info/" + id, function (r) {
+                vm.footprint = r.footprint;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+        }
+    }
+});

+ 285 - 0
kmall-admin/src/main/webapp/js/shop/freight.js

@@ -0,0 +1,285 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../freight/list',
+        datatype: "json",
+        colModel: [
+            {label: 'ID', name: 'id', index: 'id', hidden: true, key: true},
+            {label: '模版名称', name: 'name', index: 'name'},
+            {
+                label: '模版类型', name: 'templateType', index: 'template_type', width: 100,
+                formatter: function (value) {
+                    return transTemplateType(value);
+                }
+            },
+            {
+                label: '计价方式', name: 'pricingManner', index: 'pricing_manner', width: 100,
+                formatter: function (value) {
+                    return transPricingManner(value);
+                }
+            }],
+        viewrecords: true,
+        height: 675,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+function transTemplateType(value) {
+    if (value == 1) {
+        return '卖家包邮';
+    }
+    return '买家承担运费';
+};
+
+function transPricingManner(value) {
+    if (value == 1) {
+        return '按重量';
+    } else if (value == 2) {
+        return '按体积';
+    }
+    return '按件数';
+};
+
+
+let vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        freight: {},
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        freightItemEntityList: [{
+            id: '',
+            freId: '',
+            deliveryArea: true,
+            firstPiece: '',
+            freight: '',
+            continuePiece: '',
+            renew: '',
+            isDelete: 0
+        }],
+        storeList: [],
+        merchList: []
+    },
+    methods: {
+        changeUnit: function(value) {
+            if (value == '0') {
+                $('#first').html('首件(个)');
+                $('#continue').html('续件(个)');
+            } else if (value == '1') {
+                $('#first').html('首件(kg)');
+                $('#continue').html('续件(kg)');
+            } else if (value == '2') {
+                $('#first').html('首件(m³)');
+                $('#continue').html('续件(m³)');
+            }
+        },
+        delItemRow: function (index) {
+            //最后一行时禁止删除
+            if (vm.freightItemEntityList.length == 1) {
+                return;
+            }
+            vm.freightItemEntityList[index].isDelete = 1;
+        },
+        addItemRow: function () {
+            let id = '';
+            if (vm.freight) {
+                id = vm.freight.id;
+            }
+            vm.freightItemEntityList.push({
+                id: '',
+                freId: '',
+                firstPiece: '',
+                freight: '',
+                continuePiece: '',
+                renew: '',
+                isDelete: 0
+            })
+        },
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.freight = {
+                name: '',
+                templateType: 0,
+                pricingManner: 0,
+                isDefault: false
+            };
+            vm.freightItemEntityList = [{
+                id: '',
+                freId: '',
+                deliveryArea: true,
+                firstPiece: '',
+                freight: '',
+                continuePiece: '',
+                renew: '',
+                isDelete: 0
+            }];
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getMerchList();
+        },
+        getStoresByMerch: function (opt) {
+            var value = opt.value;
+            $.get("../store/getStoresByMerch?merchSn=" + value, function (r) {
+                vm.storeList = r.list;
+            });
+        },
+        getMerchList: function() {
+            $.get("../merch/queryAll", function (r) {
+                vm.merchList = r.list;
+            });
+        },
+        update: function (event) {
+            let id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+            vm.freight = {
+                name: '',
+                templateType: 0,
+                pricingManner: 0,
+                isDefault: false
+            };
+            vm.freightItemEntityList = [{
+                id: '',
+                freId: '',
+                deliveryArea: true,
+                firstPiece: '',
+                freight: '',
+                continuePiece: '',
+                renew: '',
+                isDelete: 0
+            }];
+            vm.storeList = [];
+            vm.merchList = [];
+            vm.getInfo(id)
+            vm.getMerchList();
+            vm.getStoresByMerch();
+        },
+        saveOrUpdate: function (event) {
+            let url = vm.freight.id == null ? "../freight/save" : "../freight/update";
+            vm.freight.freightItemEntityList = vm.freightItemEntityList;
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.freight),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            let ids = getSelectedRows();
+            if (ids == null){
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../freight/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function(id){
+            $.get("../freight/info/"+id, function (r) {
+                vm.freight = r.freight;
+                if (vm.freight.isDefault == "1") {
+                    vm.freight.isDefault = true;
+                }
+                if (r.freight.freightItemEntityList.length > 0) {
+                    vm.freightItemEntityList = r.freight.freightItemEntityList;
+                    for (var item in vm.freightItemEntityList) {
+                        if (item.deliveryArea == "ALL") {
+                            item.deliveryArea = true;
+                        }
+                    }
+                } else {
+                    vm.freightItemEntityList = [{
+                        id: '',
+                        freId: '',
+                        deliveryArea: true,
+                        firstPiece: '',
+                        freight: '',
+                        continuePiece: '',
+                        renew: '',
+                        isDelete: 0
+                    }];
+                }
+            });
+        },
+        reloadSearch: function() {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+        },
+        reload: function (event) {
+            vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+    }
+});

+ 621 - 0
kmall-admin/src/main/webapp/js/shop/goods.js

@@ -0,0 +1,621 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../goods/list',
+        datatype: "json",
+        colModel: [
+            {label: 'ID', name: 'id', index: 'id', hidden: true, key: true},
+            {label: '商品编码', name: 'goodsSn', index: 'goods_Sn', width: 60},
+            {label: 'SKU', name: 'sku', index: 'sku', width: 80},
+            {label: '商品类型', name: 'categoryName', index: 'category_id', width: 40},
+            {label: '名称', name: 'name', index: 'name', width: 160},
+            {
+                label: '货品业务类型', name: 'goodsBizType', index: 'goods_biz_type', width: 70,
+                formatter: function (value) {
+                    if (value == '00') {
+                        return '保税备货';
+                    } else if (value == '02') {
+                        return '保税展示补货';
+                    } else if (value == '10') {
+                        return '保税展示跨境';
+                    }
+                    return '普通货物';
+                }
+            },
+            {label: '零售价格', name: 'retailPrice', index: 'retail_price', width: 80},
+            {label: '市场价', name: 'marketPrice', index: 'market_price', width: 80},
+            {
+                label: '上架', name: 'isOnSale', index: 'is_on_sale', width: 40, align: 'center',
+                formatter: function (value) {
+                    return transIsNot(value);
+                }
+            },
+            /*{
+                label: '热销', name: 'isHot', index: 'is_hot', width: 80, formatter: function (value) {
+                return transIsNot(value);
+            }
+            },
+            {
+                label: '活动', name: 'goodsType', index: 'goodsType', width: 80,
+                formatter: function (value) {
+                    if (value == 2) {
+                        return '<span class="label label-warning">团购</span>';
+                    } else {
+                        return '<span class="label label-success">无活动</span>';
+                    }
+                }
+            },*/
+            {
+                label: '录入日期', name: 'addTime', index: 'add_time', width: 80,
+                formatter: function (value) {
+                    return transDate(value, 'yyyy-MM-dd hh:mm:ss');
+                }
+            }
+        ],
+        viewrecords: true,
+        height: 675,
+        rowNum: 15,
+        rowList: [15, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+    $('#goodsDesc').editable({
+        inlineMode: false,
+        alwaysBlank: true,
+        height: '500px', //高度
+        minHeight: '200px',
+        language: "zh_cn",
+        spellcheck: false,
+        plainPaste: true,
+        enableScript: false,
+        imageButtons: ["floatImageLeft", "floatImageNone", "floatImageRight", "linkImage", "replaceImage", "removeImage"],
+        allowedImageTypes: ["jpeg", "jpg", "png", "gif"],
+        imageUploadURL: '../sys/oss/upload',
+        imageUploadParams: {id: "edit"},
+        imagesLoadURL: '../sys/oss/queryAll'
+    })
+});
+
+var ztree;
+
+var setting = {
+    data: {
+        simpleData: {
+            enable: true,
+            idKey: "id",
+            pIdKey: "parentId",
+            rootPId: -1
+        },
+        key: {
+            url: "nourl"
+        }
+    }
+};
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        fileList: true,
+        title: null,
+        uploadList: [],
+        imgName: '',
+        visible: false,
+        goods: {primaryPicUrl: '', listPicUrl: '',videoUrl:'', categoryId: '', isOnSale: 1, isAppExclusive: 0, isLimited: 0, isHot: 0, categoryName: '', retailPrice: '', marketPrice: '', goodsRate: '', sortOrder: '' },
+        ruleValidate: {
+            /*name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]*/
+        },
+        q: {name: '', goodsSn: '', category: '', categoryTwo: ''},
+        attributes: [],
+        attributeEntityList: [{'id': '', 'goodsId': '', 'attributeId': '', 'value': '', 'isDelete': 0}],
+        productEntityList: [{'id': '', 'goodsId': '', 'goodsSpecificationIds': '', 'goodsSpecificationNameValue': '', 'goodsSn': '', 'goodsNumber': '', 'isDelete': 0, 'goodsDefault': 0}],
+        queryCategories: [],//一级分类
+        queryCategoriesTwo: [],
+        categories: [],//一级分类
+        categoriesTwo: [],
+        macros: [],//商品单位
+        attributeCategories: [],//属性类别
+        specifications: [],
+        brands: [],
+        freights: [],
+        showInput: true,
+        categoryId: '',
+        cusUnitCodeList: [],
+        cusNationCodeList: [],
+        merchList: [],
+        suppliers: []
+    },
+    methods: {
+        delSpeRow: function (index) {
+            //最后一行时禁止删除
+            if (vm.productEntityList.length == 1) {
+                return;
+            }
+            vm.productEntityList[index].isDelete = 1;
+        },
+        addSpeRow: function () {
+            let goodsId = '';
+            if (vm.goods) {
+                goodsId = vm.goods.id;
+            }
+            vm.productEntityList.push({'id': '', 'goodsId': '', 'goodsSpecificationIds': '', 'goodsSpecificationNameValue': '', 'goodsSn': '', 'goodsNumber': '', 'isDelete': 0, 'goodsDefault': 0});
+        },
+        delAttrRow: function (index) {
+            //最后一行时禁止删除
+            if (vm.attributeEntityList.length == 1) {
+                return;
+            }
+            vm.attributeEntityList[index].isDelete = 1;
+        },
+        addAttrRow: function () {
+            let goodsId = '';
+            if (vm.goods) {
+                goodsId = vm.goods.id;
+            }
+            vm.attributeEntityList.push({'id': '', 'goodsId': goodsId, 'attributeId': '', 'value': '', 'isDelete': 0});
+        },
+        reloadSearch: function () {
+            vm.q = {
+                name: '',
+                goodsSn: '',
+                category: '',
+                categoryTwo: ''
+            }
+        },
+        query: function () {
+            vm.reload(1);
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.uploadList = [];
+            vm.goods = {primaryPicUrl: '', listPicUrl: '',videoUrl:'',  categoryId: '', isOnSale: 1, isAppExclusive: 0, isLimited: 0, isHot: 0, categoryName: '', retailPrice: '', marketPrice: '', goodsRate: '', sortOrder: '' };
+            $('#goodsDesc').editable('setHTML', '');
+            vm.getCategory();
+            vm.macros = [];
+            vm.brands = [];
+            vm.freights = [];
+            vm.cusUnitCodeList = [];
+            vm.cusNationCodeList = [];
+            vm.attributeEntityList = [{'id': '', 'goodsId': '', 'attributeId': '', 'value': '', 'isDelete': 0}];
+            vm.getMacro();
+            vm.getCusUnitCodeList();
+            vm.getCusNationCode();
+            vm.getMerchList();
+            vm.showInput = true;
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+            vm.uploadList = [];
+            vm.getInfo(id);
+            var opt = {};
+            opt.value = vm.goods.categoryId;
+            opt.flag = 1;
+            vm.getAttributes(opt);
+            vm.getMacro();
+            vm.getCusUnitCodeList();
+            vm.getCusNationCode();
+            vm.getGoodsGallery(id);
+            vm.getMerchList();
+            vm.showInput = true;
+            if (vm.goods.goodsBizType == '10' || vm.goods.goodsBizType == '02') {
+                vm.showInput = false;
+            }
+        },
+        getMacro: function () {
+            // 获取货品业务类型
+            $.get("../sys/macro/queryMacrosByValue?value=goodsBizType", function (r) {
+                vm.macros = r.list;
+            });
+        },
+        getBrand: function (merchSn) {
+            $.get("../brand/queryAll?merchSn=" + merchSn, function (r) {
+                vm.brands = r.list;
+            });
+        },
+        getSuppliers: function (merchSn) {
+            $.get("../supplier/queryAll?merchSn=" + merchSn, function (r) {
+                vm.suppliers = r.list;
+            });
+        },
+        getCusUnitCodeList: function () {
+            $.get("../syscusunitcode/queryAll", function (r) {
+                vm.cusUnitCodeList = r.list;
+            });
+        },
+        getCusNationCode: function () {
+            $.get("../syscusnationcode/queryAll", function (r) {
+                vm.cusNationCodeList = r.list;
+            });
+        },
+        getFreights: function(merchSn) {
+            $.get("../freight/queryAll?merchSn=" + merchSn, function (r) {
+                vm.freights = r.list;
+            });
+        },
+        getGoodsGallery: function (id) {//获取商品顶部轮播图
+            $.get("../goodsgallery/queryAll?goodsId=" + id, function (r) {
+                vm.uploadList = r.list;
+            });
+        },
+        getMerchList: function() {
+            $.get("../merch/queryAll", function (r) {
+                vm.merchList = r.list;
+            });
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.goods.id == null ? "../goods/save" : "../goods/update";
+            vm.goods.goodsDesc = $('#goodsDesc').editable('getHTML');
+            vm.goods.goodsImgList = vm.uploadList;
+            vm.goods.attributeEntityList = vm.attributeEntityList;
+            vm.goods.productEntityList = vm.productEntityList;
+            $.ajax({
+                type: "POST",
+                url: url,
+                dataType: "json",
+                contentType: "application/json",
+                data: JSON.stringify(vm.goods),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        enSale: function () {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+            confirm('确定要上架选中的商品?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../goods/enSaleBatch",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        openSpe: function () {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            openWindow({
+                type: 2,
+                title: '商品规格',
+                content: '../shop/goodsspecification.html?goodsId=' + id
+            })
+        },
+        openPro: function () {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            openWindow({
+                type: 2,
+                title: '产品设置',
+                content: '../shop/product.html?goodsId=' + id
+            });
+        },
+        unSale: function () {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+            confirm('确定要下架选中的商品?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../goods/unSaleBatch",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../goods/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../goods/info/" + id, function (r) {
+                vm.goods = r.goods;
+                vm.categoryId = r.goods.categoryId;
+                // vm.getCategory();
+                var opt = {};
+                opt.value = vm.goods.attributeCategory;
+                vm.changeCategories(opt);
+                if (r.goods.attributeEntityList.length > 0) {
+                    vm.attributeEntityList = r.goods.attributeEntityList;
+                } else {
+                    vm.attributeEntityList = [{'id': '', 'goodsId': '', 'attributeId': '', 'value': '', 'isDelete': 0}];
+                }
+                if (r.goods.productEntityList.length > 0) {
+                    vm.productEntityList = r.goods.productEntityList;
+                } else {
+                    vm.productEntityList = [{'id': '', 'goodsId': '', 'goodsSpecificationIds': '', 'goodsSpecificationNameValue': '', 'goodsSn': '', 'goodsNumber': '', 'isDelete': 0, 'goodsDefault': 0}];
+                }
+
+                $('#goodsDesc').editable('setHTML', vm.goods.goodsDesc);
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            let page = event;
+            if (event != 1) {
+                page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            }
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {
+                    'name': vm.q.name,
+                    'goodsSn': vm.q.goodsSn,
+                    'category': vm.q.category,
+                    'categoryTwo': vm.q.categoryTwo
+                },
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        getCategory: function () {
+            //加载分类树
+            $.get("../category/query", function (r) {
+                ztree = $.fn.zTree.init($("#categoryTree"), setting, r.list);
+                var node = ztree.getNodeByParam("id", vm.goods.categoryId);
+                if (node) {
+                    ztree.selectNode(node);
+                    vm.goods.categoryName = node.name;
+                } else {
+                    node = ztree.getNodeByParam("id", 0);
+                    ztree.selectNode(node);
+                    vm.goods.categoryName = node.name;
+                }
+            })
+        },
+        categoryTree: function () {
+            openWindow({
+                title: "选择类型",
+                area: ['300px', '450px'],
+                content: jQuery("#categoryLayer"),
+                btn: ['确定', '取消'],
+                btn1: function (index) {
+                    var node = ztree.getSelectedNodes();
+                    if (node[0].isParent) {
+                        alert("只能选择");
+                        return;
+                    }
+                    //选择上级菜单
+                    vm.goods.categoryId = node[0].id;
+                    vm.goods.categoryName = node[0].name;
+
+                    layer.close(index);
+                }
+            });
+        },
+        changeGoodsBizType: function(opt) {
+            var goodsBizType = opt.value;
+            if (vm.goods.goodsBizType == '10' || vm.goods.goodsBizType == '02') {
+                vm.showInput = false;
+            } else {
+                vm.showInput = true;
+            }
+        },
+        handleView(name) {
+            this.imgName = name;
+            this.visible = true;
+        },
+        changeQueryCategories: function (opt) {
+            var value = opt.value;
+            $.get("../category/getCategorySelectByParent?parentId=" + value, function (r) {
+                vm.queryCategoriesTwo = r.list;
+            });
+        },
+        getAttributes: function (opt) {
+            var value = opt.value;
+            $.get("../attribute/query?attributeCategoryId=" + value, function (r) {
+                vm.attributes = r.list;
+            });
+
+            if (opt.flag != 1 && !(value === vm.categoryId)) {
+                if (vm.attributeEntityList.length > 0 && vm.attributeEntityList[0].attributeId != '') {
+                    for (var i = 0; i < vm.attributeEntityList.length; i++) {
+                        if (!(vm.attributeEntityList[0].attributeId === '')) {
+                            vm.attributeEntityList[i].isDelete = 1;
+                        }
+                    }
+
+                    var goodsId = '';
+                    if (vm.goods) {
+                        goodsId = vm.goods.id;
+                    }
+                    vm.attributeEntityList.unshift({'id': '', 'goodsId': goodsId, 'attributeId': '', 'value': '', 'isDelete': 0});
+                }
+            }
+        },
+        changeCategories: function (opt) {
+            var value = opt.value;
+            $.get("../category/getCategorySelectByParent?isShow=1&parentId=" + value, function (r) {
+                vm.categoriesTwo = r.list;
+            });
+        },
+        uploadExcelSuccess: function (data) {
+            console.log(data);
+            if(data.code==0){
+                alert('导入成功', function (index) {
+                    $("#jqGrid").trigger("reloadGrid");
+                });
+            }else{
+                alert(data.msg);
+            }
+        },
+        uploadExcelError: function () {
+            alert('上传出现异常,请重试!');
+        },
+        uploadExcelFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 xls 或 xlsx 格式的文件。'
+            });
+        },
+        handleRemove(file) {
+            // 从 upload 实例删除数据
+            const fileList = vm.uploadList;
+            vm.uploadList.splice(fileList.indexOf(file), 1);
+        },
+        handleSuccess(res, file) {
+            // 因为上传过程为实例,这里模拟添加 url
+            file.imgUrl = res.url;
+            file.name = res.url;
+            vm.uploadList.add(file);
+        },
+        handleBeforeUpload() {
+            const check = vm.uploadList.length < 5;
+            if (!check) {
+                this.$Notice.warning({
+                    title: '最多只能上传 5 张图片。'
+                });
+            }
+            return check;
+        },
+        handleSubmit: function (name) {
+            // handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            // });
+        },
+        handleFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
+            });
+        },
+        handleMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        handleSuccessPicUrl: function (res, file) {
+            vm.goods.primaryPicUrl = file.response.url;
+        },
+        handleSuccessListPicUrl: function (res, file) {
+            vm.goods.listPicUrl = file.response.url;
+        },
+        eyeImagePicUrl: function () {
+            var url = vm.goods.primaryPicUrl;
+            eyeImage(url);
+        },
+        eyeImageListPicUrl: function () {
+            var url = vm.goods.listPicUrl;
+            eyeImage(url);
+        },
+        eyeImage: function (e) {
+            eyeImage($(e.target).attr('src'));
+        },
+        eyeImageListVideoUrl: function (e) {
+            var url = vm.goods.videoUrl;
+            eyeVideo(url);
+        },
+        handleVideoFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 mp4 格式的图片。'
+            });
+        },
+        handleVideoMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 10M。'
+            });
+        },
+        handleSuccessListVideoUrl: function (res, file) {
+            vm.goods.videoUrl = file.response.url;
+        },
+        goodsExport: function () {
+            vm.fileList = false;
+        },
+        showMerchInfo:function(opt){
+            var merchSn = opt.value;
+            vm.getCategories(merchSn);
+            vm.getFreights(merchSn);
+            vm.getBrand(merchSn);
+            vm.getSuppliers(merchSn);
+        },
+        getCategories: function (merchSn) {
+            $.get("../category/getCategorySelect?isShow=1&merchSn=" + merchSn, function (r) {
+                vm.categories = r.list;
+            });
+        },
+    },
+    mounted() {
+        // this.uploadList = this.$refs.upload.fileList;
+        $.get("../category/getCategorySelect", function (r) {
+            vm.queryCategories = r.list;
+        });
+
+    }
+});

+ 155 - 0
kmall-admin/src/main/webapp/js/shop/goodsattribute.js

@@ -0,0 +1,155 @@
+var goodsId = getQueryString("goodsId");
+$(function () {
+    let url = '../goodsattribute/list';
+    if (goodsId) {
+        url += '?goodsId=' + goodsId;
+    }
+    $("#jqGrid").jqGrid({
+        url: url,
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '商品', name: 'goodsName', index: 'goods_id', width: 80},
+            {label: '属性', name: 'attributeName', index: 'attribute_id', width: 80},
+            {label: '属性值', name: 'value', index: 'value', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        goodsAttribute: {},
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        attributes: []
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.goodsAttribute = {};
+            vm.getAttributes();
+        },
+        update: function (event) {
+            let id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id);
+            vm.getAttributes();
+        },
+        saveOrUpdate: function (event) {
+            let url = vm.goodsAttribute.id == null ? "../goodsattribute/save" : "../goodsattribute/update";
+            vm.goodsAttribute.goodsId = goodsId;
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.goodsAttribute),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            let ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../goodsattribute/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getAttributes: function () {
+            $.get("../attribute/queryAll", function (r) {
+                vm.attributes = r.list;
+            });
+        },
+        getInfo: function (id) {
+            $.get("../goodsattribute/info/" + id, function (r) {
+                vm.goodsAttribute = r.goodsAttribute;
+            });
+        },
+        reloadSearch: function () {
+            vm.q = {
+                name: ''
+            }
+            vm.reload();
+        },
+        reload: function (event) {
+            vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        }
+    }
+});

+ 151 - 0
kmall-admin/src/main/webapp/js/shop/goodscrash.js

@@ -0,0 +1,151 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../goodscrash/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '商品', name: 'goodsName', index: 'goods_id', width: 80},
+            {label: '搭配商品', name: 'goodsCrashName', index: 'goods_crash_id', width: 80},
+            {label: '搭配产品', name: 'goodsSpecificationValue', index: 'product_crash_id', width: 80},
+            {label: '搭配商品价格,需要小于原始价格', name: 'retailCrashPrice', index: 'retail_crash_price', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+var vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        goodsCrash: {},
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            goodsName: ''
+        },
+        goodss: [],
+        products: []
+    },
+    methods: {
+        changeGoodsCrash: function (opt) {
+            var goodsId = opt.value;
+            $.get("../product/queryByGoodsId/" + goodsId, function (r) {
+                vm.products = r.list;
+            });
+        },
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.goodsCrash = {};
+            vm.getGoodss();
+        },
+        update: function (event) {
+            var id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+            vm.getGoodss();
+        },
+        saveOrUpdate: function (event) {
+            var url = vm.goodsCrash.id == null ? "../goodscrash/save" : "../goodscrash/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.goodsCrash),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            var ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../goodscrash/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../goodscrash/info/" + id, function (r) {
+                vm.goodsCrash = r.goodsCrash;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            var page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'goodsName': vm.q.goodsName},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        getGoodss: function () {
+            $.get("../goods/queryAll/", function (r) {
+                vm.goodss = r.list;
+            });
+        }
+    }
+});

+ 226 - 0
kmall-admin/src/main/webapp/js/shop/goodsgroup.js

@@ -0,0 +1,226 @@
+$(function () {
+    $("#jqGrid").jqGrid({
+        url: '../goodsgroup/list',
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '团购主题', name: 'title', index: 'title', width: 80},
+            {
+                label: '活动图片', name: 'itemPicUrl', index: 'item_pic_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+            },
+            {
+                label: '缩列图', name: 'abbrPicUrl', index: 'abbr_pic_url', width: 80, formatter: function (value) {
+                return transImg(value);
+            }
+            },
+            {label: '广告语', name: 'adDesc', index: 'ad_desc', width: 80},
+            // {label: '开团次数', name: 'launchNum', index: 'launch_num', width: 80},
+            {label: '商品', name: 'goodsName', index: 'goods_id', width: 120},
+            {label: '排序', name: 'sortOrder', index: 'sort_order', width: 80},
+            {label: '最低开团人数', name: 'minOpenGroup', index: 'min_open_group', width: 80},
+            {label: '子标题', name: 'subtitle', index: 'subtitle', width: 80},
+            {label: '团购价格', name: 'retailMinPrice', index: 'retail_min_price', width: 80},
+            {
+                label: '开团时间', name: 'openTime', index: 'open_time', width: 80, formatter: function (value) {
+                return transDate(value);
+            }
+            },
+            {
+                label: '结束时间', name: 'endTime', index: 'end_time', width: 80, formatter: function (value) {
+                return transDate(value);
+            }
+            },
+            {
+                label: '状态',
+                name: 'openStatus',
+                index: 'open_status',
+                width: 80,
+                formatter: function (value) {
+                    if (value == 1) {
+                        return '<span class="label label-success">开团中</span>';
+                    } else if (value == 2) {
+                        return '<span class="label label-primary">过期</span>';
+                    } else if (value == 3) {
+                        return '<span class="label label-danger">已删除</span>';
+                    }
+                    return '-';
+                }
+            },
+            {label: '开团有效期', name: 'validDays', index: 'valid_days', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        goodsGroup: {},
+        ruleValidate: {
+            title: [
+                {required: true, message: '标题不能为空', trigger: 'blur'}
+            ]
+        },
+        goodss: [],
+        q: {
+            subtitle: '',
+            title: '',
+            goodsName: ''
+        },
+        selStatus: [{id: 1, name: '开团中'}, {id: 2, name: '过期'}, {id: 3, name: '失效'}]
+    },
+    methods: {
+        toRecord: function () {
+            let id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            openWindow({
+                type: 2,
+                area: ['90%', '100%'],
+                title: '开团记录',
+                content: '../shop/goodsgroupopen.html?groupId=' + id
+            });
+        },
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.goodsGroup = {};
+            vm.getGoods();
+        },
+        update: function (event) {
+            let id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+            vm.getGoods();
+        },
+        getGoods: function () {
+            $.get("../goods/queryAll/", function (r) {
+                vm.goodss = r.list;
+            });
+        },
+        saveOrUpdate: function (event) {
+            let url = vm.goodsGroup.id == null ? "../goodsgroup/save" : "../goodsgroup/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.goodsGroup),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            let ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../goodsgroup/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../goodsgroup/info/" + id, function (r) {
+                vm.goodsGroup = r.goodsGroup;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'subtitle': vm.q.subtitle, 'title': vm.q.title, 'goodsName': vm.q.goodsName},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        handleFormatError: function (file) {
+            this.$Notice.warning({
+                title: '文件格式不正确',
+                desc: '文件 ' + file.name + ' 格式不正确,请上传 jpg 或 png 格式的图片。'
+            });
+        },
+        handleMaxSize: function (file) {
+            this.$Notice.warning({
+                title: '超出文件大小限制',
+                desc: '文件 ' + file.name + ' 太大,不能超过 2M。'
+            });
+        },
+        handleSuccess: function (res, file) {
+            vm.goodsGroup.itemPicUrl = file.response.url;
+        },
+        eyeImage: function () {
+            var url = vm.goodsGroup.itemPicUrl;
+            eyeImage(url);
+        },
+        handleAbbrSuccess: function (res, file) {
+            vm.goodsGroup.abbrPicUrl = file.response.url;
+        },
+        eyeAbbrImage: function () {
+            var url = vm.goodsGroup.abbrPicUrl;
+            eyeImage(url);
+        }
+    }
+});

+ 189 - 0
kmall-admin/src/main/webapp/js/shop/goodsgroupopen.js

@@ -0,0 +1,189 @@
+$(function () {
+    let groupId = getQueryString("groupId");
+    $("#jqGrid").jqGrid({
+        url: '../goodsgroupopen/list?groupId=' + groupId,
+        datatype: "json",
+        colModel: [
+            {label: 'id', name: 'id', index: 'id', key: true, hidden: true},
+            {label: '开团Id', name: 'groupId', index: 'group_id', width: 80, hidden: true},
+            {label: '开团人', name: 'userName', index: 'user_id', width: 80},
+            {
+                label: '开团时间', name: 'openTime', index: 'open_time', width: 80, formatter: function (value) {
+                return transDate(value);
+            }
+            },
+            {
+                label: '结束时间', name: 'endTime', index: 'end_time', width: 80, formatter: function (value) {
+                return transDate(value);
+            }
+            },
+            {
+                label: '状态', name: 'attendStatus', index: 'attend_status', width: 80, formatter: function (value) {
+                if (value === 0) {
+                    return '待付款';
+                } else if (value == 1) {
+                    return '拼团中';
+                } else if (value == 2) {
+                    return '拼团成功';
+                } else if (value == 3) {
+                    return '拼团失败';
+                }
+                return '-';
+            }
+            },
+            {label: '当前参团人数', name: 'attendNum', index: 'attend_num', width: 80}],
+        viewrecords: true,
+        height: 385,
+        rowNum: 10,
+        rowList: [10, 30, 50],
+        rownumbers: true,
+        rownumWidth: 25,
+        autowidth: true,
+        multiselect: true,
+        pager: "#jqGridPager",
+        jsonReader: {
+            root: "page.list",
+            page: "page.currPage",
+            total: "page.totalPage",
+            records: "page.totalCount"
+        },
+        prmNames: {
+            page: "page",
+            rows: "limit",
+            order: "order"
+        },
+        gridComplete: function () {
+            $("#jqGrid").closest(".ui-jqgrid-bdiv").css({"overflow-x": "hidden"});
+        }
+    });
+});
+
+let vm = new Vue({
+    el: '#rrapp',
+    data: {
+        showList: true,
+        title: null,
+        goodsGroupOpen: {},
+        ruleValidate: {
+            name: [
+                {required: true, message: '名称不能为空', trigger: 'blur'}
+            ]
+        },
+        q: {
+            name: ''
+        },
+        selStatus: [{id: 0, name: '待付款'}, {id: 1, name: '拼团中'}, {id: 2, name: '拼团成功'}, {id: 3, name: '拼团失败'}]
+    },
+    methods: {
+        query: function () {
+            vm.reload();
+        },
+        add: function () {
+            vm.showList = false;
+            vm.title = "新增";
+            vm.goodsGroupOpen = {};
+        },
+        update: function (event) {
+            let id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            vm.showList = false;
+            vm.title = "修改";
+
+            vm.getInfo(id)
+        },
+        saveOrUpdate: function (event) {
+            let url = vm.goodsGroupOpen.id == null ? "../goodsgroupopen/save" : "../goodsgroupopen/update";
+            $.ajax({
+                type: "POST",
+                url: url,
+                contentType: "application/json",
+                data: JSON.stringify(vm.goodsGroupOpen),
+                success: function (r) {
+                    if (r.code === 0) {
+                        alert('操作成功', function (index) {
+                            vm.reload();
+                        });
+                    } else {
+                        alert(r.msg);
+                    }
+                }
+            });
+        },
+        del: function (event) {
+            let ids = getSelectedRows();
+            if (ids == null) {
+                return;
+            }
+
+            confirm('确定要删除选中的记录?', function () {
+                $.ajax({
+                    type: "POST",
+                    url: "../goodsgroupopen/delete",
+                    contentType: "application/json",
+                    data: JSON.stringify(ids),
+                    success: function (r) {
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    }
+                });
+            });
+        },
+        getInfo: function (id) {
+            $.get("../goodsgroupopen/info/" + id, function (r) {
+                vm.goodsGroupOpen = r.goodsGroupOpen;
+            });
+        },
+        reload: function (event) {
+            vm.showList = true;
+            let page = $("#jqGrid").jqGrid('getGridParam', 'page');
+            $("#jqGrid").jqGrid('setGridParam', {
+                postData: {'name': vm.q.name},
+                page: page
+            }).trigger("reloadGrid");
+            vm.handleReset('formValidate');
+        },
+        handleSubmit: function (name) {
+            handleSubmitValidate(this, name, function () {
+                vm.saveOrUpdate()
+            });
+        },
+        handleReset: function (name) {
+            handleResetForm(this, name);
+        },
+        cancelGroup: function (event) {
+            let id = getSelectedRow();
+            if (id == null) {
+                return;
+            }
+            confirm('确定要取消选中的团购?', function () {
+                // this.$Loading.start();
+                $.ajax({
+                    type: "POST",
+                    url: "../goodsgroupopen/cancelGroup",
+                    contentType: "application/json",
+                    data: JSON.stringify(id),
+                    success: function (r) {
+                        // this.$Loading.finish();
+                        if (r.code == 0) {
+                            alert('操作成功', function (index) {
+                                $("#jqGrid").trigger("reloadGrid");
+                            });
+                        } else {
+                            alert(r.msg);
+                        }
+                    },
+                    error: function (r) {
+                        // this.$Loading.error();
+                    }
+                });
+            });
+        },
+    }
+});

Beberapa file tidak ditampilkan karena terlalu banyak file yang berubah dalam diff ini