Bladeren bron

初始化代码
from:http://192.168.0.115:3000/4dkankan_back/shop.git
branch:shop-zfb-3.0.0
version:54103aef

tianboguang 3 jaren geleden
commit
07501f8b59
100 gewijzigde bestanden met toevoegingen van 64201 en 0 verwijderingen
  1. 8 0
      _sql/ddl/alter_ddl.sql
  2. 3909 0
      _sql/platform.sql
  3. 46217 0
      _sql/sys_region.sql
  4. 120 0
      platform-admin/pom.xml
  5. 48 0
      platform-admin/src/main/java/com/platform/aop/CurrentUserAspect.java
  6. 135 0
      platform-admin/src/main/java/com/platform/aop/DataFilterAspect.java
  7. 73 0
      platform-admin/src/main/java/com/platform/aop/RedisCacheAspect.java
  8. 94 0
      platform-admin/src/main/java/com/platform/aop/SysLogAspect.java
  9. 114 0
      platform-admin/src/main/java/com/platform/controller/SysConfigController.java
  10. 440 0
      platform-admin/src/main/java/com/platform/controller/SysDeptController.java
  11. 44 0
      platform-admin/src/main/java/com/platform/controller/SysLogController.java
  12. 150 0
      platform-admin/src/main/java/com/platform/controller/SysMacroController.java
  13. 232 0
      platform-admin/src/main/java/com/platform/controller/SysOssController.java
  14. 30 0
      platform-admin/src/main/java/com/platform/controller/SysPageController.java
  15. 195 0
      platform-admin/src/main/java/com/platform/controller/SysRegionController.java
  16. 128 0
      platform-admin/src/main/java/com/platform/controller/SysSmsLogController.java
  17. 28 0
      platform-admin/src/main/java/com/platform/dao/SysOssDao.java
  18. 47 0
      platform-admin/src/main/java/com/platform/entity/SysOssEntity.java
  19. 5 0
      platform-admin/src/main/java/com/platform/feign/ZhiHouseFeignApi.java
  20. 26 0
      platform-admin/src/main/java/com/platform/service/SysOssService.java
  21. 30 0
      platform-admin/src/main/java/com/platform/service/impl/SysOssServiceImpl.java
  22. 7 0
      platform-admin/src/main/resources/caffeine.properties
  23. 16 0
      platform-admin/src/main/resources/com/platform/dao/SysOssDao.xml
  24. 68 0
      platform-admin/src/main/resources/dev/log4j.properties
  25. 117 0
      platform-admin/src/main/resources/dev/platform.properties
  26. 67 0
      platform-admin/src/main/resources/ehcache.xml
  27. 95 0
      platform-admin/src/main/resources/j2cache.properties
  28. 14 0
      platform-admin/src/main/resources/mybatis.xml
  29. 43 0
      platform-admin/src/main/resources/network.xml
  30. 66 0
      platform-admin/src/main/resources/prod/log4j.properties
  31. 114 0
      platform-admin/src/main/resources/prod/platform.properties
  32. 158 0
      platform-admin/src/main/resources/spring-jdbc.xml
  33. 123 0
      platform-admin/src/main/resources/spring-mvc.xml
  34. 9 0
      platform-admin/src/main/webapp/WEB-INF/dispatcher-servlet.xml
  35. 184 0
      platform-admin/src/main/webapp/WEB-INF/page/brand.html
  36. 3 0
      platform-admin/src/main/webapp/WEB-INF/page/join/axios.js
  37. 79 0
      platform-admin/src/main/webapp/WEB-INF/page/join/index.html
  38. 114 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/ad.html
  39. 33 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/address.html
  40. 57 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/adminuser.html
  41. 60 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/adposition.html
  42. 69 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/attribute.html
  43. 57 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/attributecategory.html
  44. 290 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/brand.html
  45. 236 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/broadcast.html
  46. 110 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/carousel.html
  47. 91 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/cart.html
  48. 152 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/category.html
  49. 84 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/channel.html
  50. 68 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/collect.html
  51. 42 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/comment.html
  52. 147 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/coupon.html
  53. 77 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/coupondetail.html
  54. 197 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/dept.html
  55. 90 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/feedback.html
  56. 57 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/footprint.html
  57. 344 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/goods.html
  58. 35 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/goodshistory.html
  59. 282 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/goodshotspot.html
  60. 54 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/goodsissue.html
  61. 95 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/goodsspecification.html
  62. 65 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/helpissue.html
  63. 55 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/helptype.html
  64. 97 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/keywords.html
  65. 243 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/linkhotspot.html
  66. 217 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/order.html
  67. 125 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/orderPrint.html
  68. 100 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/product.html
  69. 169 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/recommend.html
  70. 231 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/sceneAllocation.html
  71. 60 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/searchhistory.html
  72. 61 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/selectUser.html
  73. 107 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/shopuser.html
  74. 64 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/specification.html
  75. 159 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/staff.html
  76. 142 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/topic.html
  77. 74 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/topiccategory.html
  78. 66 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/usercoupon.html
  79. 54 0
      platform-admin/src/main/webapp/WEB-INF/page/shop/userlevel.html
  80. 62 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/config.html
  81. 143 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/dept.html
  82. 27 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/generator.html
  83. 69 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/header.html
  84. 4217 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/icon.html
  85. 36 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/log.html
  86. 82 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/macro.html
  87. 101 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/main.html
  88. 111 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/menu.html
  89. 243 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/newUser.html
  90. 126 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/oss.html
  91. 104 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/region.html
  92. 84 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/role.html
  93. 101 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/schedule.html
  94. 26 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/schedule_log.html
  95. 57 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/smslog.html
  96. 160 0
      platform-admin/src/main/webapp/WEB-INF/page/sys/user.html
  97. 3 0
      platform-admin/src/main/webapp/WEB-INF/page/test/axios.js
  98. 77 0
      platform-admin/src/main/webapp/WEB-INF/page/test/index.html
  99. 206 0
      platform-admin/src/main/webapp/WEB-INF/page/test/iviewDemo.html
  100. 0 0
      platform-admin/src/main/webapp/WEB-INF/page/topic/save/axios.js

+ 8 - 0
_sql/ddl/alter_ddl.sql

@@ -0,0 +1,8 @@
+-- 商家表
+ALTER TABLE nideshop_brand ADD COLUMN  `pic_list` longtext DEFAULT NULL COMMENT COMMENT '店铺简介照片集';
+ALTER TABLE nideshop_brand ADD COLUMN  `longitude` decimal(9,6) DEFAULT NULL COMMENT '经度';
+ALTER TABLE nideshop_brand ADD COLUMN  `latitude` decimal(9,6) DEFAULT NULL COMMENT '纬度';
+ALTER TABLE nideshop_brand ADD COLUMN  `introduce_video` varchar(255) DEFAULT NULL COMMENT '视频简介地址';
+ALTER TABLE nideshop_brand ADD COLUMN  `introduce_video_cover` varchar(255) DEFAULT NULL COMMENT '视频简介的第一帧';
+
+

File diff suppressed because it is too large
+ 3909 - 0
_sql/platform.sql


File diff suppressed because it is too large
+ 46217 - 0
_sql/sys_region.sql


+ 120 - 0
platform-admin/pom.xml

@@ -0,0 +1,120 @@
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>com.platform</groupId>
+        <artifactId>platform</artifactId>
+        <version>1.0.0</version>
+    </parent>
+
+    <artifactId>platform-admin</artifactId>
+    <packaging>war</packaging>
+    <name>platform-admin</name>
+    <description>管理后台</description>
+
+    <dependencies>
+        <dependency>
+            <groupId>com.platform</groupId>
+            <artifactId>platform-common</artifactId>
+            <version>1.0.0</version>
+        </dependency>
+        <!--验证码生成工具-->
+        <dependency>
+            <groupId>com.github.penggle</groupId>
+            <artifactId>kaptcha</artifactId>
+            <version>${kaptcha.version}</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.75</version>
+        </dependency>
+        <!-- https://mvnrepository.com/artifact/com.thoughtworks.xstream/xstream -->
+        <dependency>
+            <groupId>com.thoughtworks.xstream</groupId>
+            <artifactId>xstream</artifactId>
+            <version>1.4.16</version>
+        </dependency>
+    </dependencies>
+
+    <profiles>
+        <profile>
+            <id>dev</id>
+            <properties>
+                <env>dev</env>
+            </properties>
+            <activation>
+                <activeByDefault>true</activeByDefault>
+            </activation>
+        </profile>
+        <profile>
+            <id>prod</id>
+            <properties>
+                <env>prod</env>
+            </properties>
+        </profile>
+    </profiles>
+
+    <build>
+        <scriptSourceDirectory>src/main/java</scriptSourceDirectory>
+        <resources>
+            <resource>
+                <directory>src/main/resources/${env}</directory>
+                <filtering>true</filtering>
+            </resource>
+            <resource>
+                <directory>src/main/resources</directory>
+                <filtering>true</filtering>
+                <excludes>
+                    <exclude>dev/*</exclude>
+                    <exclude>prod/*</exclude>
+                </excludes>
+            </resource>
+            <resource>
+                <directory>src/main/java</directory>
+                <filtering>true</filtering>
+                <includes>
+                    <include>**/*.xml</include>
+                </includes>
+            </resource>
+        </resources>
+        <plugins>
+            <plugin>
+                <artifactId>maven-war-plugin</artifactId>
+                <configuration>
+                    <warSourceDirectory>src/main/webapp</warSourceDirectory>
+                    <failOnMissingWebXml>false</failOnMissingWebXml>
+                    <webResources>
+                        <resource>
+                            <directory>src/main/resources/${env}</directory>
+                            <targetPath>WEB-INF/classes</targetPath>
+                            <filtering>true</filtering>
+                        </resource>
+                        <resource>
+                            <directory>src/main/resources</directory>
+                            <filtering>true</filtering>
+                            <excludes>
+                                <exclude>dev/*</exclude>
+                                <exclude>prod/*</exclude>
+                            </excludes>
+                        </resource>
+                    </webResources>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-resources-plugin</artifactId>
+                <configuration>
+                    <encoding>UTF-8</encoding>
+                    <!-- 过滤后缀为pem、pfx的证书文件 -->
+                    <nonFilteredFileExtensions>
+                        <nonFilteredFileExtension>pem</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>pfx</nonFilteredFileExtension>
+                        <nonFilteredFileExtension>p12</nonFilteredFileExtension>
+                    </nonFilteredFileExtensions>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 48 - 0
platform-admin/src/main/java/com/platform/aop/CurrentUserAspect.java

@@ -0,0 +1,48 @@
+package com.platform.aop;
+
+import com.platform.utils.RRException;
+import com.platform.utils.ShiroUtils;
+import com.platform.vos.CurrentUserLoginVo;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.springframework.stereotype.Component;
+import org.springframework.util.ObjectUtils;
+
+import java.util.Date;
+
+/**
+ * 系统日志,切面处理类
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017年3月8日 上午11:07:35
+ */
+@Aspect
+@Component
+public class CurrentUserAspect {
+
+    /**
+     * 切点
+     */
+    @Pointcut("@annotation(com.platform.annotation.CanUserUpdateRecord)")
+    public void logPointCut() {
+
+    }
+
+    /**
+     * 前置通知
+     *
+     */
+    @Before("logPointCut()")
+    public void saveSysLog() {
+        //获取当前登录用户
+        CurrentUserLoginVo currentUser = ShiroUtils.getUserEntity();
+        // 判断企业是否过期
+        if (!ObjectUtils.isEmpty(currentUser.getDeptExpirationDate()) && currentUser.getDeptExpirationDate().before(new Date())) {
+            throw new RRException("当前登录用户企业已过期,不允许操作");
+        }
+    }
+
+}

+ 135 - 0
platform-admin/src/main/java/com/platform/aop/DataFilterAspect.java

@@ -0,0 +1,135 @@
+package com.platform.aop;
+
+import com.platform.annotation.DataFilter;
+import com.platform.entity.SysUserEntity;
+import com.platform.service.SysRoleDeptService;
+import com.platform.utils.Constant;
+import com.platform.utils.RRException;
+import com.platform.utils.ShiroUtils;
+import org.apache.commons.lang.StringUtils;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 数据过滤,切面处理类
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017年10月23日 下午13:33:35
+ */
+@Aspect
+@Component
+public class DataFilterAspect {
+    @Autowired
+    private SysRoleDeptService sysRoleDeptService;
+
+    /**
+     * 切点
+     */
+    @Pointcut("@annotation(com.platform.annotation.DataFilter)")
+    public void dataFilterCut() {
+
+    }
+
+    /**
+     * 前置通知
+     *
+     * @param point 连接点
+     */
+    @Before("dataFilterCut()")
+    public void dataFilter(JoinPoint point) {
+        //获取参数
+        Object params = point.getArgs()[0];
+        if (params != null && params instanceof Map) {
+            SysUserEntity user = ShiroUtils.getUserEntity();
+
+            //如果不是超级管理员,则只能查询本部门及子部门数据
+            if (user.getUserId() != Constant.SUPER_ADMIN) {
+                Map map = (Map) params;
+                map.put("filterSql", getFilterSQL(user, point));
+            }
+
+            return;
+        }
+
+        throw new RRException("数据权限接口的参数必须为Map类型,且不能为NULL");
+    }
+
+    /**
+     * 获取数据过滤的SQL
+     *
+     * @param user  登录用户
+     * @param point 连接点
+     * @return sql
+     */
+    private String getFilterSQL(SysUserEntity user, JoinPoint point) {
+        MethodSignature signature = (MethodSignature) point.getSignature();
+        DataFilter dataFilter = signature.getMethod().getAnnotation(DataFilter.class);
+
+        String userAlias = dataFilter.userAlias();
+        String deptAlias = dataFilter.deptAlias();
+
+        StringBuilder filterSql = new StringBuilder();
+
+        if (StringUtils.isNotBlank(deptAlias)) {
+            //取出登录用户部门权限
+            String alias = getAliasByUser(user.getUserId());
+            if (StringUtils.isNotEmpty(alias)) {
+                filterSql.append(" and (");
+                filterSql.append(deptAlias);
+                filterSql.append(" in ");
+                filterSql.append(" ( ");
+                filterSql.append(alias);
+                filterSql.append(" ) ");
+                if (StringUtils.isNotBlank(userAlias)) {
+                    filterSql.append(" or ");
+                    filterSql.append(userAlias);
+                    filterSql.append("='");
+                    filterSql.append(user.getUserId());
+                    filterSql.append("' ");
+                }
+                filterSql.append(" ) ");
+            }
+        } else if (StringUtils.isNotBlank(userAlias)) {
+            filterSql.append(" and ");
+            filterSql.append(userAlias);
+            filterSql.append("='");
+            filterSql.append(user.getUserId());
+            filterSql.append("' ");
+        }
+
+        return filterSql.toString();
+    }
+
+    /**
+     * 取出用户权限
+     *
+     * @param userId 登录用户Id
+     * @return 权限
+     */
+    private String getAliasByUser(Long userId) {
+        @SuppressWarnings("unchecked")
+        List<Long> roleOrglist = sysRoleDeptService.queryDeptIdListByUserId(userId);
+        StringBuilder roleStr = new StringBuilder();
+        String alias = "";
+        if (roleOrglist != null && !roleOrglist.isEmpty()) {
+            for (Long roleId : roleOrglist) {
+                roleStr.append(",");
+                roleStr.append("'");
+                roleStr.append(roleId);
+                roleStr.append("'");
+            }
+            alias = roleStr.toString().substring(1, roleStr.length());
+        }
+        return alias;
+    }
+}

+ 73 - 0
platform-admin/src/main/java/com/platform/aop/RedisCacheAspect.java

@@ -0,0 +1,73 @@
+package com.platform.aop;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.platform.annotation.RedisCache;
+import com.platform.cache.J2CacheUtils;
+import com.platform.utils.StringUtils;
+import org.aspectj.lang.ProceedingJoinPoint;
+import org.aspectj.lang.Signature;
+import org.aspectj.lang.annotation.Around;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author 李鹏军
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2019年2月18日 下午15:54:23
+ */
+@Aspect
+@Component
+public class RedisCacheAspect {
+
+    @Pointcut("@annotation(com.platform.annotation.RedisCache)")
+    public void webAspect() {
+    }
+
+    @SuppressWarnings("unchecked")
+    @Around("webAspect()")
+    public Object redisCache(ProceedingJoinPoint pjp) throws Throwable {
+        //得到类名、方法名和参数
+        String redisResult;
+        String className = pjp.getTarget().getClass().getName();
+        String methodName = pjp.getSignature().getName();
+        Object[] args = pjp.getArgs();
+
+        //得到被代理的方法
+        Signature signature = pjp.getSignature();
+        if (!(signature instanceof MethodSignature)) {
+            throw new IllegalArgumentException();
+        }
+        MethodSignature methodSignature = (MethodSignature) signature;
+        Method method = pjp.getTarget().getClass().getMethod(methodSignature.getName(), methodSignature.getParameterTypes());
+        //得到被代理的方法上的注解
+        String cacheKey = method.getAnnotation(RedisCache.class).cacheKey();
+        boolean destine = method.getAnnotation(RedisCache.class).destine();
+
+        String key = cacheKey;
+        if (!destine) {
+            //根据类名,方法名和参数生成key
+            key = StringUtils.genKey(cacheKey, className, methodName);
+        }
+
+        Object result = null;
+        if (!J2CacheUtils.exists(key)) {
+            //缓存不存在,则调用原方法,并将结果放入缓存中
+            result = pjp.proceed(args);
+            redisResult = JSON.toJSONString(result);
+            J2CacheUtils.put(key, redisResult);
+        } else {
+            //缓存命中
+            redisResult = JSONObject.toJSON(J2CacheUtils.get(key)).toString();
+            //得到被代理方法的返回值类型
+            Class returnType = method.getReturnType();
+            result = JSON.parseObject(redisResult, returnType);
+        }
+        return result;
+    }
+}

+ 94 - 0
platform-admin/src/main/java/com/platform/aop/SysLogAspect.java

@@ -0,0 +1,94 @@
+package com.platform.aop;
+
+import com.alibaba.fastjson.JSON;
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysLogEntity;
+import com.platform.entity.SysUserEntity;
+import com.platform.service.SysLogService;
+import com.platform.utils.HttpContextUtils;
+import com.platform.utils.IPUtils;
+import com.platform.utils.ShiroUtils;
+import com.platform.vos.CurrentUserLoginVo;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.Aspect;
+import org.aspectj.lang.annotation.Before;
+import org.aspectj.lang.annotation.Pointcut;
+import org.aspectj.lang.reflect.MethodSignature;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+import java.lang.reflect.Method;
+import java.util.Date;
+
+/**
+ * 系统日志,切面处理类
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017年3月8日 上午11:07:35
+ */
+@Aspect
+@Component
+public class SysLogAspect {
+    @Autowired
+    private SysLogService sysLogService;
+
+    /**
+     * 切点
+     */
+    @Pointcut("@annotation(com.platform.annotation.SysLog)")
+    public void logPointCut() {
+
+    }
+
+    /**
+     * 前置通知
+     *
+     * @param joinPoint 连接点
+     */
+    @Before("logPointCut()")
+    public void saveSysLog(JoinPoint joinPoint) {
+        MethodSignature signature = (MethodSignature) joinPoint.getSignature();
+        Method method = signature.getMethod();
+
+        SysLogEntity sysLog = new SysLogEntity();
+        SysLog syslog = method.getAnnotation(SysLog.class);
+        if (syslog != null) {
+            //注解上的描述
+            sysLog.setOperation(syslog.value());
+        }
+
+        //请求的方法名
+        String className = joinPoint.getTarget().getClass().getName();
+        String methodName = signature.getName();
+        sysLog.setMethod(className + "." + methodName + "()");
+
+        //请求的参数
+        Object[] args = joinPoint.getArgs();
+        String params = JSON.toJSONString(args[0]);
+        sysLog.setParams(params);
+
+        //获取request
+        HttpServletRequest request = HttpContextUtils.getHttpServletRequest();
+        //设置IP地址
+        sysLog.setIp(IPUtils.getIpAddr(request));
+
+        //用户名
+        CurrentUserLoginVo sysUserEntity = ShiroUtils.getUserEntity();
+        String username = "";
+        if ("login".equals(methodName)) {
+            username = params;
+        }
+        if (null != sysUserEntity) {
+            username = sysUserEntity.getUsername();
+        }
+        sysLog.setUsername(username);
+
+        sysLog.setCreateDate(new Date());
+        //保存系统日志
+        sysLogService.save(sysLog);
+    }
+
+}

+ 114 - 0
platform-admin/src/main/java/com/platform/controller/SysConfigController.java

@@ -0,0 +1,114 @@
+package com.platform.controller;
+
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysConfigEntity;
+import com.platform.service.SysConfigService;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import com.platform.validator.ValidatorUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 系统配置信息Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2016年12月4日 下午6:55:53
+ */
+@RestController
+@RequestMapping("/sys/config")
+public class SysConfigController extends AbstractController {
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    /**
+     * 所有配置列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:config:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+        List<SysConfigEntity> configList = sysConfigService.queryList(query);
+        int total = sysConfigService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(configList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+
+    /**
+     * 根据主键获取配置信息
+     *
+     * @param id 主键
+     * @return R
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("sys:config:info")
+    public R info(@PathVariable("id") Long id) {
+        SysConfigEntity config = sysConfigService.queryObject(id);
+
+        return R.ok().put("config", config);
+    }
+
+    /**
+     * 新增配置
+     *
+     * @param config 配置
+     * @return R
+     */
+    @SysLog("新增配置")
+    @RequestMapping("/save")
+    @RequiresPermissions("sys:config:save")
+    public R save(@RequestBody SysConfigEntity config) {
+        ValidatorUtils.validateEntity(config);
+
+        sysConfigService.save(config);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改配置
+     *
+     * @param config 配置
+     * @return R
+     */
+    @SysLog("修改配置")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:config:update")
+    public R update(@RequestBody SysConfigEntity config) {
+        ValidatorUtils.validateEntity(config);
+
+        sysConfigService.update(config);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除配置
+     *
+     * @param ids 主键集
+     * @return R
+     */
+    @SysLog("删除配置")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:config:delete")
+    public R delete(@RequestBody Long[] ids) {
+        sysConfigService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+}

+ 440 - 0
platform-admin/src/main/java/com/platform/controller/SysDeptController.java

@@ -0,0 +1,440 @@
+package com.platform.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysDeptEntity;
+import com.platform.entity.SysUserEntity;
+import com.platform.service.SysDeptService;
+import com.platform.service.impl.SysUserServiceImpl;
+import com.platform.utils.*;
+import com.platform.vos.SysDeptEntityVo;
+import com.platform.vos.SysDeptVo;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiImplicitParams;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.CollectionUtils;
+import org.springframework.util.ObjectUtils;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * 部门管理Controller
+ *
+ * @author liepngjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-09-17 23:58:47
+ */
+@Api(tags = "管理后台部门操作相关接口")
+@RestController
+@RequestMapping("/sys/dept")
+@Slf4j
+public class SysDeptController extends AbstractController {
+    @Autowired
+    private SysDeptService sysDeptService;
+
+    @Autowired
+    private SysUserServiceImpl sysUserService;
+
+    @ApiOperation(value = "获取公司可新增员工的数量")
+    @GetMapping("/getLessNum")
+    @RequiresPermissions("sys:user:list")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "deptId", value = "部门ID", dataType = "long"),
+    })
+    public R userBindList(@RequestParam(name = "deptId") long deptId) {
+        Map<String , Object> mp = new HashMap<>();
+        SysDeptEntity sysDeptEntity = sysDeptService.queryObject(deptId);
+        if(null == sysDeptEntity){
+            return  R.error("公司不存在");
+        }
+        long curStaffNum = sysUserService.getUserNumOfDept(deptId);
+        long maxStaffNum = null !=  sysDeptEntity.getStaffNum() ? sysDeptEntity.getStaffNum() : 0;
+        long less = maxStaffNum - curStaffNum;
+        mp.put("less" , less);
+        return R.ok(mp);
+    }
+
+
+    /**
+     * 部门列表
+     *
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:dept:list")
+    public R list(@RequestParam(name = "name") String name) {
+        List<SysDeptEntity> deptList;
+        if(StringUtils.isBlank(name)){
+            Map<String, Object> map = new HashMap<>();
+            //如果不是超级管理员,则只能查询本部门及子部门数据
+            if (getUserId() != Constant.SUPER_ADMIN) {
+                map.put("deptFilter", sysDeptService.getSubDeptIdList(getDeptId()));
+            }
+            if(map.containsKey("sidx")){
+                map.remove("sidx");
+            }
+            deptList = sysDeptService.queryList(map);
+        }else{
+            //如果不是超级管理员,则只能查询本部门及子部门数据
+            if (getUserId() != Constant.SUPER_ADMIN) {
+                deptList = sysDeptService.queryListByName(name , getAllSubDeptIds(getDeptId()));
+            }else{
+                deptList = sysDeptService.queryListByName(name , null);
+            }
+        }
+        // 获取管理员手机号
+        if(ObjectUtils.isEmpty(deptList)) {
+            return R.ok().put("list", deptList);
+        }
+        Map<Long, SysDeptEntity> entityMap = deptList.stream()
+                .collect(Collectors.toMap(SysDeptEntity::getDeptId, deptEntity -> deptEntity));
+        Map<String,Object> params = new HashMap<>();
+        params.put("deptIdList",entityMap.keySet());
+        List<SysUserEntity> users = sysUserService.queryList(params);
+        users.parallelStream().filter(user -> user.getRoleId() == 6 && entityMap.containsKey(user.getDeptId()))
+                .forEach(user -> {
+                    SysDeptEntity deptEntity = entityMap.get(user.getDeptId());
+                    String mobile = user.getMobile();
+                    if (ObjectUtils.isEmpty(deptEntity.getManagerPhoneNum())) {
+                        deptEntity.setManagerPhoneNum(mobile);
+                    } else {
+                        deptEntity.setManagerPhoneNum(deptEntity.getManagerPhoneNum().concat(";").concat(mobile));
+                    }
+                });
+        return R.ok().put("list", deptList);
+    }
+    @ApiOperation(value = "拉取所有部门列表,具有树状结构")
+    @PostMapping("/anonList")
+    public R anonList() {
+        Map<String, Object> map = new HashMap<>();
+        //从总部开始去获取所有的子部门
+        map.put("deptFilter", sysDeptService.getSubDeptIdList(1L));
+        List<SysDeptEntity> deptList = sysDeptService.queryList(map);
+        return R.ok().put("list", deptList);
+    }
+
+    /**
+     * 选择部门(添加、修改菜单)
+     *
+     * @return R
+     */
+    @RequestMapping("/select")
+    @RequiresPermissions("sys:dept:select")
+    public R select() {
+        Map<String, Object> map = new HashMap<>();
+        //如果不是超级管理员,则只能查询本部门及子部门数据
+        if (getUserId() != Constant.SUPER_ADMIN) {
+            map.put("deptFilter", sysDeptService.getSubDeptIdList(getDeptId()));
+        }
+        List<SysDeptEntity> deptList = sysDeptService.queryList(map);
+
+        //添加一级部门
+        if (getUserId() == Constant.SUPER_ADMIN) {
+            SysDeptEntity root = new SysDeptEntity();
+            root.setDeptId(0L);
+            root.setName("一级部门");
+            root.setParentId(-1L);
+            root.setOpen(true);
+            deptList.add(root);
+        }
+
+        return R.ok().put("deptList", deptList);
+    }
+
+    /**
+     * 获取用户部门Id(管理员则为0)
+     *
+     * @return
+     */
+    @RequestMapping("/info")
+    @RequiresPermissions("sys:dept:list")
+    public R info() {
+        long deptId = 0;
+        if (getUserId() != Constant.SUPER_ADMIN) {
+            SysDeptEntity dept = sysDeptService.queryObject(getDeptId());
+            deptId = dept.getParentId();
+        }
+
+        return R.ok().put("deptId", deptId);
+    }
+
+    /**
+     * 根据主键获取部门信息
+     *
+     * @param deptId 主键
+     * @return R
+     */
+    @RequestMapping("/info/{deptId}")
+    @RequiresPermissions("sys:dept:info")
+    public R info(@PathVariable("deptId") Long deptId) {
+        SysDeptEntity dept = sysDeptService.queryObject(deptId);
+
+        return R.ok().put("dept", dept);
+    }
+
+    /**
+     * 新增部门
+     *
+     * @param dept 部门
+     * @return R
+     */
+    @ApiOperation(value = "新增部门")
+    @SysLog("新增部门")
+    @PostMapping("/save")
+    @RequiresPermissions("sys:dept:save")
+    public R save(@RequestBody SysDeptEntityVo dept) {
+        try {
+            if(ObjectUtils.isEmpty(dept.getManagerPhoneNum())){
+                return R.error("手机号为空,请输入公司管理员手机号!");
+            }
+            SysUserEntity manager = sysUserService.queryByUserMobile(dept.getManagerPhoneNum());
+            if(!ObjectUtils.isEmpty(manager) && manager.getDeptId() != -1L){
+                return R.error("操作失败,当前账号已被绑定");
+            }
+            if (ObjectUtils.isEmpty(dept.getParentId())) {
+                dept.setParentId(1L);
+            }else{
+                Integer count = 0;
+                int parentLevel = countParentDeptLevel(dept.getParentId(), count);
+                log.info("当前部门的父类部门深度为:{}", parentLevel);
+                if (parentLevel > 4) {
+                    return R.error("部门层级已经达到5层了,无法再创建子部门");
+                }
+            }
+            if (ObjectUtils.isEmpty(dept.getDeptId())) {
+                dept.setCurStaffNum(1);
+            } else {
+                SysDeptEntity deptEntity = sysDeptService.queryObject(dept.getDeptId());
+                if (ObjectUtils.isEmpty(deptEntity.getCurStaffNum())) {
+                    deptEntity.setCurStaffNum(0);
+                }
+                deptEntity.setCurStaffNum(deptEntity.getCurStaffNum() + 1);
+            }
+            sysDeptService.save(dept);
+            //需要更新公司管理员的部门id
+            manager.setDeptId(dept.getDeptId());
+            manager.setRoleIdList(Arrays.asList(6L));
+            sysUserService.update(manager);
+        } catch (Exception e) {
+            e.printStackTrace();
+            return R.error(e.getMessage());
+        }
+        return R.ok();
+    }
+
+    @SysLog("计算当前部门的深度")
+    @ApiOperation(value = "计算当前部门的深度")
+    @GetMapping("/countDeptLevel")
+    @RequiresPermissions("sys:dept:save")
+    public R countDeptLevel(Long deptId) {
+        if(null == deptId){
+            return R.error("部门Id缺失");
+        }
+        int count = 0;
+        Map<String , Object> result  = new HashMap<>();
+        result.put("num" , countParentDeptLevel(deptId , count));
+        return  R.ok(result);
+
+    }
+
+    public int countParentDeptLevel(long parentId , Integer count){
+
+        SysDeptEntity sysDeptEntity = sysDeptService.queryObject(parentId);
+        if(null == sysDeptEntity){
+            return 0;
+        }
+        if(count > 10){
+            log.warn("递归嵌套超过了10,保护资源,停止递归");
+            return 0;
+        }
+        count += 1;
+        if(null != sysDeptEntity.getParentId()){
+           return  1 + countParentDeptLevel(sysDeptEntity.getParentId() , count);
+        }
+
+        return 1;
+    }
+
+
+    @SysLog("校验父部门的管理员的短信验证码")
+    @PostMapping("/validParentAdmin")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public R validParentAdmin(@RequestBody SysDeptVo sysDeptVo) {
+        if(null == sysDeptVo){
+            return R.error("缺失参数");
+        }
+        if(null == sysDeptVo.getParentId()){
+            return R.error("缺失父部门的id");
+        }
+
+        if(StringUtils.isBlank(sysDeptVo.getParentAdminPhoneNum())){
+            return R.error("缺失父部门管理员的手机号");
+        }
+
+        if(StringUtils.isBlank(sysDeptVo.getParentSmsCode())){
+            return R.error("缺失父部门管理员的短信验证码");
+        }
+        SysUserEntity parentAdmin = sysUserService.queryByMobileAndDeptId(sysDeptVo.getParentAdminPhoneNum() , sysDeptVo.getParentId());
+        if(null == parentAdmin){
+            return R.error("父部门的管理员信息不正确");
+        }
+
+        //校验管理员的短信验证码
+        String parentSmsCode = (String) LettuceRedisClientUtils.getValueByKey("login_sms_code:" + sysDeptVo.getParentAdminPhoneNum() + sysDeptVo.getParentSmsCode());
+        logger.info("上级部门管理员的上送验证码为:{},缓存中的为:{}" , sysDeptVo.getParentSmsCode() , parentSmsCode);
+        if(StringUtils.isBlank(parentSmsCode)){
+            return R.error("上级部门管理员的验证码过期或者不正确");
+        }
+        return R.ok();
+
+    }
+
+
+    @SysLog("新增部门同时更新管理员数据")
+    @PostMapping("/createDept")
+    @ResponseBody
+    @Transactional(rollbackFor = Exception.class)
+    public R saveDept(@RequestBody SysDeptVo sysDeptVo) {
+
+        if(null == sysDeptVo){
+            return R.error("缺失参数");
+        }
+
+        if(StringUtils.isBlank(sysDeptVo.getSmsCode()) || StringUtils.isBlank(sysDeptVo.getAdminPhoneNum())){
+            return R.error("管理员的手机号或者验证码缺失");
+        }
+        //校验当前管理员的手机验证码
+        String smsCode = (String) LettuceRedisClientUtils.getValueByKey("login_sms_code:" + sysDeptVo.getAdminPhoneNum() + sysDeptVo.getSmsCode());
+        logger.info("上级部门管理员的上送验证码为:{},缓存中的为:{}" , sysDeptVo.getSmsCode() , smsCode);
+        if(StringUtils.isBlank(smsCode)){
+            return R.error("管理员的短信验证码过期或者无效");
+        }
+
+        SysUserEntity userEntity = getUser();
+        if(null == userEntity){
+            return R.error("用户未登录");
+        }
+        if(null != userEntity.getDeptId()){
+            return R.error("一个用户只能归属一个部门");
+        }
+
+        //新增部门数据
+        SysDeptEntity sysDeptEntity = new SysDeptEntity();
+        sysDeptEntity.setName(sysDeptVo.getDeptName());
+        if(null == sysDeptVo.getParentId()){
+            //不传,默认认为是新建,新建的,统一设置为1l总部
+            sysDeptEntity.setParentId(1L);
+        }else{
+            sysDeptEntity.setParentId(sysDeptVo.getParentId());
+        }
+
+        //TODO:事务管控
+        sysDeptService.save(sysDeptEntity);
+
+        log.info("新增的部门id={}" , sysDeptEntity.getDeptId());
+
+        //更新部门数据到管理员
+        SysUserEntity admin = sysUserService.queryByUserMobile(sysDeptVo.getAdminPhoneNum());
+        if(null == admin){
+            log.warn("管理员用户:{}不存在" , sysDeptVo.getAdminPhoneNum());
+        }else{
+            admin.setDeptId(sysDeptEntity.getDeptId());
+            sysUserService.updateUserAndAddDeptAdminRolls(admin);
+        }
+        return R.ok();
+    }
+
+
+    /**
+     * 修改部门
+     *
+     * @param dept 部门
+     * @return R
+     */
+    @SysLog("修改部门")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:dept:update")
+    public R update(@RequestBody SysDeptEntityVo dept) {
+        sysDeptService.update(dept);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除部门
+     *
+     * @param deptId 主键
+     * @return R
+     */
+    @SysLog("删除部门")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:dept:delete")
+    public R delete(long deptId) {
+        //判断是否有子部门
+        List<Long> deptList = getAllSubDeptIds(deptId);
+        if (deptList.size() > 1) {
+            return R.error("请先删除子部门");
+        }
+        // 判断 该部门(子部门)下有没有账号
+        List<SysUserEntity> users = sysUserService.getSysUserListByDeptIds(deptList);
+        if(!CollectionUtils.isEmpty(users)){
+            return R.error("删除失败,请先将公司以及下级公司所绑定的账号都解绑后,再进行删除!");
+        }
+        sysDeptService.delete(deptId);
+        return R.ok();
+    }
+
+    public List<Long> getAllSubDeptIds(Long deptId) {
+        if (null == deptId) {
+            log.info("部门ID为空");
+            return new ArrayList<>();
+        }
+        List<Long> allDeptIdList = new ArrayList<>();
+        int leve = 0;
+        leve = findDeptIdByParent(deptId, 0, allDeptIdList);
+        log.info("获取到当前部门以及所有子部门(10层嵌套以内)的id为:{},部门层级为:{}",
+                JSON.toJSONString(allDeptIdList) , leve);
+        return allDeptIdList;
+    }
+
+    private int findDeptIdByParent(long deptId, int level, List<Long> deptIdList) {
+
+        if (level > 10) {
+            log.info("嵌套层数超过了10层");
+            return level;
+        }
+        deptIdList.add(deptId);
+        //获取所有子部门的id
+        List<Long> subDeptIdList = sysDeptService.queryDetpIdList(deptId);
+        if (CollectionUtils.isEmpty(subDeptIdList)) {
+            //自己算一层,没有子部门,要先加上自己这一层
+            return level + 1;
+        }
+        int maxLevel = 0;
+        for(Long id : subDeptIdList){
+            //遍历所有子部门的子部门,并记下子部门中嵌套最深的层数
+            int tmpLevel = findDeptIdByParent(id, level, deptIdList);
+            if(tmpLevel > maxLevel){
+                maxLevel = tmpLevel;
+            }
+        }
+        //添加子部门的id
+        deptIdList.addAll(subDeptIdList);
+        //叠加子部门的最大层级
+        level += maxLevel;
+        //加上自己这一层
+        level += 1;
+        return level;
+    }
+
+}

+ 44 - 0
platform-admin/src/main/java/com/platform/controller/SysLogController.java

@@ -0,0 +1,44 @@
+package com.platform.controller;
+
+import com.platform.service.SysLogService;
+import com.platform.utils.PageUtilsPlus;
+import com.platform.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.Map;
+
+/**
+ * 系统日志Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-08 10:40:56
+ */
+@Controller
+@RequestMapping("/sys/log")
+public class SysLogController {
+    @Autowired
+    private SysLogService sysLogService;
+
+    /**
+     * 系统日志列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @ResponseBody
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:log:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        PageUtilsPlus pageUtil = sysLogService.queryPage(params);
+        return R.ok().put("page", pageUtil);
+    }
+
+}

+ 150 - 0
platform-admin/src/main/java/com/platform/controller/SysMacroController.java

@@ -0,0 +1,150 @@
+package com.platform.controller;
+
+import com.platform.annotation.SysLog;
+import com.platform.entity.SysMacroEntity;
+import com.platform.service.SysMacroService;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 通用字典表Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-08-22 11:48:16
+ */
+@RestController
+@RequestMapping("sys/macro")
+public class SysMacroController {
+    @Autowired
+    private SysMacroService sysMacroService;
+
+    /**
+     * 所有字典列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:macro:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<SysMacroEntity> sysMacroList = sysMacroService.queryList(query);
+        int total = sysMacroService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(sysMacroList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 根据主键获取字典信息
+     *
+     * @param macroId 主键
+     * @return R
+     */
+    @RequestMapping("/info/{macroId}")
+    @RequiresPermissions("sys:macro:info")
+    public R info(@PathVariable("macroId") Long macroId) {
+        SysMacroEntity sysMacro = sysMacroService.queryObject(macroId);
+
+        return R.ok().put("macro", sysMacro);
+    }
+
+    /**
+     * 新增字典
+     *
+     * @param sysMacro 字典
+     * @return R
+     */
+    @SysLog("新增字典")
+    @RequestMapping("/save")
+    @RequiresPermissions("sys:macro:save")
+    public R save(@RequestBody SysMacroEntity sysMacro) {
+        sysMacroService.save(sysMacro);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改字典
+     *
+     * @param sysMacro 字典
+     * @return R
+     */
+    @SysLog("修改字典")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:macro:update")
+    public R update(@RequestBody SysMacroEntity sysMacro) {
+        sysMacroService.update(sysMacro);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除字典
+     *
+     * @param macroIds 主键集
+     * @return R
+     */
+    @SysLog("删除字典")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:macro:delete")
+    public R delete(@RequestBody Long[] macroIds) {
+        sysMacroService.deleteBatch(macroIds);
+
+        return R.ok();
+    }
+
+    /**
+     * 查看字典列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/queryAll")
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<SysMacroEntity> list = sysMacroService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查看字典目录列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/queryAllParent")
+    public R queryAllParent(@RequestParam Map<String, Object> params) {
+
+        List<SysMacroEntity> list = sysMacroService.queryAllParent(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 根据value查询数据字典
+     *
+     * @param value value
+     * @return R
+     */
+    @RequestMapping("/queryMacrosByValue")
+    public R queryMacrosByValue(@RequestParam String value) {
+
+        List<SysMacroEntity> list = sysMacroService.queryMacrosByValue(value);
+
+        return R.ok().put("list", list);
+    }
+}

+ 232 - 0
platform-admin/src/main/java/com/platform/controller/SysOssController.java

@@ -0,0 +1,232 @@
+package com.platform.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.platform.annotation.SysLog;
+import com.platform.entity.Result;
+import com.platform.entity.SysOssEntity;
+import com.platform.entity.SysUserEntity;
+import com.platform.enums.ResultCodeEnum;
+import com.platform.exception.CommonBaseException;
+import com.platform.oss.CloudStorageConfig;
+import com.platform.oss.OSSFactory;
+import com.platform.service.SysConfigService;
+import com.platform.service.SysOssService;
+import com.platform.service.SysUserService;
+import com.platform.utils.*;
+import com.platform.validator.ValidatorUtils;
+import com.platform.validator.group.AliyunGroup;
+import com.platform.validator.group.DiskGroup;
+import com.platform.validator.group.QcloudGroup;
+import com.platform.validator.group.QiniuGroup;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.annotation.Logical;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.apache.shiro.authz.annotation.RequiresRoles;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.*;
+
+/**
+ * 文件上传Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+@RestController
+@RequestMapping("sys/oss")
+@Slf4j
+public class SysOssController extends AbstractController{
+    @Autowired
+    private SysOssService sysOssService;
+    @Autowired
+    private SysConfigService sysConfigService;
+
+    @Autowired
+    private SysUserService sysUserService;
+
+
+
+
+    @Autowired
+    private UploadToOssUtil uploadToOssUtil;
+
+    @Autowired
+    private OssCheckPointUploadUtil ossCheckPointUploadUtil;
+
+    @Value("${oss.query.url}")
+    private String ossQueryUrl;
+
+    @Value("${oss.video.file.path}")
+    private String ossVideoPath;
+
+    @Value("${video-file-path}")
+    private String videoLocalBackupPath;
+
+    private final static String KEY = Constant.CLOUD_STORAGE_CONFIG_KEY;
+
+    /**
+     * 列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:oss:all")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        PageUtilsPlus pageUtil = sysOssService.queryPage(params);
+        return R.ok().put("page", pageUtil);
+    }
+
+
+    /**
+     * 获取云存储配置信息
+     *
+     * @return R
+     */
+    @RequestMapping("/config")
+    @RequiresPermissions("sys:oss:all")
+    public R config() {
+        CloudStorageConfig config = sysConfigService.getConfigObject(KEY, CloudStorageConfig.class);
+
+        return R.ok().put("config", config);
+    }
+
+
+    /**
+     * 保存云存储配置信息
+     *
+     * @param config 配置信息
+     * @return R
+     */
+    @SysLog("保存云存储配置信息")
+    @RequestMapping("/saveConfig")
+    @RequiresPermissions("sys:oss:all")
+    public R saveConfig(@RequestBody CloudStorageConfig config) {
+        //校验类型
+        ValidatorUtils.validateEntity(config);
+
+        if (config.getType() == Constant.CloudService.QINIU.getValue()) {
+            //校验七牛数据
+            ValidatorUtils.validateEntity(config, QiniuGroup.class);
+        } else if (config.getType() == Constant.CloudService.ALIYUN.getValue()) {
+            //校验阿里云数据
+            ValidatorUtils.validateEntity(config, AliyunGroup.class);
+        } else if (config.getType() == Constant.CloudService.QCLOUD.getValue()) {
+            //校验腾讯云数据
+            ValidatorUtils.validateEntity(config, QcloudGroup.class);
+        } else if (config.getType() == Constant.CloudService.DISCK.getValue()) {
+            //校验腾讯云数据
+            ValidatorUtils.validateEntity(config, DiskGroup.class);
+        }
+
+        sysConfigService.updateValueByKey(KEY, JSON.toJSONString(config));
+
+        return R.ok();
+    }
+
+    @ApiOperation(value = "上传视频")
+    @PostMapping("/upLoadVideo")
+    @ResponseBody
+    public Result uploadIntroduceVideo(@RequestParam("file") MultipartFile file) {
+        if (null == file) {
+            throw new CommonBaseException(ResultCodeEnum.D3001);
+        }
+        log.info("当前视频大小为:{} bytes" , file.getSize());
+        if(file.getSize() > 1024000000){
+            return Result.failure("视频不能超过1G");
+        }
+        String downLoanVideoPath = FileUtils.parseFile(file, videoLocalBackupPath);
+        log.info("视频文件已经下载到本地:{}", downLoanVideoPath);
+        //视频文件名一般为:xxx.mp4这种格式
+        String videoFilePureName = file.getOriginalFilename();
+        log.info("视频文件名为:{}", videoFilePureName);
+        //去掉格式,只获取纯名字
+        int index = videoFilePureName.indexOf(".");
+        //获取纯名字
+        if (index != -1) {
+            videoFilePureName = videoFilePureName.substring(0, index);
+        } else {
+            Random random = new Random();
+            videoFilePureName = "default_imag_" + random.nextInt(10000);
+            log.info("采用默认的图片名字:{}", videoFilePureName);
+        }
+        //这里默认第一帧图片是jpg格式
+        String imageFormatter = "jpg";
+        //视频在oss中的object name
+        String imageOssObjectName = ossVideoPath + videoFilePureName + "." + imageFormatter;
+        //截取视频第一帧图片
+        boolean cutFirstImageResult = FileUtils.executeCodecs(downLoanVideoPath, videoLocalBackupPath,
+                videoFilePureName, imageFormatter);
+
+        if (cutFirstImageResult) {
+            log.info("成功截取第一帧图片,将上传到oss上");
+            String imageLocalPath = videoLocalBackupPath + videoFilePureName + "." + imageFormatter;
+            uploadToOssUtil.uploadThenDelete(imageLocalPath, imageOssObjectName);
+            log.info("上传第一帧图片到oss完成");
+        }
+
+        String videoObjectName = ossVideoPath + file.getOriginalFilename();
+        ossCheckPointUploadUtil.doUploadThenDelete(downLoanVideoPath, videoObjectName);
+
+        Map<String, Object> resultMap = new HashMap<>();
+        resultMap.put("image", ossQueryUrl + imageOssObjectName);
+        resultMap.put("video", ossQueryUrl + videoObjectName);
+        return Result.success("视频文件上传oss结束", resultMap);
+    }
+
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @return R
+     * @throws Exception 异常
+     */
+    @RequestMapping("/upload")
+    public R upload(@RequestParam("file") MultipartFile file) throws Exception {
+        if (file.isEmpty()) {
+            throw new RRException("上传文件不能为空");
+        }
+        //上传文件
+        String url = OSSFactory.build().upload(file);
+
+        //保存文件信息
+        SysOssEntity ossEntity = new SysOssEntity();
+        ossEntity.setUrl(url);
+        ossEntity.setCreateDate(new Date());
+        ossEntity.setUserId(getUserId());
+
+        SysUserEntity userEntity = sysUserService.queryObject(ossEntity.getUserId());
+        if(userEntity != null){
+            ossEntity.setUsername(userEntity.getUsername());
+        }
+        sysOssService.save(ossEntity);
+
+        R r = new R();
+        r.put("url", url);
+        r.put("link", url);
+        return r;
+    }
+
+
+    /**
+     * 删除图片
+     *
+     * @param ids 主键集
+     * @return R
+     */
+    @SysLog("删除图片")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:oss:all")
+    public R delete(@RequestBody Long[] ids) {
+        sysOssService.removeByIds(Arrays.asList(ids));
+
+        return R.ok();
+    }
+}

+ 30 - 0
platform-admin/src/main/java/com/platform/controller/SysPageController.java

@@ -0,0 +1,30 @@
+package com.platform.controller;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+/**
+ * 系统页面视图Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2016年11月24日 下午11:05:27
+ */
+@Controller
+public class SysPageController {
+
+    /**
+     * 视图路径
+     *
+     * @param module 模块
+     * @param url    url
+     * @return 页面视图路径
+     */
+    @RequestMapping("{module}/{url}.html")
+    public String page(@PathVariable("module") String module, @PathVariable("url") String url) {
+        return module + "/" + url + ".html";
+    }
+
+}

+ 195 - 0
platform-admin/src/main/java/com/platform/controller/SysRegionController.java

@@ -0,0 +1,195 @@
+package com.platform.controller;
+
+import com.platform.annotation.SysLog;
+import com.platform.cache.RegionCacheUtil;
+import com.platform.entity.SysRegionEntity;
+import com.platform.service.SysRegionService;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import com.platform.utils.TreeUtils;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 地址管理Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-11-04 11:19:31
+ */
+@RestController
+@RequestMapping("sys/region")
+public class SysRegionController {
+    @Autowired
+    private SysRegionService sysRegionService;
+
+    /**
+     * 查看列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:region:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<SysRegionEntity> regionList = sysRegionService.queryList(query);
+        int total = sysRegionService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(regionList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 根据主键获取信息
+     *
+     * @param id 主键
+     * @return R
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("sys:region:info")
+    public R info(@PathVariable("id") Integer id) {
+        SysRegionEntity region = sysRegionService.queryObject(id);
+
+        return R.ok().put("region", region);
+    }
+
+    /**
+     * 新增地址
+     *
+     * @param region 地址
+     * @return R
+     */
+    @SysLog("新增地址")
+    @RequestMapping("/save")
+    @RequiresPermissions("sys:region:save")
+    public R save(@RequestBody SysRegionEntity region) {
+        sysRegionService.save(region);
+
+        return R.ok();
+    }
+
+    /**
+     * 修改地址
+     *
+     * @param region 地址
+     * @return R
+     */
+    @SysLog("修改地址")
+    @RequestMapping("/update")
+    @RequiresPermissions("sys:region:update")
+    public R update(@RequestBody SysRegionEntity region) {
+        sysRegionService.update(region);
+
+        return R.ok();
+    }
+
+    /**
+     * 删除地址
+     *
+     * @param ids 主键集
+     * @return R
+     */
+    @SysLog("删除地址")
+    @RequestMapping("/delete")
+    @RequiresPermissions("sys:region:delete")
+    public R delete(@RequestBody Integer[] ids) {
+        sysRegionService.deleteBatch(ids);
+
+        return R.ok();
+    }
+
+    /**
+     * 查询所有国家
+     *
+     * @return R
+     */
+    @RequestMapping("/getAllCountry")
+    public R getAllCountry() {
+        List<SysRegionEntity> list = RegionCacheUtil.getAllCountry();
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查询所有省份
+     *
+     * @return R
+     */
+    @RequestMapping("/getAllProvice")
+    public R getAllProvice(@RequestParam(required = false) Integer areaId) {
+        List<SysRegionEntity> list = RegionCacheUtil.getAllProviceByParentId(areaId);
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查询所有城市
+     *
+     * @return R
+     */
+    @RequestMapping("/getAllCity")
+    public R getAllCity(@RequestParam(required = false) Integer areaId) {
+        List<SysRegionEntity> list = RegionCacheUtil.getChildrenCity(areaId);
+        return R.ok().put("list", list);
+    }
+
+
+    /**
+     * 查询所有区县
+     *
+     * @return R
+     */
+    @RequestMapping("/getChildrenDistrict")
+    public R getChildrenDistrict(@RequestParam(required = false) Integer areaId) {
+        List<SysRegionEntity> list = RegionCacheUtil.getChildrenDistrict(areaId);
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 查看信息(全部加载页面渲染太慢!)
+     *
+     * @return R
+     */
+    @RequestMapping("/getAreaTree")
+    public R getAreaTree() {
+        List<SysRegionEntity> list = RegionCacheUtil.sysRegionEntityList;
+        for (SysRegionEntity sysRegionEntity : list) {
+            sysRegionEntity.setValue(sysRegionEntity.getId() + "");
+            sysRegionEntity.setLabel(sysRegionEntity.getName());
+        }
+        List<SysRegionEntity> node = TreeUtils.factorTree(list);
+
+        return R.ok().put("node", node);
+    }
+
+    /**
+     * 根据类型获取区域
+     *
+     * @param type 类型
+     * @return R
+     */
+    @RequestMapping("/getAreaByType")
+    public R getAreaByType(@RequestParam(required = false) Integer type) {
+
+        List<SysRegionEntity> list = new ArrayList<>();
+        if (type.equals(0)) {
+
+        } else if (type.equals(1)) {//省份
+            list = RegionCacheUtil.getAllCountry();
+        } else if (type.equals(2)) {
+            list = RegionCacheUtil.getAllProvice();
+        } else if (type.equals(3)) {
+            list = RegionCacheUtil.getAllCity();
+        }
+        return R.ok().put("list", list);
+    }
+}

+ 128 - 0
platform-admin/src/main/java/com/platform/controller/SysSmsLogController.java

@@ -0,0 +1,128 @@
+package com.platform.controller;
+
+import com.alibaba.fastjson.JSON;
+import com.platform.annotation.SysLog;
+import com.platform.entity.SmsConfig;
+import com.platform.entity.SysSmsLogEntity;
+import com.platform.service.SysConfigService;
+import com.platform.service.SysSmsLogService;
+import com.platform.utils.Constant;
+import com.platform.utils.PageUtils;
+import com.platform.utils.Query;
+import com.platform.utils.R;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 发送短信日志Controller
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-12-16 23:38:05
+ */
+@RestController
+@RequestMapping("/sys/smslog")
+public class SysSmsLogController {
+    @Autowired
+    private SysSmsLogService smsLogService;
+    @Autowired
+    private SysConfigService sysConfigService;
+    /**
+     * 短信配置KEY
+     */
+    private final static String KEY = Constant.SMS_CONFIG_KEY;
+
+    /**
+     * 所有日志列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/list")
+    @RequiresPermissions("sys:smslog:list")
+    public R list(@RequestParam Map<String, Object> params) {
+        //查询列表数据
+        Query query = new Query(params);
+
+        List<SysSmsLogEntity> smsLogList = smsLogService.queryList(query);
+        int total = smsLogService.queryTotal(query);
+
+        PageUtils pageUtil = new PageUtils(smsLogList, total, query.getLimit(), query.getPage());
+
+        return R.ok().put("page", pageUtil);
+    }
+
+    /**
+     * 根据主键获取日志信息
+     *
+     * @param id 主键
+     * @return R
+     */
+    @RequestMapping("/info/{id}")
+    @RequiresPermissions("sys:smslog:info")
+    public R info(@PathVariable("id") String id) {
+        SysSmsLogEntity smsLog = smsLogService.queryObject(id);
+
+        return R.ok().put("smsLog", smsLog);
+    }
+
+    /**
+     * 查看所有列表
+     *
+     * @param params 请求参数
+     * @return R
+     */
+    @RequestMapping("/queryAll")
+    public R queryAll(@RequestParam Map<String, Object> params) {
+
+        List<SysSmsLogEntity> list = smsLogService.queryList(params);
+
+        return R.ok().put("list", list);
+    }
+
+    /**
+     * 获取短信配置信息
+     *
+     * @return R
+     */
+    @RequestMapping("/config")
+    public R config() {
+        SmsConfig config = sysConfigService.getConfigObject(KEY, SmsConfig.class);
+
+        return R.ok().put("config", config);
+    }
+
+    /**
+     * 保存短信配置信息
+     *
+     * @param config 短信配置信息
+     * @return R
+     */
+    @SysLog("保存短信配置信息")
+    @RequestMapping("/saveConfig")
+    public R saveConfig(@RequestBody SmsConfig config) {
+        sysConfigService.updateValueByKey(KEY, JSON.toJSONString(config));
+        return R.ok();
+    }
+
+    /**
+     * 发送短信
+     *
+     * @param smsLog 短信
+     * @return R
+     */
+    @RequestMapping("/sendSms")
+    public R sendSms(@RequestBody SysSmsLogEntity smsLog) {
+        //腾讯云短信平台
+//        SysSmsLogEntity sysSmsLogEntity = smsLogService.sendSms(smsLog);
+
+        //阿里云短信平台
+        SysSmsLogEntity sysSmsLogEntity = smsLogService.sendAliSms("SMS_184816840", smsLog);
+        return R.ok().put("result", sysSmsLogEntity);
+    }
+}

+ 28 - 0
platform-admin/src/main/java/com/platform/dao/SysOssDao.java

@@ -0,0 +1,28 @@
+package com.platform.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.platform.entity.SysOssEntity;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * 文件上传Dao
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+public interface SysOssDao extends BaseMapper<SysOssEntity> {
+
+    /**
+     * 自定义分页查询
+     *
+     * @param page
+     * @param params
+     * @return
+     */
+    List<SysOssEntity> selectSysOssPage(IPage page, Map<String, Object> params);
+}

+ 47 - 0
platform-admin/src/main/java/com/platform/entity/SysOssEntity.java

@@ -0,0 +1,47 @@
+package com.platform.entity;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 文件上传
+ * 表名 sys_oss
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+@Data
+@TableName("sys_oss")
+public class SysOssEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+    /**
+     * URL地址
+     */
+    private String url;
+    /**
+     * 创建时间
+     */
+    private Date createDate;
+
+    /**
+     * 用户id
+     */
+    private Long userId;
+
+    /**
+     * 用户名
+     */
+    private String username;
+}

+ 5 - 0
platform-admin/src/main/java/com/platform/feign/ZhiHouseFeignApi.java

@@ -0,0 +1,5 @@
+package com.platform.feign;
+
+
+public class ZhiHouseFeignApi {
+}

+ 26 - 0
platform-admin/src/main/java/com/platform/service/SysOssService.java

@@ -0,0 +1,26 @@
+package com.platform.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.platform.entity.SysOssEntity;
+import com.platform.utils.PageUtilsPlus;
+
+import java.util.Map;
+
+/**
+ * 文件上传Service
+ *
+ * @author lipengjun
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ * @date 2017-03-25 12:13:26
+ */
+public interface SysOssService extends IService<SysOssEntity> {
+
+    /**
+     * queryPage
+     *
+     * @param params
+     * @return
+     */
+    PageUtilsPlus queryPage(Map<String, Object> params);
+}

+ 30 - 0
platform-admin/src/main/java/com/platform/service/impl/SysOssServiceImpl.java

@@ -0,0 +1,30 @@
+package com.platform.service.impl;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.platform.dao.SysOssDao;
+import com.platform.entity.SysOssEntity;
+import com.platform.service.SysOssService;
+import com.platform.utils.PageUtilsPlus;
+import com.platform.utils.QueryPlus;
+import org.springframework.stereotype.Service;
+
+import java.util.Map;
+
+/**
+ * @author 李鹏军
+ * @email 939961241@qq.com
+ * @gitee https://gitee.com/fuyang_lipengjun/platform
+ */
+@Service("sysOssService")
+public class SysOssServiceImpl extends ServiceImpl<SysOssDao, SysOssEntity> implements SysOssService {
+
+    @Override
+    public PageUtilsPlus queryPage(Map<String, Object> params) {
+        //排序
+        params.put("sidx", "t.create_date");
+        params.put("asc", false);
+        Page<SysOssEntity> page = new QueryPlus<SysOssEntity>(params).getPage();
+        return new PageUtilsPlus(page.setRecords(baseMapper.selectSysOssPage(page, params)));
+    }
+}

+ 7 - 0
platform-admin/src/main/resources/caffeine.properties

@@ -0,0 +1,7 @@
+#########################################
+# Caffeine configuration
+# [name] = size, xxxx[s|m|h|d]
+#########################################
+default=1000, 60m
+sysCache=1000, 60m
+shopCache= 1000, 60m

+ 16 - 0
platform-admin/src/main/resources/com/platform/dao/SysOssDao.xml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.platform.dao.SysOssDao">
+
+    <select id="selectSysOssPage" resultType="com.platform.entity.SysOssEntity">
+		select
+		t.id,
+		t.url,
+		t.create_date,
+		t.user_id,
+		t.username
+		from sys_oss t
+	</select>
+
+</mapper>

+ 68 - 0
platform-admin/src/main/resources/dev/log4j.properties

@@ -0,0 +1,68 @@
+log4j.rootLogger=INFO,stdout,info,warn,error,file
+#控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.Threshold=INFO
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO所有日志
+log4j.logger.file=info
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.File=../logs/info.log
+log4j.appender.file.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.file.append=true
+log4j.appender.file.Threshold=INFO
+log4j.appender.file.encoding=UTF-8
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO日志
+log4j.logger.info=info
+log4j.appender.info=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.info.File=../logs/info/info.log
+log4j.appender.info.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.info.append=true
+log4j.appender.info.Threshold=INFO
+log4j.appender.info.encoding=UTF-8
+log4j.appender.info.ImmediateFlush=true
+log4j.appender.info.layout=org.apache.log4j.PatternLayout
+log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#WARN日志
+log4j.appender.warn=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.warn.File=../logs/warn/warn.log
+log4j.appender.warn.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.warn.append=true
+log4j.appender.warn.Threshold=WARN
+log4j.appender.warn.encoding=UTF-8
+log4j.appender.warn.ImmediateFlush=true
+log4j.appender.warn.layout=org.apache.log4j.PatternLayout
+log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#ERROR日志
+log4j.appender.error=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.error.File=../logs/error/error.log
+log4j.appender.error.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.error.append=true
+log4j.appender.error.Threshold=ERROR
+log4j.appender.error.encoding=UTF-8
+log4j.appender.error.ImmediateFlush=true
+log4j.appender.error.layout=org.apache.log4j.PatternLayout
+log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#执行慢的SQL
+log4j.logger.com.alibaba.druid.filter.stat.StatFilter=ERROR,slowsql
+log4j.appender.slowsql=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.slowsql.File=../logs/slow_sql/slow_sql.log
+log4j.appender.slowsql.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.slowsql.append=true
+log4j.appender.slowsql.encoding=UTF-8
+log4j.appender.slowsql.ImmediateFlush=true
+log4j.appender.slowsql.layout=org.apache.log4j.PatternLayout
+log4j.appender.slowsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#控制台输出所有SQL
+#便于调试  生产环境注释
+log4j.logger.com.platform.dao=DEBUG,sql
+log4j.appender.sql=org.apache.log4j.ConsoleAppender
+log4j.appender.sql.Target=DEBUG
+log4j.appender.sql.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql.layout.ConversionPattern=%m %n
+
+

+ 117 - 0
platform-admin/src/main/resources/dev/platform.properties

@@ -0,0 +1,117 @@
+jdbc.url=jdbc:mysql://120.24.202.7:3306/4dage-zfb?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&characterSetResults=utf8&autoReconnect=true
+jdbc.username=root
+jdbc.password=zfb@20210727%
+
+jdbc.initialSize=5
+jdbc.maxActive=30
+jdbc.minPoolSize=2
+jdbc.maxIdleTime=30000
+jdbc.idleConnectionTestPeriod=100
+
+
+#小程序ID
+wx.appId=wxf1eb182777211ed7
+#小程序密钥
+wx.secret=d1c7e5894ddf44d0bcc2d0da476bcc01
+#商户号
+wx.mchId=1384865002
+#支付签名
+wx.paySignKey=hangzhoutianmenkejizfbvr82350800
+#交易类型
+wx.tradeType=JSAPI
+#证书名称,对应不同的商户号
+#wx.certName=/cert/apiclient_cert.p12
+wx.certName=/root/user/java/apache-tomcat-8.0.51-platform/apiclient_cert.p12
+#支付回调地址
+wx.notifyUrl=https://testshop.4dkankan.com/platform-framework/api/pay/notify
+#获取code的请求地址
+wx.getCode=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STAT#wechat_redirect
+#获取Web_access_tokenhttps的请求地址
+wx.webAccessTokenhttps = https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
+#拉取用户信息的请求地址
+wx.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
+#微信统一下单接口路径
+wx.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
+#退款地址
+wx.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
+#退款查询地址
+wx.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
+#微信查询订单状态
+wx.orderquery=https://api.mch.weixin.qq.com/pay/orderquery
+
+ali.webAccessTokenhttps=https://openapi.alipay.com/gateway.do
+ali.appId=
+ali.privateKey=
+ali.pubKey=
+
+#安全起见,暴露的短信接口需要配置有效的请求IP
+sms.validIp=127.0.0.1
+
+#演示环境  1:是  0:否
+sys.demo=0
+
+#微信公众号appId
+mp.appId=
+#微信公众号secret
+mp.secret=
+#令牌(Token)
+mp.token=
+#消息加解密密钥
+mp.aesKey=
+
+scenePath=https://zfb.4dkankan.com/
+sceneData=https://4dkk.4dage.com/
+showHtml=shop.html
+editHtml=editShopPC.html
+
+#H5 微信分享二维码url前缀
+
+h5.wx.mini.program.url.pre=pages/webview/index?id=
+
+
+oss.point=http://oss-cn-shenzhen.aliyuncs.com
+oss.key=LTAIUrvuHqj8pvry
+oss.secrey=JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+oss.bucket=4d-tjw
+oss.video.file.path=domain/shop/video/
+oss.image.file.path=domain/shop/image/
+oss.excel.file.path=domain/shop/excel/
+oss.query.url=https://houseoss.4dkankan.com/
+
+#video-file-path: D:/video-files/
+video-file-path: shop/video-files/
+#file-backup-path: shop/im-files/
+file-backup-path: D:/im-files/
+
+#商品信息来自哪个小程序
+origin=fashilong
+
+webpSheelPath=/opt/libwebp-0.4.3-linux-x86-64/bin/cwebp.sh
+filePath=D:/platform/
+
+
+api.host.query.url=https://testopen.4dkankan.com/api/shop/format?
+api.host.url=https://testopen.4dkankan.com
+api.id= 10305d97abc0b40f79b1607491893621
+api.secret=10405fbabccca8f8cc91607491893623
+
+#四维看看的登录域名
+4dkankan.host=https://test.4dkankan.com/
+4dkankan.api.vr.show.host=https://testopen.4dkankan.com/
+
+#直播间默认商品信息
+goods.cover.image=https://4dkk.4dage.com/shop/huafa/20200915/17145240908b6e.jpg
+goods.name=钻石世家 18K金钻石戒指
+goods.price=4290.00
+goods.buy.url=https://item.jd.com/32579640875.html
+goods.id=1181354
+
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+
+base.dept.id=91
+
+
+
+wx_miniprogram_state=trial
+wx_subscribe.template.id=klhtcMH_MixbhY2AqKjZ6sl7y51UkpWJ4Xj4P4Cn9U0

+ 67 - 0
platform-admin/src/main/resources/ehcache.xml

@@ -0,0 +1,67 @@
+<!-- for ehcache 2.x -->
+<ehcache updateCheck="false" dynamicConfig="false">
+
+    <diskStore path="java.io.tmpdir"/>
+
+    <cacheManagerEventListenerFactory class="" properties=""/>
+
+    <!--Default Cache configuration. These will applied to caches programmatically created through
+        the CacheManager.
+
+        The following attributes are required for defaultCache:
+
+        maxInMemory       - Sets the maximum number of objects that will be created in memory
+        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
+                            is never expired.
+        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
+                            if the element is not eternal. Idle time is now - last accessed time
+        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
+                            if the element is not eternal. TTL is now - creation time
+        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
+                            has reached the maxInMemory limit.
+
+        -->
+    <defaultCache
+            maxElementsInMemory="50000"
+            eternal="false"
+            timeToIdleSeconds="3600000"
+            timeToLiveSeconds="3600000"
+            overflowToDisk="true">
+    </defaultCache>
+
+    <!--Predefined caches.  Add your cache configuration settings here.
+        If you do not have a configuration for your cache a WARNING will be issued when the
+        CacheManager starts
+
+        The following attributes are required for defaultCache:
+
+        name              - Sets the name of the cache. This is used to identify the cache. It must be unique.
+        maxInMemory       - Sets the maximum number of objects that will be created in memory
+        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
+                            is never expired.
+        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
+                            if the element is not eternal. Idle time is now - last accessed time
+        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
+                            if the element is not eternal. TTL is now - creation time
+        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
+                            has reached the maxInMemory limit.
+
+        -->
+
+    <cache name="sysCache"
+           maxElementsInMemory="50000"
+           eternal="false"
+           timeToIdleSeconds="3600000"
+           timeToLiveSeconds="3600000"
+           overflowToDisk="false">
+    </cache>
+
+    <cache name="shopCache"
+           maxElementsInMemory="50000"
+           eternal="false"
+           timeToIdleSeconds="3600000"
+           timeToLiveSeconds="3600000"
+           overflowToDisk="false">
+    </cache>
+
+</ehcache>

+ 95 - 0
platform-admin/src/main/resources/j2cache.properties

@@ -0,0 +1,95 @@
+#J2Cache configuration
+#########################################
+# Cache Broadcast Method
+# values:
+# jgroups -> use jgroups's multicast
+# redis -> use redis publish/subscribe mechanism
+# none -> don't notify the other nodes in cluster
+# xx.xxxx.xxxx.Xxxxx your own cache broadcast policy classname that implement net.oschina.j2cache.ClusterPolicy
+#########################################
+j2cache.broadcast=redis
+#�鲥��ͨ������
+jgroups.channel.name=j2cache
+jgroups.configXml=/network.xml
+#########################################
+# Level 1&2 provider
+# values:
+# none -> disable this level cache
+# ehcache -> use ehcache2 as level 1 cache
+# ehcache3 -> use ehcache3 as level 1 cache
+# caffeine -> use caffeine as level 1 cache(only in memory)
+# redis -> use redis(hashs) as level 2 cache
+# readonly-redis -> use redis as level 2 cache ,but never write data to it. if use this provider, you must uncomment `j2cache.L2.config_section` to make the redis configurations available.
+# [classname] -> use custom provider
+#########################################
+j2cache.L1.provider_class=caffeine
+j2cache.L2.provider_class=redis
+# When L2 provider isn't `redis`, using `L2.config_section = redis` to read redis configurations
+# j2cache.L2.config_section = redis
+# Enable/Disable ttl in redis cache data (if disabled, the object in redis will never expire)
+j2cache.sync_ttl_to_redis=true
+# Whether to cache null objects by default
+j2cache.default_cache_null_object=true
+#########################################
+# Cache Serialization Provider
+# values:
+# fst -> fast-serialization
+# kyro -> kyro
+# java -> java standard
+# [classname implements Serializer]
+#########################################
+j2cache.serialization=fst
+#########################################
+# Ehcache configuration
+#########################################
+ehcache.configXml=/ehcache.xml
+#########################################
+# Caffeine configuration
+# caffeine.region.[name] = size, xxxx[s|m|h|d]
+#
+#########################################
+caffeine.properties=/caffeine.properties
+#########################################
+# Redis connection configuration
+#########################################
+#########################################
+# Redis Cluster Mode
+#
+# single -> single redis server
+# sentinel -> master-slaves servers
+# cluster -> cluster servers (���ݿ�������Ч��ʹ�� database = 0��
+# sharded -> sharded servers  (���롢���ݿ������ hosts ��ָ���������ӳ�������Ч ; redis://user:password@127.0.0.1:6379/0��
+#
+#########################################
+redis.mode=single
+#redis storage mode (generic|hash)
+redis.storage=generic
+## redis pub/sub channel name
+redis.channel=j2cache
+## redis pub/sub server (using redis.hosts when empty)
+redis.channel.host=
+#cluster name just for sharded
+redis.cluster_name=j2cache
+## redis cache namespace optional, default[j2cache]
+redis.namespace=
+## connection ��Ⱥ�������hosts��Ӣ�Ķ��Ÿ������� 127.0.0.1:6379,127.0.0.1:6378
+redis.hosts=120.25.146.52:6379
+redis.timeout=2000
+## ��Ⱥÿ���ڵ�������뱣��һ��
+redis.password=
+redis.database=0
+## redis pool properties
+redis.maxTotal=100
+redis.maxIdle=10
+redis.maxWaitMillis=5000
+redis.minEvictableIdleTimeMillis=60000
+redis.minIdle=1
+redis.numTestsPerEvictionRun=10
+redis.lifo=false
+redis.softMinEvictableIdleTimeMillis=10
+redis.testOnBorrow=true
+redis.testOnReturn=false
+redis.testWhileIdle=true
+redis.timeBetweenEvictionRunsMillis=300000
+redis.blockWhenExhausted=false
+redis.jmxEnabled=false

+ 14 - 0
platform-admin/src/main/resources/mybatis.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8" ?>
+<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
+        "http://mybatis.org/dtd/mybatis-3-config.dtd">
+<configuration>
+    <settings>
+        <setting name="mapUnderscoreToCamelCase" value="true"/>
+    </settings>
+    <plugins>
+        <plugin interceptor="com.github.miemiedev.mybatis.paginator.OffsetLimitInterceptor">
+            <property name="dialectClass" value="com.github.miemiedev.mybatis.paginator.dialect.MySQLDialect"/>
+        </plugin>
+    </plugins>
+</configuration><!-- 配置分页插件 -->
+

+ 43 - 0
platform-admin/src/main/resources/network.xml

@@ -0,0 +1,43 @@
+<config xmlns="urn:org:jgroups"
+        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+        xsi:schemaLocation="urn:org:jgroups http://www.jgroups.org/schema/jgroups.xsd">
+    <UDP
+            mcast_port="${jgroups.udp.mcast_port:45588}"
+            ip_ttl="4"
+            ucast_recv_buf_size="5M"
+            ucast_send_buf_size="5M"
+            mcast_recv_buf_size="5M"
+            mcast_send_buf_size="5M"
+            max_bundle_size="64K"
+            enable_diagnostics="false"
+
+            thread_pool.min_threads="2"
+            thread_pool.max_threads="8"
+            thread_pool.keep_alive_time="5000"/>
+
+    <PING/>
+    <MERGE3 max_interval="30000"
+            min_interval="10000"/>
+    <FD_SOCK/>
+    <FD_ALL/>
+    <VERIFY_SUSPECT timeout="1500"/>
+    <pbcast.NAKACK2 xmit_interval="500"
+                    xmit_table_num_rows="100"
+                    xmit_table_msgs_per_row="2000"
+                    xmit_table_max_compaction_time="30000"
+                    use_mcast_xmit="false"
+                    discard_delivered_msgs="true"/>
+    <UNICAST3 xmit_interval="500"
+              xmit_table_num_rows="100"
+              xmit_table_msgs_per_row="2000"
+              xmit_table_max_compaction_time="60000"
+              conn_expiry_timeout="0"/>
+    <pbcast.STABLE desired_avg_gossip="50000"
+                   max_bytes="4M"/>
+    <pbcast.GMS print_local_addr="true" join_timeout="2000"/>
+    <UFC max_credits="2M"
+         min_threshold="0.4"/>
+    <MFC max_credits="2M"
+         min_threshold="0.4"/>
+    <FRAG2 frag_size="60K"/>
+</config>

+ 66 - 0
platform-admin/src/main/resources/prod/log4j.properties

@@ -0,0 +1,66 @@
+log4j.rootLogger=INFO,stdout,info,warn,error,file
+#控制台输出
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.Target=System.out
+log4j.appender.stdout.Threshold=INFO
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO所有日志
+log4j.logger.file=info
+log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.file.File=/usr/local/platform/logs/info.log
+log4j.appender.file.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.file.append=true
+log4j.appender.file.Threshold=INFO
+log4j.appender.file.encoding=UTF-8
+log4j.appender.file.ImmediateFlush=true
+log4j.appender.file.layout=org.apache.log4j.PatternLayout
+log4j.appender.file.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#INFO日志
+log4j.logger.info=info
+log4j.appender.info=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.info.File=/usr/local/platform/logs/info/info.log
+log4j.appender.info.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.info.append=true
+log4j.appender.info.Threshold=INFO
+log4j.appender.info.encoding=UTF-8
+log4j.appender.info.ImmediateFlush=true
+log4j.appender.info.layout=org.apache.log4j.PatternLayout
+log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#WARN日志
+log4j.appender.warn=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.warn.File=/usr/local/platform/logs/warn/warn.log
+log4j.appender.warn.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.warn.append=true
+log4j.appender.warn.Threshold=WARN
+log4j.appender.warn.encoding=UTF-8
+log4j.appender.warn.ImmediateFlush=true
+log4j.appender.warn.layout=org.apache.log4j.PatternLayout
+log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#ERROR日志
+log4j.appender.error=com.platform.log4j.GradeLogDailyRollingFileAppender
+log4j.appender.error.File=/usr/local/platform/logs/error/error.log
+log4j.appender.error.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.error.append=true
+log4j.appender.error.Threshold=ERROR
+log4j.appender.error.encoding=UTF-8
+log4j.appender.error.ImmediateFlush=true
+log4j.appender.error.layout=org.apache.log4j.PatternLayout
+log4j.appender.error.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#执行慢的SQL
+log4j.logger.com.alibaba.druid.filter.stat.StatFilter=ERROR,slowsql
+log4j.appender.slowsql=org.apache.log4j.DailyRollingFileAppender
+log4j.appender.slowsql.File=/usr/local/platform/logs/slow_sql/slow_sql.log
+log4j.appender.slowsql.datePattern='.'yyyy-MM-dd'.log'
+log4j.appender.slowsql.append=true
+log4j.appender.slowsql.encoding=UTF-8
+log4j.appender.slowsql.ImmediateFlush=true
+log4j.appender.slowsql.layout=org.apache.log4j.PatternLayout
+log4j.appender.slowsql.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss SSS}|%5p|%F.%M:%L|%m%n
+#控制台输出所有SQL
+#便于调试  生产环境注释
+log4j.logger.com.platform.dao=DEBUG,sql
+log4j.appender.sql=org.apache.log4j.ConsoleAppender
+log4j.appender.sql.Target=DEBUG
+log4j.appender.sql.layout=org.apache.log4j.PatternLayout
+log4j.appender.sql.layout.ConversionPattern=%m %n

+ 114 - 0
platform-admin/src/main/resources/prod/platform.properties

@@ -0,0 +1,114 @@
+jdbc.url=jdbc:mysql://localhost:3306/4dage-zfb?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8&characterSetResults=utf8&autoReconnect=true
+jdbc.username=root
+jdbc.password=4dkankancuikuan%
+
+jdbc.initialSize=5
+jdbc.maxActive=30
+jdbc.minPoolSize=2
+jdbc.maxIdleTime=30000
+jdbc.idleConnectionTestPeriod=100
+
+#小程序ID
+wx.appId=wxf1eb182777211ed7
+#小程序密钥
+wx.secret=d1c7e5894ddf44d0bcc2d0da476bcc01
+#商户号
+wx.mchId=1384865002
+#支付签名
+wx.paySignKey=hangzhoutianmenkejizfbvr82350800
+#交易类型
+wx.tradeType=JSAPI
+#证书名称,对应不同的商户号
+wx.certName=/root/user/java/apache-tomcat-8.0.51-platform/apiclient_cert.p12
+#支付回调地址
+wx.notifyUrl=https://shop.4dkankan.com/platform-framework/api/pay/notify
+#获取code的请求地址
+wx.getCode=https://open.weixin.qq.com/connect/oauth2/authorize?appid=%s&redirect_uri=%s&response_type=code&scope=%s&state=STAT#wechat_redirect
+#获取Web_access_tokenhttps的请求地址
+wx.webAccessTokenhttps = https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code
+#拉取用户信息的请求地址
+wx.userMessage=https://api.weixin.qq.com/sns/userinfo?access_token=%s&openid=%s&lang=zh_CN
+#微信统一下单接口路径
+wx.uniformorder=https://api.mch.weixin.qq.com/pay/unifiedorder
+#退款地址
+wx.refundUrl=https://api.mch.weixin.qq.com/secapi/pay/refund
+#退款查询地址
+wx.refundqueryUrl=https://api.mch.weixin.qq.com/pay/refundquery
+#微信查询订单状态
+wx.orderquery=https://api.mch.weixin.qq.com/pay/orderquery
+
+ali.webAccessTokenhttps=https://openapi.alipay.com/gateway.do
+ali.appId=
+ali.privateKey=
+ali.pubKey=
+
+#安全起见,暴露的短信接口需要配置有效的请求IP
+sms.validIp=127.0.0.1
+
+#演示环境  1:是  0:否
+sys.demo=0
+
+#微信公众号appId
+mp.appId=
+#微信公众号secret
+mp.secret=
+#令牌(Token)
+mp.token=
+#消息加解密密钥
+mp.aesKey=
+
+scenePath=https://www.4dkankan.com/
+sceneData=https://4dkk.4dage.com/
+showHtml=shop.html
+editHtml=editShopPC.html
+
+#H5 微信分享二维码url前缀
+
+h5.wx.mini.program.url.pre=pages/webview/index?id=
+
+
+oss.point=http://oss-cn-shenzhen-internal.aliyuncs.com
+oss.key=LTAIUrvuHqj8pvry
+oss.secrey=JLOVl0k8Ke0aaM8nLMMiUAZ3EiiqI4
+oss.bucket=4d-tjw
+oss.video.file.path=domain/shop/video/
+oss.image.file.path=domain/shop/image/
+oss.excel.file.path=domain/shop/excel/
+oss.query.url=https://houseoss.4dkankan.com/
+
+video-file-path: shop/video-files/
+file-backup-path: shop/im-files/
+
+#商品信息来自哪个小程序
+origin=fashilong
+
+webpSheelPath=/opt/libwebp-0.4.3-linux-x86-64/bin/cwebp.sh
+filePath=/platform/
+
+api.host.query.url=https://open.4dkankan.com/api/shop/format?
+api.host.url=https://open.4dkankan.com
+api.id= 10305d97abc0b40f79b1607491893621
+api.secret=10405fbabccca8f8cc91607491893623
+
+
+#四维看看的登录域名
+4dkankan.host=https://www.4dkankan.com/
+4dkankan.api.vr.show.host=https://open.4dkankan.com/
+
+#直播间默认商品信息
+goods.cover.image=https://4dkk.4dage.com/shop/huafa/20200915/17145240908b6e.jpg
+goods.name=钻石世家 18K金钻石戒指
+goods.price=4290.00
+goods.buy.url=https://item.jd.com/32579640875.html
+goods.id=1181354
+
+
+spring.redis.host=127.0.0.1
+spring.redis.port=6379
+
+
+base.dept.id=91
+
+
+wx_miniprogram_state=formal
+wx_subscribe.template.id=klhtcMH_MixbhY2AqKjZ6sl7y51UkpWJ4Xj4P4Cn9U0

+ 158 - 0
platform-admin/src/main/resources/spring-jdbc.xml

@@ -0,0 +1,158 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop"
+       xsi:schemaLocation="
+        http://www.springframework.org/schema/beans
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
+        http://www.springframework.org/schema/context
+        http://www.springframework.org/schema/context/spring-context-4.2.xsd
+        http://www.springframework.org/schema/tx
+     	http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
+		http://www.springframework.org/schema/aop
+		http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
+
+    <tx:annotation-driven/>
+    <!-- Import Properties -->
+    <context:property-placeholder location="classpath*:platform.properties"/>
+
+    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
+          init-method="init" destroy-method="close">
+        <property name="url">
+            <value>${jdbc.url}</value>
+        </property>
+        <property name="username">
+            <value>${jdbc.username}</value>
+        </property>
+        <property name="password">
+            <value>${jdbc.password}</value>
+        </property>
+        <property name="initialSize">
+            <value>${jdbc.initialSize}</value>
+        </property>
+        <property name="maxActive">
+            <value>${jdbc.maxActive}</value>
+        </property>
+        <property name="proxyFilters">
+            <list>
+                <ref bean="stat-filter"/>
+                <!--过滤永真条件 防止注入-->
+                <ref bean="wall-filter"/>
+            </list>
+        </property>
+        <property name="connectionInitSqls" value="set names utf8mb4;"/>
+    </bean>
+
+    <bean id="stat-filter" class="com.alibaba.druid.filter.stat.StatFilter">
+        <property name="slowSqlMillis" value="1000"/>
+        <property name="logSlowSql" value="true"/>
+        <property name="mergeSql" value="true"/>
+    </bean>
+
+    <bean id="wall-filter" class="com.alibaba.druid.wall.WallFilter">
+        <property name="dbType" value="mysql"/>
+        <property name="config" ref="wall-filter-config"/>
+    </bean>
+
+    <bean id="wall-filter-config" class="com.alibaba.druid.wall.WallConfig">
+        <property name="multiStatementAllow" value="true"/>
+    </bean>
+
+    <bean id="druid-stat-interceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor"></bean>
+    <bean id="druid-stat-pointcut" class="org.springframework.aop.support.JdkRegexpMethodPointcut" scope="prototype">
+        <property name="patterns">
+            <list>
+                <value>com.platform.controller.*</value>
+                <value>com.platform.service.*</value>
+            </list>
+        </property>
+    </bean>
+    <aop:config>
+        <aop:advisor advice-ref="druid-stat-interceptor" pointcut-ref="druid-stat-pointcut"/>
+    </aop:config>
+
+    <!-- 配置事务管理器 -->
+    <bean id="transactionManager"
+          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
+        <property name="dataSource" ref="dataSource"></property>
+    </bean>
+
+    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
+        <property name="dataSource">
+            <ref bean="dataSource"/>
+        </property>
+    </bean>
+
+    <!-- JDBC配置 -->
+    <bean id="namedParameterJdbcTemplate"
+          class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
+        <constructor-arg ref="dataSource"/>
+    </bean>
+
+    <!-- SqlSessionFactory MyBatisPlus Config -->
+    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
+        <property name="typeAliasesPackage" value="com.platform.entity"/>
+        <property name="dataSource" ref="dataSource"/>
+        <property name="globalConfig">
+            <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig">
+                <property name="dbConfig">
+                    <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig.DbConfig">
+                        <!-- 表关键词 key 生成器 -->
+                        <property name="keyGenerator">
+                            <bean class="com.baomidou.mybatisplus.extension.incrementer.OracleKeyGenerator"/>
+                        </property>
+                        <!-- 主键类型  0:"数据库ID自增", 1:"用户输入ID",2:"全局唯一ID (数字类型唯一ID)", 3:"全局唯一ID UUID"; -->
+                        <property name="idType" value="AUTO"/>
+                        <!-- 字段策略 0:"忽略判断",1:"非 NULL 判断"),2:"非空判断" -->
+                        <property name="fieldStrategy" value="NOT_EMPTY"/>
+                        <!-- 逻辑删除配置 -->
+                        <property name="logicDeleteValue" value="0"/>
+                        <property name="logicNotDeleteValue" value="1"/>
+                        <!-- 数据库类型,默认值为未知的数据库类型 如果值为OTHER,启动时会根据数据库连接 url 获取数据库类型;如果不是OTHER则不会自动获取数据库类型 -->
+                        <property name="dbType" value="OTHER"/>
+                    </bean>
+                </property>
+                <property name="sqlInjector">
+                    <!-- 注入逻辑删除 -->
+                    <bean class="com.baomidou.mybatisplus.extension.injector.LogicSqlInjector"/>
+                </property>
+            </bean>
+        </property>
+        <property name="configuration">
+            <bean class="com.baomidou.mybatisplus.core.MybatisConfiguration">
+                <!-- 是否开启自动驼峰命名规则(camel case)映射,即从A_COLUMN(下划线命名) 到Java 属性名 aColumn(驼峰命名) 的类似映射。 -->
+                <property name="mapUnderscoreToCamelCase" value="true"/>
+                <!-- 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true。 -->
+                <property name="cacheEnabled" value="false"/>
+                <!--指定当结果集中值为 null 的时候是否调用映射对象的 Setter(Map 对象时为 put)方法,通常运用于有 Map.keySet() 依赖或 null 值初始化的情况。
+                    通俗的讲,即 MyBatis 在使用 resultMap 来映射查询结果中的列,如果查询结果中包含空值的列,则 MyBatis 在映射的时候,不会映射这个字段,这就
+                    导致在调用到该字段的时候由于没有映射,取不到而报空指针异常。-->
+                <property name="callSettersOnNulls" value="false"/>
+                <!-- 配置JdbcTypeForNull, oracle数据库必须配置 -->
+                <property name="jdbcTypeForNull" value="NULL"/>
+            </bean>
+        </property>
+        <property name="plugins">
+            <array>
+                <!-- 性能分析拦截器 -->
+                <bean class="com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor">
+                    <property name="format" value="true"></property>
+                    <property name="maxTime" value="100"></property>
+                    <!-- 是否写入日志文件(true 写入日志文件,不阻断程序执行!超过设定的最大执行时长异常提示) -->
+                    <property name="writeInLog" value="true"></property>
+                </bean>
+                <!-- 分页拦截器 -->
+                <bean class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor"/>
+                <!-- 乐观锁 -->
+                <bean class="com.baomidou.mybatisplus.extension.plugins.OptimisticLockerInterceptor"/>
+                <bean class="com.platform.interceptor.EscapeInterceptor"/>
+            </array>
+        </property>
+    </bean>
+
+    <!-- MyBatis Mapper Scan Config  -->
+    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
+        <property name="basePackage" value="com.platform.dao,com.platform.dao.custom,com.platform.*.dao"/>
+    </bean>
+</beans>

+ 123 - 0
platform-admin/src/main/resources/spring-mvc.xml

@@ -0,0 +1,123 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<beans xmlns="http://www.springframework.org/schema/beans"
+       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+       xmlns:context="http://www.springframework.org/schema/context"
+       xmlns:aop="http://www.springframework.org/schema/aop"
+       xmlns:mvc="http://www.springframework.org/schema/mvc"
+       xsi:schemaLocation="
+        http://www.springframework.org/schema/beans 
+        http://www.springframework.org/schema/beans/spring-beans-4.2.xsd        
+        http://www.springframework.org/schema/context 
+        http://www.springframework.org/schema/context/spring-context-4.2.xsd
+     	http://www.springframework.org/schema/aop 
+     	http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
+		http://www.springframework.org/schema/mvc 
+     	http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd">
+
+    <context:component-scan base-package="com.platform"/>
+    <context:annotation-config/>
+    <mvc:default-servlet-handler/>
+    <aop:aspectj-autoproxy proxy-target-class="true"/>
+    <mvc:annotation-driven>
+        <mvc:message-converters register-defaults="true">
+            <bean class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter">
+                <property name="supportedMediaTypes">
+                    <list>
+                        <value>text/html;charset=UTF-8</value>
+                        <value>application/json;charset=UTF-8</value>
+                    </list>
+                </property>
+                <property name="features">
+                    <list>
+                        <value>WriteMapNullValue</value>
+                        <value>QuoteFieldNames</value>
+                        <value>WriteDateUseDateFormat</value>
+                        <!-- 禁用fastjson循环引用检测 -->
+                        <value>DisableCircularReferenceDetect</value>
+                    </list>
+                </property>
+            </bean>
+        </mvc:message-converters>
+    </mvc:annotation-driven>
+
+    <!-- 为了加载拦截器 需要 日志拦截器 (登录拦截和权限拦截已在shiro实现,看实现 情况处理) -->
+    <mvc:interceptors>
+        <!-- 使用bean定义一个Interceptor,直接定义在mvc:interceptors根下面的Interceptor将拦截所有的请求 -->
+        <!--<bean class="com.platform.interceptor.LogInterceptor"/>-->
+        <mvc:interceptor>
+            <mvc:mapping path="/**"/>
+            <mvc:exclude-mapping path="/statics/**"/>
+            <mvc:exclude-mapping path="/**/**.html"/>
+            <mvc:exclude-mapping path="/**/**.js"/>
+            <bean class="com.platform.interceptor.LogInterceptor"/>
+        </mvc:interceptor>
+    </mvc:interceptors>
+
+    <!-- Velocity视图解析器    默认视图  -->
+    <bean id="velocityViewResolver" class="org.springframework.web.servlet.view.velocity.VelocityViewResolver">
+        <property name="contentType" value="text/html;charset=UTF-8"/>
+        <property name="viewNames" value="*.html"/>
+        <property name="suffix" value=""/>
+        <property name="dateToolAttribute" value="date"/>
+        <property name="numberToolAttribute" value="number"/>
+        <property name="toolboxConfigLocation" value="/WEB-INF/velocity-toolbox.xml"/>
+        <!--是否使用spring对宏定义的支持-->
+        <property name="exposeRequestAttributes" value="true"/>
+        <property name="requestContextAttribute" value="rc"/>
+        <property name="order" value="0"/>
+    </bean>
+
+    <bean id="velocityConfigurer" class="org.springframework.web.servlet.view.velocity.VelocityConfigurer">
+        <property name="resourceLoaderPath" value="/WEB-INF/page/"/>
+        <property name="velocityProperties">
+            <props>
+                <prop key="input.encoding">UTF-8</prop>
+                <prop key="output.encoding">UTF-8</prop>
+                <prop key="contentType">text/html;charset=UTF-8</prop>
+            </props>
+        </property>
+    </bean>
+
+    <!-- JSP视图解析器  -->
+    <bean id="viewResolverJsp" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
+        <property name="prefix" value="/WEB-INF/page/"/>
+        <property name="suffix" value=".jsp"/>
+    </bean>
+
+    <!-- FreeMarker视图解析器 -->
+    <bean id="viewResolver" class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
+        <property name="viewClass" value="org.springframework.web.servlet.view.freemarker.FreeMarkerView"/>
+        <property name="contentType" value="text/html; charset=utf-8"/>
+        <property name="cache" value="false"/>
+        <property name="viewNames" value="*.ftl"/>
+        <property name="suffix" value=""/>
+        <property name="order" value="2"/>
+    </bean>
+
+    <bean class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
+        <property name="templateLoaderPath" value="/WEB-INF/page/"/>
+    </bean>
+
+    <bean id="multipartResolver"
+          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
+        <property name="maxUploadSize" value="1000000000"/>
+    </bean>
+
+    <!-- Kaptcha验证码生成器 -->
+    <bean name="producer" class="com.google.code.kaptcha.impl.DefaultKaptcha" scope="singleton">
+        <property name="config">
+            <bean class="com.google.code.kaptcha.util.Config">
+                <constructor-arg>
+                    <props>
+                        <prop key="kaptcha.border">no</prop>
+                        <prop key="kaptcha.textproducer.font.color">black</prop>
+                        <prop key="kaptcha.textproducer.char.space">4</prop>
+                        <prop key="kaptcha.textproducer.char.length">4</prop>
+                        <prop key="kaptcha.textproducer.char.string">123456789</prop>
+                    </props>
+                </constructor-arg>
+            </bean>
+        </property>
+    </bean>
+
+</beans>

+ 9 - 0
platform-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>

+ 184 - 0
platform-admin/src/main/webapp/WEB-INF/page/brand.html

@@ -0,0 +1,184 @@
+<!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="8" >
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="VR场景名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <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-option value="4">其他</i-option>
+                        </i-select>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            
+            </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="120">
+            <div style="width: 100%;">
+                <Form-item label="VR场景名称" prop="name">
+                    <div class="c-winput">
+                        <i-input v-model="brand.name" placeholder="VR场景名称"/>
+                    </div>
+                </Form-item>
+                <Form-item label="VR场景封面" prop="listPicUrl">
+                    <div class="c-winput">
+                        <i-input v-model="brand.listPicUrl" placeholder="图片" readonly/>
+                    </div>
+                    <div class="c-btn">
+                        <Upload 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>
+                    </div>
+                    <div class="c-btn">
+                        <div class="c-winput">
+                         <i-button icon="eye" @click="eyeImageListPicUrl">预览图片</i-button>
+                        </div>
+                    </div>
+                </Form-item>
+                   
+                <Form-item label="描述" prop="simpleDesc">
+                    <div class="c-winput">
+                        <i-input type="textarea" v-model="brand.simpleDesc" placeholder="描述"/>
+                    </div>
+                </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="3">
+                        <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="3">
+                        <Form-item :label-width="1">
+                            <i-button icon="eye" @click="eyeImagePicUrl">预览图片</i-button>
+                        </Form-item>
+                    </i-col>
+                </Row> -->
+                <Form-item label="排序" prop="sortOrder">
+                    <div class="c-winput">
+                        <Input-number :min="0" :step="1" v-model="brand.sortOrder" placeholder="排序" style="width: 188px;"/>
+                    </div>
+                </Form-item>
+                <Form-item label="显示" prop="isShow">
+                    <div class="c-winput">
+                        <Radio-group v-model="brand.isShow">
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                        </Radio-group>
+                    </div>
+                </Form-item>
+    
+                <Form-item label="VR场景类型" prop="type" style="width: 288px;">
+                    <div class="c-winput">
+                        <i-select v-model="brand.type">
+                            <i-option v-for="typeitem in typeList" :value="typeitem.id"
+                                    :key="typeitem.id">{{typeitem.name}}
+                            </i-option>
+                        </i-select>
+                    </div>
+
+                </Form-item>
+    
+                <Form-item label="VR场景链接" prop="sceneUrl">
+                    <div class="c-winput">
+                        <i-button type="primary" @click="addSceneLink">编辑场景链接</i-button>
+                        <div>场景链接:{{brand.sceneUrl||'-'}}</div>
+                        <div>场景名称:{{brand.sceneName||'-'}}</div>
+                    </div>
+                    <!-- <div class="c-winput">
+                        <i-input v-model="brand.sceneUrl" placeholder="VR场景场景链接"/>
+                    </div> -->
+                </Form-item>
+                
+                <!-- <Form-item label="分享图" prop="newPicUrl">
+                    <div class="c-winput">
+                        <i-input v-model="brand.newPicUrl" placeholder="分享图(宽高比:(5:4))" readonly/>
+                    </div>
+                    <div class="c-btn">
+                        <Upload 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>
+                    </div>
+                    <div class="c-btn">
+                        <i-button icon="eye" @click="eyeImageNewPicUrl">预览图片</i-button>
+                    </div>
+
+                </Form-item> -->
+                <!-- <Form-item label="新VR场景排序" prop="newSortOrder">
+                    <Input-number :min="0" :step="1" v-model="brand.newSortOrder" placeholder="新VR场景排序"
+                                  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>
+            </div>
+        </i-form>
+    </Card>
+
+    <div id="loginLayer" style="display: none;height: 100%;">
+        <iframe id="loginfdkk" src="https://www.4dkankan.com/mall_login/login.html" style="height: 100%;width:100%" frameborder="0"></iframe>
+    </div>
+</div>
+
+<script src="${rc.contextPath}/js/shop/brand.js?_${date.systemTime}"></script>
+</body>
+</html>

File diff suppressed because it is too large
+ 3 - 0
platform-admin/src/main/webapp/WEB-INF/page/join/axios.js


+ 79 - 0
platform-admin/src/main/webapp/WEB-INF/page/join/index.html

@@ -0,0 +1,79 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>商品关联</title>
+  <style>
+    #list {
+      margin-top: 20px;
+      display: grid;
+      grid-template-columns: repeat(auto-fill, 400px);;
+      grid-row-gap: 20px;
+      grid-column-gap: 20px;
+    }
+
+    #list > div {
+      width: 400px;
+      height: 200px;
+      padding-left: 220px;
+      box-sizing: border-box;
+      position: relative;
+      border: 1px solid #000;
+    }
+
+    #list > div > img {
+      position: absolute;
+      max-height: 100%;
+      left: 0;
+      max-width: 200px;
+      top: 50%;
+      transform: translateY(-50%);
+    }
+  </style>
+</head>
+<body>
+  
+  <div>
+    <input type="text" id="text" placeholder="搜索商品">
+    <button id="search">搜索</button>
+  </div>
+
+  <div id="list">
+
+  </div>
+
+  <script src="./axios.js"></script>
+  <script>
+    let $text = document.querySelector('#text')
+    let $search = document.querySelector('#search')
+    let $data = document.querySelector('#list')
+    
+    $search.addEventListener('click', function(ev) {
+      var params = new URLSearchParams();
+      params.append('sort', 'id')
+      params.append('keyword', $text.value)
+      params.append('order', 'desc')
+
+      axios({
+        url: 'https://shop.4dkankan.com/platform-framework/api/goods/list',
+        method: 'POST',
+        data: params
+      }).then(function(data) {
+        let goodsList = data.data.data.goodsList
+        $data.innerHTML = goodsList.map(function(item) { 
+          return ' \
+          <div> \
+            <img src="'+item.list_pic_url+'">\
+            <div>\
+              <p><label>标题:</label>'+item.name+'</p>\
+              <p><label>id:</label>'+item.id+'</p>\
+              <p><label>价格:</label>'+item.market_price+'</p>\
+            </div>\
+          </div>'
+        }).join('')
+      })
+    })
+  </script>
+</body>
+</html>

+ 114 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/ad.html

@@ -0,0 +1,114 @@
+<!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="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="mediaType">
+                <Radio-group v-model="ad.mediaType">
+                    <Radio label="0">
+                        <span>0</span>
+                    </Radio>
+                    <Radio label="1">
+                        <span>1</span>
+                    </Radio>
+                    <Radio label="2">
+                        <span>2</span>
+                    </Radio>
+                    <Radio label="3">
+                        <span>3</span>
+                    </Radio>
+                </Radio-group>
+            </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>
+                <i-col span="16">
+                    <Form-item label="图片" prop="imageUrl">
+                        <i-input v-model="ad.imageUrl" placeholder="图片" readonly/>
+                    </Form-item>
+                </i-col>
+                <i-col span="3">
+                    <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="3">
+                    <Form-item :label-width="1">
+                        <i-button icon="eye" @click="eyeImage">预览图片</i-button>
+                    </Form-item>
+                </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="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
platform-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>

+ 57 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/adminuser.html

@@ -0,0 +1,57 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>管理员列表</title>
+    #parse("sys/header.html")
+    <style>
+        .ui-jqgrid tr.jqgrow td {
+            white-space: normal !important;
+            height:auto;
+            vertical-align:text-top;
+            padding-top:2px;
+        }
+    </style>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.nickname" @on-enter="query" placeholder="请输入微信名称或用户名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </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>
+
+    <div style="margin-top: 30px; text-align: center;">
+        <i-button type="primary" @click="submit">提交</i-button>
+        <i-button @click="close" style="margin-left: 8px">返回</i-button>
+    </div>
+
+</div>
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+<script src="${rc.contextPath}/js/shop/adminuser.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 60 - 0
platform-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>

+ 69 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/attribute.html

@@ -0,0 +1,69 @@
+<!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="name">
+                <i-input v-model="attribute.name" placeholder="名称"/>
+            </Form-item>
+            <Form-item label="所属种类" prop="attributeCategoryId" style="width: 268px;">
+                <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
platform-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>

+ 290 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/brand.html

@@ -0,0 +1,290 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title></title>
+    #parse("sys/header.html")
+    <link rel="stylesheet" href="${rc.contextPath}/css/map.css">
+</head>
+
+<body>
+    <div id="rrapp" v-cloak>
+        <div v-show="showList">
+            <Row :gutter="16">
+                <div class="search-group">
+                    <i-col span="12">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.name" @on-enter="query" placeholder="直播间名称" />
+                        </div>
+                        <div style="display: inline-block;width: 100px;">
+                            <i-select v-model="q.type">
+                                <i-option value=" ">全部</i-option>
+                                <i-option :value="item.brandType" v-for="(item,i) in typeList" :key="item.id">{{item.name}}</i-option>
+                            </i-select>
+                        </div>
+                         <div style="display: inline-block;width: 100px;">
+                             <i-select v-model="q.livestreamStatus" placeholder="是否开播">
+                                 <i-option value="">全部</i-option>
+                                 <i-option value="1">是</i-option>
+                                 <i-option value="0">否</i-option>
+                               
+                             </i-select>
+                         </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+                    </i-col>
+
+                </div>
+                <div class="buttons-group">
+                    <i-button
+                        v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)"
+                        type="info"
+                        @click="open">绑定主播</i-button>
+                    #if($shiro.hasPermission("brand:save"))
+                    <i-button
+                        v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)"
+                        type="info"
+                        @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                    #end #if($shiro.hasPermission("brand:update"))
+                    <i-button
+                        v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)"
+                        type="warning"
+                        @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                    #end #if($shiro.hasPermission("brand:delete"))
+                    <i-button
+                        v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] ==6)"
+                        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>
+        <Spin fix v-if="loading">
+            <Icon type="load-c" size=18 class="demo-spin-icon-load"></Icon>
+            <div>上传中</div>
+        </Spin>
+        <Card v-show="!showList">
+            <p slot="title">{{title}}</p>
+            <i-form ref="formValidate" :model="brand" :rules="ruleValidate" :label-width="120">
+                <div style="width: 100%;">
+                    <Form-item label="直播间类型" prop="type" style="width: 288px;">
+                        <div class="c-winput">
+                            <i-select v-model="brand.type">
+                                <i-option v-for="typeitem in typeList" :value="typeitem.brandType" :key="typeitem.brandType">{{typeitem.name}}
+                                </i-option>
+                            </i-select>
+                        </div>
+
+                    </Form-item>
+                    <Form-item label="直播间名称" prop="name">
+                        <div class="c-winput">
+                            <i-input :maxlength="50" v-model="brand.name" placeholder="直播间名称" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="直播间封面" prop="appListPicUrl">
+                        <div class="demo-upload-list">
+                            <template v-if="brand.appListPicUrl">
+                            <img style="width: 167px;" :src="brand.appListPicUrl">
+                            <div class="demo-upload-list-cover" >
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImage(brand.appListPicUrl)"></i>
+                                <i class="ivu-icon ivu-icon-trash-a" @click="brand.appListPicUrl=''"></i>
+                            </div>
+                        </template>
+                        </div>
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png','gif']" :max-size="1024*5" :on-success="handleSuccessListPicUrl" :on-format-error="handleFormatError" :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                        </div>
+                        <p>1、支持png、jpg和gif图片格式;</p>
+                        <p>2、最大可上传5M的图片。</p>
+                        <p>3、推荐大小:400 * 400 像素</p>
+                        <div>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="场景链接" prop="sceneNum">
+                        <div class="c-winput" style="width:calc(60% + 20px)">
+                            <i-select v-if="!selectDisabled" filterable v-model="brand.sceneNum" style="width:calc(100% - 20px)" :on-change="_currUrl(brand.sceneNum)">
+                                <i-option v-for="(item,i) in myScene" :key="i" :label="item.name" :value="item.sceneNum">{{item.name}}
+                                </i-option>
+                            </i-select>
+                            <div v-else class="c-winput">
+                                <i-input v-model="brand.sceneUrl" disabled placeholder="场景链接" />
+                            </div>
+                            <Tooltip placement="right" style="margin-right: 4px;">
+                                <div slot="content">
+                                    <p>场景链接数据,来源于指房宝APP-编辑后台</p>
+                                </div>
+                                <i class="ivu-icon ivu-icon-help-circled"></i>
+                            </Tooltip>
+                            <!-- <div>场景链接:{{brand.sceneNum?((window.location.href.indexOf('test')>1?'https://test.4dkankan.com/shop.html?m=':'https://www.4dkankan.com/shop.html?m=')+brand.sceneNum+'&origin='+(window.location.href.indexOf('fashilong')>1?'fashilong':'4Dplaza')):'-'}}</div> -->
+                            <!-- <div v-if="brand.sceneNum">场景链接:{{brand.sceneNum?currUrl:''}}</div> -->
+                            <!-- <div style="color:red;">注意:场景绑定后,将无法进行修改。{{currUrl}}</div> -->
+                            <div style="color:red;">注意:场景绑定后,将无法进行修改。</div>
+                        </div>
+                    </Form-item>
+
+                    <!-- <Form-item label="所属售价" prop="retailPrice">
+                    <div class="c-winput">
+                        <i-input v-model="brand.retailPrice" placeholder="请输入售价"/>
+                    </div>
+                    <span style="color:#aaa;margin-left: 10px;">万元</span>
+                </Form-item>
+
+                <Form-item label="所属均价" prop="averagePrice">
+                    <div class="c-winput">
+                        <i-input v-model="brand.averagePrice" placeholder="请输入均价"/>
+                    </div>
+                    <span style="color:#aaa;margin-left: 10px;">元/m²</span>
+                </Form-item> -->
+
+                    <Form-item label="直播间描述" prop="simpleDesc">
+                        <div class="c-winput">
+                            <i-input :maxlength="50" :show-word-limit="true" type="textarea" v-model="brand.simpleDesc" placeholder="直播间描述" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="直播间位置" prop="livestreamStatus">
+                        <v-select ref="vselect" v-if="!showList" :areapath="brand.address" :longitude="brand.longitude" :latitude="brand.latitude"></v-select>
+                    </Form-item>
+
+                    <Form-item label="直播间图片" prop="picList">
+                        <div style="display: flex;flex-wrap: wrap;">
+                            <div class="demo-upload-list" style="margin-right:10px;" :key="i" v-for="(item,i) in brand.picList">
+                                <template v-if="item.status == 'finished'">
+                                <img style="width:280px;" :src="item.url">
+                                <div class="demo-upload-list-cover" >
+                                    <i class="ivu-icon ivu-icon-eye" @click="eyeImage(item.name)"></i>
+                                    <i class="ivu-icon ivu-icon-trash-a" @click="handleRemove(item)"></i>
+                                </div>
+                            </template>
+                                <template v-else>
+                                <Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
+                            </template>
+                            </div>
+                        </div>
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png','gif']" :max-size="1024*5" :ref="'upload'" :default-file-list="defaultList" :on-success="handleSuccessBrandPicUrl" :on-format-error="handleFormatError" :show-upload-list="false" :before-upload="handleBeforeUpload"
+                                multiple :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                        </div>
+                        <p>1、支持png、jpg和gif图片格式,最多可上传15张图。</p>
+                        <p>2、最大可上传5M的图片。</p>
+                        <p>3、推荐大小:450 * 400 像素。</p>
+                        <div>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="视频">
+                        <div style="width: 50%;min-height: 400px;" v-show="brand.introduceVideo">
+                            <video controls style="width: 100%;" :src="brand.introduceVideo"></video>
+                        </div>
+                        <div class="c-btn" style="display: flex;">
+                            <Upload action="../sys/oss/upLoadVideo" :format="['mpeg','avi','wmv','mov','3gp','mp4']" :max-size="1024*100" :before-upload="handleBefore" :on-success="handleSuccessVideoUrl" :on-format-error="handleFormatError" :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传视频</i-button>
+                            </Upload>
+                            <i-button type="error" style="margin-left: 10px;" @click="brand.introduceVideo=''"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                        </div>
+                        <div>
+                            <p>1、支持mpeg、avi、wmv、mov、3gp和mp4视频格式;</p>
+                            <p>2、最大可上传100M的视频。</p>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="视频封面">
+                        <div class="demo-upload-list">
+                            <template v-if="brand.introduceVideoCover">
+                            <img style="width: 232px;" :src="brand.introduceVideoCover">
+                            <div class="demo-upload-list-cover" >
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImage(brand.introduceVideoCover)"></i>
+                                <i class="ivu-icon ivu-icon-trash-a" @click="brand.introduceVideoCover=''"></i>
+                            </div>
+                        </template>
+                        </div>
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png']" :max-size="1024*5" :on-success="handleSuccessVideoPicUrl" :on-format-error="handleFormatError" :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                        </div>
+                        <p>1、支持png、jpg和gif图片格式;</p>
+                        <p>2、最大可上传5M的图片。</p>
+                        <p>3、推荐大小:400 * 300 像素</p>
+                        <div>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="排序" prop="sortOrder">
+                        <div class="c-winput">
+                            <Input-number :min="0" :step="1" v-model="brand.sortOrder" placeholder="排序" style="width: 188px;" />
+                        </div>
+                    </Form-item>
+                    <Form-item label="开播" prop="livestreamStatus">
+                        <div class="c-winput">
+                            <Radio-group v-model="brand.livestreamStatus">
+                                <!-- <Radio :disabled="!(userInfo.roleIdList&&(userInfo.roleIdList[0]==5))" label="1">
+                                <span>是</span>
+                            </Radio>
+                            <Radio :disabled="!(userInfo.roleIdList&&(userInfo.roleIdList[0]==5))" label="0">
+                                <span>否</span>
+                            </Radio> -->
+                                <Radio label="1">
+                                    <span>是</span>
+                                </Radio>
+                                <Radio label="0">
+                                    <span>否</span>
+                                </Radio>
+                            </Radio-group>
+                            <!-- <Tooltip placement="right" v-if="!(userInfo.roleIdList&&(userInfo.roleIdList[0]==5))">
+                            <div slot="content">
+                                <p>注:暂不开放支持显示,可使用直播间链接进行访问</p>
+                            </div>
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                        </Tooltip> -->
+                        </div>
+                    </Form-item>
+
+                    <div style="font-size: 16px;font-weight: bold;margin-bottom: 10px;">店铺联系方式</div>
+
+                    <Form-item label="联系电话" prop="contractPhone">
+                        <div class="c-winput" style="width:calc(60% + 20px)">
+                            <i-input v-model="brand.contractPhone" placeholder="直播间联系电话" />
+                        </div>
+                        <div>支持填写400(400-xxx-xxxx)热线、手机号等联系方式</div>
+                    </Form-item>
+
+                    <!-- <Form-item label="数据分析员:">
+                        <div class="c-winput">
+                            <div v-if="brand.adminName">{{brand.adminName}}</div>
+                            <i-button @click="openAdmin">选择数据分析员</i-button>
+                        </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>
+                </div>
+            </i-form>
+        </Card>
+
+        <div id="loginLayer" style="display: none;height: 100%;">
+            <iframe id="loginfdkk" src="https://www.4dkankan.com/mall_login/login.html" style="height: 100%;width:100%" frameborder="0"></iframe>
+        </div>
+    </div>
+    <script src="https://webapi.amap.com/maps?v=1.4.10&key=e661b00bdf2c44cccf71ef6070ef41b8"></script>
+    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.6&key=e661b00bdf2c44cccf71ef6070ef41b8&plugin=AMap.Geocoder"></script>
+    <script type="text/javascript" src="https://webapi.amap.com/ui/1.0/main.js?v=1.0.11"></script>
+
+
+    <script src="${rc.contextPath}/js/shop/brand.js?_${date.systemTime}"></script>
+</body>
+
+</html>

+ 236 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/broadcast.html

@@ -0,0 +1,236 @@
+<!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="8" >
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("liveRoom:add"))
+                <i-button type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                <!-- <Icon type="share"></Icon> -->
+                #if($shiro.hasPermission("liveRoom:update"))
+                <i-button type="warning" @click="share"><i class="ivu-icon ivu-icon-share"></i>&nbsp;开播码</i-button>
+                #end
+                #if($shiro.hasPermission("liveRoom:update"))
+                <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>
+    <Spin fix v-if="loading">
+        <Icon type="load-c" size=18 class="demo-spin-icon-load"></Icon>
+        <div>上传中</div>
+    </Spin>
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="broadcast" :rules="ruleValidate" :label-width="110">
+            <div style="width: 100%;">
+                <div style="font-size: 16px;font-weight: bold;margin-bottom: 10px;">基本信息</div>
+                <Form-item label="选择VR场景" prop="brandId" style="width: 268px;">
+                    <i-select  v-if="title=='新增'" v-model="broadcast.brandId" filterable>
+                        <i-option v-for="brand in brands" :value="brand.id" :key="brand.id">{{brand.name}}
+                        </i-option>
+                    </i-select>
+                    <span v-else v-html="broadcast.brandName"></span>
+                </Form-item>
+                <Form-item label="直播类型" prop="title">
+                    <div class="c-winput" >
+                        <Radio-group v-model="broadcast.type">
+                            <Radio :label="0">
+                                <span>手机直播</span>
+                            </Radio>
+                        </Radio-group>
+                    </div>
+                </Form-item>
+                <Form-item label="直播间标题" prop="name">
+                    <div class="c-winput">
+                        <i-input v-model="broadcast.name" placeholder="直播间标题"/>
+                    </div>
+                </Form-item>
+                <Form-item label="直播开始时间" prop="startTime">
+                    <Date-picker @on-change="handleChangeStart" type="datetime" v-model="broadcast.startTime" placeholder="直播开始时间"></Date-picker>
+                    <Tooltip placement="right">
+                        <div slot="content">
+                            <p>1、开播时间段仅供参考,不是实际直播间可以开播的时间。</p>
+                            <p>2、直播间在开始时间前也可以开播,并且到结束时间后不会强制结束。</p>
+                            <p>3、若到结束时间仍未开播,则直播间无法再开播。</p>
+                        </div>
+                        <i class="ivu-icon ivu-icon-help-circled"></i>
+                    </Tooltip>
+                    
+                </Form-item>
+                <Form-item label="直播结束时间" prop="endTime">
+                    <Date-picker @on-change="handleChangeEnd" type="datetime" v-model="broadcast.endTime" placeholder="直播结束时间"></Date-picker>
+                    <Tooltip placement="right">
+                        <div slot="content">
+                            <p>1、开播时间段仅供参考,不是实际直播间可以开播的时间。</p>
+                            <p>2、直播间在开始时间前也可以开播,并且到结束时间后不会强制结束。</p>
+                            <p>3、若到结束时间仍未开播,则直播间无法再开播。</p>
+                        </div>
+                        <i class="ivu-icon ivu-icon-help-circled"></i>
+                    </Tooltip>
+                </Form-item>
+                <Form-item label="主播名称" prop="anchorName">
+                    <div class="c-winput">
+                        <i-input v-model="broadcast.anchorName" placeholder="主播名称"/>
+                    </div>
+                </Form-item>
+
+                <Form-item label="主播微信账号" prop="anchorWechat">
+                    <div class="c-winput">
+                        <i-input v-model="broadcast.anchorWechat" placeholder="填写微信账号"/>
+                    </div>
+                    <Tooltip content="每个直播间需要绑定一个用作核实主播身份,不会展示给观众。" placement="right">
+                        <i class="ivu-icon ivu-icon-help-circled"></i>
+                    </Tooltip>
+                    <div class="qr-renzheng" v-if="valiImg">
+                        <p style="color: red;">主播未进行验证,请扫描下方二维码进行身份验证</p>
+                        <img style="max-width:300px" :src="valiImg" alt="">
+                    </div>
+                </Form-item>
+
+                <div style="font-size: 16px;font-weight: bold;margin-bottom: 10px;">直播间配置</div>
+
+
+                <Form-item label="分享卡片封面" prop="shareImg">
+                    <div class="demo-upload-list" v-if="broadcast.shareImg">
+                            <img style="max-width:300px" :src="shareImg">
+                            <div class="demo-upload-list-cover" >
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImage(shareImg)"></i>
+                            </div>
+                    </div>
+                    <div class="c-btn">
+                        <Upload action="../liveRoom/uploadImage" :format="['jpg','jpeg','png']"
+                                :max-size="1024"
+                                :before-upload="beforeShareImgUpload"
+                                :on-success="handleSuccessShareImg" 
+                                :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                                <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </div>
+                        <p>分享卡片封面</p>
+                        <p>观众在微信对话框内分享的直播间将以分享卡片的形式呈现。</p>
+                        <p>建议尺寸:800像素 * 640像素,图片大小不得超过1M。</p>
+                    <div>
+                   </div>
+                </Form-item>
+
+                <Form-item label="直播卡片封面" prop="coverImg">
+                    <div class="demo-upload-list" v-if="broadcast.coverImg">
+                            <img style="max-width:300px" :src="coverImg">
+                            <div class="demo-upload-list-cover" >
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImage(coverImg)"></i>
+                            </div>
+                    </div>
+                    <div class="c-btn">
+                        <Upload action="../liveRoom/uploadImage" :format="['jpg','jpeg','png']"
+                                :max-size="300"
+                                :before-upload="beforecoverImgUpload"
+                                :on-success="handleSuccesscoverImg" 
+                                :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                                <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </div>
+                        <p>图片建议大小为 800像素 * 800像素。</p>
+                        <p>图片大小不超过 300KB。</p>
+                        <p>图片内容遵循平台规范后更容易被推荐。</p>
+                    <div>
+                   </div>
+                </Form-item>
+
+                <Form-item label="直播间背景墙" prop="feedsImg">
+                    <div class="demo-upload-list" v-if="broadcast.feedsImg">
+                            <img style="max-width:300px" :src="feedsImg">
+                            <div class="demo-upload-list-cover" >
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImage(feedsImg)"></i>
+                            </div>
+                    </div>
+                    <div class="c-btn">
+                        <Upload action="../liveRoom/uploadImage" :format="['jpg','jpeg','png']"
+                                :max-size="1024*2"
+                                :before-upload="beforefeedsImgUpload"
+                                :on-success="handleSuccessfeedsImg" 
+                                :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                                <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </div>
+                        <p>直播间背景墙是每个直播间的默认背景。</p>
+                        <p>建议尺寸:1080像素 * 1920像素。</p>
+                        <p>图片大小不得超过2M。</p>
+                    <div>
+                   </div>
+                </Form-item>
+
+                <Form-item label="直播间功能" >
+                    <div class="c-winput">
+                        <Checkbox value="broadcast.closeComment" @on-change="(val)=>{broadcast.closeComment=!val*1}">评论</Checkbox>
+                        <Checkbox value="broadcast.closeGoods" @on-change="(val)=>{broadcast.closeGoods=!val*1}">商品货架</Checkbox>
+                        <Checkbox value="broadcast.closeShare" @on-change="(val)=>{broadcast.closeShare=!val*1}">分享</Checkbox>
+                        <Checkbox value="broadcast.closeLike" @on-change="(val)=>{broadcast.closeLike=!val*1}">点赞</Checkbox>
+                    </div>
+                </Form-item>
+
+                <Form-item label="回放">
+                    <div class="c-winput">
+                        <Radio-group v-model="broadcast.closeReplay">
+                            <Radio :label="0">
+                                <span>是</span>
+                            </Radio>
+                            <Radio :label="1">
+                                <span>否</span>
+                            </Radio>
+                        </Radio-group>
+                    </div>
+                </Form-item>
+
+                <Form-item label="客服">
+                    <div class="c-winput">
+                        <Radio-group v-model="broadcast.closeKf">
+                            <Radio :label="0">
+                                <span>是</span>
+                            </Radio>
+                            <Radio :label="1">
+                                <span>否</span>
+                            </Radio>
+                        </Radio-group>
+                    </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>
+            </div>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/broadcast.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 110 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/carousel.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="8" >
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </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>
+    <Spin fix v-if="loading">
+        <Icon type="load-c" size=18 class="demo-spin-icon-load"></Icon>
+        <div>上传中</div>
+    </Spin>
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="carousel" :rules="ruleValidate" :label-width="110">
+            <div style="width: 100%;">
+                <Form-item label="标题" prop="title">
+                    <div class="c-winput">
+                        <i-input v-model="carousel.title" placeholder="标题"/>
+                    </div>
+                </Form-item>
+                <Form-item label="轮播图片" prop="coverImage">
+                    <div class="demo-upload-list" v-if="carousel.coverImage">
+                            <img style="width:340px" :src="carousel.coverImage">
+                            <div class="demo-upload-list-cover" >
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImage(carousel.coverImage)"></i>
+                            </div>
+                    </div>
+                    <div class="c-btn">
+                        <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                :max-size="1024*5"
+                                :on-success="handleSuccessCarouselImage" 
+                                :on-format-error="handleFormatError"
+                                :show-upload-list="false"
+                                :on-exceeded-size="handleMaxSize">
+                                <i-button icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </div>
+                        <p>1、支持png、jpg和gif图片格式;最多可上传1张。</p>
+                        <p>2、最大可上传5M的图片。</p>
+                        <p>3、建议上传大小:450 * 250 像素</p>
+                    <div>
+                   </div>
+                </Form-item>
+
+                <Form-item label="跳转链接">
+                    <div class="c-winput">
+                        <i-input v-model="carousel.redirectUrl" placeholder="跳转链接"/>
+                    </div>
+                </Form-item>
+
+                <Form-item label="排序">
+                    <div class="c-winput">
+                        <Input-number :min="0" :step="1" v-model="carousel.sortOrder" placeholder="排序" style="width: 188px;"/>
+                    </div>
+                </Form-item>
+
+                <Form-item label="是否显示">
+                    <div class="c-winput">
+                        <i-switch v-model="carousel.isShow" :false-value="0" :true-value="1"  />
+                    </div>
+                </Form-item>
+
+                <Form-item label="备注">
+                    <div class="c-winput">
+                        <i-input type="textarea" v-model="carousel.remark" placeholder="备注"/>
+                    </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>
+            </div>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/carousel.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 91 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/cart.html

@@ -0,0 +1,91 @@
+<!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">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </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="goodsSpecifitionNameValue">
+                <i-input v-model="cart.goodsSpecifitionNameValue" placeholder="规格属性组成的字符串,用来显示用"/>
+            </Form-item>
+            <Form-item label="product表对应的goods_specifition_ids" prop="goodsSpecifitionIds">
+                <i-input v-model="cart.goodsSpecifitionIds" 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>

+ 152 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/category.html

@@ -0,0 +1,152 @@
+<!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 type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+            </div> -->
+            <div class="buttons-group">
+                #if($shiro.hasPermission("category:save"))
+                <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                #end
+                #if($shiro.hasPermission("category:update"))
+                <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                #end
+                #if($shiro.hasPermission("category:delete"))
+                <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" 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">
+            <div style="width: 100%;">
+                <Form-item label="分类名称" prop="name">
+                    <div class="c-winput">
+                        <i-input v-model="category.name" placeholder="分类名称"/>
+                    </div>
+                </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>一级分类</span>
+                        </Radio>
+                        <Radio label="L2">
+                            <span>二级分类</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>
+
+                <!-- <Form-item label="手机banner" prop="wapBannerUrl">
+                    <div class="c-winput">
+                        <i-input v-model="category.wapBannerUrl" placeholder="手机banner" readonly/>
+                    </div>
+                        <div class="c-btn">
+                            <Upload 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>
+                    </div>
+                    <div class="c-btn">
+                            <i-button icon="eye" @click="eyeImageWapBannerUrl">预览图片</i-button>
+                    </div>
+                </Form-item> -->
+
+                <Form-item label="手机banner" prop="wapBannerUrl">
+                    <div class="demo-upload-list" >
+                        <template v-if="category.wapBannerUrl">
+                            <img style="width: 56px;height:56px;border-radius: 50%;" :src="category.wapBannerUrl">
+                            <div class="demo-upload-list-cover" >
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImageWapBannerUrl"></i>
+                                <i class="ivu-icon ivu-icon-trash-a" @click="category.wapBannerUrl=''"></i>
+                            </div>
+                        </template>
+                    </div>
+                    <div class="c-btn">
+                        <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                        :max-size="1024*5"
+                        :on-success="handleSuccessWapBannerUrl" :on-format-error="handleFormatError"
+                        :show-upload-list="false"
+                        :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </div>
+                        <p>1、支持png、jpg和gif图片格式;</p>
+                        <p>2、最大可上传5M的图片。</p>
+                        <p>3、推荐大小:100 * 100 像素</p>
+                    <div>
+                   </div>
+                </Form-item>
+                   
+                </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>
+            </div>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/category.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 84 - 0
platform-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="3">
+                    <Form-item :label-width="1">
+                        <Upload style="width: 300px;" action="../sys/oss/upload" :format="['jpg','jpeg','png']"
+                                max-size="10"
+                                :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="3">
+                    <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>

+ 68 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/collect.html

@@ -0,0 +1,68 @@
+<!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="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+
+                </i-col>
+            </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
platform-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>

+ 147 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/coupon.html

@@ -0,0 +1,147 @@
+<!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="12" >
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="优惠券名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.brandName" @on-enter="query" placeholder="VR场景名称"/>
+                    </div>
+                    <div style="display: inline-block;width:100px">
+                        <i-select v-model="q.couponStatus" >
+                            <i-option value=" ">全部</i-option>
+                            <i-option value="1">未生效</i-option>
+                            <i-option value="2">生效中</i-option>
+                            <i-option value="3">已失效</i-option>
+                            <i-option value="4">停止发放</i-option>
+                        </i-select>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+                
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("coupon:save"))
+                <i-button v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'" 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 v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'" type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                #end
+            </div>
+            <!--#if($shiro.hasPermission("coupon:publish"))-->
+            <!--<i-button type="primary" @click="publish">-->
+            <!--<Icon type="android-send"></Icon>-->
+            <!--</i>&nbsp;发放-->
+            <!--</i-button>-->
+            <!--#end-->
+        </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="150">
+            <Form-item label="VR场景名称" prop="brandId" style="width: 468px;">
+                <i-select  v-if="title=='新增'" v-model="coupon.brandId" filterable>
+                    <i-option v-for="brand in brands" :value="brand.id" :key="brand.id">{{brand.name}}
+                    </i-option>
+                </i-select>
+                <span v-else v-html="coupon.brandName"></span>
+            </Form-item>
+            <Form-item label="优惠券名称" prop="name">
+                <i-input v-model="coupon.name" placeholder="优惠券名称"/>
+            </Form-item>
+            <Form-item label="面值金额" prop="typeMoney">
+                <Input-number :min="0" :max="9999" v-model="coupon.typeMoney" placeholder="面值金额" style="width: 200px;"/>
+            </Form-item>
+            <Form-item label="最小订单金额" prop="minGoodsAmount">
+                <Input-number :min="0" :max="99999999" v-model="coupon.minGoodsAmount" placeholder="最小订单金额" style="width: 200px;"/>
+            </Form-item>
+            <!-- <Form-item label="发放方式" prop="sendType">
+                <Radio-group v-model="coupon.sendType">
+                    <Radio label="0">
+                        <span>按订单发放</span>
+                    </Radio>
+                </Radio-group>
+            </Form-item> -->
+
+            <Form-item label="发放数量" prop="number">
+                <Input-number :min="0" v-model="coupon.number" placeholder="发放数量" style="width: 200px;"/>
+            </Form-item>
+           
+            <Form-item label="使用开始时间" prop="useStartDate">
+                <Date-picker type="datetime" v-model="coupon.useStartDate" placeholder="使用开始时间"></Date-picker>
+            </Form-item>
+            <Form-item label="使用结束时间" prop="useEndDate">
+                <Date-picker type="datetime" v-model="coupon.useEndDate" placeholder="使用结束时间"></Date-picker>
+            </Form-item>
+
+            <Form-item label="使用说明" prop="useDesc">
+                <div class="c-winput">
+                    <i-input type="textarea" v-model="coupon.useDesc" placeholder="描述"/>
+                </div>
+            </Form-item>
+
+            <!-- <Form-item label="最小金额" prop="minAmount">
+                <Input-number :min="0" v-model="coupon.minAmount" placeholder="最小金额" style="width: 200px;"/>
+            </Form-item>
+            <Form-item label="最大金额" prop="maxAmount">
+                <Input-number :min="0" v-model="coupon.maxAmount" placeholder="最大金额" style="width: 200px;"/>
+            </Form-item>
+            <Form-item label="发放开始时间" prop="sendStartDate">
+                <Date-picker v-model="coupon.sendStartDate" placeholder="发放开始时间"></Date-picker>
+            </Form-item>
+            <Form-item label="发放结束时间" prop="sendEndDate">
+                <Date-picker v-model="coupon.sendEndDate" placeholder="发放结束时间"></Date-picker>
+            </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>

+ 77 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/coupondetail.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="12" >
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.orderId" @on-enter="query" placeholder="订单号"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.userName" @on-enter="query" placeholder="会员名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-select v-model="q.useStatus" >
+                            <i-option value=" ">全部</i-option>
+                            <i-option value="1">已领取</i-option>
+                            <i-option value="2">已使用</i-option>
+                            <i-option value="3">已过期</i-option>
+                            <i-option value="4">已作废</i-option>
+                        </i-select>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </div>
+            <!--#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-->
+            <div class="buttons-group">
+            </div>
+        </Row>
+        VR场景名称:{{brandName}}<span style="display: inline-block;margin: 0 10px;"></span>优惠券名称:{{name}}
+        <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/coupondetail.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 197 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/dept.html

@@ -0,0 +1,197 @@
+<!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="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.name" @on-enter="query" placeholder="公司名称" />
+                        </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+                    </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="120">
+                <div style="width: 100%;">
+                    <Form-item label="指房宝APP账号" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="请输入账号名称" />
+                        </div>
+                        <Tooltip content="需拥有指房宝APP账号,才可新增公司。(前往注册)" placement="right">
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                        </Tooltip>
+                    </Form-item>
+
+                    <Form-item label="请输入账号密码" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="公司名称" />
+                        </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>
+                    </Form-item>
+                </div>
+            </i-form>
+
+            <i-form ref="formValidate" :model="dept" :rules="ruleValidate" :label-width="120">
+                <div style="width: 100%;">
+                    <Form-item label="指房宝APP账号" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="请输入账号名称" />
+                        </div>
+                        <Tooltip content="需拥有指房宝APP账号,才可新增公司。(前往注册)" placement="right">
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                        </Tooltip>
+                    </Form-item>
+
+                    <Form-item label="请输入账号密码" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="公司名称" />
+                        </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>
+                    </Form-item>
+                </div>
+            </i-form>
+        </Card>
+
+        <Card v-show="!showList&&comfirmActive==1">
+            <p slot="title">{{title}}</p>
+            <i-form ref="formValidate" :model="dept" :rules="ruleValidate" :label-width="120">
+                <div style="width: 100%;">
+                    <Form-item label="指房宝APP账号" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="请输入账号名称" />
+                        </div>
+                        <Tooltip content="需拥有指房宝APP账号,才可新增公司。(前往注册)" placement="right">
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                        </Tooltip>
+                    </Form-item>
+
+                    <Form-item label="请输入账号密码" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="公司名称" />
+                        </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>
+                    </Form-item>
+                </div>
+            </i-form>
+
+
+        </Card>
+
+        <Card v-show="!showList&&comfirmActive==2">
+            <i-form ref="formValidate" :model="dept" :rules="ruleValidate" :label-width="80">
+                <div style="width: 100%;">
+                    <Form-item label="公司名称" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="请输入公司名称" />
+                        </div>
+                        <Tooltip content="需拥有指房宝APP账号,才可新增公司。(前往注册)" placement="right">
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                        </Tooltip>
+                    </Form-item>
+
+                    <Form-item label="公司封面" prop="primaryPicUrl">
+                        <div class="demo-upload-list">
+                            <template>
+                                <img style="width: 74px;" :src="dept.primaryPicUrl">
+                                <div class="demo-upload-list-cover">
+                                    <i class="ivu-icon ivu-icon-eye" @click="eyeImagePicUrl"></i>
+                                    <i class="ivu-icon ivu-icon-trash-a" @click="dept.primaryPicUrl=''"></i>
+                                </div>
+                            </template>
+                        </div>
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png']" :max-size="1024*5"
+                                :onsuccess="handleSuccessPicUrl" on-format-error="handleFormatError"
+                                :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                            <div>
+                                <p>1、支持png、jpg和gif图片格式;</p>
+                                <p>2、最大可上传5M的图片。</p>
+                                <p>3、推荐大小:108 * 81 像素</p>
+                            </div>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="可新增员工数" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="dept.name" placeholder="请输入可新增员工数" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="到期时间" prop="expirationDate">
+                        <div class="c-winput">
+                            <i-input v-model="dept.expirationDate" placeholder="请输入公司到期时间"></i-input>
+                            <!-- <DatePicker v-model="dept.expirationDate" type="date" placeholder="请选择公司到期时间" style=""></DatePicker> -->
+                        </div>
+                    </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>
+                </div>
+            </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>

+ 90 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/feedback.html

@@ -0,0 +1,90 @@
+<!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="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.userName" @on-enter="query" placeholder="会员名称" />
+                        </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+                    </i-col>
+                </div>
+                <!--#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-->
+                <div class="buttons-group">
+                    #if($shiro.hasPermission("feedback: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="feedback" :rules="ruleValidate" :label-width="80">-->
+        <!--<Form-item label="父节点" prop="parentId">-->
+        <!--<i-input v-model="feedback.parentId" placeholder="父节点"/>-->
+        <!--</Form-item>-->
+        <!--<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="userEmail">-->
+        <!--<i-input v-model="feedback.userEmail" placeholder="邮件"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="标题" prop="msgTitle">-->
+        <!--<i-input v-model="feedback.msgTitle" placeholder="标题"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="类型" prop="msgType">-->
+        <!--<i-input v-model="feedback.msgType" placeholder="类型"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="状态" prop="msgStatus">-->
+        <!--<i-input v-model="feedback.msgStatus" placeholder="状态"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="详细内容" prop="msgContent">-->
+        <!--<i-input v-model="feedback.msgContent" placeholder="详细内容"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="反馈时间" prop="msgTime">-->
+        <!--<i-input v-model="feedback.msgTime" placeholder="反馈时间"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="图片" prop="messageImg">-->
+        <!--<i-input v-model="feedback.messageImg" placeholder="图片"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="订单Id" prop="orderId">-->
+        <!--<i-input v-model="feedback.orderId" placeholder="订单Id"/>-->
+        <!--</Form-item>-->
+        <!--<Form-item label="" prop="msgArea">-->
+        <!--<i-input v-model="feedback.msgArea" 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>

+ 57 - 0
platform-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>

+ 344 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/goods.html

@@ -0,0 +1,344 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title></title>
+    #parse("sys/header.html")
+    <link rel="stylesheet" href="${rc.contextPath}/css/goods.css">
+</head>
+
+<body>
+    <div id="rrapp" v-cloak>
+        <div v-show="showList">
+            <Row :gutter="16">
+                <div class="search-group">
+                    <i-col span="8">
+                        <div style="display: inline-block;">
+
+                            <i-input v-model="q.name" @on-enter="query" placeholder="商品名称" />
+                        </div>
+                        <div style="display: inline-block; width: 200px;">
+                            <i-select v-model="q.brandId">
+                                <i-option value=" ">全部</i-option>
+                                <i-option v-for="(item,i) in brands" :key="i" :value="item.id">{{item.name}}</i-option>
+                            </i-select>
+                        </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+
+                    </i-col>
+
+                </div>
+                <div class="buttons-group">
+                    #if($shiro.hasPermission("goods:save"))
+                    <i-button v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'" type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                    #end #if($shiro.hasPermission("goods:update"))
+                    <i-button v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'" type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                    #end #if($shiro.hasPermission("goods:delete"))
+                    <i-button v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'" type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                    #end
+                    <i-button v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'" type="primary" @click="enSale"><i class="fa fa-hand-o-up"></i>&nbsp;上架</i-button>
+                    <i-button v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'" type="dashed" @click="unSale"><i class="fa fa-hand-o-down"></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="goods" :rules="ruleValidate" :label-width="80">
+                <div style="width: 100%;">
+                    <Form-item label="商品分类" prop="categoryName">
+                        <div class="c-winput" @click="categoryTree">
+                            <i-input v-model="goods.categoryName" icon="eye" readonly="readonly" placeholder="商品分类" />
+                        </div>
+                    </Form-item>
+                    <Form-item label="序列号" prop="goodsSn">
+                        <div class="c-winput">
+                            <i-input v-model="goods.goodsSn" placeholder="商品序列号" />
+                        </div>
+                    </Form-item>
+                    <Form-item label="商品名称" prop="name">
+                        <div class="c-winput">
+                            <i-input v-model="goods.name" placeholder="名称" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="商品描述" prop="goodsSimpleDesc">
+                        <div class="c-winput">
+                            <i-input v-model="goods.goodsSimpleDesc" placeholder="商品描述" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="直播间" prop="brandId" style="width: 300px;">
+                        <i-select v-if="title=='新增'" v-model="goods.brandId" filterable>
+                            <i-option v-for="brand in brands" :value="brand.id" :key="brand.id">{{brand.name}}
+                            </i-option>
+                        </i-select>
+                        <span v-else>{{goods.brandName||'-'}}</span>
+                        <div style="color:red;">注意:场景绑定后,将无法进行修改。</div>
+                    </Form-item>
+                    <Form-item label="购买链接" prop="realShopUrl">
+                        <div class="c-winput">
+                            <i-input v-model="goods.realShopUrl" placeholder="购买链接" />
+                        </div>
+                        <span style="color:#aaa;margin-left: 10px;">仅支持京东链接</span>
+                    </Form-item>
+
+                    <Form-item label="商品规格" prop="guigeArr">
+                        <div class="items-ge">
+                            <div class="item-ge" v-for="(item,i) in guigeArr" :key="i">
+                                <div @click="handleBigItem(i)" class="item-close">
+                                    <i class="fa fa-times-circle"></i>
+                                </div>
+                                <div class="t-name">
+                                    <span>规格名:</span>
+                                    <div class="c-winput-sm">
+                                        <i-input @on-focus="onfocus(i)" @on-enter="onblur(i)" v-model="item.name" placeholder="规格名" />
+                                    </div>
+                                    <ul class="sp-list" v-if="item.show">
+                                        <li @click.stop="handleItem(i,sub)" v-for="(sub,idx) in specifications" :key="idx">
+                                            {{sub.name}}
+                                        </li>
+                                    </ul>
+                                </div>
+                                <div class="t-val">
+                                    <span class="v-name">规格值:</span>
+                                    <!-- {{item.val}} -->
+                                    <div class="c-winput-sm c-winput-bm" v-for="(gg,idx) in item.val" :key="idx">
+                                        <div style="width: 30%;margin-bottom: 10px;">
+                                            <i-input v-model="gg.name" placeholder="规格值" />
+                                        </div>
+                                        <i @click="delguige(idx,item.val)" class="fa fa-times-circle"></i>
+                                        <div class="upload">
+                                            <div class="c-winput">
+                                                <i-input v-model="gg.picUrl" placeholder="规格图" readonly/>
+                                            </div>
+                                            <div class="c-btn">
+                                                <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png']" max-size="2048" :on-success="handleItemPicUrl" :on-format-error="handleFormatError" :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                                    <i-button @click="handleCurrentIdx(i,idx)" icon="ios-cloud-upload-outline">上传图片</i-button>
+                                                </Upload>
+                                            </div>
+                                            <div class="c-btn">
+                                                <i-button icon="eye" @click="eyeImageItemPicUrl(gg.picUrl)">预览图片</i-button>
+                                            </div>
+                                        </div>
+                                    </div>
+
+                                    <span class="add-s" @click="addguige(item)">添加属性值</span>
+
+                                </div>
+                            </div>
+                            <i-button @click="addGoodsItem">添加规格项目</i-button>
+                            <i-button @click="showArr">生成规格明细</i-button>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="规格明细" prop="ggContent">
+                        <div class="c-table">
+                            <div class="">
+                                <div class="t-header">
+                                    <ul class="h-val">
+                                        <li v-for="(item,i) in ggname">{{item.name}}</li>
+                                    </ul>
+                                    <ul>
+                                        <li v-for="(item,i) in ggheader">
+                                            {{item.name}}
+                                        </li>
+                                    </ul>
+                                </div>
+                                <div class="t-content">
+                                    <ul class="tc-content">
+                                        <li v-for="(item,i) in ggContent" :key="i">
+                                            <span>{{item.value}}</span>
+                                            <ul class="secend-ul" v-if="item.subItems">
+                                                <li v-for="sub in item.subItems">
+                                                    <span>{{sub.value}}</span>
+                                                    <ul v-if="sub.subItems">
+                                                        <li v-for="children in sub.subItems">
+                                                            <span>{{children.value}}</span>
+                                                        </li>
+                                                    </ul>
+                                                </li>
+                                            </ul>
+                                        </li>
+                                    </ul>
+                                    <ul class="ip-layout" v-if="inputArr.length>0">
+                                        <li v-for="(item,i) in inputArr" :key="i">
+                                            <div style="display: flex">
+                                                <div>
+                                                    <i-input @keyup.native="handleInputChange(item,'goodsNumber',i)" v-model="item.goodsNumber" /></div>
+                                                <div>
+                                                    <i-input v-model="item.goodsSn" /></div>
+                                                <div>
+                                                    <i-input @keyup.native="handleInputChange(item,'marketPrice',i)" v-model="item.marketPrice" /></div>
+                                                <div>
+                                                    <i-input @keyup.native="handleInputChange(item,'retailPrice',i)" v-model="item.retailPrice" /></div>
+                                            </div>
+                                        </li>
+                                    </ul>
+                                </div>
+                            </div>
+                        </div>
+                        <div class="ivu-form-item-error-tip" v-if="showguigearr">
+                            输入有误,市场价、销售价请填写精确至小数点后两位的数字。库存,只能填写大于0的数字<br/>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="主图" prop="primaryPicUrl">
+                        <div class="demo-upload-list">
+                            <template v-if="goods.primaryPicUrl">
+                                    <img style="width: 74px;" :src="goods.primaryPicUrl">
+                                    <div class="demo-upload-list-cover" >
+                                        <i class="ivu-icon ivu-icon-eye" @click="eyeImagePicUrl"></i>
+                                        <i class="ivu-icon ivu-icon-trash-a" @click="goods.primaryPicUrl=''"></i>
+                                    </div>
+                                </template>
+                        </div>
+
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png']" :max-size="1024*5" :on-success="handleSuccessPicUrl" :on-format-error="handleFormatError" :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                        </div>
+                        <p>1、支持png、jpg和gif图片格式;</p>
+                        <p>2、最大可上传5M的图片。</p>
+                        <p>3、推荐大小:300 * 300 像素</p>
+                        <div>
+                        </div>
+                    </Form-item>
+
+
+                    <Form-item label="列表图" prop="listPicUrl">
+                        <div style="display: flex;flex-wrap: wrap;">
+                            <!-- <div class="demo-upload-list" style="margin-right:10px;" :key="i" v-for="(item,i) in goods.listPicUrl"> -->
+                            <div class="demo-upload-list" style="margin-right:10px;" :key="i" v-for="(item,i) in picList">
+                                <template v-if="item.status == 'finished'">
+                                        <img style="width: 250px;" :src="item.url">
+                                        <div class="demo-upload-list-cover" >
+                                            <i class="ivu-icon ivu-icon-eye" @click="eyeImageItemPicUrl(item.name)"></i>
+                                            <i class="ivu-icon ivu-icon-trash-a" @click="handleRemove1(item)"></i>
+                                        </div>
+                                    </template>
+                                <template v-else>
+                                        <Progress v-if="item.showProgress" :percent="item.percentage" hide-info></Progress>
+                                    </template>
+                            </div>
+                        </div>
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png','gif']" :max-size="1024*5" :ref="'goodupload'" :default-file-list="defaultList" :on-success="handleSuccessBrandPicUrl" :on-format-error="handleFormatError" :show-upload-list="false" :before-upload="handleBeforeUpload15"
+                                multiple :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                        </div>
+                        <p>1、支持png、jpg和gif图片格式,最多可上传15张图。</p>
+                        <p>2、最大可上传5M的图片。</p>
+                        <p>3、推荐大小:400 * 400 像素。</p>
+                        <div>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="商品描述">
+                        <div class="c-winput">
+                            <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>
+                        </template>
+                        <div id="goodsDesc"></div>
+                </div>
+                </Form-item>
+                <Form-item label="上架" prop="isOnSale">
+                    <Radio-group v-model="goods.isOnSale">
+                        <Radio label="1">
+                            <span>是</span>
+                        </Radio>
+                        <Radio label="0">
+                            <span>否</span>
+                        </Radio>
+                    </Radio-group>
+                </Form-item>
+    </div>
+    </i-form>
+
+    <!-- <Tab-Pane label="详细描述" name="name2">
+                
+            </Tab-Pane> -->
+    <!-- <Tab-Pane label="其他信息" name="name3">
+                <i-form ref="formValidate1" :model="goods" :rules="ruleValidate" :label-width="80">
+                    <Form-item label="排序" prop="sortOrder">
+                        <Input-number :min="0" :step="1" v-model="goods.sortOrder" placeholder="排序"
+                                      style="width: 188px;"/>
+                    </Form-item>
+                    
+                    <Form-item label="是否新商品" prop="isNew">
+                        <Radio-group v-model="goods.isNew">
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="热销" prop="isHot">
+                        <Radio-group v-model="goods.isHot">
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                            <Radio label="0">
+                                <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="keywords">
+                        <i-input v-model="goods.keywords" placeholder="关键字"/>
+                    </Form-item>
+                    <Form-item label="简明介绍" prop="goodsBrief">
+                        <i-input v-model="goods.goodsBrief" placeholder="简明介绍"/>
+                    </Form-item>
+                </i-form>
+            </Tab-Pane> -->
+    <!-- </Tabs> -->
+    <div style="padding-left: 20px; margin-bottom: 30px" v-show="!showList">
+        <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>
+        <!-- <i-button @click="showArrsds">确定呀</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>

+ 35 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/goodshistory.html

@@ -0,0 +1,35 @@
+<!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="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </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>

+ 282 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/goodshotspot.html

@@ -0,0 +1,282 @@
+<!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="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="VR场景名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+
+                </i-col>
+            </div>
+            <div class="buttons-group">
+                <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>
+
+        <Tabs value="name1">
+            <Tab-Pane label="通用信息" name="name1">
+                <i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">
+                    <Form-item label="商品类型" prop="categoryId">
+                        <i-input v-model="goods.categoryName" @on-click="categoryTree" icon="eye" readonly="readonly"
+                                 placeholder="商品类型"/>
+                    </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="VR场景" prop="brandId" style="width: 268px;">
+                        <i-select v-model="goods.brandId" filterable>
+                            <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="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="商品库存" prop="goodsNumber">
+                        <Input-number :min="0" :step="1" v-model="goods.goodsNumber" placeholder="商品库存"
+                                      style="width: 188px;"/>
+                    </Form-item>
+                    <!--<Form-item label="商品单位" prop="goodsUnit" style="width: 268px;">-->
+                    <!--<i-select v-model="goods.goodsUnit" filterable>-->
+                    <!--<i-option v-for="macro in macros" :value="macro.value" :key="macro.value">{{macro.name}}-->
+                    <!--</i-option>-->
+                    <!--</i-select>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="单价" prop="unitPrice">-->
+                    <!--<Input-number :min="0" :step="1" v-model="goods.unitPrice" placeholder="单价"-->
+                    <!--style="width: 188px;"/>-->
+                    <!--</Form-item>-->
+                    <Form-item label="零售价格" prop="retailPrice">
+                        <Input-number :min="0" :step="1" v-model="goods.retailPrice" placeholder="零售价格"
+                                      style="width: 188px;"/>
+                    </Form-item>
+                    <Form-item label="市场价" prop="marketPrice">
+                        <Input-number :min="0" :step="1" v-model="goods.marketPrice" placeholder="市场价"
+                                      style="width: 188px;"/>
+                    </Form-item>
+                    <!--<Form-item label="专柜价格" prop="counterPrice">-->
+                    <!--<Input-number :min="0" :step="1" v-model="goods.counterPrice" placeholder="专柜价格"-->
+                    <!--style="width: 188px;"/>-->
+                    <!--</Form-item>-->
+                    <!--<Form-item label="附加价格" prop="extraPrice">-->
+                    <!--<Input-number :min="0" :step="1" v-model="goods.extraPrice" placeholder="附加价格"-->
+                    <!--style="width: 188px;"/>-->
+                    <!--</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="3">
+                            <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="3">
+                            <Form-item :label-width="1">
+                                <i-button icon="eye" @click="eyeImagePicUrl">预览图片</i-button>
+                            </Form-item>
+                        </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="3">
+                            <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="3">
+                            <Form-item :label-width="1">
+                                <i-button icon="eye" @click="eyeImageListPicUrl">预览图片</i-button>
+                            </Form-item>
+                        </i-col>
+                    </Row>
+                </i-form>
+            </Tab-Pane>
+            <Tab-Pane label="详细描述" name="name2">
+
+                <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>
+                </template>
+                <div id="goodsDesc"></div>
+            </Tab-Pane>
+            <Tab-Pane label="其他信息" name="name3">
+                <i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">
+                    <Form-item label="排序" prop="sortOrder">
+                        <Input-number :min="0" :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="1">
+                                <span>是</span>
+                            </Radio>
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="是否新商品" prop="isNew">
+                        <Radio-group v-model="goods.isNew">
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item label="热销" prop="isHot">
+                        <Radio-group v-model="goods.isHot">
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                            <Radio label="0">
+                                <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="keywords">
+                        <i-input v-model="goods.keywords" placeholder="关键字"/>
+                    </Form-item>
+                    <Form-item label="简明介绍" prop="goodsBrief">
+                        <i-input v-model="goods.goodsBrief" placeholder="简明介绍"/>
+                    </Form-item>
+                </i-form>
+            </Tab-Pane>
+        </Tabs>
+        <div style="padding-left: 20px; margin-bottom: 30px">
+            <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/goodshotspot.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 54 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/goodsissue.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.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="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>

+ 95 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/goodsspecification.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="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.name" @on-enter="query" placeholder="商品名称/VR场景名称"/>
+                    </div>
+                    <div style="display: inline-block; width: 200px;">
+                        <i-select v-model="q.brandId">
+                            <i-option value=" ">全部</i-option>
+                            <i-option v-for="(item,i) in brands" :key="i" :value="item.id">{{item.name}}</i-option>
+                        </i-select>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+              
+            </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" style="margin-bottom: 20px"></div>
+    </div>
+
+    <Card v-show="!showList">
+        <p slot="title">{{title}}</p>
+        <i-form ref="formValidate" :model="goodsSpecification" :rules="ruleValidate" :label-width="80">
+        <div style="width: 100%;">
+         <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">
+                <div class="c-winput">
+                    <i-input type="textarea" v-model="goodsSpecification.value" placeholder="规格说明"/>
+                </div>
+            </Form-item>
+                    <Form-item label="规格图片" prop="picUrl">
+                        <div class="c-winput">
+                            <i-input v-model="goodsSpecification.picUrl" placeholder="规格图片" readonly/>
+                        </div>
+                        <div class="c-btn">
+                            <Upload 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>
+                        </div>
+                        <div class="c-btn">
+                            <i-button icon="eye" @click="eyeImage">预览图片</i-button>
+                        </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>
+        </div>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/goodsspecification.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 65 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/helpissue.html

@@ -0,0 +1,65 @@
+<!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="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
platform-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.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("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
platform-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>

+ 243 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/linkhotspot.html

@@ -0,0 +1,243 @@
+<!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-select v-model="q.brandId">
+                            <i-option value=" ">全部</i-option>
+                            <i-option v-for="(item,i) in brands" :key="i" :value="item.id">{{item.name}}</i-option>
+                        </i-select>
+                    </i-col>
+                    <i-button @click="query">查询</i-button>
+                </div>
+            </Row>
+            <table id="jqGrid"></table>
+            <div id="jqGridPager"></div>
+        </div>
+
+        <div style="margin:20px auto; text-align: center;">
+            <i-button @click='closeWindow'>取消</i-button>
+            <i-button type="primary" @click="bind" style="margin-left: 20px;">确定</i-button>
+        </div>
+    
+        <Card v-show="!showList">
+            <p slot="title">{{title}}</p>
+    
+            <Tabs value="name1">
+                <Tab-Pane label="通用信息" name="name1">
+                    <i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">
+                        <Form-item label="商品类型" prop="categoryId">
+                            <i-input v-model="goods.categoryName" @on-click="categoryTree" icon="eye" readonly="readonly"
+                                     placeholder="商品类型"/>
+                        </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="VR场景" prop="brandId" style="width: 268px;">
+                            <i-select v-model="goods.brandId" filterable>
+                                <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="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="商品库存" prop="goodsNumber">
+                            <Input-number :min="0" :step="1" v-model="goods.goodsNumber" placeholder="商品库存"
+                                          style="width: 188px;"/>
+                        </Form-item>
+                        <!--<Form-item label="商品单位" prop="goodsUnit" style="width: 268px;">-->
+                        <!--<i-select v-model="goods.goodsUnit" filterable>-->
+                        <!--<i-option v-for="macro in macros" :value="macro.value" :key="macro.value">{{macro.name}}-->
+                        <!--</i-option>-->
+                        <!--</i-select>-->
+                        <!--</Form-item>-->
+                        <!--<Form-item label="单价" prop="unitPrice">-->
+                        <!--<Input-number :min="0" :step="1" v-model="goods.unitPrice" placeholder="单价"-->
+                        <!--style="width: 188px;"/>-->
+                        <!--</Form-item>-->
+                        <Form-item label="零售价格" prop="retailPrice">
+                            <Input-number :min="0" :step="1" v-model="goods.retailPrice" placeholder="零售价格"
+                                          style="width: 188px;"/>
+                        </Form-item>
+                        <Form-item label="市场价" prop="marketPrice">
+                            <Input-number :min="0" :step="1" v-model="goods.marketPrice" placeholder="市场价"
+                                          style="width: 188px;"/>
+                        </Form-item>
+                        <!--<Form-item label="专柜价格" prop="counterPrice">-->
+                        <!--<Input-number :min="0" :step="1" v-model="goods.counterPrice" placeholder="专柜价格"-->
+                        <!--style="width: 188px;"/>-->
+                        <!--</Form-item>-->
+                        <!--<Form-item label="附加价格" prop="extraPrice">-->
+                        <!--<Input-number :min="0" :step="1" v-model="goods.extraPrice" placeholder="附加价格"-->
+                        <!--style="width: 188px;"/>-->
+                        <!--</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="3">
+                                <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="3">
+                                <Form-item :label-width="1">
+                                    <i-button icon="eye" @click="eyeImagePicUrl">预览图片</i-button>
+                                </Form-item>
+                            </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="3">
+                                <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="3">
+                                <Form-item :label-width="1">
+                                    <i-button icon="eye" @click="eyeImageListPicUrl">预览图片</i-button>
+                                </Form-item>
+                            </i-col>
+                        </Row>
+                    </i-form>
+                </Tab-Pane>
+                <Tab-Pane label="详细描述" name="name2">
+    
+                    <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>
+                    </template>
+                    <div id="goodsDesc"></div>
+                </Tab-Pane>
+                <Tab-Pane label="其他信息" name="name3">
+                    <i-form ref="formValidate" :model="goods" :rules="ruleValidate" :label-width="80">
+                        <Form-item label="排序" prop="sortOrder">
+                            <Input-number :min="0" :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="1">
+                                    <span>是</span>
+                                </Radio>
+                                <Radio label="0">
+                                    <span>否</span>
+                                </Radio>
+                            </Radio-group>
+                        </Form-item>
+                        <Form-item label="是否新商品" prop="isNew">
+                            <Radio-group v-model="goods.isNew">
+                                <Radio label="1">
+                                    <span>是</span>
+                                </Radio>
+                                <Radio label="0">
+                                    <span>否</span>
+                                </Radio>
+                            </Radio-group>
+                        </Form-item>
+                        <Form-item label="热销" prop="isHot">
+                            <Radio-group v-model="goods.isHot">
+                                <Radio label="1">
+                                    <span>是</span>
+                                </Radio>
+                                <Radio label="0">
+                                    <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="keywords">
+                            <i-input v-model="goods.keywords" placeholder="关键字"/>
+                        </Form-item>
+                        <Form-item label="简明介绍" prop="goodsBrief">
+                            <i-input v-model="goods.goodsBrief" placeholder="简明介绍"/>
+                        </Form-item>
+                    </i-form>
+                </Tab-Pane>
+            </Tabs>
+            <div style="padding-left: 20px; margin-bottom: 30px">
+                <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/linkhotspot.js?_${date.systemTime}"></script>
+    </body>
+</html>

+ 217 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/order.html

@@ -0,0 +1,217 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title></title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="!detail&&showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="12">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.orderSn" @on-enter="query" placeholder="订单号"/>
+                    </div>
+                    <div style="display: inline-block;width: 200px;">
+                        <i-select v-model="q.orderStatus" placeholder="请选择订单状态">
+                            <i-option value=" ">全部订单</i-option>
+                            <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="1">订单已发货</i-option>
+                            <i-option value="2">订单已收货</i-option>
+                            <!-- <i-option value="401">退款(未发货)</i-option> -->
+                            <!-- <i-option value="402">退款(已收货)</i-option> -->
+                            <i-option value="501">完成</i-option>
+                        </i-select>
+                    </div>
+                    <div style="display: inline-block;width: 200px;">
+                        <i-select v-model="q.brandId" placeholder="请选择VR场景">
+                            <i-option value=" ">全部</i-option>
+                            <i-option v-for="(item,i) in brands" :key="i" :value="item.id">{{item.name}}</i-option>
+                        </i-select>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </div>
+            <div class="buttons-group">
+                #if($shiro.hasPermission("order:exports"))
+                <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" type="info" @click="exports">导出</i-button>
+                #end
+                #if($shiro.hasPermission("order:sendGoods"))
+                <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" type="warning" @click="sendGoods">发货</i-button>
+                #end
+                #if($shiro.hasPermission("order:confirm"))
+                <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" type="error" @click="confirm">确认收货</i-button>
+                #end
+            </div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+    </div>
+
+    <Card v-show="!showList&&!detail">
+        <p slot="title">{{title}}</p>
+        <i-form :model="order" :label-width="100">
+            <div style="width: 100%;">
+                <Form-item label="快递公司" prop="shippingId">
+                    <div class="c-winput">
+                        <i-select v-model="order.shippingId" filterable>
+                            <i-option v-for="shipping in shippings" :value="shipping.id" :key="shipping.id">{{shipping.name}}
+                            </i-option>
+                        </i-select>
+                    </div>
+                </Form-item>
+                <Form-item label="快递单号" prop="shippingNo">
+                    <div class="c-winput">
+                        <i-input v-model="order.shippingNo" placeholder="快递单号"/>
+                    </div>
+                </Form-item>
+                <Form-item>
+                    <i-button type="primary" @click="saveOrUpdate">提交</i-button>
+                    <i-button type="warning" @click="reload" style="margin-left: 8px"/>
+                    返回</i-button>
+                </Form-item>
+            </div>
+        </i-form>
+    </Card>
+
+    <Card v-show="detail">
+        <p slot="title" style="height: auto">
+            {{title}}
+            <i-button type="warning" @click="reload" style="margin-left: 8px;float: right;"/>
+            返回</i-button>
+        </p>
+        <i-form ref="formValidate" :model="order" :label-width="80">
+            <div style="width: 100%;">
+                <Form-item label="订单号:" prop="orderSn">
+                    {{order.orderSn}}
+                    <!-- <i-input v-model="" readonly/> -->
+                </Form-item>
+                <Form-item label="会员昵称:" prop="nickName">
+                    {{order.nickName}}
+                    <!-- <i-input v-model="order.nickName" readonly/> -->
+                </Form-item>
+                <Form-item label="订单类型:" prop="orderType">
+                    <div class="c-winput">
+                        <i-select v-model="order.orderType" disabled>
+                            <i-option value="1">普通订单</i-option>
+                            <i-option value="2">团购订单</i-option>
+                            <i-option value="3">砍价订单</i-option>
+                            <i-option value="4">立即购买</i-option>
+                        </i-select>
+                    </div>
+                </Form-item>
+                <Form-item label="订单状态:" prop="orderStatus" readonly>
+                    <span>{{orderStatusStr[order.orderStatus]||'-'}}</span>
+                </Form-item>
+                <Form-item label="发货状态:" prop="shippingStatus">
+                    <span>{{shippingStatusStr[order.shippingStatus]||'-'}}</span>
+                </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="goodsList">
+                    <div v-if="order.goodsList" class="order-detail">
+                        <div class="order-item" v-if="order.goodsList" v-for="(item,idx) in order.goodsList" :key="idx">
+                            <img :src="item.listPicUrl" alt="">
+                            <div class="order-info">
+                                <p>{{item.goodsName}}</p>
+                                <p>{{item.goodsSpecifitionNameValue}}</p>
+                                <p class="order-price">
+                                    <span>¥{{item.retailPrice}}</span>
+                                    <span>x{{item.number}}</span>
+                                </p>
+                            </div>
+                        </div>
+                    </div>
+                    <div v-else>暂无商品信息</div>
+                </Form-item>
+                <Form-item label="收货人:" prop="consignee">
+                    {{order.consignee}}
+                    <!-- <i-input v-model="order.consignee" readonly/> -->
+                </Form-item>
+                <Form-item label="收货地址:" prop="address">
+                    {{order.address}}
+                    <!-- <i-input v-model="order.address" readonly/> -->
+                </Form-item>
+                <Form-item label="联系电话:" prop="mobile">
+                    {{order.mobile}}
+                    <!-- <i-input v-model="order.mobile" readonly/> -->
+                </Form-item>
+                <Form-item label="快递公司:" prop="shippingName">
+                    {{order.shippingName}}
+                    <!-- <i-input v-model="order.shippingName" readonly/> -->
+                </Form-item>
+                <Form-item label="快递单号:" prop="shippingNo">
+                    {{order.shippingNo}}
+                    <!-- <i-input v-model="order.shippingNo" readonly/> -->
+                </Form-item>
+                <Form-item label="物流信息:" prop="logistics">
+                    <Timeline style="background-color: #fafafa;" v-if="order.logistics">
+                        <TimelineItem v-if="order.logistics" v-for="(item,idx) in order.logistics.list" :key="idx">
+                            <p>{{item.time}}</p>
+                            <p style="padding-left: 5px;" >{{item.status}}</p>
+                        </TimelineItem>
+                    </Timeline>
+                    <div v-else>暂无物流信息</div>
+                </Form-item>
+                <Form-item label="付款方:" prop="payName">
+                    {{order.payName}}
+                    <!-- <i-input v-model="order.payName" readonly/> -->
+                </Form-item>
+                <Form-item label="快递费用:" prop="shippingFee">
+                    {{order.freightPrice}}
+                    <!-- <i-input v-model="order.shippingFee" readonly/> -->
+                </Form-item>
+                <Form-item label="实际支付:" prop="actualPrice">
+                    {{order.actualPrice}}
+                    <!-- <i-input v-model="order.actualPrice" readonly/> -->
+                </Form-item>
+                <Form-item label="订单总价:" prop="orderPrice">
+                    {{order.orderPrice}}
+                    <!-- <i-input v-model="order.orderPrice" readonly/> -->
+                </Form-item>
+                <Form-item label="商品总价:" prop="goodsPrice">
+                    {{order.goodsPrice}}
+                    <!-- <i-input v-model="order.goodsPrice" readonly/> -->
+                </Form-item>
+                <Form-item label="下单时间:" prop="addTime">
+                    {{transDate(order.addTime, 'yyyy-MM-dd')}}
+
+                    <!-- <Date-picker v-model="order.addTime" placeholder="使用时间" readonly/> -->
+                </Form-item>
+                <Form-item label="付款时间:" prop="payTime">
+                    {{transDate(order.payTime, 'yyyy-MM-dd')}}
+                    <!-- <Date-picker 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> -->
+            </div>
+        </i-form>
+    </Card>
+
+</div>
+<script src="${rc.contextPath}/js/shop/order.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 125 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/orderPrint.html

@@ -0,0 +1,125 @@
+<!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}}
+                        </address>
+                    </div>
+
+                    <div class="col-sm-6 text-right">
+                        <h4>单据编号:</h4>
+                        <h4 class="text-navy">{{order.orderSn}}</h4>
+                        <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).toFixed(1)}}</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");
+    let brandId = getQueryString("brandId");
+
+    var vm = new Vue({
+        el: '#rrapp',
+        data: {
+            showBtn: true,
+            order: {},
+            orderGoods: {},
+            sumRetailPrice: 0,
+            nowDate: transDate((new Date()).getTime())
+        },
+        methods: {
+            print: function () {
+                vm.showBtn = false;
+                setTimeout(() => {
+                    window.print();
+                    vm.showBtn = true;
+                });
+            }
+        },
+        created: function () {
+            Ajax.request({
+                url: "../order/info/" + orderId+'/'+brandId,
+                async: true,
+                successCallback: function (r) {
+                    vm.order = r.order;
+                    console.log(vm.order)
+
+                    vm.orderGoods = r.order.goodsList;
+                    vm.sumRetailPrice = r.order.orderPrice
+                    // for (let i = 0; i < r.order.goodsList.length; i++) {
+                    //     vm.sumRetailPrice += r.order.goodsList[i].retailPrice.toFixed(1) * r.order.goodsList[i].number.toFixed(1)
+                    // }
+                }
+            });
+            // Ajax.request({
+            //     url: "../ordergoods/queryAll?orderId=" + orderId,
+            //     async: true,
+            //     successCallback: function (r) {
+            //         vm.orderGoods = r.list;
+            //         for (let i = 0; i < r.list.length; i++) {
+            //             vm.sumRetailPrice += r.list[i].retailPrice * r.list[i].number
+            //         }
+            //     }
+            // });
+        }
+    });
+</script>
+
+</body>
+
+</html>

+ 100 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/product.html

@@ -0,0 +1,100 @@
+<!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" v-if="!onlyOne">
+                <i-col span="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.goodsName" @on-enter="query" placeholder="商品名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </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="90">
+            <div style="width: 100%;">
+                <Form-item label="商品名称" prop="goodsId">
+                    <div class="c-winput">
+                        <i-select :disabled="type!=='add'" 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>
+                    </div>
+                </Form-item>
+                <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-select v-model="color" filterable multiple>
+                        <i-option v-for="color in colors" :value="color.id" :key="color.id">{{color.value}}</i-option>
+                    </i-select>
+                </Form-item>
+                <Form-item label="规格" v-if="attribute.indexOf(2)>-1" prop="guige">
+                    <i-select v-model="guige" filterable multiple>
+                        <i-option v-for="guige in guiges" :value="guige.id" :key="guige.id">{{guige.value}}</i-option>
+                    </i-select>
+                </Form-item>
+                <Form-item label="重量" v-if="attribute.indexOf(4)>-1" prop="weight">
+                    <i-select v-model="weight" filterable multiple>
+                        <i-option v-for="weight in weights" :value="weight.id" :key="weight.id">{{weight.value}}</i-option>
+                    </i-select>
+                </Form-item>
+                <Form-item label="商品序列号" prop="goodsSn">
+                    <div class="c-winput">
+                        <i-input v-model="product.goodsSn" placeholder="商品序列号"/>
+                    </div>
+                </Form-item>
+                <Form-item label="商品库存" prop="goodsNumber">
+                    <Input-number :min="1" :step="1" v-model="product.goodsNumber" placeholder="商品库存"
+                                  style="width: 188px;"/>
+                </Form-item>
+                <Form-item label="零售价格" prop="retailPrice">
+                    <Input-number :min="1" :step="1" v-model="product.retailPrice" placeholder="零售价格"
+                                  style="width: 188px;"/>
+                </Form-item>
+                <Form-item label="市场价格" prop="marketPrice">
+                    <Input-number :min="1" :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>
+            </div>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/shop/product.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 169 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/recommend.html

@@ -0,0 +1,169 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>场景分配</title>
+    #parse("sys/header.html")
+    <style>
+        .ivu-spin-fix {
+            z-index: 99999999;
+        }
+
+        .demo-spin-icon-load {
+            animation: ani-demo-spin 1s linear infinite;
+        }
+
+        @keyframes ani-demo-spin {
+            from {
+                transform: rotate(0deg);
+            }
+
+            50% {
+                transform: rotate(180deg);
+            }
+
+            to {
+                transform: rotate(360deg);
+            }
+        }
+
+        .demo-spin-col {
+            height: 100px;
+            position: relative;
+            border: 1px solid #eee;
+        }
+    </style>
+</head>
+
+<body>
+    <div id="rrapp" v-cloak>
+        <i-menu mode="horizontal" @on-select="changTab" theme="light" active-name="11" style="margin-bottom: 10px;">
+            <Menu-item name="11">
+                热门房源
+            </Menu-item>
+            <Menu-item name="12">
+                热门装修
+            </Menu-item>
+            <Menu-item name="13">
+                热门商家
+            </Menu-item>
+        </i-menu>
+        <div v-show="showList">
+            <Row :gutter="16">
+                <div class="search-group">
+                    <i-col span="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.title" @on-enter="query" placeholder="请输入标题" />
+                        </div>
+
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+
+                    </i-col>
+
+                </div>
+                <div class="buttons-group">
+                    <i-button
+                        v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'"
+                        type="info" @click="add">新增</i-button>
+                    <i-button
+                        v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null' "
+                        type="warning" @click="edit"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                    <i-button
+                        v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null' "
+                        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">推荐位</p>
+            <i-form :model="info" ref="formValidate" :rules="ruleValidate" :label-width="120">
+                <Form-item label="封面" prop="image">
+                    <div class="demo-upload-list">
+                        <template v-if="info.image">
+                            <img style="width: 167px;" :src="info.image">
+                            <div class="demo-upload-list-cover">
+                                <i class="ivu-icon ivu-icon-eye" @click="eyeImage(info.image)"></i>
+                                <i class="ivu-icon ivu-icon-trash-a" @click="info.image=''"></i>
+                            </div>
+                        </template>
+                    </div>
+                    <div class="c-btn">
+                        <Upload action="../sys/oss/upload" :format="['jpg','png']" :max-size="1024*5"
+                             :on-success="handleSuccessListPicUrl"
+                            :on-format-error="handleFormatError" :show-upload-list="false"
+                            :on-exceeded-size="handleMaxSize">
+                            <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                        </Upload>
+                    </div>
+                    <p>1、支持png、jpg图片格式;</p>
+                    <p>2、最大可上传5M的图片。</p>
+                    <p>3、推荐大小:800 * 800 像素</p>
+                    <div>
+                    </div>
+                </Form-item>
+
+                <Form-item label="标题" prop="title">
+                    <div class="c-winput">
+                        <i-input :maxlength="50" v-model="info.title" placeholder="请输入标题" />
+                    </div>
+                </Form-item>
+
+                <Form-item v-if="!showList" label="直播间链接" prop="connectId">
+                    <div class="c-winput" style="width:calc(60% + 20px)">
+                        <i-select v-if="!info.id" filterable v-model="info.connectId" style="width:calc(100% - 20px)"
+                            @on-change="currUrl">
+                            <i-option v-for="(item,i) in myScene" :key="i" :label="item.name" :value="item.id">
+                                {{item.name}}
+                            </i-option>
+                        </i-select>
+                        <div v-else class="c-winput">
+                            <i-input v-model="info.sceneName" disabled placeholder="直播间链接" />
+                        </div>
+                        <!-- <Tooltip placement="right" style="margin-right: 4px;">
+                            <div slot="content">
+                                <p>直播间链接数据,来源于指房宝APP-编辑后台</p>
+                            </div>
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                        </Tooltip> -->
+
+                        <div style="color:red;">注意:直播间绑定后,将无法进行修改。</div>
+                        <div v-if="info.sceneUrl!=''">
+                            链接:<a :href="info.sceneUrl" target="_blank">{{info.sceneUrl}}</a>
+                        </div>
+                    </div>
+                </Form-item>
+                <Form-item label="推荐排序" prop="orderNum">
+                    <div class="c-winput">
+                        <!-- <i-input :maxlength="4" type="number" @on-change="limitNum" v-model.number="info.orderNum"
+                            placeholder="" /> -->
+                        <i-input :maxlength="4" type="number" v-model.number="info.orderNum"
+                            placeholder="" />
+                    </div>
+                </Form-item>
+
+                <Form-item>
+                    <i-button type="warning" @click="reload" style="margin-left: 8px">取消</i-button>
+
+                    <i-button type="primary" @click="handleSubmit('formValidate')">保存</i-button>
+                </Form-item>
+            </i-form>
+        </Card>
+
+
+
+
+
+
+
+    </div>
+
+    <script src="${rc.contextPath}/js/shop/recommend.js?_${date.systemTime}"></script>
+</body>
+
+</html>

+ 231 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/sceneAllocation.html

@@ -0,0 +1,231 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>场景分配</title>
+    #parse("sys/header.html")
+    <style>
+        .ivu-spin-fix {
+            z-index: 99999999;
+        }
+
+        .demo-spin-icon-load {
+            animation: ani-demo-spin 1s linear infinite;
+        }
+
+        @keyframes ani-demo-spin {
+            from {
+                transform: rotate(0deg);
+            }
+
+            50% {
+                transform: rotate(180deg);
+            }
+
+            to {
+                transform: rotate(360deg);
+            }
+        }
+
+        .demo-spin-col {
+            height: 100px;
+            position: relative;
+            border: 1px solid #eee;
+        }
+    </style>
+</head>
+
+<body>
+    <div id="rrapp" v-cloak>
+        <div v-show="showList">
+            <Row :gutter="16">
+                <div class="search-group">
+                    <i-col span="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.name" @on-enter="query" placeholder="场景名称" />
+                        </div>
+                        <!-- <div style="display: inline-block;">
+                        <i-input v-model="q.brandName" @on-enter="query" placeholder="VR场景名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-select v-model="q.bindStatus" >
+                            <i-option value=" ">全部</i-option>
+                            <i-option value="1">已绑定</i-option>
+                            <i-option value="0">未绑定</i-option>
+
+                        </i-select>
+                    </div> -->
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+
+                        <!-- <div style="display: inline-block;margin-left: 10px;">可新增数量为 {{lessNum}} 个</div> -->
+                    </i-col>
+
+                </div>
+                <div class="buttons-group">
+                    #if($shiro.hasPermission("brand:list"))
+                    <!-- <i-button v-if="localStorage.getItem('userExpTime') > Date.now()" type="info" @click="open">绑定员工</i-button> -->
+                    <i-button
+                        v-if="localStorage.getItem('userExpTime') > Date.now() || localStorage.getItem('userExpTime') == 'null'"
+                        type="info" @click="showYoN">修改</i-button>
+                    #end
+                </div>
+            </Row>
+            <table id="jqGrid"></table>
+            <div id="jqGridPager"></div>
+        </div>
+
+        <Card v-show="showInApp">
+            <p slot="title">{{title}}</p>
+            <i-form :model="appShow" ref="formValidate1" :rules="ruleValidate1" :label-width="120">
+                <div>
+                    <Form-item label="场景名称:" prop="name">
+                        <!-- <div>{{appShow.name}}</div> -->
+                        <div>
+                            {{appShow.name}}
+                        </div>
+                        <!-- <i-input type="text" maxlength="50" v-model="appShow.name" /> -->
+                    </Form-item>
+                    <Form-item label="封面" prop="appListPicUrl">
+                        <div class="demo-upload-list">
+                            <template>
+                                <img v-if="!appShow.appListPicUrl" style="width: 167px;"
+                                    src="../statics/img/pic_bg@2x.png">
+                                <img v-else style="width: 167px;" :src="appShow.appListPicUrl">
+                                <div class="demo-upload-list-cover">
+                                    <i class="ivu-icon ivu-icon-eye" @click="eyeImage(appShow.appListPicUrl)"></i>
+                                    <i class="ivu-icon ivu-icon-trash-a" @click="appShow.appListPicUrl=''"></i>
+                                </div>
+                            </template>
+                        </div>
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png','gif']" :max-size="1024*2"
+                                :on-success="handleSuccessListPicUrl" :on-format-error="handleFormatError"
+                                :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                        </div>
+                        <p>1、支持png、jpg和gif图片格式;</p>
+                        <p>2、最大可上传2M的图片。</p>
+                        <p>3、推荐大小:400 * 400 像素</p>
+                        <div>
+                        </div>
+                    </Form-item>
+                    <Form-item label="是否在小程序里显示" prop="isShow">
+                        <Radio-group v-model="appShow.isShow">
+                            <Radio label="0">
+                                <span>否</span>
+                            </Radio>
+                            <Radio label="1">
+                                <span>是</span>
+                            </Radio>
+                        </Radio-group>
+                    </Form-item>
+                    <Form-item>
+                        <i-button type="primary" @click="handleSubmit1('formValidate1')">提交</i-button>
+                        <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                    </Form-item>
+                </div>
+            </i-form>
+        </Card>
+        <div v-show="loading">
+            <Spin fix>
+                <Icon type="load-c" size=30 class="demo-spin-icon-load"></Icon>
+                <div style="font-size: 20px;">Loading</div>
+            </Spin>
+        </div>
+
+
+
+
+        <Card v-show="roleBangding">
+            <p slot="title">{{title}}</p>
+            <i-form ref="formValidate" :model="user" :rules="ruleValidate" :label-width="80">
+                <div style="width: 100%;">
+                    <Form-item label="用户名" prop="username">
+                        <div class="c-winput">
+                            <i-input v-model="user.username" placeholder="登录账号" />
+                        </div>
+                    </Form-item>
+                    <Form-item label="所属公司" prop="deptName">
+                        <div class="c-winput" @click="deptTree">
+                            <i-input type="text" v-model="user.deptName" icon="eye" readonly="readonly"
+                                readonly="readonly" placeholder="所属公司" />
+                        </div>
+                    </Form-item>
+                    <Form-item label="邮箱" prop="email">
+                        <div class="c-winput">
+                            <i-input v-model="user.email" placeholder="邮箱" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="手机号" prop="mobile">
+                        <div class="c-winput">
+                            <i-input v-model="user.mobile" placeholder="手机号" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="VR场景关联">
+                        <i-button @click="getBrandList">添加VR场景</i-button>
+
+                        <div v-if="user.brandList">
+                            <span style="margin-right: 20px;" v-for="(item,i) in user.brandList"
+                                :key="i">{{item.brandName||item.name}}</span>
+                        </div>
+
+                    </Form-item>
+
+                    <Form-item label="角色" prop="roleIdList">
+                        <Checkbox-group v-model="user.roleIdList">
+                            <Checkbox :label="role.roleId" v-for="role in roleList">{{role.roleName}}</Checkbox>
+                        </Checkbox-group>
+                    </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>
+                </div>
+            </i-form>
+        </Card>
+
+        <Modal v-model="modal1" title="添加VR场景关联" @on-ok="ok" @on-cancel="cancel">
+            <!-- 
+       <CheckboxGroup v-model="social" @on-change="checkAllGroupChange">
+        <Checkbox  :label="brand.name" v-for="(brand,idx) in brandsList" :key='idx'>
+            <span>{{brand.name}}</span>
+        </Checkbox>
+    </CheckboxGroup> -->
+
+            <div class="checkbox-item" @click="clickCheck(brand,idx)" v-for="(brand,idx) in brandsList" :key='idx'>
+                <span class="checkbox-kuang"></span>
+                <img v-if="brand.checked" src="http://4d-tjw.oss-cn-shenzhen.aliyuncs.com/images/fdsq-click.png" alt="">
+                <span>{{brand.name}}</span>
+            </div>
+
+            <Page style="margin-top: 20px;" :total="brandTotal" @on-change="pageChange" :page-size='brandPerPage'
+                :current='brandPage' size="small" />
+        </Modal>
+
+    </div>
+    <!-- 选择公司 -->
+    <div id="deptLayer" style="display: none;padding:10px;">
+        <ul id="deptTree" class="ztree"></ul>
+    </div>
+    <script src="${rc.contextPath}/js/shop/sceneAllocation.js?_${date.systemTime}"></script>
+</body>
+
+</html>

+ 60 - 0
platform-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>

+ 61 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/selectUser.html

@@ -0,0 +1,61 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>管理员列表</title>
+    #parse("sys/header.html")
+    <style>
+        .ui-jqgrid tr.jqgrow td {
+            white-space: normal !important;
+            height:auto;
+            vertical-align:text-top;
+            padding-top:2px;
+        }
+    </style>
+</head>
+<body>
+<div id="rrapp" v-cloak>
+    <div v-show="showList">
+        <Row :gutter="16">
+            <div class="search-group">
+                <i-col span="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.key" @on-enter="query" placeholder="请输入员工名"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </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>
+        <Row :gutter="16">
+            <div style="padding-left: 8px;">场景名称:{{sceneName||'-'}}<span style="margin: 0 30px;"></span>直播间名称:{{name||'-'}}</div>
+        </Row>
+        <table id="jqGrid"></table>
+        <div id="jqGridPager"></div>
+        <div>已选择 <span id="selctedNum">0</span> 名</div>
+    </div>
+
+    <div style="margin-top: 30px; text-align: center;">
+        <i-button type="primary" @click="submit">提交</i-button>
+        <i-button @click="close" style="margin-left: 8px">返回</i-button>
+    </div>
+
+</div>
+<!-- 选择部门 -->
+<div id="deptLayer" style="display: none;padding:10px;">
+    <ul id="deptTree" class="ztree"></ul>
+</div>
+<script src="${rc.contextPath}/js/shop/selectUser.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 107 - 0
platform-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>

+ 64 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/specification.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="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.name" @on-enter="query" placeholder="商品属性" />
+                        </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+                    </i-col>
+                </div>
+                <div class="buttons-group">
+                    #if($shiro.hasPermission("specification:save"))
+                    <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" type="info"
+                        @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                    #end #if($shiro.hasPermission("specification:update"))
+                    <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" type="warning"
+                        @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                    #end #if($shiro.hasPermission("specification:delete"))
+                    <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)|| (localStorage.getItem('userExpTime') == 'null' &&JSON.parse(localStorage.getItem('userInfo')).roleIdList[0] !=8)" 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">
+                    <div class="c-winput">
+                        <i-input v-model="specification.name" placeholder="商品属性" />
+                    </div>
+                </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>

+ 159 - 0
platform-admin/src/main/webapp/WEB-INF/page/shop/staff.html

@@ -0,0 +1,159 @@
+<!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="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.key" @on-enter="query" placeholder="员工名称" />
+                        </div>
+                        <!-- <div style="display: inline-block;">
+                        <i-select v-model="q.deptId" placeholder="请选择所属公司">
+                            <i-option value=" ">全部</i-option>
+                            <i-option v-for="(item,i) in brands" :key="i" :value="item.id">{{item.name}}</i-option>
+                        </i-select>
+                    </div> -->
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.deptName" @on-enter="query" placeholder="所属公司" />
+                        </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+                        <!-- <div v-if="userRole!=5&&userRole!=6" style="display: inline-block;margin-left: 10px;">可新增数量为 {{lessNum}} 个</div> -->
+                        <div v-if="userRole==6" style="display: inline-block;margin-left: 10px;">可新增数量为 {{lessNum}} 个
+                        </div>
+                    </i-col>
+
+                </div>
+                <div class="buttons-group">
+                    <div class="buttons-group">
+                        <i-button
+                            v-if="(localStorage.getItem('userExpTime') > Date.now() && userRole == 6) || (localStorage.getItem('userExpTime') == 'null' && userRole == 6)"
+                            type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                        <i-button
+                            v-if="(localStorage.getItem('userExpTime') > Date.now() && userRole == 6) || (localStorage.getItem('userExpTime') == 'null' && userRole == 6)"
+                            type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                        <i-button
+                            v-if="(localStorage.getItem('userExpTime') > Date.now() && userRole == 6) || (localStorage.getItem('userExpTime') == 'null' && userRole == 6)"
+                            type="error" @click="checkDel"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+
+                        <!-- #if($shiro.hasPermission("user:save"))
+                        <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && userRole == 6) || (localStorage.getItem('userExpTime') == 'null' && userRole == 6)" type="info" @click="add"><i class="fa fa-plus"></i>&nbsp;新增</i-button>
+                        #end #if($shiro.hasPermission("user:update"))
+                        <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && userRole == 6) || (localStorage.getItem('userExpTime') == 'null' && userRole == 6)" type="warning" @click="update"><i class="fa fa-pencil-square-o"></i>&nbsp;修改</i-button>
+                        #end #if($shiro.hasPermission("user:delete"))
+                        <i-button v-if="(localStorage.getItem('userExpTime') > Date.now() && userRole == 6) || (localStorage.getItem('userExpTime') == 'null' && userRole == 6)" type="error" @click="del"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                        #end -->
+                    </div>
+                </div>
+            </Row>
+            <table id="jqGrid"></table>
+            <div id="jqGridPager"></div>
+        </div>
+        <Modal v-model="show_delModal" title="删除员工">
+            <p v-if="delInfo.type==1" style="padding:10px 0 20px 20px;">是否确定删除员工?</p>
+            <p v-if="delInfo.type==2" style="padding:10px 0 20px 20px;">删除失败,公司仅剩一名员工,不可进行删除</p>
+            <p v-if="delInfo.type==3" style="padding:10px 0 20px 20px;">请将当前员工的直播间数据进行迁移后,再删除员工</p>
+
+            <div v-if="delInfo.type==3">
+                <i-form :model="delInfo" :label-width="120" ref="formDelValidate" :rules="delValidate">
+                    <Form-item label="选择迁移的员工" prop="select">
+                        <i-select v-model="delInfo.select" placeholder="请选择">
+                            <i-option :value="i" v-for="i in delInfo.list">{{i}}</i-option>
+                        </i-select>
+                    </Form-item>
+                </i-form>
+            </div>
+
+            <div slot="footer">
+                <i-button type="primary" size="large" @click="comfirmDel">确定</i-button>
+                <i-button type="text" size="large" v-if="delInfo.type!=2" @click="cancelDel">取消</i-button>
+
+            </div>
+        </Modal>
+        <Card v-show="!showList">
+            <p slot="title">{{title}}</p>
+            <i-form ref="formValidate" :model="user" :rules="ruleValidate" :label-width="80">
+                <div style="width: 100%;">
+
+                    <Form-item label="手机号" prop="mobile">
+                        <div class="c-winput">
+                            <i-input :maxlength='11' v-model="user.mobile" placeholder="手机号" />
+                        </div>
+                        <div class="ivu-form-item-error-tip" style="display: none;" id="isSign">手机号未在指房宝APP中进行注册</div>
+                        <Tooltip content="" placement="right">
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                            <div slot="content">
+                                <p>手机号需在指房宝APP注册后才可新增</p>
+                            </div>
+                        </Tooltip>
+                    </Form-item>
+
+                    <Form-item label="员工名称" prop="username">
+                        <div class="c-winput">
+                            <i-input :maxlength='20' v-model="user.username" placeholder="请输入员工名称" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="角色" prop="roleId">
+                        <Radio-group v-model="user.roleId">
+                            <Radio :key="role" :value="role.roleId" :label="role.roleId" v-for="role in roleList">
+                                {{role.roleName}}</Radio>
+                        </Radio-group>
+                    </Form-item>
+
+                    <Form-item label="状态" prop="status">
+                        <Radio-group v-model="user.status">
+                            <Radio value="1" label="1">
+                                <span>正常</span>
+                            </Radio>
+                            <Radio value="0" label="0">
+                                <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>
+                </div>
+            </i-form>
+        </Card>
+
+        <Modal v-model="modal1" title="添加VR场景关联" @on-ok="ok" @on-cancel="cancel">
+            <!-- 
+       <CheckboxGroup v-model="social" @on-change="checkAllGroupChange">
+        <Checkbox  :label="brand.name" v-for="(brand,idx) in brandsList" :key='idx'>
+            <span>{{brand.name}}</span>
+        </Checkbox>
+    </CheckboxGroup> -->
+
+            <div class="checkbox-item" @click="clickCheck(brand,idx)" v-for="(brand,idx) in brandsList" :key='idx'>
+                <span class="checkbox-kuang"></span>
+                <img v-if="brand.checked" src="http://4d-tjw.oss-cn-shenzhen.aliyuncs.com/images/fdsq-click.png" alt="">
+                <span>{{brand.name}}</span>
+            </div>
+
+            <Page style="margin-top: 20px;" :total="brandTotal" @on-change="pageChange" :page-size='brandPerPage'
+                :current='brandPage' size="small" />
+        </Modal>
+
+    </div>
+    <!-- 选择公司 -->
+    <div id="deptLayer" style="display: none;padding:10px;">
+        <ul id="deptTree" class="ztree"></ul>
+    </div>
+    <script src="${rc.contextPath}/js/shop/staff.js?_${date.systemTime}"></script>
+</body>
+
+</html>

+ 142 - 0
platform-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="3">
+                    <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="3">
+                    <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="3">
+                    <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="3">
+                    <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="3">
+                    <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="3">
+                    <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
platform-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="3">
+                    <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="3">
+                    <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
platform-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>
+            <!--#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-->
+            <div class="buttons-group">
+                #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
platform-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>

+ 62 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/config.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">
+
+                <div style="display: inline-block;">
+                    <i-input v-model="q.key" @on-enter="query" placeholder="参数名"/>
+                </div>
+                <div style="display: inline-block;">
+                    <i-button @click="query">查询</i-button>
+                </div>
+
+            </i-col>
+            <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">
+          <div style="width: 100%;">
+            <Form-item label="参数名" prop="key">
+                <div class="c-winput">
+                    <i-input v-model="config.key" placeholder="参数名"/>
+                </div>
+            </Form-item>
+            <Form-item label="参数值" prop="value">
+                <div class="c-winput">
+                    <i-input v-model="config.value" placeholder="参数值"/>
+                </div>
+            </Form-item>
+            <Form-item label="备注" prop="remark">
+                <div class="c-winput">
+                    <i-input type="textarea" v-model="config.remark" placeholder="备注"/>
+                </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>
+          </div>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/config.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 143 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/dept.html

@@ -0,0 +1,143 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>公司管理</title>
+    #parse("sys/header.html")
+    <!-- <link rel="stylesheet" href="statics/css/iview.css"> -->
+    <!-- <link rel="stylesheet" href="${rc.contextPath}/css/goods.css"> -->
+</head>
+
+<body>
+    <div id="rrapp" v-cloak>
+        <div v-show="showList">
+            <Row :gutter="16">
+                <div class="search-group">
+                    <i-col span="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.name" @on-enter="query" placeholder="公司名称" />
+                        </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+                    </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&&comfirmActive==1" :key="comfirmActive">
+            <p slot="title">{{title}}</p>
+            <i-form ref="formValidate" :model="dept" :rules="rule1" :label-width="120">
+                <div style="width: 100%;">
+                    <Form-item label="指房宝APP账号" prop="username">
+                        <div class="c-winput">
+                            <i-input v-model="dept.username" placeholder="请输入账号名称" />
+                        </div>
+                        <Tooltip content="需拥有指房宝APP账号,才可新增公司。(前往注册)" placement="right">
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                        </Tooltip>
+                    </Form-item>
+
+                    <Form-item label="所属密码" prop="password">
+                        <div class="c-winput">
+                            <i-input type="password" v-model="dept.password" placeholder="请输入账号密码" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item>
+                        <i-button type="primary" @click="validUser">下一步</i-button>
+                        <i-button type="warning" @click="reload" style="margin-left: 8px">返回</i-button>
+                    </Form-item>
+                </div>
+            </i-form>
+
+
+        </Card>
+
+        <Card v-show="!showList&&comfirmActive==2" :key="comfirmActive">
+            <i-form ref="formValidate" :model="dept" :rules="rule2" :label-width="105">
+                <div style="width: 100%;">
+                    <Form-item label="公司名称" prop="name">
+                        <div class="c-winput">
+                            <i-input :maxlength="20" v-model="dept.name" placeholder="请输入公司名称" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="公司封面" prop="logoUrl">
+                        <div class="demo-upload-list">
+                            <template v-if="dept.logoUrl">
+                    <img style="width: 74px;" :src="dept.logoUrl">
+                    <div class="demo-upload-list-cover">
+                        <i class="ivu-icon ivu-icon-eye" @click="eyeImageItemPicUrl(dept.logoUrl)"></i>
+                        <i class="ivu-icon ivu-icon-trash-a" @click="dept.logoUrl=''"></i>
+                    </div>
+                </template>
+                        </div>
+                        <div class="c-btn">
+                            <Upload action="../sys/oss/upload" :format="['jpg','jpeg','png']" :max-size="1024*5" :on-success="handleSuccessPicUrl" :on-format-error="handleFormatError" :show-upload-list="false" :on-exceeded-size="handleMaxSize">
+                                <i-button type="warning" icon="ios-cloud-upload-outline">上传图片</i-button>
+                            </Upload>
+                            <div style="text-align: left;">
+                                <p>1、支持png和jpg图片格式;</p>
+                                <p>2、最大可上传5M的图片;</p>
+                                <p>3、推荐大小:108 * 81 像素。</p>
+                            </div>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="可新增员工数" prop="staffNum">
+                        <div class="c-winput">
+                            <i-input :maxlength="4" @on-change="limitNum" v-model="dept.staffNum" placeholder="请输入可新增员工数" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="到期时间" prop="expirationDate">
+                        <div class="c-winput">
+                            <!-- <i-input v-model="dept.expirationDate" placeholder="请输入到期时间,如“2021-08-10”"></i-input> -->
+                            <Date-picker type="date" v-model="dept.expirationDate" placeholder="选择日期" style="width: 200px"></Date-picker>
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="排序号" prop="orderNum">
+                        <div class="c-winput">
+                            <i-input :maxlength="4" v-model="dept.orderNum" placeholder="请输入排序号" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item>
+                        <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                        <i-button type="warning" @click="back" style="margin-left: 8px">返回</i-button>
+                    </Form-item>
+                </div>
+            </i-form>
+        </Card>
+
+    </div>
+
+    <!-- 选择公司 -->
+    <div id="deptLayer" style="display: none;padding:10px;">
+        <ul id="deptTree" class="ztree"></ul>
+    </div>
+    <script src="${rc.contextPath}/statics/libs/common.js"></script>
+    <script src="${rc.contextPath}/statics/libs/base64.min.js"></script>
+    <script src="${rc.contextPath}/js/sys/dept.js?_${date.systemTime}"></script>
+</body>
+
+</html>

+ 27 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/generator.html

@@ -0,0 +1,27 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>代码生成器</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp">
+    <div class="grid-btn">
+        <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>
+            <i-button @click="reloadSearch">重置</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>
+    <table id="jqGrid"></table>
+    <div id="jqGridPager"></div>
+</div>
+
+<script src="${rc.contextPath}/js/sys/generator.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 69 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/header.html

@@ -0,0 +1,69 @@
+<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">
+<!--polyfill-->
+<!-- <script src="https://cdn.bootcss.com/jquery-browser/0.1.0/jquery.browser.min.js"></script>
+<script src="https://cdn.bootcss.com/babel-polyfill/7.8.7/polyfill.min.js"></script> -->
+<!--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>
+<!--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}/js/common.js"></script>
+
+
+<script>
+    var _hmt = _hmt || [];
+    (function() {
+        var hm = document.createElement("script");
+        hm.src = "https://hm.baidu.com/hm.js?4656e49e8efa9f2ad6868ea26fb8984c";
+        var s = document.getElementsByTagName("script")[0];
+        s.parentNode.insertBefore(hm, s);
+    })();
+</script>

File diff suppressed because it is too large
+ 4217 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/icon.html


+ 36 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/log.html

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

+ 82 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/macro.html

@@ -0,0 +1,82 @@
+<!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 type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+            </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>

+ 101 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/main.html

@@ -0,0 +1,101 @@
+<!DOCTYPE html>
+<html>
+
+<head>
+    <title>欢迎页</title>
+    #parse("sys/header.html")
+
+    <!-- <script src='https://gitee.com/fuyang_lipengjun/platform/widget_preview'></script> -->
+    <style>
+        body {
+            overflow: hidden;
+        }
+        
+        .pro_name a {
+            color: #4183c4;
+        }
+        
+        .osc_git_title {
+            background-color: #fff;
+        }
+        
+        .osc_git_box {
+            background-color: #fff;
+        }
+        
+        .osc_git_box {
+            border-color: #E3E9ED;
+            margin: 20px;
+        }
+        
+        .osc_git_info {
+            color: #666;
+        }
+        
+        .osc_git_main a {
+            color: #9B9B9B;
+        }
+        
+        .animated {
+            position: relative;
+        }
+        
+        .animated img {
+            width: 100%;
+            margin: 0 auto;
+            /* display: inherit; */
+            position: relative;
+            top: -150px;
+        }
+        
+        .box-center {
+            position: absolute;
+            top: 27%;
+            left: 31%;
+            transform: translate(-50%, -50%);
+        }
+        
+        .box-center img {
+            /* width: 190px; */
+            width: 80px;
+            position: absolute;
+            top: -160px;
+            left: -100px;
+        }
+        
+        .box-center p {
+            font-size: 28px;
+            color: #fff;
+        }
+        
+        .box-center p:last-of-type {
+            font-size: 48px;
+            font-weight: bold;
+        }
+        
+        @media screen and (max-width: 1500px) {
+            .animated img {
+                top: 0;
+            }
+            .box-center {
+                top: 42%;
+            }
+            .box-center img {
+                top: -125px;
+                left: -70px;
+            }
+        }
+    </style>
+</head>
+
+<body>
+    <div class=" animated fadeInRight">
+        <img src="http://4d-tjw.oss-cn-shenzhen.aliyuncs.com/images/login_bg.jpg" alt="">
+        <div class="box-center">
+            <img src="../statics/img/4d_zfb_logo.png" alt="">
+            <p>四维指房宝</p>
+        </div>
+    </div>
+</body>
+
+</html>

+ 111 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/menu.html

@@ -0,0 +1,111 @@
+<!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 type="ghost" @click="reload"><i class="fa fa-refresh"></i>&nbsp;刷新</i-button>
+            </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">
+            <div style="width: 100%;">
+                <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">
+                    <div class="c-winput">
+                        <i-input v-model="menu.name" placeholder="菜单名称或按钮名称"/>
+                    </div>
+                </Form-item>
+    
+                <Form-item label="上级菜单" v-if="menu.type == 2" prop="parentName">
+                    <div class="c-winput" @click="menuTree" >
+                        <i-input v-model="menu.parentName" icon="eye" readonly="readonly"
+                                placeholder="一级菜单"/>
+                    </div>
+                </Form-item>
+                <Form-item label="上级菜单" v-if="menu.type != 2">
+                    <div class="c-winput" @click="menuTree" >
+                        <i-input v-model="menu.parentName" icon="eye" readonly="readonly"
+                                placeholder="一级菜单"/>
+                    </div>
+                </Form-item>
+    
+                <Form-item v-if="menu.type == 1" label="菜单URL" prop="url">
+                    <div class="c-winput">
+                         <i-input v-model="menu.url" placeholder="菜单URL"/>
+                    </div>
+                </Form-item>
+                <Form-item v-if="menu.type == 1 || menu.type == 2" label="授权标识" prop="perms">
+                    <div class="c-winput">
+                        <i-input v-model="menu.perms" placeholder="多个用逗号分隔,如:user:list,user:create"/>
+                    </div>
+                </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">
+                    <div class="c-winput" @click="selectIcon">
+                        <i-input v-model="menu.icon" placeholder="图标,点击右边按钮选取图标"  icon="eye"/>
+                    </div>
+                </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>
+            </div>
+        </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>

+ 243 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/newUser.html

@@ -0,0 +1,243 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>新用户登录</title>
+    #parse("sys/header.html")
+	
+	<style>
+        body{
+            overflow: hidden;
+        }
+		.pro_name a{color: #4183c4;}
+		.osc_git_title{background-color: #fff;}
+		.osc_git_box{background-color: #fff;}
+		.osc_git_box{border-color: #E3E9ED;margin: 20px;}
+		.osc_git_info{color: #666;}
+        .osc_git_main a{color: #9B9B9B;}
+        .animated{
+            position: relative;
+            width: 100%;
+            height: 100%;
+        }
+        .box-center{
+            position: absolute;
+            top: 50%;
+            left: 50%;
+            transform: translate(-50%,-50%);
+            color: #000;
+            width: 80%;
+        }
+
+        
+        .box-center h1{
+            font-size: 42px;
+            font-weight: bold;
+            text-align: center;
+            margin-bottom: 100px;
+        }
+
+        .box-center ul{
+            display: flex;
+            justify-content: space-around;
+        }
+        .box-center ul li{
+            text-align: center;
+            cursor: pointer;
+            padding: 30px;
+            border: solid 1px rgba(0, 0, 0, 0);
+        }
+
+        .box-center ul li img{
+            width: 200px;
+            margin-bottom: 40px;
+        }
+
+        .box-center ul .active{
+            border: solid 1px #1fe4dc;
+        }
+
+        .box-center ul p{
+            max-width: 78%;
+            margin: 0 auto;
+            text-align: left;
+        }
+
+        .box-center ul p:first-of-type{
+            font-size: 36px;
+            max-width: unset;
+            text-align: center;
+            font-weight: bold;
+            margin-bottom: 10px;
+        }
+
+        .box-center .submitbtn{
+            width: 100%;
+            text-align: center;
+            margin-top: 80px;
+        }
+
+        @media screen and (max-width: 1500px) {
+            .animated img{
+                top: 0;
+            }
+            .box-center{
+                top: 42%;
+            }
+            .box-center img{
+                top: -125px;
+                left: -70px;
+            }
+        }
+	</style>
+</head>
+<body>
+<div id="rrapp" class="animated fadeInRight">
+    <div class="box-center" v-if="!comfirmActive">
+        <h1>请选择创建或加入 公司/VR场景</h1>
+        <ul>
+            <li @click="active=1" :style="{border:active === 1?'solid 1px #1fe4dc':''}">
+                <img src="/platform-framework/statics/img/userNew1.png" alt="">
+                <p>创建公司/VR场景</p>
+                <p>创建公司/VR场景,适用于拥有门店的商家且未加入看店4DKanKan</p>
+            </li>
+            <li @click="active=2" :style="{border:active === 2?'solid 1px #999':''}">
+                <img src="/platform-framework/statics/img/userNew2.png" alt="">
+                <p>加入公司/VR场景</p>
+                <p>加入公司/VR场景,适用于公司/VR场景已加入看店4DKanKan</p>
+            </li>
+        </ul>
+        <div class="submitbtn">
+            <i-button size="large" @click="comfirmActive=active" type="warning" :style="!active?'background:#999;border-color: #999;':''">提交</i-button>
+        </div>
+    </div>
+
+    <Card v-if="comfirmActive===1" :key='comfirmActive'>
+        <p slot="title">基本信息</p>
+        <i-form ref="formValidate" :model="dept" :rules="rule1" :label-width="140">
+          <div style="width: 100%;">
+            <Form-item label="公司名称" prop="deptName">
+                <div class="c-winput">
+                    <i-input v-model="dept.deptName" placeholder="公司名称"/>
+                </div>
+            </Form-item>
+
+            <Form-item label="管理员名称" prop="adminUserName">
+                <div class="c-winput" >
+                    <i-input v-model="dept.adminUserName" disabled placeholder="管理员名称"/>
+                </div>
+            </Form-item>
+
+            <Form-item label="绑定管理员电话" prop="adminPhoneNum">
+                <div class="c-winput" >
+                    <i-input v-model="dept.adminPhoneNum" disabled placeholder="管理员电话"/>
+                </div>
+            </Form-item>
+
+            <Form-item label="验证码" prop="smsCode">
+                <div class="c-winput" style="display:flex">
+                    <div  style="width:78%;">
+                        <i-input v-model="dept.smsCode" placeholder="请输入验证码"/>
+                    </div>
+                    <i-button :type="!jishi?'warning':''" style="width:20%; margin-left:2%;" @click="getSmsCode(dept.adminPhoneNum)" >
+                        <template v-if="!jishi">点击获取</template>
+                        <template v-else>{{`${interTime}s后重新发送`}}</template>
+                    </i-button>
+                </div>
+            </Form-item>
+
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button @click="comfirmActive=''" style="margin-left: 8px">返回</i-button>
+            </Form-item>
+        </div>
+        </i-form>
+    </Card>
+
+    <Card v-if="comfirmActive===2" :key='comfirmActive'>
+        <p slot="title">验证信息</p>
+        <i-form ref="formValidate" :model="dept" :rules="rule2" :label-width="140">
+          <div style="width: 100%;">
+            
+            <template v-if="!isNext">
+                <Form-item label="公司名称" prop="parentName">
+                    <div class="c-winput"  @click="deptTree">
+                        <i-input type="text" v-model="dept.parentName" icon="eye" readonly="readonly"
+                         readonly="readonly" placeholder="公司名称"/>
+                    </div>
+                </Form-item>
+                <Form-item label="所属管理员电话" prop="parentAdminPhoneNum">
+                    <div class="c-winput">
+                        <i-input v-model="dept.parentAdminPhoneNum" placeholder="请输入公司已绑定的管理员联系电话"/>
+                    </div>
+                </Form-item>
+    
+                <Form-item label="验证码" prop="parentSmsCode">
+                    <div class="c-winput" style="display:flex">
+                        <div  style="width:78%;">
+                            <i-input v-model="dept.parentSmsCode" placeholder="请输入验证码"/>
+                        </div>
+                        <i-button :type="!jishi?'warning':''" style="width:20%; margin-left:2%;" @click="getSmsCode(dept.parentAdminPhoneNum,'','checkParentId')" >
+                            <template v-if="!jishi">点击获取</template>
+                            <template v-else>{{`${interTime}s后重新发送`}}</template>
+                        </i-button>
+                    </div>
+                </Form-item>
+
+                <Form-item>
+                    <i-button type="primary" @click="validCode">提交</i-button>
+                    <i-button @click="comfirmActive=''" style="margin-left: 8px">返回</i-button>
+                </Form-item>
+            </template>
+
+           <template v-else>
+            <div style="font-size: 16px;font-weight: bold;margin-bottom: 10px;">基本信息</div>
+
+            <Form-item label="所在公司" prop="deptName">
+                <div class="c-winput">
+                    <i-input v-model="dept.deptName" placeholder="公司名称"/>
+                </div>
+            </Form-item>
+
+            <Form-item label="所属管理员名称" prop="adminUserName">
+                <div class="c-winput" >
+                    <i-input v-model="dept.adminUserName" disabled placeholder="管理员名称"/>
+                </div>
+            </Form-item>
+
+            <Form-item label="绑定管理员电话" prop="adminPhoneNum">
+                <div class="c-winput" >
+                    <i-input v-model="dept.adminPhoneNum" disabled placeholder="管理员电话"/>
+                </div>
+            </Form-item>
+
+            <Form-item label="验证码" prop="smsCode">
+                <div class="c-winput" style="display:flex">
+                    <div  style="width:78%;">
+                        <i-input v-model="dept.smsCode" placeholder="请输入验证码"/>
+                    </div>
+                    <i-button :type="!jishi2?'warning':''" style="width:20%; margin-left:2%;" @click="getSmsCode(dept.adminPhoneNum,2)" >
+                        <template v-if="!jishi2">点击获取</template>
+                        <template v-else>{{`${interTime2}s后重新发送`}}</template>
+                    </i-button>
+                </div>
+            </Form-item>
+
+            <Form-item>
+                <i-button type="primary" @click="handleSubmit('formValidate')">提交</i-button>
+                <i-button @click="isNext=false" style="margin-left: 8px">返回</i-button>
+            </Form-item>
+           </template>
+        </div>
+        </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/newUser.js?_${date.systemTime}"></script>
+
+</body>
+</html>

+ 126 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/oss.html

@@ -0,0 +1,126 @@
+<!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>
+            </div>
+            <div class="buttons-group">
+                <i-button type="primary" id="upload"><i class="fa fa-plus"></i>&nbsp;上传文件</i-button>
+                <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="4">
+                        <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>
+            <i-form ref="formValidate" :model="config" :rules="diskRuleValidate" v-if="config.type == 4"
+                    :label-width="130">
+                <Form-item label="存储路径" prop="diskPath">
+                    <i-input v-model="config.diskPath" placeholder="本地存储路径"/>
+                </Form-item>
+                <Form-item label="代理服务器" prop="proxyServer">
+                    <i-input v-model="config.proxyServer" placeholder="本地存储代理服务器,比如Nginx代理服务"/>
+                </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>

+ 104 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/region.html

@@ -0,0 +1,104 @@
+<!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="8" >
+                <div style="display: inline-block;">
+                    <i-input v-model="q.parentName" @on-enter="query" placeholder="上级区域"/>
+                </div>
+                <div style="display: inline-block;">
+                    <i-input v-model="q.name" @on-enter="query" placeholder="区域"/>
+                </div>
+                <div style="display: inline-block;">
+                    <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>
+                </div>
+                <div style="display: inline-block;">
+                    <i-button @click="query">查询</i-button>
+                </div>
+            </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> -->
+            <div class="buttons-group">
+                #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
+            </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="region" :rules="ruleValidate" :label-width="80">
+          <div style="width: 100%;">
+            <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">
+                <div class="c-winput">
+                    <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>
+                </div>
+            </Form-item>
+            <Form-item label="区域名称" prop="name">
+                <div class="c-winput">
+                    <i-input v-model="region.name" placeholder="区域名称"/>
+                </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>
+        </div>
+        </i-form>
+    </Card>
+</div>
+
+<script src="${rc.contextPath}/js/sys/region.js?_${date.systemTime}"></script>
+</body>
+</html>

+ 84 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/role.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="8">
+                    <div style="display: inline-block;">
+                        <i-input v-model="q.roleName" @on-enter="query" placeholder="角色名称"/>
+                    </div>
+                    <div style="display: inline-block;">
+                        <i-button @click="query">查询</i-button>
+                    </div>
+                </i-col>
+            </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">
+            <div style="width: 100%;">
+                <Form-item label="角色名称" prop="roleName">
+                    <div class="c-winput">
+                        <i-input v-model="role.roleName" placeholder="角色名称"/>
+                    </div>
+                </Form-item>
+                <Form-item label="所属部门" prop="deptName">
+                    <div class="c-winput" @click="deptTree">
+                        <i-input type="text" v-model="role.deptName" icon="eye" readonly="readonly"
+                                 readonly="readonly" placeholder="所属部门"/>
+                    </div>
+                </Form-item>
+                <Form-item label="备注" prop="remark">
+                    <div class="c-winput">
+                        <i-input type="textarea" v-model="role.remark" placeholder="备注"/>
+                    </div>
+                </Form-item>
+                <Form-item label="功能权限">
+                    <div style="overflow-y: auto;width: 60%;">
+                        <ul id="menuTree" class="ztree"></ul>
+                    </div>
+                </Form-item>
+                <Form-item label="数据权限">
+                    <div style="overflow-y: auto;width: 60%;">
+                        <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>
+            </div>
+        </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>

+ 101 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/schedule.html

@@ -0,0 +1,101 @@
+<!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.beanName" @on-enter="query" placeholder="bean名称"/>
+                </i-col>
+                <i-button @click="query">查询</i-button>
+            </div>
+            <div class="buttons-group">
+                #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
+            </div>
+        </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="80">
+                    <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>

+ 26 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/schedule_log.html

@@ -0,0 +1,26 @@
+<!DOCTYPE html>
+<html>
+<head>
+    <title>定时任务日志</title>
+    #parse("sys/header.html")
+</head>
+<body>
+<div id="rrapp">
+    <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>
+        </div>
+        <div class="buttons-group">
+            <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>

+ 57 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/smslog.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.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>
+            </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="appid" prop="appid">
+                <i-input v-model="config.appid" placeholder="appid"/>
+            </Form-item>
+            <Form-item label="appkey" prop="appkey">
+                <i-input v-model="config.appkey" placeholder="appkey"/>
+            </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>

+ 160 - 0
platform-admin/src/main/webapp/WEB-INF/page/sys/user.html

@@ -0,0 +1,160 @@
+<!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="8">
+                        <div style="display: inline-block;">
+                            <i-input v-model="q.username" @on-enter="query" placeholder="用户名" />
+                        </div>
+                        <div style="display: inline-block;">
+                            <i-button @click="query">查询</i-button>
+                        </div>
+                    </i-col>
+                </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> -->
+                    <i-button type="error" @click="checkDel"><i class="fa fa-trash-o"></i>&nbsp;删除</i-button>
+                    #end
+                </div>
+            </Row>
+            <table id="jqGrid"></table>
+            <div id="jqGridPager"></div>
+        </div>
+        <Modal v-model="show_delModal" title="删除员工">
+            <p v-if="delInfo.type==1" style="padding:10px 0 20px 20px;">是否确定删除员工?</p>
+            <p v-if="delInfo.type==2" style="padding:10px 0 20px 20px;">删除失败,公司仅剩一名员工,不可进行删除</p>
+            <p v-if="delInfo.type==3" style="padding:10px 0 20px 20px;">请将当前员工的直播间数据进行迁移后,再删除员工</p>
+
+            <div v-if="delInfo.type==3">
+                <i-form :model="delInfo" :label-width="120" ref="formDelValidate" :rules="delValidate">
+                    <Form-item label="选择迁移的员工" prop="select">
+                        <i-select v-model="delInfo.select" placeholder="请选择">
+                            <i-option :value="i" v-for="i in delInfo.list">{{i}}</i-option>
+                        </i-select>
+                    </Form-item>
+                </i-form>
+            </div>
+
+            <div slot="footer">
+                <i-button type="primary" size="large" @click="comfirmDel">确定</i-button>
+                <i-button type="text" size="large" v-if="delInfo.type!=2" @click="cancelDel">取消</i-button>
+
+            </div>
+        </Modal>
+        <Card v-show="!showList">
+            <p slot="title">{{title}}</p>
+            <i-form ref="formValidate" :model="user" :rules="ruleValidate" :label-width="80">
+                <div style="width: 100%;">
+                    <Form-item label="用户名" prop="username">
+                        <div class="c-winput">
+                            <i-input v-model="user.username" placeholder="登录账号" />
+                        </div>
+                    </Form-item>
+                    <Form-item label="所属公司" prop="deptName">
+                        <div class="c-winput" @click="deptTree">
+                            <i-input type="text" v-model="user.deptName" icon="eye" readonly="readonly"
+                                readonly="readonly" placeholder="所属公司" />
+                        </div>
+                    </Form-item>
+                    <Form-item label="邮箱" prop="email">
+                        <div class="c-winput">
+                            <i-input v-model="user.email" placeholder="邮箱" />
+                        </div>
+                    </Form-item>
+
+                    <Form-item label="手机号" prop="mobile">
+                        <div class="c-winput">
+                            <i-input v-model="user.mobile" placeholder="手机号" />
+                        </div>
+                        <div class="ivu-form-item-error-tip" style="display: none;" id="isSign1">手机号未在指房宝APP中进行注册</div>
+                        <Tooltip content="" placement="right">
+                            <i class="ivu-icon ivu-icon-help-circled"></i>
+                            <div slot="content">
+                                <p>手机号需在指房宝APP注册后才可新增</p>
+                            </div>
+                        </Tooltip>
+                    </Form-item>
+
+                    <!-- <Form-item label="VR场景关联">
+                <i-button  @click="getBrandList">添加VR场景</i-button>
+
+                <div v-if="user.brandList">
+                    <span style="margin-right: 20px;" v-for="(item,i) in user.brandList" :key="i">{{item.brandName||item.name}}</span>
+                </div>
+
+            </Form-item> -->
+
+                    <Form-item label="角色" prop="roleIdList">
+                        <!-- <Checkbox-group v-model="user.roleIdList">
+                            <Checkbox :label="role.roleId" v-for="role in roleList">{{role.roleName}}</Checkbox>
+                        </Checkbox-group> -->
+                        <Radio-group v-model="user.roleIdList" @on-change="change_role">
+                            <Radio :label="role.roleId" v-for="role in roleList">{{role.roleName}}
+                            </Radio>
+                        </Radio-group>
+                    </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>
+                </div>
+            </i-form>
+        </Card>
+
+        <Modal v-model="modal1" title="添加VR场景关联" @on-ok="ok" @on-cancel="cancel">
+            <!-- 
+       <CheckboxGroup v-model="social" @on-change="checkAllGroupChange">
+        <Checkbox  :label="brand.name" v-for="(brand,idx) in brandsList" :key='idx'>
+            <span>{{brand.name}}</span>
+        </Checkbox>
+    </CheckboxGroup> -->
+
+            <div class="checkbox-item" @click="clickCheck(brand,idx)" v-for="(brand,idx) in brandsList" :key='idx'>
+                <div>
+                    <span class="checkbox-kuang"></span>
+                    <img v-if="brand.checked" src="http://4d-tjw.oss-cn-shenzhen.aliyuncs.com/images/fdsq-click.png"
+                        alt="">
+                    <span>{{brand.sceneName}}</span>
+                </div>
+            </div>
+
+            <Page style="margin-top: 20px;" :total="brandTotal" @on-change="pageChange" :page-size='brandPerPage'
+                :current='brandPage' size="small" />
+        </Modal>
+
+    </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>

File diff suppressed because it is too large
+ 3 - 0
platform-admin/src/main/webapp/WEB-INF/page/test/axios.js


+ 77 - 0
platform-admin/src/main/webapp/WEB-INF/page/test/index.html

@@ -0,0 +1,77 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  <meta charset="UTF-8">
+  <meta name="viewport" content="width=device-width, initial-scale=1.0">
+  <title>商品关联</title>
+  <style>
+    #list {
+      margin-top: 20px;
+      display: grid;
+      grid-template-columns: repeat(auto-fill, 400px);;
+      grid-row-gap: 20px;
+      grid-column-gap: 20px;
+    }
+
+    #list > div {
+      width: 400px;
+      height: 200px;
+      padding-left: 220px;
+      box-sizing: border-box;
+      position: relative;
+      border: 1px solid #000;
+    }
+
+    #list > div > img {
+      position: absolute;
+      max-height: 100%;
+      left: 0;
+      max-width: 200px;
+      top: 50%;
+      transform: translateY(-50%);
+    }
+  </style>
+</head>
+<body>
+  
+  <div>
+    <input type="text" id="text" placeholder="搜索商品">
+    <button id="search">搜索</button>
+  </div>
+
+  <div id="list">
+
+  </div>
+
+  <script src="./axios.js"></script>
+  <script>
+    let $text = document.querySelector('#text')
+    let $search = document.querySelector('#search')
+    let $data = document.querySelector('#list')
+    
+    $search.addEventListener('click', ev => {
+      var params = new URLSearchParams();
+      params.append('sort', 'id')
+      params.append('keyword', $text.value)
+      params.append('order', 'desc')
+
+      axios({
+        url: 'https://shop.4dkankan.com/platform-framework/api/goods/list',
+        method: 'POST',
+        data: params
+      }).then(({data: {data: {goodsList}}}) => {
+        $data.innerHTML = goodsList.map(item => `
+          <div>
+            <img src="${item.list_pic_url}">
+            <div>
+              <p><label>标题:</label>${item.name}</p>
+              <p><label>id:</label>${item.id}</p>
+              <p><label>价格:</label>${item.market_price}</p>
+            </div>
+          </div>
+        `).join('')
+      })
+    })
+  </script>
+</body>
+</html>

+ 206 - 0
platform-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>

+ 0 - 0
platform-admin/src/main/webapp/WEB-INF/page/topic/save/axios.js


Some files were not shown because too many files changed in this diff