seyason 4 年之前
父节点
当前提交
1ad7ee2b7b
共有 100 个文件被更改,包括 18563 次插入0 次删除
  1. 21 0
      cloud-model/src/main/java/com/hssx/cloudmodel/controller/LoginLogController.java
  2. 21 0
      cloud-model/src/main/java/com/hssx/cloudmodel/controller/SysParamController.java
  3. 21 0
      cloud-model/src/main/java/com/hssx/cloudmodel/controller/WxCorpInfoController.java
  4. 75 0
      cloud-model/src/main/java/com/hssx/cloudmodel/entity/LoginLog.java
  5. 91 0
      cloud-model/src/main/java/com/hssx/cloudmodel/entity/SysParam.java
  6. 191 0
      cloud-model/src/main/java/com/hssx/cloudmodel/entity/WxCorpInfo.java
  7. 16 0
      cloud-model/src/main/java/com/hssx/cloudmodel/mapper/LoginLogMapper.java
  8. 16 0
      cloud-model/src/main/java/com/hssx/cloudmodel/mapper/SysParamMapper.java
  9. 16 0
      cloud-model/src/main/java/com/hssx/cloudmodel/mapper/WxCorpInfoMapper.java
  10. 16 0
      cloud-model/src/main/java/com/hssx/cloudmodel/service/LoginLogService.java
  11. 16 0
      cloud-model/src/main/java/com/hssx/cloudmodel/service/SysParamService.java
  12. 16 0
      cloud-model/src/main/java/com/hssx/cloudmodel/service/WxCorpInfoService.java
  13. 20 0
      cloud-model/src/main/java/com/hssx/cloudmodel/service/impl/LoginLogServiceImpl.java
  14. 20 0
      cloud-model/src/main/java/com/hssx/cloudmodel/service/impl/SysParamServiceImpl.java
  15. 20 0
      cloud-model/src/main/java/com/hssx/cloudmodel/service/impl/WxCorpInfoServiceImpl.java
  16. 59 0
      cloud-model/src/main/java/com/qq/weixin/mp/aes/AesException.java
  17. 26 0
      cloud-model/src/main/java/com/qq/weixin/mp/aes/ByteGroup.java
  18. 67 0
      cloud-model/src/main/java/com/qq/weixin/mp/aes/PKCS7Encoder.java
  19. 61 0
      cloud-model/src/main/java/com/qq/weixin/mp/aes/SHA1.java
  20. 289 0
      cloud-model/src/main/java/com/qq/weixin/mp/aes/WXBizMsgCrypt.java
  21. 106 0
      cloud-model/src/main/java/com/qq/weixin/mp/aes/XMLParse.java
  22. 17 0
      cloud-model/src/main/resources/mapper/LoginLogMapper.xml
  23. 18 0
      cloud-model/src/main/resources/mapper/SysParamMapper.xml
  24. 26 0
      cloud-model/src/main/resources/mapper/WxCorpInfoMapper.xml
  25. 23 0
      cloud-socket/src/com/js/kbt/util/ByteUtils.java
  26. 2 0
      ys_h5/.env.development
  27. 3 0
      ys_h5/.env.production
  28. 22 0
      ys_h5/.gitignore
  29. 49 0
      ys_h5/README.bak.md
  30. 140 0
      ys_h5/README.md
  31. 15 0
      ys_h5/babel.config.js
  32. 16843 0
      ys_h5/package-lock.json
  33. 66 0
      ys_h5/package.json
  34. 二进制
      ys_h5/public/favicon.ico
  35. 137 0
      ys_h5/public/index.html
  36. 18 0
      ys_h5/src/App.vue
  37. 二进制
      ys_h5/src/assets/img/MovieDetails/1.jpg
  38. 二进制
      ys_h5/src/assets/img/MovieDetails/jz1.jpg
  39. 二进制
      ys_h5/src/assets/img/MovieDetails/jz2.jpg
  40. 二进制
      ys_h5/src/assets/img/MovieDetails/jz3.jpg
  41. 二进制
      ys_h5/src/assets/img/MovieDetails/jz4.jpg
  42. 二进制
      ys_h5/src/assets/img/MovieDetails/r1.jpg
  43. 二进制
      ys_h5/src/assets/img/MovieDetails/r2.jpg
  44. 二进制
      ys_h5/src/assets/img/MovieDetails/r3.jpg
  45. 二进制
      ys_h5/src/assets/img/MovieDetails/r4.jpg
  46. 二进制
      ys_h5/src/assets/img/MovieDetails/r5.jpg
  47. 二进制
      ys_h5/src/assets/img/alt.jpg
  48. 二进制
      ys_h5/src/assets/img/book.png
  49. 二进制
      ys_h5/src/assets/img/calendar.png
  50. 二进制
      ys_h5/src/assets/img/close.png
  51. 二进制
      ys_h5/src/assets/img/daijian.png
  52. 二进制
      ys_h5/src/assets/img/daipei.png
  53. 二进制
      ys_h5/src/assets/img/date.png
  54. 二进制
      ys_h5/src/assets/img/detection.png
  55. 二进制
      ys_h5/src/assets/img/document.png
  56. 二进制
      ys_h5/src/assets/img/download.png
  57. 二进制
      ys_h5/src/assets/img/gaofang.png
  58. 二进制
      ys_h5/src/assets/img/home/check.png
  59. 二进制
      ys_h5/src/assets/img/home/edit.png
  60. 二进制
      ys_h5/src/assets/img/home/more.png
  61. 二进制
      ys_h5/src/assets/img/home/my.png
  62. 二进制
      ys_h5/src/assets/img/home/wait.png
  63. 二进制
      ys_h5/src/assets/img/index/banner_1.png
  64. 二进制
      ys_h5/src/assets/img/index/banner_2.png
  65. 二进制
      ys_h5/src/assets/img/index/banner_3.png
  66. 二进制
      ys_h5/src/assets/img/jianyao.png
  67. 二进制
      ys_h5/src/assets/img/larger.png
  68. 二进制
      ys_h5/src/assets/img/login_logo.png
  69. 二进制
      ys_h5/src/assets/img/logo.png
  70. 二进制
      ys_h5/src/assets/img/logo_new.png
  71. 二进制
      ys_h5/src/assets/img/map.png
  72. 二进制
      ys_h5/src/assets/img/members.png
  73. 二进制
      ys_h5/src/assets/img/message.png
  74. 二进制
      ys_h5/src/assets/img/mobile.png
  75. 二进制
      ys_h5/src/assets/img/mould.png
  76. 二进制
      ys_h5/src/assets/img/not.jpeg
  77. 二进制
      ys_h5/src/assets/img/orderList1.jpg
  78. 二进制
      ys_h5/src/assets/img/orderList2.jpg
  79. 二进制
      ys_h5/src/assets/img/pdf.png
  80. 二进制
      ys_h5/src/assets/img/peisong.png
  81. 二进制
      ys_h5/src/assets/img/personal/beij.png
  82. 二进制
      ys_h5/src/assets/img/personal/cl.png
  83. 二进制
      ys_h5/src/assets/img/personal/dt.png
  84. 二进制
      ys_h5/src/assets/img/personal/hb.png
  85. 二进制
      ys_h5/src/assets/img/personal/head_back.jpg
  86. 二进制
      ys_h5/src/assets/img/personal/p.png
  87. 二进制
      ys_h5/src/assets/img/personal/qb.png
  88. 二进制
      ys_h5/src/assets/img/personal/tg.png
  89. 二进制
      ys_h5/src/assets/img/personal/tx.jpg
  90. 二进制
      ys_h5/src/assets/img/personal/userHead.png
  91. 二进制
      ys_h5/src/assets/img/personal/yhk.png
  92. 二进制
      ys_h5/src/assets/img/poster/1.jpg
  93. 二进制
      ys_h5/src/assets/img/poster/2.jpg
  94. 二进制
      ys_h5/src/assets/img/poster/3.jpg
  95. 二进制
      ys_h5/src/assets/img/poster/4.jpg
  96. 二进制
      ys_h5/src/assets/img/project.png
  97. 二进制
      ys_h5/src/assets/img/qx.png
  98. 二进制
      ys_h5/src/assets/img/qxbj.png
  99. 二进制
      ys_h5/src/assets/img/small.png
  100. 0 0
      ys_h5/src/assets/img/zhongyaofang.png

+ 21 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/controller/LoginLogController.java

@@ -0,0 +1,21 @@
+package com.hssx.cloudmodel.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-16
+ */
+@RestController
+@RequestMapping("/login-log")
+public class LoginLogController {
+
+}
+

+ 21 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/controller/SysParamController.java

@@ -0,0 +1,21 @@
+package com.hssx.cloudmodel.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-13
+ */
+@RestController
+@RequestMapping("/sys-param")
+public class SysParamController {
+
+}
+

+ 21 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/controller/WxCorpInfoController.java

@@ -0,0 +1,21 @@
+package com.hssx.cloudmodel.controller;
+
+
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-14
+ */
+@RestController
+@RequestMapping("/wx-corp-info")
+public class WxCorpInfoController {
+
+}
+

+ 75 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/entity/LoginLog.java

@@ -0,0 +1,75 @@
+package com.hssx.cloudmodel.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-16
+ */
+public class LoginLog extends Model<LoginLog> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 用户主键
+     */
+    @TableField("user_id")
+    private Integer userId;
+
+    /**
+     * 登录时间
+     */
+    @TableField("login_time")
+    private LocalDateTime loginTime;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getUserId() {
+        return userId;
+    }
+
+    public void setUserId(Integer userId) {
+        this.userId = userId;
+    }
+
+    public LocalDateTime getLoginTime() {
+        return loginTime;
+    }
+
+    public void setLoginTime(LocalDateTime loginTime) {
+        this.loginTime = loginTime;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "LoginLog{" +
+        "id=" + id +
+        ", userId=" + userId +
+        ", loginTime=" + loginTime +
+        "}";
+    }
+}

+ 91 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/entity/SysParam.java

@@ -0,0 +1,91 @@
+package com.hssx.cloudmodel.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-13
+ */
+@TableName("tb_sys_param")
+public class SysParam extends Model<SysParam> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    /**
+     * 参数编码
+     */
+    @TableField("param_code")
+    private String paramCode;
+
+    /**
+     * 参数名称
+     */
+    @TableField("param_name")
+    private String paramName;
+
+    /**
+     * 说明
+     */
+    @TableField("remark")
+    private String remark;
+
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public String getParamCode() {
+        return paramCode;
+    }
+
+    public void setParamCode(String paramCode) {
+        this.paramCode = paramCode;
+    }
+
+    public String getParamName() {
+        return paramName;
+    }
+
+    public void setParamName(String paramName) {
+        this.paramName = paramName;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.id;
+    }
+
+    @Override
+    public String toString() {
+        return "SysParam{" +
+        "id=" + id +
+        ", paramCode=" + paramCode +
+        ", paramName=" + paramName +
+        ", remark=" + remark +
+        "}";
+    }
+}

+ 191 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/entity/WxCorpInfo.java

@@ -0,0 +1,191 @@
+package com.hssx.cloudmodel.entity;
+
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.TableField;
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-15
+ */
+public class WxCorpInfo extends Model<WxCorpInfo> {
+
+    private static final long serialVersionUID=1L;
+
+    @TableId("corpid")
+    private String corpid;
+
+    @TableField("corp_name")
+    private String corpName;
+
+    @TableField("corp_full_name")
+    private String corpFullName;
+
+    @TableField("corp_scale")
+    private String corpScale;
+
+    @TableField("corp_industry")
+    private String corpIndustry;
+
+    @TableField("corp_sub_industry")
+    private String corpSubIndustry;
+
+    @TableField("location")
+    private String location;
+
+    /**
+     * 企业token
+     */
+    @TableField("access_token")
+    private String accessToken;
+
+    /**
+     * token有效期
+     */
+    @TableField("expire_time")
+    private LocalDateTime expireTime;
+
+    /**
+     * 企业永久授权码
+     */
+    @TableField("permanent_code")
+    private String permanentCode;
+
+    /**
+     * 授权人姓名
+     */
+    @TableField("auth_username")
+    private String authUsername;
+
+    /**
+     * 系统内部的公司id
+     */
+    @TableField("company_id")
+    private Integer companyId;
+
+
+    public String getCorpid() {
+        return corpid;
+    }
+
+    public void setCorpid(String corpid) {
+        this.corpid = corpid;
+    }
+
+    public String getCorpName() {
+        return corpName;
+    }
+
+    public void setCorpName(String corpName) {
+        this.corpName = corpName;
+    }
+
+    public String getCorpFullName() {
+        return corpFullName;
+    }
+
+    public void setCorpFullName(String corpFullName) {
+        this.corpFullName = corpFullName;
+    }
+
+    public String getCorpScale() {
+        return corpScale;
+    }
+
+    public void setCorpScale(String corpScale) {
+        this.corpScale = corpScale;
+    }
+
+    public String getCorpIndustry() {
+        return corpIndustry;
+    }
+
+    public void setCorpIndustry(String corpIndustry) {
+        this.corpIndustry = corpIndustry;
+    }
+
+    public String getCorpSubIndustry() {
+        return corpSubIndustry;
+    }
+
+    public void setCorpSubIndustry(String corpSubIndustry) {
+        this.corpSubIndustry = corpSubIndustry;
+    }
+
+    public String getLocation() {
+        return location;
+    }
+
+    public void setLocation(String location) {
+        this.location = location;
+    }
+
+    public String getAccessToken() {
+        return accessToken;
+    }
+
+    public void setAccessToken(String accessToken) {
+        this.accessToken = accessToken;
+    }
+
+    public LocalDateTime getExpireTime() {
+        return expireTime;
+    }
+
+    public void setExpireTime(LocalDateTime expireTime) {
+        this.expireTime = expireTime;
+    }
+
+    public String getPermanentCode() {
+        return permanentCode;
+    }
+
+    public void setPermanentCode(String permanentCode) {
+        this.permanentCode = permanentCode;
+    }
+
+    public String getAuthUsername() {
+        return authUsername;
+    }
+
+    public void setAuthUsername(String authUsername) {
+        this.authUsername = authUsername;
+    }
+
+    public Integer getCompanyId() {
+        return companyId;
+    }
+
+    public void setCompanyId(Integer companyId) {
+        this.companyId = companyId;
+    }
+
+    @Override
+    protected Serializable pkVal() {
+        return this.corpid;
+    }
+
+    @Override
+    public String toString() {
+        return "WxCorpInfo{" +
+        "corpid=" + corpid +
+        ", corpName=" + corpName +
+        ", corpFullName=" + corpFullName +
+        ", corpScale=" + corpScale +
+        ", corpIndustry=" + corpIndustry +
+        ", corpSubIndustry=" + corpSubIndustry +
+        ", location=" + location +
+        ", accessToken=" + accessToken +
+        ", expireTime=" + expireTime +
+        ", permanentCode=" + permanentCode +
+        ", authUsername=" + authUsername +
+        ", companyId=" + companyId +
+        "}";
+    }
+}

+ 16 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/mapper/LoginLogMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.cloudmodel.mapper;
+
+import com.hssx.cloudmodel.entity.LoginLog;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-16
+ */
+public interface LoginLogMapper extends BaseMapper<LoginLog> {
+
+}

+ 16 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/mapper/SysParamMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.cloudmodel.mapper;
+
+import com.hssx.cloudmodel.entity.SysParam;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-13
+ */
+public interface SysParamMapper extends BaseMapper<SysParam> {
+
+}

+ 16 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/mapper/WxCorpInfoMapper.java

@@ -0,0 +1,16 @@
+package com.hssx.cloudmodel.mapper;
+
+import com.hssx.cloudmodel.entity.WxCorpInfo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-14
+ */
+public interface WxCorpInfoMapper extends BaseMapper<WxCorpInfo> {
+
+}

+ 16 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/service/LoginLogService.java

@@ -0,0 +1,16 @@
+package com.hssx.cloudmodel.service;
+
+import com.hssx.cloudmodel.entity.LoginLog;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-16
+ */
+public interface LoginLogService extends IService<LoginLog> {
+
+}

+ 16 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/service/SysParamService.java

@@ -0,0 +1,16 @@
+package com.hssx.cloudmodel.service;
+
+import com.hssx.cloudmodel.entity.SysParam;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-13
+ */
+public interface SysParamService extends IService<SysParam> {
+
+}

+ 16 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/service/WxCorpInfoService.java

@@ -0,0 +1,16 @@
+package com.hssx.cloudmodel.service;
+
+import com.hssx.cloudmodel.entity.WxCorpInfo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-14
+ */
+public interface WxCorpInfoService extends IService<WxCorpInfo> {
+
+}

+ 20 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/service/impl/LoginLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.hssx.cloudmodel.service.impl;
+
+import com.hssx.cloudmodel.entity.LoginLog;
+import com.hssx.cloudmodel.mapper.LoginLogMapper;
+import com.hssx.cloudmodel.service.LoginLogService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-16
+ */
+@Service
+public class LoginLogServiceImpl extends ServiceImpl<LoginLogMapper, LoginLog> implements LoginLogService {
+
+}

+ 20 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/service/impl/SysParamServiceImpl.java

@@ -0,0 +1,20 @@
+package com.hssx.cloudmodel.service.impl;
+
+import com.hssx.cloudmodel.entity.SysParam;
+import com.hssx.cloudmodel.mapper.SysParamMapper;
+import com.hssx.cloudmodel.service.SysParamService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-13
+ */
+@Service
+public class SysParamServiceImpl extends ServiceImpl<SysParamMapper, SysParam> implements SysParamService {
+
+}

+ 20 - 0
cloud-model/src/main/java/com/hssx/cloudmodel/service/impl/WxCorpInfoServiceImpl.java

@@ -0,0 +1,20 @@
+package com.hssx.cloudmodel.service.impl;
+
+import com.hssx.cloudmodel.entity.WxCorpInfo;
+import com.hssx.cloudmodel.mapper.WxCorpInfoMapper;
+import com.hssx.cloudmodel.service.WxCorpInfoService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author seya
+ * @since 2020-08-14
+ */
+@Service
+public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpInfo> implements WxCorpInfoService {
+
+}

+ 59 - 0
cloud-model/src/main/java/com/qq/weixin/mp/aes/AesException.java

@@ -0,0 +1,59 @@
+package com.qq.weixin.mp.aes;
+
+@SuppressWarnings("serial")
+public class AesException extends Exception {
+
+	public final static int OK = 0;
+	public final static int ValidateSignatureError = -40001;
+	public final static int ParseXmlError = -40002;
+	public final static int ComputeSignatureError = -40003;
+	public final static int IllegalAesKey = -40004;
+	public final static int ValidateCorpidError = -40005;
+	public final static int EncryptAESError = -40006;
+	public final static int DecryptAESError = -40007;
+	public final static int IllegalBuffer = -40008;
+	//public final static int EncodeBase64Error = -40009;
+	//public final static int DecodeBase64Error = -40010;
+	//public final static int GenReturnXmlError = -40011;
+
+	private int code;
+
+	private static String getMessage(int code) {
+		switch (code) {
+			case ValidateSignatureError:
+				return "签名验证错误";
+			case ParseXmlError:
+				return "xml解析失败";
+			case ComputeSignatureError:
+				return "sha加密生成签名失败";
+			case IllegalAesKey:
+				return "SymmetricKey非法";
+			case ValidateCorpidError:
+				return "corpid校验失败";
+			case EncryptAESError:
+				return "aes加密失败";
+			case DecryptAESError:
+				return "aes解密失败";
+			case IllegalBuffer:
+				return "解密后得到的buffer非法";
+//		case EncodeBase64Error:
+//			return "base64加密错误";
+//		case DecodeBase64Error:
+//			return "base64解密错误";
+//		case GenReturnXmlError:
+//			return "xml生成失败";
+			default:
+				return null; // cannot be
+		}
+	}
+
+	public int getCode() {
+		return code;
+	}
+
+	AesException(int code) {
+		super(getMessage(code));
+		this.code = code;
+	}
+
+}

+ 26 - 0
cloud-model/src/main/java/com/qq/weixin/mp/aes/ByteGroup.java

@@ -0,0 +1,26 @@
+package com.qq.weixin.mp.aes;
+
+import java.util.ArrayList;
+
+class ByteGroup {
+	ArrayList<Byte> byteContainer = new ArrayList<Byte>();
+
+	public byte[] toBytes() {
+		byte[] bytes = new byte[byteContainer.size()];
+		for (int i = 0; i < byteContainer.size(); i++) {
+			bytes[i] = byteContainer.get(i);
+		}
+		return bytes;
+	}
+
+	public ByteGroup addBytes(byte[] bytes) {
+		for (byte b : bytes) {
+			byteContainer.add(b);
+		}
+		return this;
+	}
+
+	public int size() {
+		return byteContainer.size();
+	}
+}

+ 67 - 0
cloud-model/src/main/java/com/qq/weixin/mp/aes/PKCS7Encoder.java

@@ -0,0 +1,67 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.qq.weixin.mp.aes;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+
+/**
+ * 提供基于PKCS7算法的加解密接口.
+ */
+class PKCS7Encoder {
+	static Charset CHARSET = Charset.forName("utf-8");
+	static int BLOCK_SIZE = 32;
+
+	/**
+	 * 获得对明文进行补位填充的字节.
+	 * 
+	 * @param count 需要进行填充补位操作的明文字节个数
+	 * @return 补齐用的字节数组
+	 */
+	static byte[] encode(int count) {
+		// 计算需要填充的位数
+		int amountToPad = BLOCK_SIZE - (count % BLOCK_SIZE);
+		if (amountToPad == 0) {
+			amountToPad = BLOCK_SIZE;
+		}
+		// 获得补位所用的字符
+		char padChr = chr(amountToPad);
+		String tmp = new String();
+		for (int index = 0; index < amountToPad; index++) {
+			tmp += padChr;
+		}
+		return tmp.getBytes(CHARSET);
+	}
+
+	/**
+	 * 删除解密后明文的补位字符
+	 * 
+	 * @param decrypted 解密后的明文
+	 * @return 删除补位字符后的明文
+	 */
+	static byte[] decode(byte[] decrypted) {
+		int pad = (int) decrypted[decrypted.length - 1];
+		if (pad < 1 || pad > 32) {
+			pad = 0;
+		}
+		return Arrays.copyOfRange(decrypted, 0, decrypted.length - pad);
+	}
+
+	/**
+	 * 将数字转化成ASCII码对应的字符,用于对明文进行补码
+	 * 
+	 * @param a 需要转化的数字
+	 * @return 转化得到的字符
+	 */
+	static char chr(int a) {
+		byte target = (byte) (a & 0xFF);
+		return (char) target;
+	}
+
+}

+ 61 - 0
cloud-model/src/main/java/com/qq/weixin/mp/aes/SHA1.java

@@ -0,0 +1,61 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.qq.weixin.mp.aes;
+
+import java.security.MessageDigest;
+import java.util.Arrays;
+
+/**
+ * SHA1 class
+ *
+ * 计算消息签名接口.
+ */
+class SHA1 {
+
+	/**
+	 * 用SHA1算法生成安全签名
+	 * @param token 票据
+	 * @param timestamp 时间戳
+	 * @param nonce 随机字符串
+	 * @param encrypt 密文
+	 * @return 安全签名
+	 * @throws AesException 
+	 */
+	public static String getSHA1(String token, String timestamp, String nonce, String encrypt) throws AesException
+			  {
+		try {
+			String[] array = new String[] { token, timestamp, nonce, encrypt };
+			StringBuffer sb = new StringBuffer();
+			// 字符串排序
+			Arrays.sort(array);
+			for (int i = 0; i < 4; i++) {
+				sb.append(array[i]);
+			}
+			String str = sb.toString();
+			// SHA1签名生成
+			MessageDigest md = MessageDigest.getInstance("SHA-1");
+			md.update(str.getBytes());
+			byte[] digest = md.digest();
+
+			StringBuffer hexstr = new StringBuffer();
+			String shaHex = "";
+			for (int i = 0; i < digest.length; i++) {
+				shaHex = Integer.toHexString(digest[i] & 0xFF);
+				if (shaHex.length() < 2) {
+					hexstr.append(0);
+				}
+				hexstr.append(shaHex);
+			}
+			return hexstr.toString();
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.ComputeSignatureError);
+		}
+	}
+}

+ 289 - 0
cloud-model/src/main/java/com/qq/weixin/mp/aes/WXBizMsgCrypt.java

@@ -0,0 +1,289 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+/**
+ * 针对org.apache.commons.codec.binary.Base64,
+ * 需要导入架包commons-codec-1.9(或commons-codec-1.8等其他版本)
+ * 官方下载地址:http://commons.apache.org/proper/commons-codec/download_codec.cgi
+ */
+package com.qq.weixin.mp.aes;
+
+import java.nio.charset.Charset;
+import java.util.Arrays;
+import java.util.Random;
+
+import javax.crypto.Cipher;
+import javax.crypto.spec.IvParameterSpec;
+import javax.crypto.spec.SecretKeySpec;
+
+import org.apache.commons.codec.binary.Base64;
+
+/**
+ * 提供接收和推送给企业微信消息的加解密接口(UTF8编码的字符串).
+ * <ol>
+ * 	<li>第三方回复加密消息给企业微信</li>
+ * 	<li>第三方收到企业微信发送的消息,验证消息的安全性,并对消息进行解密。</li>
+ * </ol>
+ * 说明:异常java.security.InvalidKeyException:illegal Key Size的解决方案
+ * <ol>
+ * 	<li>在官方网站下载JCE无限制权限策略文件(JDK7的下载地址:
+ *      http://www.oracle.com/technetwork/java/javase/downloads/jce-7-download-432124.html</li>
+ * 	<li>下载后解压,可以看到local_policy.jar和US_export_policy.jar以及readme.txt</li>
+ * 	<li>如果安装了JRE,将两个jar文件放到%JRE_HOME%\lib\security目录下覆盖原来的文件</li>
+ * 	<li>如果安装了JDK,将两个jar文件放到%JDK_HOME%\jre\lib\security目录下覆盖原来文件</li>
+ * </ol>
+ */
+public class WXBizMsgCrypt {
+	static Charset CHARSET = Charset.forName("utf-8");
+	Base64 base64 = new Base64();
+	byte[] aesKey;
+	String token;
+	String receiveid;
+
+	/**
+	 * 构造函数
+	 * @param token 企业微信后台,开发者设置的token
+	 * @param encodingAesKey 企业微信后台,开发者设置的EncodingAESKey
+	 * @param receiveid, 不同场景含义不同,详见文档
+	 * 
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public WXBizMsgCrypt(String token, String encodingAesKey, String receiveid) throws AesException {
+		if (encodingAesKey.length() != 43) {
+			throw new AesException(AesException.IllegalAesKey);
+		}
+
+		this.token = token;
+		this.receiveid = receiveid;
+		aesKey = Base64.decodeBase64(encodingAesKey + "=");
+	}
+
+	// 生成4个字节的网络字节序
+	byte[] getNetworkBytesOrder(int sourceNumber) {
+		byte[] orderBytes = new byte[4];
+		orderBytes[3] = (byte) (sourceNumber & 0xFF);
+		orderBytes[2] = (byte) (sourceNumber >> 8 & 0xFF);
+		orderBytes[1] = (byte) (sourceNumber >> 16 & 0xFF);
+		orderBytes[0] = (byte) (sourceNumber >> 24 & 0xFF);
+		return orderBytes;
+	}
+
+	// 还原4个字节的网络字节序
+	int recoverNetworkBytesOrder(byte[] orderBytes) {
+		int sourceNumber = 0;
+		for (int i = 0; i < 4; i++) {
+			sourceNumber <<= 8;
+			sourceNumber |= orderBytes[i] & 0xff;
+		}
+		return sourceNumber;
+	}
+
+	// 随机生成16位字符串
+	String getRandomStr() {
+		String base = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
+		Random random = new Random();
+		StringBuffer sb = new StringBuffer();
+		for (int i = 0; i < 16; i++) {
+			int number = random.nextInt(base.length());
+			sb.append(base.charAt(number));
+		}
+		return sb.toString();
+	}
+
+	/**
+	 * 对明文进行加密.
+	 * 
+	 * @param text 需要加密的明文
+	 * @return 加密后base64编码的字符串
+	 * @throws AesException aes加密失败
+	 */
+	String encrypt(String randomStr, String text) throws AesException {
+		ByteGroup byteCollector = new ByteGroup();
+		byte[] randomStrBytes = randomStr.getBytes(CHARSET);
+		byte[] textBytes = text.getBytes(CHARSET);
+		byte[] networkBytesOrder = getNetworkBytesOrder(textBytes.length);
+		byte[] receiveidBytes = receiveid.getBytes(CHARSET);
+
+		// randomStr + networkBytesOrder + text + receiveid
+		byteCollector.addBytes(randomStrBytes);
+		byteCollector.addBytes(networkBytesOrder);
+		byteCollector.addBytes(textBytes);
+		byteCollector.addBytes(receiveidBytes);
+
+		// ... + pad: 使用自定义的填充方式对明文进行补位填充
+		byte[] padBytes = PKCS7Encoder.encode(byteCollector.size());
+		byteCollector.addBytes(padBytes);
+
+		// 获得最终的字节流, 未加密
+		byte[] unencrypted = byteCollector.toBytes();
+
+		try {
+			// 设置加密模式为AES的CBC模式
+			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+			SecretKeySpec keySpec = new SecretKeySpec(aesKey, "AES");
+			IvParameterSpec iv = new IvParameterSpec(aesKey, 0, 16);
+			cipher.init(Cipher.ENCRYPT_MODE, keySpec, iv);
+
+			// 加密
+			byte[] encrypted = cipher.doFinal(unencrypted);
+
+			// 使用BASE64对加密后的字符串进行编码
+			String base64Encrypted = base64.encodeToString(encrypted);
+
+			return base64Encrypted;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.EncryptAESError);
+		}
+	}
+
+	/**
+	 * 对密文进行解密.
+	 * 
+	 * @param text 需要解密的密文
+	 * @return 解密得到的明文
+	 * @throws AesException aes解密失败
+	 */
+	String decrypt(String text) throws AesException {
+		byte[] original;
+		try {
+			// 设置解密模式为AES的CBC模式
+			Cipher cipher = Cipher.getInstance("AES/CBC/NoPadding");
+			SecretKeySpec key_spec = new SecretKeySpec(aesKey, "AES");
+			IvParameterSpec iv = new IvParameterSpec(Arrays.copyOfRange(aesKey, 0, 16));
+			cipher.init(Cipher.DECRYPT_MODE, key_spec, iv);
+
+			// 使用BASE64对密文进行解码
+			byte[] encrypted = Base64.decodeBase64(text);
+
+			// 解密
+			original = cipher.doFinal(encrypted);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.DecryptAESError);
+		}
+
+		String xmlContent, from_receiveid;
+		try {
+			// 去除补位字符
+			byte[] bytes = PKCS7Encoder.decode(original);
+
+			// 分离16位随机字符串,网络字节序和receiveid
+			byte[] networkOrder = Arrays.copyOfRange(bytes, 16, 20);
+
+			int xmlLength = recoverNetworkBytesOrder(networkOrder);
+
+			xmlContent = new String(Arrays.copyOfRange(bytes, 20, 20 + xmlLength), CHARSET);
+			from_receiveid = new String(Arrays.copyOfRange(bytes, 20 + xmlLength, bytes.length),
+					CHARSET);
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.IllegalBuffer);
+		}
+
+		// receiveid不相同的情况
+		if (!from_receiveid.equals(receiveid)) {
+			throw new AesException(AesException.ValidateCorpidError);
+		}
+		return xmlContent;
+
+	}
+
+	/**
+	 * 将企业微信回复用户的消息加密打包.
+	 * <ol>
+	 * 	<li>对要发送的消息进行AES-CBC加密</li>
+	 * 	<li>生成安全签名</li>
+	 * 	<li>将消息密文和安全签名打包成xml格式</li>
+	 * </ol>
+	 * 
+	 * @param replyMsg 企业微信待回复用户的消息,xml格式的字符串
+	 * @param timeStamp 时间戳,可以自己生成,也可以用URL参数的timestamp
+	 * @param nonce 随机串,可以自己生成,也可以用URL参数的nonce
+	 * 
+	 * @return 加密后的可以直接回复用户的密文,包括msg_signature, timestamp, nonce, encrypt的xml格式的字符串
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public String EncryptMsg(String replyMsg, String timeStamp, String nonce) throws AesException {
+		// 加密
+		String encrypt = encrypt(getRandomStr(), replyMsg);
+
+		// 生成安全签名
+		if (timeStamp == "") {
+			timeStamp = Long.toString(System.currentTimeMillis());
+		}
+
+		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt);
+
+		// System.out.println("发送给平台的签名是: " + signature[1].toString());
+		// 生成发送的xml
+		String result = XMLParse.generate(encrypt, signature, timeStamp, nonce);
+		return result;
+	}
+
+	/**
+	 * 检验消息的真实性,并且获取解密后的明文.
+	 * <ol>
+	 * 	<li>利用收到的密文生成安全签名,进行签名验证</li>
+	 * 	<li>若验证通过,则提取xml中的加密消息</li>
+	 * 	<li>对消息进行解密</li>
+	 * </ol>
+	 * 
+	 * @param msgSignature 签名串,对应URL参数的msg_signature
+	 * @param timeStamp 时间戳,对应URL参数的timestamp
+	 * @param nonce 随机串,对应URL参数的nonce
+	 * @param postData 密文,对应POST请求的数据
+	 * 
+	 * @return 解密后的原文
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public String DecryptMsg(String msgSignature, String timeStamp, String nonce, String postData)
+			throws AesException {
+
+		// 密钥,公众账号的app secret
+		// 提取密文
+		Object[] encrypt = XMLParse.extract(postData);
+
+		// 验证安全签名
+		String signature = SHA1.getSHA1(token, timeStamp, nonce, encrypt[1].toString());
+
+		// 和URL中的签名比较是否相等
+		 System.out.println("第三方收到URL中的签名:" + msgSignature);
+		 System.out.println("第三方校验签名:" + signature);
+		if (!signature.equals(msgSignature)) {
+			throw new AesException(AesException.ValidateSignatureError);
+		}
+
+		// 解密
+		String result = decrypt(encrypt[1].toString());
+		return result;
+	}
+
+	/**
+	 * 验证URL
+	 * @param msgSignature 签名串,对应URL参数的msg_signature
+	 * @param timeStamp 时间戳,对应URL参数的timestamp
+	 * @param nonce 随机串,对应URL参数的nonce
+	 * @param echoStr 随机串,对应URL参数的echostr
+	 * 
+	 * @return 解密之后的echostr
+	 * @throws AesException 执行失败,请查看该异常的错误码和具体的错误信息
+	 */
+	public String VerifyURL(String msgSignature, String timeStamp, String nonce, String echoStr)
+			throws AesException {
+		String signature = SHA1.getSHA1(token, timeStamp, nonce, echoStr);
+
+		if (!signature.equals(msgSignature)) {
+			throw new AesException(AesException.ValidateSignatureError);
+		}
+
+		String result = decrypt(echoStr);
+		return result;
+	}
+
+}

+ 106 - 0
cloud-model/src/main/java/com/qq/weixin/mp/aes/XMLParse.java

@@ -0,0 +1,106 @@
+/**
+ * 对企业微信发送给企业后台的消息加解密示例代码.
+ * 
+ * @copyright Copyright (c) 1998-2014 Tencent Inc.
+ */
+
+// ------------------------------------------------------------------------
+
+package com.qq.weixin.mp.aes;
+
+import java.io.StringReader;
+
+import javax.xml.parsers.DocumentBuilder;
+import javax.xml.parsers.DocumentBuilderFactory;
+
+import org.w3c.dom.Document;
+import org.w3c.dom.Element;
+import org.w3c.dom.NodeList;
+import org.xml.sax.InputSource;
+
+/**
+ * XMLParse class
+ *
+ * 提供提取消息格式中的密文及生成回复消息格式的接口.
+ */
+class XMLParse {
+
+	/**
+	 * 提取出xml数据包中的加密消息
+	 * @param xmltext 待提取的xml字符串
+	 * @return 提取出的加密消息字符串
+	 * @throws AesException 
+	 */
+	public static Object[] extract(String xmltext) throws AesException     {
+		Object[] result = new Object[3];
+		try {
+			DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
+			
+			String FEATURE = null;
+			// This is the PRIMARY defense. If DTDs (doctypes) are disallowed, almost all XML entity attacks are prevented
+			// Xerces 2 only - http://xerces.apache.org/xerces2-j/features.html#disallow-doctype-decl
+			FEATURE = "http://apache.org/xml/features/disallow-doctype-decl";
+			dbf.setFeature(FEATURE, true);
+			
+			// If you can't completely disable DTDs, then at least do the following:
+			// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-general-entities
+			// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-general-entities
+			// JDK7+ - http://xml.org/sax/features/external-general-entities 
+			FEATURE = "http://xml.org/sax/features/external-general-entities";
+			dbf.setFeature(FEATURE, false);
+			
+			// Xerces 1 - http://xerces.apache.org/xerces-j/features.html#external-parameter-entities
+			// Xerces 2 - http://xerces.apache.org/xerces2-j/features.html#external-parameter-entities
+			// JDK7+ - http://xml.org/sax/features/external-parameter-entities 
+			FEATURE = "http://xml.org/sax/features/external-parameter-entities";
+			dbf.setFeature(FEATURE, false);
+			
+			// Disable external DTDs as well
+			FEATURE = "http://apache.org/xml/features/nonvalidating/load-external-dtd";
+			dbf.setFeature(FEATURE, false);
+			
+			// and these as well, per Timothy Morgan's 2014 paper: "XML Schema, DTD, and Entity Attacks"
+			dbf.setXIncludeAware(false);
+			dbf.setExpandEntityReferences(false);
+			
+			// And, per Timothy Morgan: "If for some reason support for inline DOCTYPEs are a requirement, then 
+			// ensure the entity settings are disabled (as shown above) and beware that SSRF attacks
+			// (http://cwe.mitre.org/data/definitions/918.html) and denial 
+			// of service attacks (such as billion laughs or decompression bombs via "jar:") are a risk."
+			
+			// remaining parser logic
+			DocumentBuilder db = dbf.newDocumentBuilder();
+			StringReader sr = new StringReader(xmltext);
+			InputSource is = new InputSource(sr);
+			Document document = db.parse(is);
+
+			Element root = document.getDocumentElement();
+			NodeList nodelist1 = root.getElementsByTagName("Encrypt");
+			NodeList nodelist2 = root.getElementsByTagName("ToUserName");
+			result[0] = 0;
+			result[1] = nodelist1.item(0).getTextContent();
+			result[2] = nodelist2.item(0).getTextContent();
+			return result;
+		} catch (Exception e) {
+			e.printStackTrace();
+			throw new AesException(AesException.ParseXmlError);
+		}
+	}
+
+	/**
+	 * 生成xml消息
+	 * @param encrypt 加密后的消息密文
+	 * @param signature 安全签名
+	 * @param timestamp 时间戳
+	 * @param nonce 随机字符串
+	 * @return 生成的xml字符串
+	 */
+	public static String generate(String encrypt, String signature, String timestamp, String nonce) {
+
+		String format = "<xml>\n" + "<Encrypt><![CDATA[%1$s]]></Encrypt>\n"
+				+ "<MsgSignature><![CDATA[%2$s]]></MsgSignature>\n"
+				+ "<TimeStamp>%3$s</TimeStamp>\n" + "<Nonce><![CDATA[%4$s]]></Nonce>\n" + "</xml>";
+		return String.format(format, encrypt, signature, timestamp, nonce);
+
+	}
+}

+ 17 - 0
cloud-model/src/main/resources/mapper/LoginLogMapper.xml

@@ -0,0 +1,17 @@
+<?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.hssx.cloudmodel.mapper.LoginLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.hssx.cloudmodel.entity.LoginLog">
+        <id column="id" property="id" />
+        <result column="user_id" property="userId" />
+        <result column="login_time" property="loginTime" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, user_id, login_time
+    </sql>
+
+</mapper>

+ 18 - 0
cloud-model/src/main/resources/mapper/SysParamMapper.xml

@@ -0,0 +1,18 @@
+<?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.hssx.cloudmodel.mapper.SysParamMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.hssx.cloudmodel.entity.SysParam">
+        <id column="id" property="id" />
+        <result column="param_code" property="paramCode" />
+        <result column="param_name" property="paramName" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        id, param_code, param_name, remark
+    </sql>
+
+</mapper>

+ 26 - 0
cloud-model/src/main/resources/mapper/WxCorpInfoMapper.xml

@@ -0,0 +1,26 @@
+<?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.hssx.cloudmodel.mapper.WxCorpInfoMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.hssx.cloudmodel.entity.WxCorpInfo">
+        <id column="corpid" property="corpid" />
+        <result column="corp_name" property="corpName" />
+        <result column="corp_full_name" property="corpFullName" />
+        <result column="corp_scale" property="corpScale" />
+        <result column="corp_industry" property="corpIndustry" />
+        <result column="corp_sub_industry" property="corpSubIndustry" />
+        <result column="location" property="location" />
+        <result column="access_token" property="accessToken" />
+        <result column="expire_time" property="expireTime" />
+        <result column="permanent_code" property="permanentCode" />
+        <result column="auth_username" property="authUsername" />
+        <result column="company_id" property="companyId" />
+    </resultMap>
+
+    <!-- 通用查询结果列 -->
+    <sql id="Base_Column_List">
+        corpid, corp_name, corp_full_name, corp_scale, corp_industry, corp_sub_industry, location, access_token, expire_time, permanent_code, auth_username, company_id
+    </sql>
+
+</mapper>

+ 23 - 0
cloud-socket/src/com/js/kbt/util/ByteUtils.java

@@ -0,0 +1,23 @@
+package com.js.kbt.util;
+
+public class ByteUtils {
+
+	//System.arraycopy()方法
+    public static byte[] byteMerger(byte[] bt1, byte[] bt2){  
+        byte[] bt3 = new byte[bt1.length+bt2.length];  
+        System.arraycopy(bt1, 0, bt3, 0, bt1.length);  
+        System.arraycopy(bt2, 0, bt3, bt1.length, bt2.length);  
+        return bt3;  
+    }
+    
+    //十六进制转byte
+  	public static byte[]  getByteFromHex(String hexStr) {
+  		byte[] data = new byte[hexStr.length()/2];
+  		for (int i=0;i<hexStr.length(); i+=2) {
+  			data[i/2] = (byte)Integer.parseInt(hexStr.substring(i, i+2), 16);
+  		}
+  		
+  		return data;
+  	}
+    
+}

+ 2 - 0
ys_h5/.env.development

@@ -0,0 +1,2 @@
+NODE_ENV="development"
+VUE_APP_URL="http://192.168.5.184:10010"

+ 3 - 0
ys_h5/.env.production

@@ -0,0 +1,3 @@
+# 配置生产地址,就是你将来发布上线的地址
+NODE_ENV="production"
+VUE_APP_URL="http://192.168.5.184:10010"

+ 22 - 0
ys_h5/.gitignore

@@ -0,0 +1,22 @@
+.DS_Store
+node_modules
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.svn
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 49 - 0
ys_h5/README.bak.md

@@ -0,0 +1,49 @@
+# 知识体系
+
+#### 封装 axios
+
+1. 使用拦截器统一处理请求和响应数据
+2. 挂载到原型上
+
+#### 上拉加载更多
+
+1. vant 的组件
+2. 设置初始高度,不然 bug 很严重
+
+#### 懒加载
+
+1. 懒加载是什么
+2. 如何实现
+
+#### 环境配置
+
+1. 根目录新建 .env.development (测试环境) 文件
+
+   ```
+   VUE_APP_URL="http://132.232.87.95:3000/api"
+   ```
+
+   然后新建。env.production(生产环境)文件
+
+   ```
+   VUE_APP_URL="http://132.232.94.151:3000/api"
+   ```
+
+2. 配置 package.json
+
+   ```
+    "scripts": {
+       "serve": "vue-cli-service serve --model",
+       "build": "vue-cli-service build --model",
+       "lint": "vue-cli-service lint"
+     },
+   ```
+
+3. 项目中通过 process.env.VUE_APP_URL  访问 VUE_APP_URL 的值,不同的环境取到的值不一样
+
+#### 打包部署
+
+#### 移动端适配
+
+1. amfe-flexib 设置 root 元素字体大小
+2. pxtorem  px 转 rem

+ 140 - 0
ys_h5/README.md

@@ -0,0 +1,140 @@
+# vue 移动端模板
+
+#### 启动项目
+1. npm i 安装依赖
+1. npm run serve 启动项目
+1. cd server  (接口目录)
+1. npm i 
+1. npm run dev
+
+
+>#### 核心知识体系简介
+1. vue-cli3 脚手架
+    * 创建项目
+    * 开发环境和生产环境配置
+    * 配置跨域
+    
+2. vue-router 路由
+    * 路由配置
+    * 子路由配置
+    * 路由守卫,设置页面标题和根据登录状态判断是否允许进入特定页面
+    * 对router-link使用active-class,高亮当前路由
+    
+3. vuex 跨组件通信
+    * vuex 配置
+    * vuex 持久化
+    * vuex 使用
+    
+4. rem 移动端适配
+    * 通过 amfe-flexibe 设置 root 元素的字体大小
+    * 通过 pxtorem 把 px 转成 rem, 无需手动书写 rem
+    
+5. axios 配置
+    * 使用拦截器配置 baseURL 和给请求头加上 token
+    * 使用拦截器对返回的数据进行处理
+    * 挂载到 vue 原型上,方便使用
+    
+6. promise 使用
+    
+    * 在项目中使用 async await 把异步变成同步,编写和阅读更舒服
+    
+7. 有赞 vant-ui 库
+    * 导航栏
+    * 单元格
+    * loading
+    * ......
+    
+8. 使用keep-alive组件缓存某些组件(新增)
+
+9. 添加小型服务器接口,用来编写本项目所需接口
+
+    
+
+>####  vue-cli3 脚手架
+1. 具体操作,请移步[vue-cli3文档官网]( [https://cli.vuejs.org/zh/guide/installation.html](https://links.jianshu.com/go?to=https%3A%2F%2Fcli.vuejs.org%2Fzh%2Fguide%2Finstallation.html)
+)
+2. **开发环境和生产环境配置**
+  * 根目录新建两文件 .env.development => 开发环境配置  .env.production => 生产环境配置
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-4f2c42f1c1bc4439.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+文件内容
+
+```
+// .env.development
+VUE_APP_URL="https://www.easy-mock.com/mock/5cd62747d3a84206275d58d1/huruqing/api"
+```
+
+```
+// .env.production
+VUE_APP_URL="https://www.easy-mock.com/mock/5cd62747d3a84206275d58d1/huruqing/api"
+```
+
+3. **package.json 配置**
+vue-cli3默认已经给你配置好了model, 开发环境对应development, 生产环境对应production,如果你不知道model,请移步[webpack文档官网]([https://www.webpackjs.com/](https://www.webpackjs.com/)
+)
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-5e9e447da363cfca.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+4. 在你的项目中,通过  process.env.VUE_APP_URL 可以访问到你在环境配置文件中设置的变量
+![](https://upload-images.jianshu.io/upload_images/7177443-d585aa842e655950.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+![开发环境中的变量](https://upload-images.jianshu.io/upload_images/7177443-02325513adfb846f.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>####  vue-router 路由
+这里主要讲一下路由守卫的配置,先上图
+![路由配置](https://upload-images.jianshu.io/upload_images/7177443-5f45913a5d70bf4d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+下面是路由守卫配置
+![路由守卫](https://upload-images.jianshu.io/upload_images/7177443-a935a3506fd9f567.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>####  vuex 跨组件通信
+1. 项目中有以下几个地方用到了 vuex
+    * 设置登录状态
+    * 设置用户名
+    * 保存 token
+2. 以登录为里,做个简单说明
+![](https://upload-images.jianshu.io/upload_images/7177443-825e2e816a49413b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+登录成功时,修改登陆状态为 true
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-906c4cc3e5713830.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+退出登录时,修改登录状态为 false
+![](https://upload-images.jianshu.io/upload_images/7177443-1da2a2e9208c1872.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+4. 获取 store 中 state 设置的变量通过 mapGetters, 看图
+![](https://upload-images.jianshu.io/upload_images/7177443-61be719b7d9c8a43.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+![在模板中使用](https://upload-images.jianshu.io/upload_images/7177443-8b2c372f88a0f59e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+3. vuex 持久化
+    * 使用 vuex-persistedstate 插件对 vuex 的状态持久化
+    * 等你的页面刷新时,状态依然存在
+    * 本质上是这个插件帮你把状态都存到了 localStorage
+配置方法,以下是最简单的配置
+![](https://upload-images.jianshu.io/upload_images/7177443-0aa53dbad9057879.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+使用了 vuex-persistedstate 插件后,store 里的状态都存到了 localStorage
+![image.png](https://upload-images.jianshu.io/upload_images/7177443-9cf6e3db49baf726.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>#### rem 移动端适配
+适配原理我就不多说了,不清楚请看我的另外一篇文章[用rem编写移动端自适应网页](https://www.jianshu.com/p/91ac1690be89)(https://www.jianshu.com/p/91ac1690be89),这里说一下在vue-cli3中是如何配置的
+1. 安装 amfe-flexible 插件 ```npm i amfe-flexible --save-dev```
+2. 在 main.js 中导入
+![ipone6](https://upload-images.jianshu.io/upload_images/7177443-05c1792eb5cfab79.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+3. 此时你的应用的 html 会自动根据手机的尺寸设置了 font-size, 如图
+![](https://upload-images.jianshu.io/upload_images/7177443-5ea467230b5426e0.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+![](https://upload-images.jianshu.io/upload_images/7177443-ee3e3fda5ec57b39.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+4. 配置 pxtorem 插件,能帮你自动把 rem 转成 px, 具体配置如下,在项目根目录下的 vue.config.js(没有则新建)
+里进行配置,如图
+![](https://upload-images.jianshu.io/upload_images/7177443-2b6e79201971d86d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>####  axios 配置
+1. axios 拦截器
+能帮我们对数据进行一些统一的处理,比如后台给我们的数据里都是把数据包在 data 对象里面,而使用 axios, 则又会再用 data 把返回的数据再包一层,如果不统一处理以下,用起来很不爽。
+2. 设置请求头,后台识别用户经常使用 token, 我们登陆的时候能拿到后台返回的 token, 然后存入 store 里,当我们发送请求时,我们可以给请求头统一加上 token, 如图
+![](https://upload-images.jianshu.io/upload_images/7177443-2a42eb0010cde4a1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+3. 把 axios 的实例挂载到 vue 的实例上
+![](https://upload-images.jianshu.io/upload_images/7177443-5163a952efbac676.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+发请求的时候,只需要使用 this.$axios.get 或者 this.$axios.post 就行了,是不是很方便
+![](https://upload-images.jianshu.io/upload_images/7177443-5a0bd9bbec047aa7.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>#### Promise 的使用
+promise 是个好东西,可以把异步变同步,在项目中使用 async await 编写代码,那叫一个爽,具体用法如下:
+![](https://upload-images.jianshu.io/upload_images/7177443-9f357fbd0a04215a.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
+
+>#### 有赞 vant-ui 库
+有赞是搞电商开发的,在公众号和小程序模板界算是做得比较不错的,vant-ui是他们开源出来的一个ui库,同时他们还有小程序的ui库,感兴趣的小伙伴可以去[看看](https://youzan.github.io/vant/)(https://youzan.github.io/vant/)
+
+>
+
+

+ 15 - 0
ys_h5/babel.config.js

@@ -0,0 +1,15 @@
+module.exports = {
+    plugins: [
+        [
+            "import",
+            {
+                libraryName: "vant",
+                libraryDirectory: "es",
+                // 指定样式路径
+                style: name => `${name}/style/less`
+            },
+            "vant"
+        ],
+        ["@babel/plugin-syntax-dynamic-import"]
+    ]
+};

文件差异内容过多而无法显示
+ 16843 - 0
ys_h5/package-lock.json


+ 66 - 0
ys_h5/package.json

@@ -0,0 +1,66 @@
+{
+  "name": "maizuo-h6",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve --model",
+    "dev": "vue-cli-service serve --model",
+    "prod": "vue-cli-service serve --model production",
+    "build": "vue-cli-service build --model",
+    "build:hq": "vue-cli-service build --model hq",
+    "push": "git add . && git commit -m'xxx' && git push",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "@babel/plugin-syntax-dynamic-import": "^7.2.0",
+    "babel-plugin-import": "^1.12.2",
+    "better-scroll": "^2.0.0-beta.10",
+    "core-js": "^2.6.5",
+    "css-loader": "^3.2.0",
+    "echarts": "^4.2.1",
+    "jquery": "^3.5.1",
+    "sass-loader": "^8.0.2",
+    "style-loader": "^1.0.0",
+    "v-viewer": "^1.5.1",
+    "vant": "^2.9.2",
+    "vue": "^2.6.10",
+    "vue-pdf": "^4.0.12",
+    "vue-photo-preview": "^1.1.3",
+    "vuex-persistedstate": "^2.5.4"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.7.0",
+    "@vue/cli-plugin-eslint": "^3.7.0",
+    "@vue/cli-service": "^4.2.2",
+    "amfe-flexible": "^2.2.1",
+    "autoprefixer": "^9.5.1",
+    "axios": "^0.18.1",
+    "babel-eslint": "^10.0.1",
+    "eslint": "^5.16.0",
+    "eslint-plugin-vue": "^5.0.0",
+    "less": "^3.9.0",
+    "less-loader": "^5.0.0",
+    "postcss-loader": "^3.0.0",
+    "postcss-pxtorem": "^4.0.1",
+    "vue-pdf": "^4.1.0",
+    "vue-router": "^3.0.6",
+    "vue-template-compiler": "^2.5.21",
+    "vuex": "^3.1.0"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true,
+      "jquery": true
+    },
+    "extends": [],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}

二进制
ys_h5/public/favicon.ico


+ 137 - 0
ys_h5/public/index.html

@@ -0,0 +1,137 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <!-- <meta name="viewport" content="width=device-width,initial-scale=1.0"> -->
+    <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title>云塑网移动端</title>
+    <link rel="stylesheet" href="http://at.alicdn.com/t/font_1456778_1mgn5degp7t.css">
+    <script src="https://cdn.bootcss.com/axios/0.19.0-beta.1/axios.min.js"></script>
+    <!-- 高德地图 -->
+    <script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=362cff852a3a37d328f9697352eebacd"></script>
+    <!-- 高德地图UI组件库 1.0 -->
+    <script src="//webapi.amap.com/ui/1.0/main.js"></script>
+
+    <!--微信js sdk-->
+    <script src="http://res.wx.qq.com/open/js/jweixin-1.2.0.js"></script>
+
+    <style>
+        /* 地图弹窗样式 */
+        .window {
+            background: #fff;
+            padding: 0px 0px 10px;
+            border:1px solid silver;
+            border-radius: 5px;
+        }
+
+        .info-top {
+            position: relative;
+            background: none repeat scroll 0 0 #F9F9F9;
+            border-bottom: 1px solid #CCC;
+            border-radius: 5px 5px 0 0;
+        }
+
+        div.info-top div {
+            display: inline-block;
+            color: #333333;
+            font-size: 14px;
+            font-weight: bold;
+            line-height: 31px;
+            padding: 0 10px;
+        }
+
+        div.info-top div span {
+            font-size:11px;
+            color:#F00;
+        }
+
+        div.info-top i {
+            position: absolute;
+            top: 10px;
+            right: 10px;
+            transition-duration: 0.25s;
+            cursor: pointer;
+        }
+
+        div.info-middle {
+            font-size: 12px;
+            padding: 10px 6px;
+            line-height: 20px;
+            background-color: #fff;
+        }
+
+        div.info-item {
+            width: 300px;
+            height: 30px;
+            line-height: 30px;
+            padding:0 8px;
+        }
+
+        div.info-item a {
+            color: #20a0ff;
+            cursor: pointer;
+        }
+
+        span.info-state {
+            float:right;
+        }
+
+        span.info-ball {
+            display: inline-block;
+            width:10px;
+            height:10px;
+            border-radius: 50%;
+            margin-right: 10px;
+            line-height: 30px;
+        }
+        
+        .customWidth {
+            width: 675px!important;
+        }
+
+        .activeNames .el-collapse-item__wrap {
+            border-bottom: none; 
+        }
+
+        /* 滚动条样式修改 */
+        /*滚动条凹槽的颜色,还可以设置边框属性 */
+        ::-webkit-scrollbar-track-piece {
+            background-color:#f8f8f8;
+            -webkit-border-radius: 2em;
+            -moz-border-radius: 2em;
+            border-radius: 2em;
+        }
+        /*滚动条的宽度*/
+        ::-webkit-scrollbar {
+            width:9px;
+        height: 9px;}
+        /*滚动条的设置*/
+        ::-webkit-scrollbar-thumb {
+            background-color:#dddddd;
+            background-clip:padding-box;
+            -webkit-border-radius: 2em;
+            -moz-border-radius: 2em;
+            border-radius: 2em;}
+
+        /*滚动条鼠标移上去*/
+        ::-webkit-scrollbar-thumb:hover {
+            background-color:#bbb;
+        }
+
+        /*取消消息列表弹出框的内边距*/
+        .popover-self {
+            padding: 0 !important;
+        }    
+    </style>
+</head>
+
+<body >
+    <noscript>
+        <strong>非常抱歉,网页丢了</strong>
+    </noscript>
+    <div id="app"></div>
+</body>
+
+</html>

+ 18 - 0
ys_h5/src/App.vue

@@ -0,0 +1,18 @@
+<template>
+    <div>
+        <keep-alive>
+            <router-view v-if="$route.meta.keepAlive"></router-view>
+        </keep-alive>
+        <router-view v-if="!$route.meta.keepAlive"></router-view>
+    </div>
+</template>
+
+<script>
+export default {
+    name: "app",
+    created() { }
+};
+</script>
+
+
+

二进制
ys_h5/src/assets/img/MovieDetails/1.jpg


二进制
ys_h5/src/assets/img/MovieDetails/jz1.jpg


二进制
ys_h5/src/assets/img/MovieDetails/jz2.jpg


二进制
ys_h5/src/assets/img/MovieDetails/jz3.jpg


二进制
ys_h5/src/assets/img/MovieDetails/jz4.jpg


二进制
ys_h5/src/assets/img/MovieDetails/r1.jpg


二进制
ys_h5/src/assets/img/MovieDetails/r2.jpg


二进制
ys_h5/src/assets/img/MovieDetails/r3.jpg


二进制
ys_h5/src/assets/img/MovieDetails/r4.jpg


二进制
ys_h5/src/assets/img/MovieDetails/r5.jpg


二进制
ys_h5/src/assets/img/alt.jpg


二进制
ys_h5/src/assets/img/book.png


二进制
ys_h5/src/assets/img/calendar.png


二进制
ys_h5/src/assets/img/close.png


二进制
ys_h5/src/assets/img/daijian.png


二进制
ys_h5/src/assets/img/daipei.png


二进制
ys_h5/src/assets/img/date.png


二进制
ys_h5/src/assets/img/detection.png


二进制
ys_h5/src/assets/img/document.png


二进制
ys_h5/src/assets/img/download.png


二进制
ys_h5/src/assets/img/gaofang.png


二进制
ys_h5/src/assets/img/home/check.png


二进制
ys_h5/src/assets/img/home/edit.png


二进制
ys_h5/src/assets/img/home/more.png


二进制
ys_h5/src/assets/img/home/my.png


二进制
ys_h5/src/assets/img/home/wait.png


二进制
ys_h5/src/assets/img/index/banner_1.png


二进制
ys_h5/src/assets/img/index/banner_2.png


二进制
ys_h5/src/assets/img/index/banner_3.png


二进制
ys_h5/src/assets/img/jianyao.png


二进制
ys_h5/src/assets/img/larger.png


二进制
ys_h5/src/assets/img/login_logo.png


二进制
ys_h5/src/assets/img/logo.png


二进制
ys_h5/src/assets/img/logo_new.png


二进制
ys_h5/src/assets/img/map.png


二进制
ys_h5/src/assets/img/members.png


二进制
ys_h5/src/assets/img/message.png


二进制
ys_h5/src/assets/img/mobile.png


二进制
ys_h5/src/assets/img/mould.png


二进制
ys_h5/src/assets/img/not.jpeg


二进制
ys_h5/src/assets/img/orderList1.jpg


二进制
ys_h5/src/assets/img/orderList2.jpg


二进制
ys_h5/src/assets/img/pdf.png


二进制
ys_h5/src/assets/img/peisong.png


二进制
ys_h5/src/assets/img/personal/beij.png


二进制
ys_h5/src/assets/img/personal/cl.png


二进制
ys_h5/src/assets/img/personal/dt.png


二进制
ys_h5/src/assets/img/personal/hb.png


二进制
ys_h5/src/assets/img/personal/head_back.jpg


二进制
ys_h5/src/assets/img/personal/p.png


二进制
ys_h5/src/assets/img/personal/qb.png


二进制
ys_h5/src/assets/img/personal/tg.png


二进制
ys_h5/src/assets/img/personal/tx.jpg


二进制
ys_h5/src/assets/img/personal/userHead.png


二进制
ys_h5/src/assets/img/personal/yhk.png


二进制
ys_h5/src/assets/img/poster/1.jpg


二进制
ys_h5/src/assets/img/poster/2.jpg


二进制
ys_h5/src/assets/img/poster/3.jpg


二进制
ys_h5/src/assets/img/poster/4.jpg


二进制
ys_h5/src/assets/img/project.png


二进制
ys_h5/src/assets/img/qx.png


二进制
ys_h5/src/assets/img/qxbj.png


二进制
ys_h5/src/assets/img/small.png


+ 0 - 0
ys_h5/src/assets/img/zhongyaofang.png


部分文件因为文件数量过多而无法显示