浏览代码

引入core资源

523096025 4 年之前
父节点
当前提交
b6647f9373
共有 85 个文件被更改,包括 3801 次插入0 次删除
  1. 9 0
      shiwan/admin/src/main/java/com/huimv/admin/AdminApplication.java
  2. 51 0
      shiwan/admin/src/main/java/com/huimv/admin/controller/AccountController.java
  3. 87 0
      shiwan/admin/src/main/java/com/huimv/admin/controller/AuthorizeController.java
  4. 80 0
      shiwan/admin/src/main/java/com/huimv/admin/controller/LoginController.java
  5. 45 0
      shiwan/admin/src/main/java/com/huimv/admin/controller/MenuController.java
  6. 48 0
      shiwan/admin/src/main/java/com/huimv/admin/controller/SysGroupController.java
  7. 55 0
      shiwan/admin/src/main/java/com/huimv/admin/controller/SysUserController.java
  8. 82 0
      shiwan/admin/src/main/java/com/huimv/admin/domain/MemberAccount.java
  9. 92 0
      shiwan/admin/src/main/java/com/huimv/admin/domain/SysAccountEntity.java
  10. 26 0
      shiwan/admin/src/main/java/com/huimv/admin/domain/SysAccountGroupEntity.java
  11. 26 0
      shiwan/admin/src/main/java/com/huimv/admin/domain/SysGroupEntity.java
  12. 26 0
      shiwan/admin/src/main/java/com/huimv/admin/domain/SysGroupMenuEntity.java
  13. 103 0
      shiwan/admin/src/main/java/com/huimv/admin/domain/SysMenuEntity.java
  14. 44 0
      shiwan/admin/src/main/java/com/huimv/admin/domain/SysUserEntity.java
  15. 38 0
      shiwan/admin/src/main/java/com/huimv/admin/exception/PlatformException.java
  16. 38 0
      shiwan/admin/src/main/java/com/huimv/admin/exception/RobotException.java
  17. 19 0
      shiwan/admin/src/main/java/com/huimv/admin/exception/constant/ExceptionConstant.java
  18. 28 0
      shiwan/admin/src/main/java/com/huimv/admin/group/UserAndAccountGroup.java
  19. 28 0
      shiwan/admin/src/main/java/com/huimv/admin/logger/ExceptionUtil.java
  20. 96 0
      shiwan/admin/src/main/java/com/huimv/admin/logger/dynamic/AppenderInstance.java
  21. 27 0
      shiwan/admin/src/main/java/com/huimv/admin/logger/dynamic/LevelController.java
  22. 10 0
      shiwan/admin/src/main/java/com/huimv/admin/repo/MemberAccountRepository.java
  23. 28 0
      shiwan/admin/src/main/java/com/huimv/admin/repo/SysAccountEntityRepository.java
  24. 35 0
      shiwan/admin/src/main/java/com/huimv/admin/repo/SysAccountGroupEntityRepository.java
  25. 15 0
      shiwan/admin/src/main/java/com/huimv/admin/repo/SysGroupEntityRepository.java
  26. 31 0
      shiwan/admin/src/main/java/com/huimv/admin/repo/SysGroupMenuEntityRepository.java
  27. 21 0
      shiwan/admin/src/main/java/com/huimv/admin/repo/SysMenuEntityRepository.java
  28. 37 0
      shiwan/admin/src/main/java/com/huimv/admin/repo/SysUserEntityRepository.java
  29. 32 0
      shiwan/admin/src/main/java/com/huimv/admin/response/ErrorResponse.java
  30. 24 0
      shiwan/admin/src/main/java/com/huimv/admin/response/OkResponse.java
  31. 9 0
      shiwan/admin/src/main/java/com/huimv/admin/response/PlatformResponse.java
  32. 68 0
      shiwan/admin/src/main/java/com/huimv/admin/response/ResponseData.java
  33. 46 0
      shiwan/admin/src/main/java/com/huimv/admin/response/RobotResponse.java
  34. 19 0
      shiwan/admin/src/main/java/com/huimv/admin/service/IAccountService.java
  35. 21 0
      shiwan/admin/src/main/java/com/huimv/admin/service/IAuthorizeService.java
  36. 17 0
      shiwan/admin/src/main/java/com/huimv/admin/service/IGroupService.java
  37. 10 0
      shiwan/admin/src/main/java/com/huimv/admin/service/ILoginService.java
  38. 25 0
      shiwan/admin/src/main/java/com/huimv/admin/service/IMenuService.java
  39. 26 0
      shiwan/admin/src/main/java/com/huimv/admin/service/IUserService.java
  40. 97 0
      shiwan/admin/src/main/java/com/huimv/admin/service/impl/AccountServiceImpl.java
  41. 263 0
      shiwan/admin/src/main/java/com/huimv/admin/service/impl/AuthorizeServiceImpl.java
  42. 81 0
      shiwan/admin/src/main/java/com/huimv/admin/service/impl/GroupServiceImpl.java
  43. 51 0
      shiwan/admin/src/main/java/com/huimv/admin/service/impl/LoginServiceImpl.java
  44. 135 0
      shiwan/admin/src/main/java/com/huimv/admin/service/impl/MenuServiceImpl.java
  45. 289 0
      shiwan/admin/src/main/java/com/huimv/admin/service/impl/UserServiceImpl.java
  46. 64 0
      shiwan/admin/src/main/java/com/huimv/admin/session/PlatformHttpSessionIdResolver.java
  47. 58 0
      shiwan/admin/src/main/java/com/huimv/admin/session/PlatformWebSessionIdResolver.java
  48. 65 0
      shiwan/admin/src/main/java/com/huimv/admin/session/reuqest/ParameterRequestWrapper.java
  49. 30 0
      shiwan/admin/src/main/java/com/huimv/admin/task/ScheduledTask.java
  50. 100 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/CheckNumber.java
  51. 27 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/GetMD5Str.java
  52. 27 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/IpTools.java
  53. 8 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/PageResult.java
  54. 38 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/PlatformException.java
  55. 79 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/Result.java
  56. 41 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/ResultCode.java
  57. 171 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/id/SnowflakeIdWorker.java
  58. 202 0
      shiwan/admin/src/main/java/com/huimv/admin/utils/id/SnowflakeSequence.java
  59. 44 0
      shiwan/admin/src/main/resources/application-prod.yml
  60. 49 0
      shiwan/admin/src/main/resources/application-test.yml
  61. 3 0
      shiwan/admin/src/main/resources/application.properties
  62. 4 0
      shiwan/admin/src/main/resources/log4j.properties
  63. 1 0
      shiwan/admin/src/main/resources/static/admin/css/app.999bd5a8.css
  64. 1 0
      shiwan/admin/src/main/resources/static/admin/css/chunk-796bd885.c5fc08d6.css
  65. 1 0
      shiwan/admin/src/main/resources/static/admin/css/chunk-d101def2.dd69aec3.css
  66. 1 0
      shiwan/admin/src/main/resources/static/admin/css/chunk-f60e2c2a.f779a949.css
  67. 1 0
      shiwan/admin/src/main/resources/static/admin/css/chunk-vendors.84bb20f7.css
  68. 二进制
      shiwan/admin/src/main/resources/static/admin/favicon.ico
  69. 二进制
      shiwan/admin/src/main/resources/static/admin/fonts/element-icons.535877f5.woff
  70. 二进制
      shiwan/admin/src/main/resources/static/admin/fonts/element-icons.732389de.ttf
  71. 二进制
      shiwan/admin/src/main/resources/static/admin/img/login_bg.7dd3ba26.jpg
  72. 二进制
      shiwan/admin/src/main/resources/static/admin/img/logo.d1c8b219.png
  73. 1 0
      shiwan/admin/src/main/resources/static/admin/index.html
  74. 2 0
      shiwan/admin/src/main/resources/static/admin/js/app.8c39dcf9.js
  75. 1 0
      shiwan/admin/src/main/resources/static/admin/js/app.8c39dcf9.js.map
  76. 2 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-796bd885.06fe2073.js
  77. 1 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-796bd885.06fe2073.js.map
  78. 2 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-d101def2.f12093d0.js
  79. 1 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-d101def2.f12093d0.js.map
  80. 2 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-f60e2c2a.f041f79a.js
  81. 1 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-f60e2c2a.f041f79a.js.map
  82. 311 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-vendors.29f05e6d.js
  83. 1 0
      shiwan/admin/src/main/resources/static/admin/js/chunk-vendors.29f05e6d.js.map
  84. 12 0
      shiwan/admin/src/main/resources/static/index.html
  85. 11 0
      shiwan/admin/src/main/resources/static/index.jsp

+ 9 - 0
shiwan/admin/src/main/java/com/huimv/admin/AdminApplication.java

@@ -2,8 +2,17 @@ package com.huimv.admin;
 
 
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
 
 
+@EnableDiscoveryClient
+@FeignClient
 @SpringBootApplication
 @SpringBootApplication
+@EnableScheduling
+//@ComponentScan({"com.huimv.core","com.huimv.huimvcore"})
+@ComponentScan(value = "com.huimv")
 public class AdminApplication {
 public class AdminApplication {
 
 
     public static void main(String[] args) {
     public static void main(String[] args) {

+ 51 - 0
shiwan/admin/src/main/java/com/huimv/admin/controller/AccountController.java

@@ -0,0 +1,51 @@
+package com.huimv.admin.controller;
+
+;
+import com.huimv.admin.domain.SysAccountEntity;
+import com.huimv.admin.service.IAccountService;
+import com.huimv.admin.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@CrossOrigin
+@RestController
+@RequestMapping("/account")
+public class AccountController {
+
+    @Autowired
+    private IAccountService iAccountService;
+
+    @RequestMapping("/new")
+    public Result newAccount(@RequestParam(name = "userId") Integer userId){
+       return iAccountService.newAccount(userId);
+    }
+
+    @RequestMapping("/cancel")
+    public Result cancelAccount(@RequestParam(name = "id") Integer id,
+                                @RequestParam(name = "accountStatus") Integer accountStatus){
+       return iAccountService.cancelAccount(id,accountStatus);
+    }
+
+    @RequestMapping("/remove")
+    public Result removeAccount(@RequestParam(name = "ids") List<Integer> ids){
+        return  iAccountService.removeAccount(ids);
+    }
+
+
+    @RequestMapping("/list")
+    public List<SysAccountEntity> listAccount(){
+        return iAccountService.findAll();
+    }
+
+    @RequestMapping("/setAccountStatus")
+    public Result setAccountStatus(@RequestParam(name = "ids") List<Integer> ids, @RequestParam(name = "status") Integer status){
+        /* 设置账号状态 */
+        return iAccountService.setAccountStatus(ids,status);
+    }
+
+}

+ 87 - 0
shiwan/admin/src/main/java/com/huimv/admin/controller/AuthorizeController.java

@@ -0,0 +1,87 @@
+package com.huimv.admin.controller;
+
+import com.huimv.admin.domain.SysMenuEntity;
+import com.huimv.admin.service.IAuthorizeService;
+import com.huimv.admin.service.IMenuService;
+import com.huimv.admin.utils.Result;
+import com.huimv.admin.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+import java.util.Map;
+
+@CrossOrigin
+@RestController
+@RequestMapping(value = "/auth")
+public class AuthorizeController {
+
+    @Autowired
+    IAuthorizeService iAuthorizeService;
+    @Autowired
+    IMenuService iMenuService;
+
+    @RequestMapping("/saveAccountGroup")
+    public Result saveAccountGroup(@RequestParam(name = "accountId", required = true) String accountId, @RequestParam(name = "groupIds", required = true) String groupIds){
+        /*
+         * 保存账号关联权限组数据
+         */
+        return iAuthorizeService.saveAccountGroup(accountId,groupIds);
+    }
+
+    @RequestMapping("/saveGroupMenu")
+    public Result saveGroupMenu(@RequestParam(name = "groupId", required = true) String groupId, @RequestParam(name = "menuIds", required = true) String menuIds){
+        /*
+         * 保存权限组关联菜单数据
+         */
+        return iAuthorizeService.saveGroupMenu(groupId,menuIds);
+    }
+
+    @RequestMapping("/getGroupByAccount")
+    public Result getGroupByAccount(@RequestParam(name = "accountId", required = true) String accountId){
+        /*
+         * 根据账号获取权限组
+         */
+        return iAuthorizeService.getGroupByAccount (accountId);
+    }
+
+    @RequestMapping("/getMenuByGroup")
+    public Result getMenuByGroup(@RequestParam(name = "groupId", required = true) String groupId){
+        /*
+         * 根据权限组获取菜单
+         */
+        return iAuthorizeService.getMenuByGroup(groupId);
+    }
+
+  /*  @RequestMapping("/getMyMenu")
+    public Result getMyMenu(@RequestParam(name = "accountName", required = true) String accountName){
+        System.out.println("accountName>>"+accountName);
+        *//*
+         * 获取用户的菜单数据
+         *//*
+
+        return iAuthorizeService.getMyMenu(accountName);
+    }*/
+    @RequestMapping("/getMyMenu")
+    public Result getMyMenu(@RequestParam(name = "accountName", required = true) String accountName){
+        System.out.println("accountName>>"+accountName);
+        /*
+         * 获取用户的菜单数据
+         */
+        List<SysMenuEntity> myMenu = iAuthorizeService.getMyMenu(accountName);
+        List<Map> list = iMenuService.optimizeListUtil(0,myMenu);
+
+        return new Result(ResultCode.SUCCESS,list);
+    }
+
+    @RequestMapping("/getAcountByGroup")
+    public Result getAccountByGroup(@RequestParam(name = "groupId", required = true) String groupId){
+        /*
+         * 根据权限组获取菜单
+         */
+        return iAuthorizeService.getAccountByGroup(groupId);
+    }
+}

+ 80 - 0
shiwan/admin/src/main/java/com/huimv/admin/controller/LoginController.java

@@ -0,0 +1,80 @@
+package com.huimv.admin.controller;
+
+import com.huimv.admin.service.ILoginService;
+import com.huimv.admin.utils.CheckNumber;
+import com.huimv.admin.utils.IpTools;
+import com.huimv.admin.utils.Result;
+import com.huimv.core.domain.SysAccountEntity;
+import com.huimv.session.AccessToken;
+import com.huimv.session.HmSession;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.imageio.ImageIO;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import javax.servlet.http.HttpSession;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.util.Date;
+
+@CrossOrigin
+@RestController
+@RequestMapping(value = "/my")
+public class LoginController {
+    @Autowired
+    ILoginService iLoginService;
+
+    private static String text;
+
+    @RequestMapping(value = "/login", method = RequestMethod.POST)
+    public AccessToken login(HttpSession session, @RequestParam(name = "accountName", required = true) String accountName, @RequestParam(name = "password", required = true) String password, HttpServletRequest req)  {
+        // 对密码加密
+//        Result result = iLoginService.login(accountName,         .getMD5Str(password));
+        // 未对密码加密
+        Result result = iLoginService.login(accountName, password);
+        SysAccountEntity accountEntity = (SysAccountEntity) result.getData();
+        String userIp = IpTools.getRemoteHost(req);
+        //spring-session默认使用uuid作为sessionId返回:
+        System.out.println("当前请求的sessionId为:" + session.getId());
+        HmSession hmSession = new HmSession();
+        hmSession.setAccountEntity(accountEntity);
+        session.setAttribute("hmSession", hmSession);
+
+        AccessToken accessToken = new AccessToken();
+        accessToken.setToken(session.getId());
+        accessToken.setLoginIp(userIp);
+        accessToken.setCreated(new Date());
+        accessToken.setAccountName(accountName);
+        accessToken.setCode(result.getCode());
+        return accessToken;
+    }
+
+    @RequestMapping("/logout")
+    public Result logout(@RequestParam(name = "accountName", required = true) String accountName, @RequestParam(name = "password", required = true) String password) {
+        return iLoginService.logout();
+    }
+
+
+    @RequestMapping(value = "getCheckNumber", produces = {"text/html;charset=UTF-8"})
+    public void getCheckNumber(HttpServletResponse response) throws IOException {
+        //创建对象
+        CheckNumber checkNumber = new CheckNumber();
+        //获取图片对象
+        BufferedImage image = checkNumber.getImage();
+        //获得图片的文本内容
+        text = checkNumber.getText();
+        //把图片返回前端
+        ImageIO.write(image, "JPEG", response.getOutputStream());
+    }
+    @RequestMapping("/checkNumber")
+    public Result checkNumber(String userCaptcha){
+        //获取用户输入的校验码并进行比较
+       // String sessionCheckNumber = (String) session.getAttribute("checkNumber");
+        System.out.println(userCaptcha +":"+ text);
+        if (text.equalsIgnoreCase(userCaptcha)) {
+            return new Result(10001,"验证码正确",true);
+        }
+        return new Result(10002,"验证码错误",false);
+    }
+}

+ 45 - 0
shiwan/admin/src/main/java/com/huimv/admin/controller/MenuController.java

@@ -0,0 +1,45 @@
+package com.huimv.admin.controller;
+
+import com.huimv.admin.domain.SysMenuEntity;
+import com.huimv.admin.service.IMenuService;
+import com.huimv.admin.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+@CrossOrigin
+@RestController
+@RequestMapping("/menu")
+public class MenuController {
+    @Autowired
+    private IMenuService menuService;
+
+    @RequestMapping("/add")
+    public Result addMenu(SysMenuEntity menu){
+        return menuService.addMenu(menu);
+    }
+
+
+    @RequestMapping("/edit")
+    public Result editMenu( SysMenuEntity menu){
+        return menuService.editMenu(menu);
+    }
+
+
+    @RequestMapping("/remove")
+    public Result removeMenu(@RequestParam(name = "menuId") Integer menuId){
+        return menuService.removeMenu(menuId);
+    }
+
+   /* @RequestMapping("/list")
+    public List<Map> listMenu() {
+        return menuService.listMenu();
+    }*/
+
+    @PostMapping("/list")
+    public List<Map> optimizeList() {
+        return menuService.optimizeList();
+    }
+}

+ 48 - 0
shiwan/admin/src/main/java/com/huimv/admin/controller/SysGroupController.java

@@ -0,0 +1,48 @@
+package com.huimv.admin.controller;
+
+
+import com.huimv.admin.domain.SysGroupEntity;
+import com.huimv.admin.service.IGroupService;
+import com.huimv.admin.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+
+@CrossOrigin
+@RestController
+@RequestMapping("/group")
+public class SysGroupController {
+
+    @Autowired
+    private IGroupService groupService;
+
+    @RequestMapping("/add")
+    public Result addGroup (@RequestParam(name = "groupName") String groupName,
+                          @RequestParam(name = "remark") String remark){
+        return groupService.addGroup(groupName,remark);
+    }
+
+
+    @RequestMapping("/edit")
+    public Result updateGroup( @RequestParam(name = "groupId",required = false) Integer groupId,
+                             @RequestParam(name = "groupName") String groupName,
+                             @RequestParam(name = "remark") String remark ){
+        return groupService.updateGroup(groupId,groupName,remark);
+    }
+
+    @RequestMapping("/remove")
+    public Result removeGroup( @RequestParam("groupId") Integer groupId) {
+        return groupService.removeGroup(groupId);
+    }
+
+    @RequestMapping("/list")
+    public Page<SysGroupEntity> listGroup(@RequestParam(name = "pageNum") int pageNum,
+                                          @RequestParam(name = "pageSize") int pageSize,
+                                          @RequestParam(name = "searchStr", required = false) String searchStr) {
+        return groupService.listGroup(pageNum,pageSize,searchStr);
+    }
+}

+ 55 - 0
shiwan/admin/src/main/java/com/huimv/admin/controller/SysUserController.java

@@ -0,0 +1,55 @@
+package com.huimv.admin.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.admin.domain.SysUserEntity;
+import com.huimv.admin.group.UserAndAccountGroup;
+import com.huimv.admin.service.IUserService;
+import com.huimv.admin.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.CrossOrigin;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.List;
+
+@CrossOrigin
+@RestController
+@RequestMapping("/user")
+public class SysUserController {
+    @Autowired
+    private IUserService iUserService;
+
+    @RequestMapping("/add")
+    public Result addUser(SysUserEntity user){
+        return  iUserService.addUser(user);
+    }
+
+    @RequestMapping("/edit")
+    public Result updateUser(SysUserEntity user){
+        return iUserService.updateUser(user);
+    }
+
+    @RequestMapping("/remove")
+    public Result removeUser( @RequestParam("userIds") List<Integer> userIds) {
+
+        return iUserService.removeUser(userIds);
+    }
+
+    @RequestMapping("/list_old")
+    public List<UserAndAccountGroup> listUser_old(@RequestParam(name = "pageNum") int pageNum,
+                                                  @RequestParam(name = "pageSize") int pageSize,
+                                                  @RequestParam(name = "searchStr", required = false) String searchStr) {
+        return iUserService.yxxList(searchStr,pageNum,pageNum);
+    }
+
+    @RequestMapping("/list")
+    public JSONObject listUser(@RequestParam(name = "pageNum") int pageNum,
+                               @RequestParam(name = "pageSize") int pageSize,
+                               @RequestParam(name = "searchStr", required = false) String searchStr) {
+
+        return iUserService.findUserAccount(searchStr,pageNum,pageSize);
+    }
+
+}

+ 82 - 0
shiwan/admin/src/main/java/com/huimv/admin/domain/MemberAccount.java

@@ -0,0 +1,82 @@
+package com.huimv.admin.domain;
+
+import java.io.Serializable;
+import java.util.Date;
+
+//import javax.persistence.Column;
+//import javax.persistence.Entity;
+//import javax.persistence.Index;
+//import javax.persistence.PrimaryKeyJoinColumn;
+//import javax.persistence.Table;
+import javax.persistence.*;
+
+import com.huimv.core.domain.MemberInfo;
+import org.hibernate.annotations.DynamicInsert;
+import org.hibernate.annotations.DynamicUpdate;
+
+@Entity
+@Table(indexes = {@Index(columnList = "loginName")})
+@PrimaryKeyJoinColumn
+@DynamicInsert(true)
+@DynamicUpdate(true)
+public class MemberAccount extends MemberInfo implements Serializable {
+
+	//序列化
+	private static final long serialVersionUID = 6918188566018907803L;
+
+	/**
+	 * login如果限定成 email ,还需要验证下
+	 */
+	private String loginName;
+	private String loginPwd;
+	private Boolean isVerified;
+
+    @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
+    private Date updated;
+
+    @Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP", updatable = false)
+    private Date created;
+
+	public String getLoginName() {
+		return loginName;
+	}
+
+	public void setLoginName(String loginName) {
+		this.loginName = loginName;
+	}
+
+	public String getLoginPwd() {
+		return loginPwd;
+	}
+
+	public void setLoginPwd(String loginPwd) {
+		this.loginPwd = loginPwd;
+	}
+
+	public Boolean getIsVerified() {
+		return isVerified;
+	}
+
+	public void setIsVerified(Boolean isVerified) {
+		this.isVerified = isVerified;
+	}
+
+	@Override
+	public Date getUpdated() {
+		return updated;
+	}
+
+	public void setUpdated(Date updated) {
+		this.updated = updated;
+	}
+
+	public Date getCreated() {
+		return created;
+	}
+
+	public void setCreated(Date created) {
+		this.created = created;
+	}
+    
+	
+}

+ 92 - 0
shiwan/admin/src/main/java/com/huimv/admin/domain/SysAccountEntity.java

@@ -0,0 +1,92 @@
+package com.huimv.admin.domain;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "sys_account")
+public class SysAccountEntity implements Serializable {
+
+    private static final long serialVersionUID = 6073065542016688601L;
+
+    @Override
+    public String toString() {
+        return "SysAccountEntity{" +
+                "id=" + id +
+                ", accountName='" + accountName + '\'' +
+                ", password='" + password + '\'' +
+                ", accountStatus=" + accountStatus +
+                ", remark='" + remark + '\'' +
+                ", userId=" + userId +
+                '}';
+    }
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false)
+    private Integer id;
+
+    @Column(name = "account_name")
+    private String accountName;
+
+    @Column(name = "password")
+    private String password;
+
+    @Column(name = "account_status")
+    private Integer accountStatus;
+
+    @Column(name = "remark")
+    private String remark;
+
+    @Column(name = "user_id")
+    private Long userId;
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setPassword(String password) {
+        this.password = password;
+    }
+
+    public String getPassword() {
+        return password;
+    }
+
+    public void setAccountStatus(Integer accountStatus) {
+        this.accountStatus = accountStatus;
+    }
+
+    public Integer getAccountStatus() {
+        return accountStatus;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setUserId(Long userId) {
+        this.userId = userId;
+    }
+
+    public Long getUserId() {
+        return userId;
+    }
+
+}

+ 26 - 0
shiwan/admin/src/main/java/com/huimv/admin/domain/SysAccountGroupEntity.java

@@ -0,0 +1,26 @@
+package com.huimv.admin.domain;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "sys_account_group")
+@Data
+public class SysAccountGroupEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false)
+    private Integer id;
+
+    @Column(name = "account_id")
+    private Integer accountId;
+
+    @Column(name = "group_id")
+    private Integer groupId;
+
+}

+ 26 - 0
shiwan/admin/src/main/java/com/huimv/admin/domain/SysGroupEntity.java

@@ -0,0 +1,26 @@
+package com.huimv.admin.domain;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Table(name = "sys_group")
+@Data
+public class SysGroupEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false)
+    private Integer id;
+
+    @Column(name = "group_name")
+    private String groupName;
+
+    @Column(name = "remark")
+    private String remark;
+
+}

+ 26 - 0
shiwan/admin/src/main/java/com/huimv/admin/domain/SysGroupMenuEntity.java

@@ -0,0 +1,26 @@
+package com.huimv.admin.domain;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Data
+@Table(name = "sys_group_menu")
+public class SysGroupMenuEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false)
+    private Integer id;
+
+    @Column(name = "group_id")
+    private Integer groupId;
+
+    @Column(name = "menu_id")
+    private Integer menuId;
+
+}

+ 103 - 0
shiwan/admin/src/main/java/com/huimv/admin/domain/SysMenuEntity.java

@@ -0,0 +1,103 @@
+package com.huimv.admin.domain;
+
+import javax.persistence.*;
+import java.io.Serializable;
+import java.util.List;
+
+@Entity
+@Table(name = "sys_menu")
+public class SysMenuEntity implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false)
+    private Integer id;
+
+    @Column(name = "menu_name")
+    private String menuName;
+
+    @Column(name = "url")
+    private String url;
+
+    @Column(name = "remark")
+    private String remark;
+
+    @Column(name = "parent_id", nullable = false)
+    private Integer parentId;
+
+    @Column(name = "sort")
+    private Integer sort;
+
+    public void setId(Integer id) {
+        this.id = id;
+    }
+
+    public Integer getId() {
+        return id;
+    }
+
+    public void setMenuName(String menuName) {
+        this.menuName = menuName;
+    }
+
+    public String getMenuName() {
+        return menuName;
+    }
+
+    public void setUrl(String url) {
+        this.url = url;
+    }
+
+    public String getUrl() {
+        return url;
+    }
+
+    public void setRemark(String remark) {
+        this.remark = remark;
+    }
+
+    public String getRemark() {
+        return remark;
+    }
+
+    public void setParentId(Integer parentId) {
+        this.parentId = parentId;
+    }
+
+    public Integer getParentId() {
+        return parentId;
+    }
+
+    public void setSort(Integer sort) {
+        this.sort = sort;
+    }
+
+    public Integer getSort() {
+        return sort;
+    }
+
+    @Transient
+    private List<SysMenuEntity> children;
+
+    public List<SysMenuEntity> getChildren() {
+        return children;
+    }
+
+    public void setChildren(List<SysMenuEntity> children) {
+        this.children = children;
+    }
+
+    @Override
+    public String toString() {
+        return "SysMenuEntity{" +
+                "id=" + id + '\'' +
+                "menuName=" + menuName + '\'' +
+                "url=" + url + '\'' +
+                "remark=" + remark + '\'' +
+                "parentId=" + parentId + '\'' +
+                "sort=" + sort + '\'' +
+                '}';
+    }
+}

+ 44 - 0
shiwan/admin/src/main/java/com/huimv/admin/domain/SysUserEntity.java

@@ -0,0 +1,44 @@
+package com.huimv.admin.domain;
+
+import lombok.Data;
+
+import javax.persistence.*;
+import java.io.Serializable;
+
+@Entity
+@Data
+@Table(name = "sys_user")
+public class SysUserEntity implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    @Column(name = "id", nullable = false)
+    private Integer id;
+
+    @Column(name = "user_name")
+    private String userName;
+
+    @Column(name = "male")
+    private Integer male;
+
+    @Column(name = "birthday")
+    private String birthday;
+
+    @Column(name = "mobile")
+    private String mobile;
+
+    @Column(name = "address")
+    private String address;
+
+    @Column(name = "job")
+    private String job;
+
+    @Column(name = "remark")
+    private String remark;
+
+    @Column(name = "user_id")
+    private Long userId;
+
+
+}

+ 38 - 0
shiwan/admin/src/main/java/com/huimv/admin/exception/PlatformException.java

@@ -0,0 +1,38 @@
+/**
+ * @Copyright (C), 2014-2020, 杭州慧牧科技有限公司
+ * @ClassName: RobotException
+ * @Author: yejijie
+ * @E-mail: yejijie@huimv.com
+ * @Date: 2020年4月23日
+ * @Version: V1.0
+ * @Description:
+ */
+package com.huimv.admin.exception;
+
+/**
+ * @author yejijie
+ *
+ */
+public class PlatformException extends RuntimeException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 6529181147584750288L;
+	private String errCode;
+	private String errMsg;
+	public PlatformException() {
+		super();
+	}
+	public PlatformException(String code, String msg) {
+		super(msg);
+		this.errCode = code;
+		this.errMsg = msg;
+	}
+	public String getErrCode() {
+		return errCode;
+	}
+	public String getErrMsg() {
+		return errMsg;
+	}
+}

+ 38 - 0
shiwan/admin/src/main/java/com/huimv/admin/exception/RobotException.java

@@ -0,0 +1,38 @@
+/**
+ * @Copyright (C), 2014-2020, 杭州慧牧科技有限公司
+ * @ClassName: RobotException
+ * @Author: yejijie
+ * @E-mail: yejijie@huimv.com
+ * @Date: 2020年4月23日
+ * @Version: V1.0
+ * @Description:
+ */
+package com.huimv.admin.exception;
+
+/**
+ * @author yejijie
+ *
+ */
+public class RobotException extends RuntimeException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 6529181147584750288L;
+	private String errCode;
+	private String errMsg;
+	public RobotException() {
+		super();
+	}
+	public RobotException(String code, String msg) {
+		super(msg);
+		this.errCode = code;
+		this.errMsg = msg;
+	}
+	public String getErrCode() {
+		return errCode;
+	}
+	public String getErrMsg() {
+		return errMsg;
+	}
+}

+ 19 - 0
shiwan/admin/src/main/java/com/huimv/admin/exception/constant/ExceptionConstant.java

@@ -0,0 +1,19 @@
+package com.huimv.admin.exception.constant;
+
+/**
+ * 异常 常量类
+ * @author guojian
+ */
+public class ExceptionConstant {
+
+    public static final String DATA_NOT_FOUND = "data_not_found";
+
+    public static final String REQUEST_NOT_AUTHORIZE = "request_not_authorize";
+    public static final String ACCOUNT_NOT_AUTHORIZE = "account_not_authorize";
+    public static final String ORG_NOT_AUTHORIZE = "org_not_authorize";
+
+    public static final String OVERSTEP_ORG_AUTH = "overstep_org_auth";
+
+    public static final String DO_IT_LATER = "do_it_later";
+    public static final String ORG_NOT_ACCOUNT = "org_not_account";
+}

+ 28 - 0
shiwan/admin/src/main/java/com/huimv/admin/group/UserAndAccountGroup.java

@@ -0,0 +1,28 @@
+package com.huimv.admin.group;
+
+import lombok.Data;
+
+@Data
+public class UserAndAccountGroup {
+    private String accountName;
+
+    private Integer accountStatus;
+
+    private Integer id;
+
+    private String userName;
+
+    private Integer male;
+
+    private String birthday;
+
+    private String mobile;
+
+    private String address;
+
+    private String job;
+
+    private String remark;
+
+    private Long userId;
+}

+ 28 - 0
shiwan/admin/src/main/java/com/huimv/admin/logger/ExceptionUtil.java

@@ -0,0 +1,28 @@
+package com.huimv.admin.logger;
+
+import lombok.extern.slf4j.Slf4j;
+
+import java.io.IOException;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+
+@Slf4j
+public class ExceptionUtil {
+
+    /**
+     * 打印异常信息
+     */
+    public static String getMessage(Exception e) {
+        String swStr = null;
+        try (StringWriter sw = new StringWriter(); PrintWriter pw = new PrintWriter(sw)) {
+            e.printStackTrace(pw);
+            pw.flush();
+            sw.flush();
+            swStr = sw.toString();
+        } catch (IOException ex) {
+            ex.printStackTrace();
+            log.error(ex.getMessage());
+        }
+        return swStr;
+    }
+}

+ 96 - 0
shiwan/admin/src/main/java/com/huimv/admin/logger/dynamic/AppenderInstance.java

@@ -0,0 +1,96 @@
+package com.huimv.admin.logger.dynamic;
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.LoggerContext;
+import ch.qos.logback.classic.encoder.PatternLayoutEncoder;
+import ch.qos.logback.classic.filter.LevelFilter;
+import ch.qos.logback.core.rolling.RollingFileAppender;
+import ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy;
+import ch.qos.logback.core.util.FileSize;
+import ch.qos.logback.core.util.OptionHelper;
+import com.huimv.admin.exception.PlatformException;
+import org.slf4j.LoggerFactory;
+import org.springframework.util.StringUtils;
+
+import java.text.DateFormat;
+import java.util.Date;
+import java.util.Locale;
+
+/**
+ * 这个类是给日志动态提供appender
+ * @author guojian
+ */
+public class AppenderInstance {
+
+    /**
+     * 通过传入的名字和级别,动态设置appender
+     * @param logDir
+     * @param name
+     * @param level
+     * @return
+     */
+    public RollingFileAppender getAppender(String logDir, String name, Level level) {
+        //最好还能做个正则校验?(目录)
+        if(StringUtils.isEmpty(logDir)){
+            throw new PlatformException("log_dir_empty", "日志文件目录,初始化失败...");
+        }
+
+        DateFormat format = DateFormat.getDateInstance(DateFormat.MEDIUM, Locale.SIMPLIFIED_CHINESE);
+        LoggerContext context = (LoggerContext) LoggerFactory.getILoggerFactory();
+        //这里是可以用来设置appender的,在xml配置文件里面,是这种形式:
+        // <appender name="error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+        RollingFileAppender appender = new RollingFileAppender();
+//        ConsoleAppender consoleAppender = new ConsoleAppender();
+
+        //这里设置级别过滤器
+        LevelController levelController = new LevelController();
+        LevelFilter levelFilter = levelController.getLevelFilter(level);
+        levelFilter.start();
+        appender.addFilter(levelFilter);
+
+
+        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
+        //但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
+        appender.setContext(context);
+        //appender的name属性
+        appender.setName("FILE-" + name);
+        //设置文件名
+        appender.setFile(OptionHelper.substVars(logDir + name + "/" + format.format(new Date()) + "/" + level.levelStr + ".log", context));
+
+        appender.setAppend(true);
+        appender.setPrudent(false);
+
+        //设置文件创建时间及大小的类
+        SizeAndTimeBasedRollingPolicy policy = new SizeAndTimeBasedRollingPolicy();  //TimeBasedRollingPolicy
+        //文件名格式
+        String fp = OptionHelper.substVars(logDir + name + "/" + format.format(new Date()) + "/" + level.levelStr + "/.%d{yyyy-MM-dd}.%i.log", context);
+        //最大日志文件大小
+        policy.setMaxFileSize(FileSize.valueOf("128MB"));
+        //设置文件名模式
+        policy.setFileNamePattern(fp);
+        //设置最大历史记录为15条
+        policy.setMaxHistory(15);
+        //总大小限制
+        policy.setTotalSizeCap(FileSize.valueOf("32GB"));
+        //设置父节点是appender
+        policy.setParent(appender);
+        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
+        //但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
+        policy.setContext(context);
+        policy.start();
+
+        PatternLayoutEncoder encoder = new PatternLayoutEncoder();
+        //设置上下文,每个logger都关联到logger上下文,默认上下文名称为default。
+        //但可以使用<contextName>设置成其他名字,用于区分不同应用程序的记录。一旦设置,不能修改。
+        encoder.setContext(context);
+        //设置格式
+        encoder.setPattern("%d %p (%file:%line\\)- %m%n");
+        encoder.start();
+
+        //加入下面两个节点
+        appender.setRollingPolicy(policy);
+        appender.setEncoder(encoder);
+        appender.start();
+        return appender;
+    }
+}

+ 27 - 0
shiwan/admin/src/main/java/com/huimv/admin/logger/dynamic/LevelController.java

@@ -0,0 +1,27 @@
+package com.huimv.admin.logger.dynamic;
+
+
+import ch.qos.logback.classic.Level;
+import ch.qos.logback.classic.filter.LevelFilter;
+
+import static ch.qos.logback.core.spi.FilterReply.ACCEPT;
+import static ch.qos.logback.core.spi.FilterReply.DENY;
+
+/**
+ * 这个类的作用是给日志通过level设置过滤器
+ * @author guojian
+ */
+public class LevelController {
+    /**
+     * 通过level设置过滤器
+     * @param level
+     * @return
+     */
+    public LevelFilter getLevelFilter(Level level){
+        LevelFilter levelFilter = new LevelFilter();
+        levelFilter.setLevel(level);
+        levelFilter.setOnMatch(ACCEPT);
+        levelFilter.setOnMismatch(DENY);
+        return levelFilter;
+    }
+}

+ 10 - 0
shiwan/admin/src/main/java/com/huimv/admin/repo/MemberAccountRepository.java

@@ -0,0 +1,10 @@
+package com.huimv.admin.repo;
+
+import com.huimv.admin.domain.MemberAccount;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MemberAccountRepository extends JpaRepository<MemberAccount, Integer> {
+	
+	MemberAccount findByLoginName(String loginName);
+	
+}

+ 28 - 0
shiwan/admin/src/main/java/com/huimv/admin/repo/SysAccountEntityRepository.java

@@ -0,0 +1,28 @@
+package com.huimv.admin.repo;
+
+import com.huimv.admin.domain.SysAccountEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface SysAccountEntityRepository extends JpaRepository<SysAccountEntity, Integer>, JpaSpecificationExecutor<SysAccountEntity> {
+    @Query(nativeQuery = true , value = "SELECT * FROM sys_account WHERE account_name=?1 AND password=?2")
+    SysAccountEntity findByAccountName(String accountName, String password);
+
+    @Transactional
+    @Modifying(clearAutomatically = true, flushAutomatically = true)
+    @Query(nativeQuery = true,value = "UPDATE sys_account SET account_status=?2 WHERE user_id=(SELECT user_id FROM sys_user WHERE id=?1)")
+    int updateAccountStatus(Integer id, Integer status);
+
+    @Transactional
+    @Modifying(clearAutomatically = true, flushAutomatically = true)
+    @Query(nativeQuery = true,value = "DELETE FROM sys_account WHERE user_id=?1")
+    void deleteByUserId(Long userId);
+
+    @Query(nativeQuery = true,value = "SELECT * FROM sys_account WHERE user_id=?1")
+    List<SysAccountEntity> findByUserId(Long userId);
+}

+ 35 - 0
shiwan/admin/src/main/java/com/huimv/admin/repo/SysAccountGroupEntityRepository.java

@@ -0,0 +1,35 @@
+package com.huimv.admin.repo;
+
+import com.huimv.admin.domain.SysAccountGroupEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+
+public interface SysAccountGroupEntityRepository extends JpaRepository<SysAccountGroupEntity, Integer>, JpaSpecificationExecutor<SysAccountGroupEntity> {
+
+    @Modifying
+    @Transactional
+    @Query(nativeQuery = true,value = "DELETE FROM sys_account_group WHERE account_id=?1")
+    void removeAccountGroup(String accountId);
+
+    @Query(nativeQuery = true,value = "SELECT * FROM sys_account_group WHERE account_id=?1")
+    List<SysAccountGroupEntity> getGroupByAccount(String accountId);
+
+    @Query(nativeQuery = true,value = "SELECT * FROM sys_account_group WHERE group_id=?1")
+    List<SysAccountGroupEntity> getAccountByGroup(String groupId);
+
+    @Transactional
+    @Modifying
+    @Query(nativeQuery = true,value = "INSERT INTO sys_account_group(account_id,group_id)VALUES(?1,?2)")
+    void insert(int accountId, int groupId);
+
+    @Modifying
+    @Transactional
+    @Query(nativeQuery = true,value = "DELETE FROM sys_account_group WHERE account_id=?1 AND group_id=?2")
+    void removeAccountGroup(String accountId, String groupId);
+}

+ 15 - 0
shiwan/admin/src/main/java/com/huimv/admin/repo/SysGroupEntityRepository.java

@@ -0,0 +1,15 @@
+package com.huimv.admin.repo;
+
+
+import com.huimv.admin.domain.SysGroupEntity;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+
+public interface SysGroupEntityRepository extends JpaRepository<SysGroupEntity, Integer>, JpaSpecificationExecutor<SysGroupEntity> {
+    @Query(nativeQuery = true , value = "SELECT * FROM sys_group WHERE group_name like %?1% order by ?#{#pageable}")
+    Page<SysGroupEntity> findByGroupNameLike(String searchStr, Pageable pageable);
+}

+ 31 - 0
shiwan/admin/src/main/java/com/huimv/admin/repo/SysGroupMenuEntityRepository.java

@@ -0,0 +1,31 @@
+package com.huimv.admin.repo;
+
+import com.huimv.admin.domain.SysGroupMenuEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+public interface SysGroupMenuEntityRepository extends JpaRepository<SysGroupMenuEntity, Integer>, JpaSpecificationExecutor<SysGroupMenuEntity> {
+
+    @Modifying
+    @Transactional
+    @Query(nativeQuery = true,value = "DELETE FROM sys_group_menu WHERE group_id=?1")
+    void removeGroupMenu(String groupId);
+
+    @Query(nativeQuery = true,value = "SELECT * FROM sys_group_menu WHERE group_id=?1")
+    List<SysGroupMenuEntity> getMenuByGroup(String groupId);
+
+    @Modifying
+    @Transactional
+    @Query(nativeQuery = true,value = "DELETE FROM sys_group_menu WHERE group_id=?1 AND menu_id=?2")
+    void removeGroupMenu(String groupId, String menuId);
+
+    @Modifying
+    @Transactional
+    @Query(nativeQuery = true,value = "DELETE FROM sys_group_menu WHERE group_id=?1")
+    void deleteByGroupId(Integer groupId);
+}

+ 21 - 0
shiwan/admin/src/main/java/com/huimv/admin/repo/SysMenuEntityRepository.java

@@ -0,0 +1,21 @@
+package com.huimv.admin.repo;
+
+import com.huimv.admin.domain.SysMenuEntity;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+
+import java.util.List;
+
+public interface SysMenuEntityRepository extends JpaRepository<SysMenuEntity, Integer>, JpaSpecificationExecutor<SysMenuEntity> {
+
+    @Query(nativeQuery = true , value = "SELECT * FROM sys_menu WHERE account_name=?1 AND password=?2")
+    List<SysMenuEntity> findByAccountId(Integer accountId);
+
+    @Query(nativeQuery = true , value = "SELECT * FROM sys_menu WHERE parent_id = ?1 ORDER BY sort ASC")
+    List<SysMenuEntity> findAllByParentId(Integer id);
+
+//    @Query(nativeQuery = true,value = "SELECT * FROM sys_menu WHERE id IN(SELECT DISTINCT(menu_id) FROM sys_group_menu WHERE group_id IN(SELECT group_id FROM sys_account_group WHERE account_id=(SELECT user1.id FROM sys_account account,sys_user user1 WHERE account.account_name=?1 AND account.user_id=user1.user_id  LIMIT 1)))")
+    @Query(nativeQuery = true,value = "SELECT * FROM sys_menu WHERE id IN(SELECT DISTINCT(menu_id) FROM sys_group_menu WHERE group_id IN(SELECT group_id FROM sys_account_group WHERE account_id=(SELECT user1.id FROM sys_account account,sys_user user1 WHERE account.account_name=?1 AND account.user_id=user1.user_id))) ORDER BY sort ASC")
+    List<SysMenuEntity> getMyMenu(String accountName);
+}

+ 37 - 0
shiwan/admin/src/main/java/com/huimv/admin/repo/SysUserEntityRepository.java

@@ -0,0 +1,37 @@
+package com.huimv.admin.repo;
+
+
+import com.huimv.admin.domain.SysUserEntity;
+import com.huimv.admin.group.UserAndAccountGroup;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+
+import java.util.List;
+
+public interface SysUserEntityRepository extends JpaRepository<SysUserEntity, Integer>, JpaSpecificationExecutor<SysUserEntity> {
+    @Query(nativeQuery = true, value = "SELECT * FROM sys_user WHERE instr(user_name, ?1) > 0 OR instr(mobile, ?1) > 0 order by ?#{#pageable}")
+    Page<SysUserEntity> findByUserNameOOrMobile(String searchStr, Pageable pageable);
+
+//    Page<SysUserEntity> findAllUser(Pageable pageable);
+
+//    @Query(nativeQuery = true, value = "SELECT user.*,account.account_name,account.account_status FROM sys_user user LEFT JOIN sys_account account ON user.user_id=account.user_id WHERE user.user_name=?1  OR user.mobile=?1 order by ?#{#pageable}")
+    @Query(nativeQuery = true, value = "SELECT user.*,account.account_name,account.account_status FROM sys_user user LEFT JOIN sys_account account ON user.user_id=account.user_id WHERE user.user_name=?1  OR user.mobile=?1 order by id desc limit ?2,?3")
+    List<Object[]> findUserAndAccountByUserName(String searchStr, int start, int end);
+
+    @Query(nativeQuery = true, value="SELECT count(*) FROM sys_user  WHERE user_name=?1")
+    Integer countByUserName(String userName);
+
+//    @Query(nativeQuery = true, value = "SELECT user.*,account.account_name,account.account_status FROM sys_user user LEFT JOIN sys_account account ON user.user_id=account.user_id order by ?#{#pageable}")
+    @Query(nativeQuery = true, value = "SELECT user.*,account.account_name,account.account_status FROM sys_user user LEFT JOIN sys_account account ON user.user_id=account.user_id order by id desc limit ?1,?2")
+    List<Object[]> findUserAndAccount(int start, int pageSize);
+
+    @Query(nativeQuery = true, value = "SELECT * FROM sys_user WHERE instr(user_name, ?1) > 0 OR instr(mobile, ?1) > 0 order by ?#{#pageable}")
+    Page<SysUserEntity> findUserAndAccount2(@Param("searchStr") String searchStr, Pageable pageable);
+
+    @Query(nativeQuery = true, value = "SELECT user.*,account.account_name,account.account_status FROM sys_user user LEFT JOIN sys_account account ON user.user_id=account.user_id WHERE user.user_name=?1  OR user.mobile=?1 order by ?#{#pageable}")
+    Page<UserAndAccountGroup> yxxList(String searchStr, Pageable pageable);
+}

+ 32 - 0
shiwan/admin/src/main/java/com/huimv/admin/response/ErrorResponse.java

@@ -0,0 +1,32 @@
+package com.huimv.admin.response;
+
+
+public class ErrorResponse extends PlatformResponse {
+
+	private String errCode;
+	private String errMsg;
+	
+	public ErrorResponse() {};
+	public ErrorResponse(String code, String msg) {
+		this.errCode=code;
+		this.errMsg = msg;
+	}
+	
+	public String getErrCode() {
+		return errCode;
+	}
+	public void setErrCode(String errCode) {
+		this.errCode = errCode;
+	}
+	public String getErrMsg() {
+		return errMsg;
+	}
+	public void setErrMsg(String errMsg) {
+		this.errMsg = errMsg;
+	}
+	@Override
+	public String toString() {
+		return "{\"errCode\":\"" + errCode + "\",\"errMsg\":\"" + errMsg + "\"}";
+	}
+	
+}

+ 24 - 0
shiwan/admin/src/main/java/com/huimv/admin/response/OkResponse.java

@@ -0,0 +1,24 @@
+package com.huimv.admin.response;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+public class OkResponse extends PlatformResponse {
+	private String code;
+	private String msg;
+	private Object data;
+	public static final String SUCCESS_CODE = "success";
+
+	public OkResponse(String msg, Object data) {
+		code = SUCCESS_CODE;
+		this.msg = msg;
+		this.data = data;
+	}
+
+	public OkResponse(String msg) {
+		this(msg, null);
+	}
+
+}

+ 9 - 0
shiwan/admin/src/main/java/com/huimv/admin/response/PlatformResponse.java

@@ -0,0 +1,9 @@
+package com.huimv.admin.response;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonInclude.Include;
+
+@JsonInclude(value=Include.NON_NULL)
+public class PlatformResponse {
+
+}

+ 68 - 0
shiwan/admin/src/main/java/com/huimv/admin/response/ResponseData.java

@@ -0,0 +1,68 @@
+/**
+ * @Copyright (C), 2014-2020, 杭州慧牧科技有限公司
+ * @ClassName: ResponseErr
+ * @Author: yejijie
+ * @E-mail: yejijie@huimv.com
+ * @Date: 2020年4月22日
+ * @Version: V1.0
+ * @Description:
+ */
+package com.huimv.admin.response;
+
+
+/**
+ * @author yejijie
+ */
+public class ResponseData {
+
+    public static String SUCCESS_CODE = "200";
+
+    private String errCode;
+    private String errMsg;
+    private Object data;
+
+    private ResponseData() {
+    }
+
+    private ResponseData(String code, String msg, Object data) {
+        this.errCode = code;
+        this.errMsg = msg;
+        this.data = data;
+    }
+
+    public static ResponseData ok(String msg, Object data) {
+        return new ResponseData(SUCCESS_CODE, msg, data);
+    }
+
+    public static ResponseData err(String code, String msg) {
+        return new ResponseData(code, msg, null);
+    }
+
+    public static ResponseData err(String code, String msg, Object data) {
+        return new ResponseData(code, msg, data);
+    }
+
+    public String getErrCode() {
+        return errCode;
+    }
+
+    public void setErrCode(String errCode) {
+        this.errCode = errCode;
+    }
+
+    public String getErrMsg() {
+        return errMsg;
+    }
+
+    public void setErrMsg(String errMsg) {
+        this.errMsg = errMsg;
+    }
+
+	public Object getData() {
+		return data;
+	}
+
+	public void setData(Object data) {
+		this.data = data;
+	}
+}

+ 46 - 0
shiwan/admin/src/main/java/com/huimv/admin/response/RobotResponse.java

@@ -0,0 +1,46 @@
+/**
+ * @Copyright (C), 2014-2020, 杭州慧牧科技有限公司
+ * @ClassName: ResponseBase
+ * @Author: yejijie
+ * @E-mail: yejijie@huimv.com
+ * @Date: 2020年4月22日
+ * @Version: V1.0
+ * @Description:
+ */
+package com.huimv.admin.response;
+
+import com.alibaba.fastjson.annotation.JSONField;
+
+/**
+ * @author yejijie
+ *
+ */
+public class RobotResponse {
+	
+	@JSONField(name="ret")
+	private int ret;
+	@JSONField(name="msg")
+	private String msg;
+	@JSONField(name = "data")
+	private Object data;
+	public int getRet() {
+		return ret;
+	}
+	public void setRet(int ret) {
+		this.ret = ret;
+	}
+	public String getMsg() {
+		return msg;
+	}
+	public void setMsg(String msg) {
+		this.msg = msg;
+	}
+	public Object getData() {
+		return data;
+	}
+	public void setData(Object data) {
+		this.data = data;
+	}
+	
+	
+}

+ 19 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/IAccountService.java

@@ -0,0 +1,19 @@
+package com.huimv.admin.service;
+
+import com.huimv.admin.domain.SysAccountEntity;
+import com.huimv.admin.utils.Result;
+
+import java.util.List;
+
+public interface IAccountService {
+
+    Result setAccountStatus(List<Integer> ids, Integer status);
+
+    Result newAccount(Integer userId);
+
+    Result cancelAccount(Integer id, Integer accountStatus);
+
+    Result removeAccount(List<Integer> ids);
+
+    List<SysAccountEntity> findAll();
+}

+ 21 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/IAuthorizeService.java

@@ -0,0 +1,21 @@
+package com.huimv.admin.service;
+
+import com.huimv.admin.utils.Result;
+
+import java.util.List;
+
+public interface IAuthorizeService {
+
+    Result saveAccountGroup(String accountId, String groupIds);
+
+    Result saveGroupMenu(String groupId, String menuIds);
+
+   // Result getMyMenu(String accountName);
+    List getMyMenu(String accountName);
+
+    Result getMenuByGroup(String groupId);
+
+    Result getGroupByAccount(String accountId);
+
+    Result getAccountByGroup(String groupId);
+}

+ 17 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/IGroupService.java

@@ -0,0 +1,17 @@
+package com.huimv.admin.service;
+
+import com.huimv.admin.domain.SysGroupEntity;
+import com.huimv.admin.utils.Result;
+import org.springframework.data.domain.Page;
+
+public interface IGroupService {
+
+
+    Result updateGroup(Integer groupId, String groupName, String remark);
+
+    Result removeGroup(Integer groupId);
+
+    Page<SysGroupEntity> listGroup(int pageNum, int pageSize, String searchStr);
+
+    Result addGroup(String groupName, String remark);
+}

+ 10 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/ILoginService.java

@@ -0,0 +1,10 @@
+package com.huimv.admin.service;
+
+import com.huimv.admin.utils.Result;
+
+public interface ILoginService {
+
+    Result login(String accountName, String password);
+
+    Result logout();
+}

+ 25 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/IMenuService.java

@@ -0,0 +1,25 @@
+package com.huimv.admin.service;
+
+import com.huimv.admin.domain.SysMenuEntity;
+import com.huimv.admin.utils.Result;
+
+import java.util.List;
+import java.util.Map;
+
+public interface IMenuService {
+    //添加菜单
+    Result addMenu(SysMenuEntity menu);
+    //修改菜单
+    Result editMenu(SysMenuEntity menu);
+    //删除菜单(批量)
+    Result removeMenu(Integer menuId);
+   /* //查询所有
+    List<Map> listMenu();
+    //菜单递归
+    List listMenuUtil(List<SysMenuEntity> list);*/
+
+    //优化查询所有
+    List<Map> optimizeList();
+    //优化菜单递归
+    List<Map> optimizeListUtil(int parentId, List<SysMenuEntity> menuEntityList);
+}

+ 26 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/IUserService.java

@@ -0,0 +1,26 @@
+package com.huimv.admin.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.admin.domain.SysUserEntity;
+import com.huimv.admin.group.UserAndAccountGroup;
+import com.huimv.admin.utils.Result;
+import org.springframework.data.domain.Page;
+
+import java.util.List;
+
+public interface IUserService {
+
+    Page<SysUserEntity> findUser(String searchStr, int pageNum, int pageSize);
+
+    JSONObject findUserAccount(String searchStr, int pageNum, int pageSize);
+
+    JSONObject findUserAccount2(String searchStr, int pageNum, int pageSize);
+
+    List<UserAndAccountGroup> yxxList(String searchStr, int pageNum, int pageSize);
+
+    Result addUser(SysUserEntity user);
+
+    Result updateUser(SysUserEntity user);
+
+    Result removeUser(List<Integer> userIds);
+}

+ 97 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/impl/AccountServiceImpl.java

@@ -0,0 +1,97 @@
+package com.huimv.admin.service.impl;
+
+import com.huimv.admin.domain.SysAccountEntity;
+import com.huimv.admin.domain.SysUserEntity;
+import com.huimv.admin.repo.SysAccountEntityRepository;
+import com.huimv.admin.repo.SysUserEntityRepository;
+import com.huimv.admin.service.IAccountService;
+import com.huimv.admin.utils.GetMD5Str;
+import com.huimv.admin.utils.Result;
+import com.huimv.admin.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+@Service
+public class AccountServiceImpl implements IAccountService {
+
+    @Autowired
+    private SysAccountEntityRepository sysAccountEntityRepository;
+
+    @Autowired
+    private SysUserEntityRepository sysUserEntityRepository;
+
+    @Transactional
+    @Override
+    public Result setAccountStatus(List<Integer> ids, Integer status) {
+        try {
+            for (Integer id : ids) {
+                sysAccountEntityRepository.updateAccountStatus(id,status);
+            }
+        }catch (Exception e){
+            return new Result(ResultCode.FAIL);
+        }
+        String message = "";
+        if(status == 1){
+            message = "你选择的账号已经启用。";
+        }else{
+            message = "你选择的账号已经暂停启用。";
+        }
+        return new Result(10001,message,true);
+    }
+
+    @Override
+    public Result newAccount(Integer userId) {
+        try {
+            SysAccountEntity sysAccountEntity = new SysAccountEntity();
+            SysUserEntity sysUserEntity = sysUserEntityRepository.findById(userId).get();
+            String mobile = sysUserEntity.getMobile();
+            String userName = sysUserEntity.getUserName();
+            if (mobile != null && !"".equals(mobile) ){
+                sysAccountEntity.setAccountName(mobile);
+            }else if (userName != null && !"".equals(userName)){
+                sysAccountEntity.setAccountName(userName);
+            }else {
+                return new Result(ResultCode.FAIL);
+            }
+            sysAccountEntity.setAccountStatus(1);
+            sysAccountEntity.setRemark("无");
+            sysAccountEntity.setPassword(GetMD5Str.getMD5Str("123456"));
+            sysAccountEntityRepository.save(sysAccountEntity);
+            return new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return new Result(ResultCode.FAIL);
+        }
+    }
+
+    @Override
+    public Result cancelAccount(Integer id, Integer accountStatus) {
+        try {
+            SysAccountEntity sysAccountEntity = sysAccountEntityRepository.findById(id).get();
+            sysAccountEntity.setAccountStatus(accountStatus);
+            sysAccountEntityRepository.save(sysAccountEntity);
+            return new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return new Result(ResultCode.FAIL);
+        }
+    }
+
+    @Override
+    public Result removeAccount(List<Integer> ids) {
+        try {
+            for (Integer id : ids) {
+                sysAccountEntityRepository.deleteById(id);
+            }
+        }catch (Exception e){
+            return new Result(ResultCode.FAIL);
+        }
+        return new Result(ResultCode.SUCCESS);
+    }
+
+    @Override
+    public List<SysAccountEntity> findAll() {
+        return sysAccountEntityRepository.findAll();
+    }
+}

+ 263 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/impl/AuthorizeServiceImpl.java

@@ -0,0 +1,263 @@
+package com.huimv.admin.service.impl;
+
+import com.huimv.admin.domain.SysAccountGroupEntity;
+import com.huimv.admin.domain.SysGroupMenuEntity;
+import com.huimv.admin.domain.SysMenuEntity;
+import com.huimv.admin.repo.SysAccountGroupEntityRepository;
+import com.huimv.admin.repo.SysGroupMenuEntityRepository;
+import com.huimv.admin.repo.SysMenuEntityRepository;
+import com.huimv.admin.service.IAuthorizeService;
+import com.huimv.admin.utils.Result;
+import com.huimv.admin.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class AuthorizeServiceImpl implements IAuthorizeService {
+
+    @Autowired
+    SysAccountGroupEntityRepository SysAccountGroupRepo;
+    @Autowired
+    SysGroupMenuEntityRepository sysGroupMenuRepo;
+    @Autowired
+    private SysMenuEntityRepository sysMenuEntityRepo;
+    @Autowired
+    private SysMenuEntityRepository sysMenuEntityRepository;
+
+    @Override
+    @Transactional
+    public Result saveAccountGroup(String accountId, String groupIds) {
+        /**
+         * Step1:先删除原先的账号关联权限组数据;
+         * Step2:再添加新的账号关联权限组数据;
+         */
+        String[] groupIdArray = groupIds.split(",");
+        SysAccountGroupRepo.removeAccountGroup(accountId);
+//        for (int a = 0; a < groupIdArray.length; a++) {
+//            SysAccountGroupRepo.removeAccountGroup(accountId,groupIdArray[a]);
+//        }
+        for (int a = 0; a < groupIdArray.length; a++) {
+            SysAccountGroupEntity accountGroupEntity = new SysAccountGroupEntity();
+            accountGroupEntity.setAccountId(Integer.parseInt(accountId));
+            accountGroupEntity.setGroupId(Integer.parseInt(groupIdArray[a]));
+            SysAccountGroupRepo.saveAndFlush(accountGroupEntity);
+//            SysAccountGroupRepo.insert(Integer.parseInt(accountId),Integer.parseInt(groupIdArray[a]));
+        }
+        return new Result(10001, "保存账号关联权限组成功", true);
+    }
+
+    @Override
+    @Transactional
+    public Result saveGroupMenu(String groupId, String menuIds) {
+        /**
+         * Step1:先删除原先的权限组关联菜单数据;
+         * Step2:再添加新的账号权限组关联菜单数据;
+         */
+//        sysGroupMenuRepo.removeGroupMenu(groupId);
+        String[] menuIdsArray = menuIds.split(",");
+        for (int a = 0; a < menuIdsArray.length; a++) {
+            sysGroupMenuRepo.removeGroupMenu(groupId, menuIdsArray[a]);
+        }
+        for (int a = 0; a < menuIdsArray.length; a++) {
+            SysGroupMenuEntity sysGroupMenuEntity = new SysGroupMenuEntity();
+            sysGroupMenuEntity.setGroupId(Integer.parseInt(groupId));
+            sysGroupMenuEntity.setMenuId(Integer.parseInt(menuIdsArray[a]));
+            sysGroupMenuRepo.saveAndFlush(sysGroupMenuEntity);
+        }
+        return new Result(10001, "保存权限组关联菜单成功", true);
+    }
+
+   /* @Override
+    public Result getMyMenu(String accountName) {
+        // 根据账号获取权限组(查询账号权限组关联表)
+        // 根据权限组获取菜单id(查询权限组菜单官僚表)
+        // 根据菜单id获取菜单全部信息(查询菜单表)
+        List<SysMenuEntity> dataList = sysMenuEntityRepo.getMyMenu(accountName);
+        System.out.println("dataList.size>>"+dataList.size());
+        List newMenuList = new ArrayList();
+        // error for (SysMenuEntity menuEntity : dataList) {
+        for (int a=0;a<dataList.size();a++) {
+            SysMenuEntity menuEntity = dataList.get(a);
+            if (menuEntity.getParentId() == 0) {
+                Map menuMap = new HashMap<>();
+                menuMap.put("id", menuEntity.getId());
+                menuMap.put("menuName", menuEntity.getMenuName());
+                menuMap.put("parentId", menuEntity.getParentId());
+                menuMap.put("url", menuEntity.getUrl());
+                menuMap.put("sort", menuEntity.getSort());
+                newMenuList.add(menuMap);
+                dataList.remove(menuEntity);
+            }
+        }
+        for (int a = 0; a < newMenuList.size(); a++) {
+            Map menuMap = (Map) newMenuList.get(a);
+            int id = Integer.parseInt(menuMap.get("id").toString());
+            List childrenList = new ArrayList();
+            for (SysMenuEntity menuEntity : dataList) {
+                if (id == menuEntity.getParentId()) {
+                    childrenList.add(menuEntity);
+                }
+            }
+            if (childrenList.size() > 0) {
+                menuMap.put("children", childrenList);
+            }
+        }
+        return new Result(ResultCode.SUCCESS, newMenuList);
+    }*/
+
+    /**
+     * @param accountName
+     * @return
+     */
+    public List getMyMenu_old(String accountName) {
+        System.out.println(" accountName>>" + accountName);
+        List<SysMenuEntity> menuEntityList = sysMenuEntityRepo.getMyMenu(accountName);
+        System.out.println(" menuEntityList.size>>" + menuEntityList.size());
+        List<SysMenuEntity> topList = new ArrayList();
+        for (SysMenuEntity sysMenuEntity : menuEntityList) {
+            if (sysMenuEntity.getParentId() == 0) {
+                topList.add(sysMenuEntity);
+            }
+        }
+        return topList;
+    }
+
+    @Override
+    public List getMyMenu(String accountName) {
+        List<SysMenuEntity> allMenuEntityList = sysMenuEntityRepo.getMyMenu(accountName);
+        System.out.println("123456");
+        //
+        List<SysMenuEntity> myRootMenuList = new ArrayList();
+        //pid(上级Id)为0的是根菜单
+        for (SysMenuEntity menuEntity : allMenuEntityList) {
+            if (menuEntity.getParentId() == 0) {
+                myRootMenuList.add(menuEntity);
+            }
+        }
+        // 遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
+        for (SysMenuEntity myMenuEntity : myRootMenuList) {
+            /*  */
+            List<SysMenuEntity> child = getChild(myMenuEntity.getId(), allMenuEntityList);
+            myMenuEntity.setChildren(child);
+        }
+        return myRootMenuList;
+    }
+
+    public List<SysMenuEntity> getChild(int pid, List<SysMenuEntity> allMenuList) {
+        //子菜单列表
+        List<SysMenuEntity> childList = new ArrayList<>();
+        for (SysMenuEntity menuEntity : allMenuList) {
+            if (pid == menuEntity.getParentId()) {
+                childList.add(menuEntity);
+            }
+        }
+        //遍历 获取子菜单的子菜单
+        for (SysMenuEntity childMenu : childList) {
+            List<SysMenuEntity> child = getChild(childMenu.getId(), allMenuList);
+            childMenu.setChildren(child);
+        }
+        //递归出口 childList长度为0
+        if (childList.size() == 0) {
+            return new ArrayList<>();
+        }
+        return childList;
+    }
+
+    @Override
+    public Result getMenuByGroup(String groupId) {
+        /* 根据权限组读取已关联菜单 */
+        List<SysGroupMenuEntity> groupMenuEntityList = sysGroupMenuRepo.getMenuByGroup(groupId);
+        if (groupMenuEntityList.size() == 0) {
+            return new Result(10005, "当前权限组暂未关联任何菜单.", false);
+        }
+        /* 读取所有菜单 */
+        List<SysMenuEntity> allMenuList = sysMenuEntityRepository.findAll();
+        if (allMenuList.size() == 0) {
+            return new Result(10007, "当前无任何菜单.", false);
+        }
+        List<SysGroupMenuEntity> newList = new ArrayList();
+        StringBuilder idSb2 = new StringBuilder();
+
+        for (int a = 0; a < groupMenuEntityList.size(); a++) {
+            SysGroupMenuEntity groupMenuEntity = groupMenuEntityList.get(a);
+            for (SysMenuEntity menuEntity : allMenuList) {
+                if (menuEntity.getId().equals(groupMenuEntity.getMenuId())) {
+                    if (menuEntity.getParentId() == 0) {
+                        if (idSb2.length() > 0) {
+                            idSb2.append(",");
+                        }
+                        idSb2.append(groupMenuEntity.getMenuId());
+                        break;
+                    } else {
+                        boolean isChild = false;
+                        for (SysMenuEntity menuEntity2 : allMenuList) {
+                            if (menuEntity2.getParentId().equals(groupMenuEntity.getMenuId())) {
+                                isChild = true;
+                                break;
+                            }
+                        }
+                        if (!isChild) {
+                            if (idSb2.length() > 0) {
+                                idSb2.append(",");
+                            }
+                            idSb2.append(groupMenuEntity.getMenuId());
+                        }
+                        break;
+                    }
+                }
+            }
+
+        }
+
+//        StringBuilder idSb = new StringBuilder();
+//        for (SysGroupMenuEntity groupMenuEntity : groupMenuEntityList) {
+//            if (idSb.length() > 0) {
+//                idSb.append(",");
+//            }
+//            idSb.append(groupMenuEntity.getMenuId());
+//        }
+        return new Result(ResultCode.SUCCESS, idSb2.toString());
+    }
+
+    /**
+     * @param accountId
+     * @return
+     */
+    @Override
+    public Result getGroupByAccount(String accountId) {
+        /* 根据账号id读取已关联权限组 */
+        List<SysAccountGroupEntity> accountGroupEntityList = SysAccountGroupRepo.getGroupByAccount(accountId);
+        if (accountGroupEntityList.size() == 0) {
+            return new Result(10006, "当前用户账号暂未关联任何权限组.", false);
+        }
+        StringBuilder idSb = new StringBuilder();
+        for (SysAccountGroupEntity accountGroupEntity : accountGroupEntityList) {
+            if (idSb.length() > 0) {
+                idSb.append(",");
+            }
+            idSb.append(accountGroupEntity.getGroupId());
+        }
+        return new Result(ResultCode.SUCCESS, idSb.toString());
+    }
+
+    @Override
+    public Result getAccountByGroup(String groupId) {
+        /* 根据账号id读取已关联权限组 */
+        List<SysAccountGroupEntity> accountGroupEntityList = SysAccountGroupRepo.getAccountByGroup(groupId);
+        if (accountGroupEntityList.size() == 0) {
+            return new Result(10006, "当前权限组暂未关联任何用户账号.", false);
+        }
+        StringBuilder idSb = new StringBuilder();
+        for (SysAccountGroupEntity accountGroupEntity : accountGroupEntityList) {
+            if (idSb.length() > 0) {
+                idSb.append(",");
+            }
+            idSb.append(accountGroupEntity.getAccountId());
+        }
+        return new Result(ResultCode.SUCCESS, idSb.toString());
+    }
+}

+ 81 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/impl/GroupServiceImpl.java

@@ -0,0 +1,81 @@
+package com.huimv.admin.service.impl;
+
+import com.huimv.admin.domain.SysGroupEntity;
+import com.huimv.admin.repo.SysGroupEntityRepository;
+import com.huimv.admin.repo.SysGroupMenuEntityRepository;
+import com.huimv.admin.service.IGroupService;
+import com.huimv.admin.utils.Result;
+import com.huimv.admin.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.util.StringUtils;
+
+@Service
+public class GroupServiceImpl implements IGroupService {
+
+    @Autowired
+    private SysGroupEntityRepository sysGroupEntityRepository;
+    @Autowired
+    private SysGroupMenuEntityRepository sysGroupMenuEntityRepository;
+
+    @Override
+    public Result updateGroup(Integer groupId, String groupName, String remark) {
+        try {
+            SysGroupEntity group = this.sysGroupEntityRepository.findById(groupId).orElse(null);
+            if (group == null) {
+                return  new Result(ResultCode.FAIL);
+            }
+            group.setGroupName(groupName);
+            group.setRemark(remark);
+            sysGroupEntityRepository.save(group);
+            return  new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+    }
+
+    @Override
+    @Transactional
+    public Result removeGroup(Integer groupId) {
+        try {
+            SysGroupEntity group = this.sysGroupEntityRepository.findById(groupId).orElse(null);
+            if (group == null) {
+                return  new Result(ResultCode.FAIL);
+            }
+            // 删除权限组
+            this.sysGroupEntityRepository.deleteById(groupId);
+            // 删除权限组关联菜单
+            sysGroupMenuEntityRepository.deleteByGroupId(groupId);
+            return  new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+    }
+
+    @Override
+    public Page<SysGroupEntity> listGroup(int pageNum, int pageSize, String searchStr) {
+        Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.Direction.DESC, "id");
+        if (!StringUtils.isEmpty(searchStr)) {
+            return sysGroupEntityRepository.findByGroupNameLike(searchStr, pageable);
+        }
+        return sysGroupEntityRepository.findAll(pageable);
+    }
+
+    @Override
+    public Result addGroup(String groupName, String remark) {
+        try {
+            SysGroupEntity group = new SysGroupEntity();
+            group.setGroupName(groupName);
+            group.setRemark(remark);
+            sysGroupEntityRepository.save(group);
+            return  new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+    }
+}

+ 51 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/impl/LoginServiceImpl.java

@@ -0,0 +1,51 @@
+package com.huimv.admin.service.impl;
+
+import com.huimv.admin.domain.SysAccountEntity;
+import com.huimv.admin.repo.SysAccountEntityRepository;
+import com.huimv.admin.repo.SysMenuEntityRepository;
+import com.huimv.admin.service.ILoginService;
+import com.huimv.admin.utils.Result;
+import com.huimv.admin.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoginServiceImpl implements ILoginService {
+
+    @Autowired
+    private SysAccountEntityRepository sysAccountEntityRepo;
+    @Autowired
+    private SysMenuEntityRepository sysMenuEntityRepo;
+
+    @Override
+    public Result login(String accountName, String password) {
+        //Step1:判断账户状态
+        //Step2:读取菜单组
+        SysAccountEntity accountEntity = sysAccountEntityRepo.findByAccountName(accountName, password);
+        if (accountEntity == null) {
+//            throw new PlatformException("The account or password is wrong.", "该账号不存在或密码错误.");
+            return new Result(10002, "账号不存在或密码错误.", false);
+        }
+        int status = accountEntity.getAccountStatus();
+        if (status == 0) {
+            return new Result(10003, "该账号未启用.", false);
+//            throw new PlatformException("10003", "该账号未启用.");
+        }
+        if (status == -1) {
+            return new Result(10004, "该账号已暂停使用.", false);
+//            throw new PlatformException("10004", "该账号已暂停使用.");
+        }
+        int accountId = accountEntity.getId();
+        System.out.println("accountId>>"+accountId);
+//        List<SysMenuEntity> menuEntityList = sysMenuEntityRepo.findByAccountId(accountId);
+//        return new Result(ResultCode.SUCCESS, menuEntityList);
+        return new Result(ResultCode.SUCCESS,accountEntity);
+    }
+
+    @Override
+    public Result logout() {
+
+
+        return null;
+    }
+}

+ 135 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/impl/MenuServiceImpl.java

@@ -0,0 +1,135 @@
+package com.huimv.admin.service.impl;
+
+import com.huimv.admin.domain.SysMenuEntity;
+import com.huimv.admin.repo.SysMenuEntityRepository;
+import com.huimv.admin.service.IMenuService;
+import com.huimv.admin.utils.Result;
+import com.huimv.admin.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+@Service
+public class MenuServiceImpl implements IMenuService {
+
+    @Autowired
+    private SysMenuEntityRepository sysMenuEntityRepository;
+
+    @Override
+    public Result addMenu(SysMenuEntity menu) {
+        System.out.println(menu);
+        try {
+            if (menu == null){
+                return  new Result(ResultCode.FAIL);
+            }
+            sysMenuEntityRepository.save(menu);
+            return  new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+    }
+
+    @Override
+    public Result editMenu(SysMenuEntity menu) {
+        try {
+            sysMenuEntityRepository.save(menu);
+            return  new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+
+    }
+
+    @Override
+    public Result removeMenu(Integer menuId) {
+        try {
+            List<SysMenuEntity> lists = sysMenuEntityRepository.findAllByParentId(menuId);
+            if (lists != null && lists.size()>0){
+                for (SysMenuEntity menu : lists) {
+                    removeMenu(menu.getId());
+                    sysMenuEntityRepository.delete(menu);
+                }
+            }
+            sysMenuEntityRepository.deleteById(menuId);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+        return  new Result(ResultCode.SUCCESS);
+    }
+
+   /* @Override
+    public List<Map> listMenu() {
+        List<SysMenuEntity> Menus = sysMenuEntityRepository.findAllByParentId(0);
+        return listMenuUtil(Menus);
+    }
+
+    @Override
+    public List listMenuUtil(List<SysMenuEntity> list){
+        List allList = new ArrayList();
+        for (SysMenuEntity menu : list) {
+            Map<String, Object> map = new HashMap<>();
+            List<SysMenuEntity> lists = sysMenuEntityRepository.findAllByParentId(menu.getId());
+            // map.put("children", lists);
+            if (lists != null && lists.size() > 0) {
+                map.put("children",listMenuUtil(lists));
+            }else{
+                map.put("children",lists);
+            }
+            map.put("id", menu.getId());
+            map.put("menuName", menu.getMenuName());
+            map.put("parentId", menu.getParentId());
+            map.put("url", menu.getUrl());
+            map.put("sort", menu.getSort());
+
+            allList.add(map);
+        }
+        return allList;
+    }
+*/
+   //查询菜单,只查一次数据库
+    @Override
+    public List<Map> optimizeList() {
+        List<SysMenuEntity> all = sysMenuEntityRepository.findAll();
+        List list = optimizeListUtil(0,all);
+        return list;
+    }
+
+    @Override
+    public List<Map> optimizeListUtil(int parentId, List<SysMenuEntity> menuEntityList){
+        List<Map> list = new ArrayList<>();
+        for (SysMenuEntity menuEntity : menuEntityList) {
+            if (menuEntity.getParentId() == parentId){
+                Map map = new HashMap();
+                map.put("id", menuEntity.getId());
+                map.put("menuName", menuEntity.getMenuName());
+                map.put("parentId", menuEntity.getParentId());
+                map.put("url", menuEntity.getUrl());
+                map.put("sort", menuEntity.getSort());
+                if (menuEntityIsChildren(menuEntity,menuEntityList) ){
+                    map.put("children",optimizeListUtil(menuEntity.getId(),menuEntityList));
+                }else {
+                    map.put("children",new ArrayList<>());
+                }
+                list.add(map);
+            }
+        }
+        return list;
+    }
+
+
+    //判断是否有children
+    private boolean menuEntityIsChildren(SysMenuEntity menuEntity, List<SysMenuEntity> menuEntityList) {
+        for (SysMenuEntity sysMenuEntity : menuEntityList) {
+            if (menuEntity.getId().equals(sysMenuEntity.getParentId()) ){
+                return true;
+            }
+        }
+        return false;
+    }
+
+
+}

+ 289 - 0
shiwan/admin/src/main/java/com/huimv/admin/service/impl/UserServiceImpl.java

@@ -0,0 +1,289 @@
+package com.huimv.admin.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.admin.domain.SysAccountEntity;
+import com.huimv.admin.domain.SysUserEntity;
+import com.huimv.admin.group.UserAndAccountGroup;
+import com.huimv.admin.repo.SysAccountEntityRepository;
+import com.huimv.admin.repo.SysUserEntityRepository;
+import com.huimv.admin.service.IUserService;
+import com.huimv.admin.utils.Result;
+import com.huimv.admin.utils.ResultCode;
+import com.huimv.admin.utils.id.SnowflakeSequence;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.domain.Page;
+import org.springframework.data.domain.PageRequest;
+import org.springframework.data.domain.Pageable;
+import org.springframework.data.domain.Sort;
+import org.springframework.data.jpa.domain.Specification;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import javax.persistence.criteria.CriteriaBuilder;
+import javax.persistence.criteria.CriteriaQuery;
+import javax.persistence.criteria.Predicate;
+import javax.persistence.criteria.Root;
+import java.util.ArrayList;
+import java.util.List;
+
+
+@Service
+public class UserServiceImpl implements IUserService {
+    @Autowired
+    private SysUserEntityRepository sysUserEntityRepository;
+    @Autowired
+    private SysAccountEntityRepository sysAccountEntityRepository;
+
+    @Override
+    public Page<SysUserEntity> findUser(String searchStr, int pageNum, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.Direction.DESC, "id");
+        if (!StringUtils.isEmpty(searchStr)) {
+            Page<SysUserEntity> userEntityList = sysUserEntityRepository.findByUserNameOOrMobile(searchStr, pageable);
+            return userEntityList;
+        }
+        System.out.println("findAll");
+        return sysUserEntityRepository.findAll(pageable);
+
+    }
+
+    public Page<SysUserEntity> findUser2(String searchStr, int pageNum, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.Direction.DESC, "id");
+        Page<SysUserEntity> userPage = sysUserEntityRepository.findAll(new Specification<SysUserEntity>(){
+            @Override
+            public Predicate toPredicate(Root<SysUserEntity> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
+                List<Predicate> list = new ArrayList<Predicate>();
+                if(null != searchStr && !"".equals(searchStr)){
+                    list.add((Predicate) criteriaBuilder.equal(root.get("userName").as(String.class), searchStr));
+                }
+
+                Predicate[] p = new Predicate[list.size()];
+                return criteriaBuilder.and(list.toArray(p));
+            }
+        },pageable);
+        return userPage;
+    }
+
+    @Override
+    public JSONObject findUserAccount(String searchStr, int pageNum, int pageSize) {
+//        Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.Direction.DESC, "id");
+        int start = (pageNum-1)*pageSize;
+        System.out.println("start>>"+start);
+
+        if (!StringUtils.isEmpty(searchStr)) {
+            List<Object[]> userAccountList = sysUserEntityRepository.findUserAndAccountByUserName(searchStr, start,pageSize);
+            JSONArray userAccountJa = new JSONArray();
+            for(int a=0;a<userAccountList.size();a++){
+                Object[] userAccountObj = (Object[]) userAccountList.get(a);
+                /* 封装用户和账户关联对象 */
+                userAccountJa.add(packageUserAccountRelatedObj(userAccountObj));
+            }
+            int total = sysUserEntityRepository.countByUserName(searchStr);
+            JSONObject resultJo = new JSONObject();
+            resultJo.put("code",10001);
+            resultJo.put("totalElements",total);
+            resultJo.put("data",userAccountJa);
+            return resultJo;
+        }
+        List<Object[]> allUserAccountList = sysUserEntityRepository.findUserAndAccount(start,pageSize);
+        JSONArray allUserAccountJa = new JSONArray();
+        for(int a=0;a<allUserAccountList.size();a++){
+            Object[] userAccountObj = (Object[]) allUserAccountList.get(a);
+            /* 封装用户和账户关联对象 */
+            allUserAccountJa.add(packageUserAccountRelatedObj(userAccountObj));
+        }
+        Long total = sysUserEntityRepository.count();
+        JSONObject resultJo = new JSONObject();
+        resultJo.put("code",10001);
+        resultJo.put("totalElements",total);
+        resultJo.put("data",allUserAccountJa);
+        return resultJo;
+    }
+
+    /**
+     * 封装对象
+     */
+    private Object packageUserAccountRelatedObj(Object[] userAccountObj) {
+        JSONObject dataJo = new JSONObject();
+        dataJo.put("id",userAccountObj[0].toString());
+        dataJo.put("userName",userAccountObj[1].toString());
+        if(userAccountObj[2] == null){
+            dataJo.put("male","");
+        }else{
+            dataJo.put("male",userAccountObj[2].toString());
+        }
+        if(userAccountObj[3] == null){
+            dataJo.put("birthday","");
+        }else{
+            dataJo.put("birthday",userAccountObj[3].toString());
+        }
+        if(userAccountObj[4] == null){
+            dataJo.put("mobile","");
+        }else{
+            dataJo.put("mobile",userAccountObj[4].toString());
+        }
+        if(userAccountObj[5] == null){
+            dataJo.put("address","");
+        }else{
+            dataJo.put("address",userAccountObj[5].toString());
+        }
+        if(userAccountObj[6] == null){
+            dataJo.put("job","");
+        }else{
+            dataJo.put("job",userAccountObj[6].toString());
+        }
+        if(userAccountObj[7] == null){
+            dataJo.put("remark","");
+        }else{
+            dataJo.put("remark",userAccountObj[7].toString());
+        }
+        if(userAccountObj[8] == null)
+        {
+            dataJo.put("userId","");
+        }else{
+            dataJo.put("userId",userAccountObj[8].toString());
+        }
+        if(userAccountObj[9] == null){
+            dataJo.put("accountName","");
+        }else{
+            dataJo.put("accountName",userAccountObj[9].toString());
+        }
+        if(userAccountObj[10] == null)
+        {dataJo.put("accountStatus","");
+
+        }else{
+            dataJo.put("accountStatus", Integer.parseInt(userAccountObj[10].toString()));
+        }
+        return dataJo;
+    }
+
+    @Override
+    public JSONObject findUserAccount2(String searchStr, int pageNum, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.Direction.DESC, "id");
+        System.out.println("searchStr>>"+searchStr);
+        if (!StringUtils.isEmpty(searchStr)) {
+//            List<Object[]> userAccountList = sysUserEntityRepository.findUserAndAccountByUserName(searchStr, pageable);
+            Page<SysUserEntity> userPage = sysUserEntityRepository.findUserAndAccount2(searchStr,pageable);
+
+            int total = sysUserEntityRepository.countByUserName(searchStr);
+            JSONObject resultJo = new JSONObject();
+            resultJo.put("code",10001);
+            resultJo.put("totalElements",total);
+            resultJo.put("data",userPage);
+            return resultJo;
+        }
+        System.out.println("pageable.toSting()>>"+pageable.toString());
+        Page<SysUserEntity> userPage = sysUserEntityRepository.findUserAndAccount2(searchStr,pageable);
+
+        Long total = sysUserEntityRepository.count();
+        JSONObject resultJo = new JSONObject();
+        resultJo.put("code",10001);
+        resultJo.put("totalElements",total);
+        resultJo.put("data",userPage);
+        return resultJo;
+    }
+
+
+    @Override
+    public List<UserAndAccountGroup> yxxList(String searchStr, int pageNum, int pageSize) {
+        Pageable pageable = PageRequest.of(pageNum - 1, pageSize, Sort.Direction.DESC, "id");
+        List<UserAndAccountGroup> list = new ArrayList<>();
+        if (searchStr != null && !"".equals(searchStr)){
+            Page<SysUserEntity> users = sysUserEntityRepository.findByUserNameOOrMobile(searchStr, pageable);
+            for (SysUserEntity user : users) {
+                SysAccountEntity account = sysAccountEntityRepository.findByUserId(user.getUserId()).get(0);
+                UserAndAccountGroup userAndAccountGroup = saveUser(user);
+                userAndAccountGroup.setAccountName(account.getAccountName());
+                userAndAccountGroup.setAccountStatus(account.getAccountStatus());
+                list.add(userAndAccountGroup);
+            }
+        }
+        Page<SysUserEntity> users = sysUserEntityRepository.findAll(pageable);
+        for (SysUserEntity user : users) {
+            SysAccountEntity account = sysAccountEntityRepository.findByUserId(user.getUserId()).get(0);
+            UserAndAccountGroup userAndAccountGroup = saveUser(user);
+            userAndAccountGroup.setAccountName(account.getAccountName());
+            userAndAccountGroup.setAccountStatus(account.getAccountStatus());
+            list.add(userAndAccountGroup);
+        }
+        return list;
+
+    }
+
+    @Override
+    public Result addUser(SysUserEntity user) {
+        try {
+            SnowflakeSequence idWorker = new SnowflakeSequence();
+            long userId = idWorker.nextId();
+            // 添加用户信息
+            user.setUserId(userId);
+            sysUserEntityRepository.save(user);
+
+            // 添加账号信息
+            String mobile = user.getMobile();
+            String userName = user.getUserName();
+            SysAccountEntity sysAccountEntity = new SysAccountEntity();
+            if (mobile != null && !"".equals(mobile) ){
+                sysAccountEntity.setAccountName(mobile);
+            }else if (userName != null && !"".equals(userName)){
+                sysAccountEntity.setAccountName(userName);
+            }
+            sysAccountEntity.setAccountStatus(0);
+            sysAccountEntity.setRemark("");
+//            sysAccountEntity.setPassword(GetMD5Str.getMD5Str("123456"));
+            sysAccountEntity.setPassword("123456");
+            sysAccountEntity.setUserId(userId);
+            sysAccountEntityRepository.save(sysAccountEntity);
+            return  new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+    }
+
+    @Override
+    public Result updateUser(SysUserEntity user) {
+        try {
+            if (user == null) {
+                return  new Result(ResultCode.FAIL);
+            }
+            sysUserEntityRepository.save(user);
+            return  new Result(ResultCode.SUCCESS);
+        }catch (Exception e){
+            return  new Result(ResultCode.FAIL);
+        }
+    }
+
+    @Override
+    public Result removeUser(List<Integer> userIds) {
+        for (Integer userId : userIds) {
+            try {
+                SysUserEntity user = this.sysUserEntityRepository.findById(userId).orElse(null);
+                if (user == null) {
+                    return  new Result(ResultCode.FAIL);
+                }
+                this.sysUserEntityRepository.deleteById(userId);
+                // 删除账号
+                this.sysAccountEntityRepository.deleteByUserId(user.getUserId());
+            }catch (Exception e){
+                return  new Result(ResultCode.FAIL);
+            }
+        }
+        return  new Result(ResultCode.SUCCESS);
+    }
+
+    private UserAndAccountGroup saveUser(SysUserEntity user) {
+        UserAndAccountGroup userAndAccountGroup = new UserAndAccountGroup();
+        userAndAccountGroup.setAddress(user.getAddress());
+        userAndAccountGroup.setBirthday(user.getBirthday());
+        userAndAccountGroup.setId(user.getId());
+        userAndAccountGroup.setJob(user.getJob());
+        userAndAccountGroup.setMale(user.getMale());
+        userAndAccountGroup.setMobile(user.getMobile());
+        userAndAccountGroup.setRemark(user.getRemark());
+        userAndAccountGroup.setUserId(user.getUserId());
+        userAndAccountGroup.setUserName(user.getUserName());
+        return userAndAccountGroup;
+    }
+
+
+}

+ 64 - 0
shiwan/admin/src/main/java/com/huimv/admin/session/PlatformHttpSessionIdResolver.java

@@ -0,0 +1,64 @@
+package com.huimv.admin.session;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.session.web.http.HttpSessionIdResolver;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author yejijie
+ * @created 2020年7月16日 上午9:35:46
+*/
+@Slf4j
+public class PlatformHttpSessionIdResolver implements HttpSessionIdResolver {
+
+	private static final String PLATFORM_AUTH_TOKEN = "x-auth-token";
+	private final String tokenName;
+	private String paramName;
+	
+	public static PlatformHttpSessionIdResolver authToken() {
+		return new PlatformHttpSessionIdResolver(PLATFORM_AUTH_TOKEN);
+	}
+	
+	public PlatformHttpSessionIdResolver(String tokenName) {
+		if (tokenName == null) {
+			throw new IllegalArgumentException("headerName cannot be null");
+		}
+		this.tokenName = tokenName;
+		this.paramName = tokenName;
+	}
+	
+	public void setParamName(String paramName) {
+		this.paramName = paramName;
+	}
+
+	@Override
+	public List<String> resolveSessionIds(HttpServletRequest request) {
+		String headerValue = request.getHeader(this.tokenName);
+		log.info("header auth->"+headerValue);
+		if(headerValue != null)
+			return Collections.singletonList(headerValue);
+		//处理其他方式
+		String paramValue = request.getParameter(this.paramName);
+		log.info("param auth->"+paramValue);
+		if(paramValue != null)
+			return Collections.singletonList(paramValue);
+		return Collections.emptyList();
+	}
+
+	@Override
+	public void setSessionId(HttpServletRequest request, HttpServletResponse response, String sessionId) {
+
+		response.setHeader(this.tokenName, sessionId);
+	}
+
+	@Override
+	public void expireSession(HttpServletRequest request, HttpServletResponse response) {
+
+		response.setHeader(this.tokenName, "");
+	}
+
+}

+ 58 - 0
shiwan/admin/src/main/java/com/huimv/admin/session/PlatformWebSessionIdResolver.java

@@ -0,0 +1,58 @@
+package com.huimv.admin.session;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.HttpHeaders;
+import org.springframework.util.Assert;
+import org.springframework.web.server.ServerWebExchange;
+import org.springframework.web.server.session.WebSessionIdResolver;
+
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * @author yejijie
+ * @created 2020年7月29日 下午2:27:21
+*/
+@Slf4j
+public class PlatformWebSessionIdResolver implements WebSessionIdResolver {
+
+	private static final String PLATFORM_HEADER_TOKEN = "x-auth-token";
+	private static final String PLATFORM_URL_TOKEN = "token";
+	private final String urlName;
+	private String headerName;
+
+	public static PlatformWebSessionIdResolver authToken() {
+		return new PlatformWebSessionIdResolver(PLATFORM_HEADER_TOKEN,PLATFORM_URL_TOKEN);
+	}
+	
+	public PlatformWebSessionIdResolver(String headerToken, String urlToken) {
+		Assert.hasText(headerToken, "'headerToken' must not be empty");
+		Assert.hasText(urlToken, "'urlToken' must not be empty");
+		this.urlName = urlToken;
+		this.headerName = headerToken;
+	}
+
+	@Override
+	public List<String> resolveSessionIds(ServerWebExchange exchange) {
+		HttpHeaders headers = exchange.getRequest().getHeaders();
+		List<String> headerValues = headers.getOrDefault(this.headerName, null);
+		log.info("header auth->"+(headerValues== null? null:headerValues.get(0)));
+		if(headerValues != null)
+			return headerValues;
+		//处理其他方式
+		List<String> paramValues = exchange.getRequest().getQueryParams().getOrDefault(this.urlName, Collections.emptyList());
+		log.info("url auth->"+(paramValues.size() == 0? null:paramValues.get(0)));
+		return paramValues;
+	}
+
+	@Override
+	public void setSessionId(ServerWebExchange exchange, String sessionId) {
+		exchange.getResponse().getHeaders().set(this.headerName, sessionId);
+	}
+
+	@Override
+	public void expireSession(ServerWebExchange exchange) {
+		exchange.getResponse().getHeaders().set(this.headerName, "");
+	}
+
+}

+ 65 - 0
shiwan/admin/src/main/java/com/huimv/admin/session/reuqest/ParameterRequestWrapper.java

@@ -0,0 +1,65 @@
+package com.huimv.admin.session.reuqest;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+import java.util.Enumeration;
+import java.util.Map;
+import java.util.Vector;
+
+
+/**
+ * 该类用于改写request.getParameterNames里的值
+ * 使用方法:HashMap newParam=new HashMap(request.getParameterMap());
+ *          ParameterRequestWrapper wrapRequest=new ParameterRequestWrapper(request,newParam);
+ *
+ * @author guojian
+ */
+public class ParameterRequestWrapper extends HttpServletRequestWrapper {
+
+    private Map params;
+
+    public ParameterRequestWrapper(HttpServletRequest request, Map newParams) {
+        super(request);
+        this.params = newParams;
+    }
+
+    public Map getParameterMap() {
+        return params;
+    }
+
+    public Enumeration getParameterNames() {
+        Vector l = new Vector(params.keySet());
+        return l.elements();
+    }
+
+    public String[] getParameterValues(String name) {
+        Object v = params.get(name);
+        if (v == null) {
+            return null;
+        } else if (v instanceof String[]) {
+            return (String[]) v;
+        } else if (v instanceof String) {
+            return new String[] { (String) v };
+        } else {
+            return new String[] { v.toString() };
+        }
+    }
+
+    public String getParameter(String name) {
+        Object v = params.get(name);
+        if (v == null) {
+            return null;
+        } else if (v instanceof String[]) {
+            String[] strArr = (String[]) v;
+            if (strArr.length > 0) {
+                return strArr[0];
+            } else {
+                return null;
+            }
+        } else if (v instanceof String) {
+            return (String) v;
+        } else {
+            return v.toString();
+        }
+    }
+}

+ 30 - 0
shiwan/admin/src/main/java/com/huimv/admin/task/ScheduledTask.java

@@ -0,0 +1,30 @@
+package com.huimv.admin.task;
+
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Component;
+
+import java.text.SimpleDateFormat;
+
+@Component
+public class ScheduledTask {
+
+    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+    private Integer count0 = 1;
+    private Integer count1 = 1;
+    private Integer count2 = 1;
+
+    @Scheduled(fixedRate = 5000)
+    public void reportCurrentTime() throws InterruptedException {
+//        System.out.println(String.format("---第%s次执行,当前时间为:%s", count0++, dateFormat.format(new Date())));
+    }
+
+    @Scheduled(fixedDelay = 5000)
+    public void reportCurrentTimeAfterSleep() throws InterruptedException {
+//        System.out.println(String.format("===第%s次执行,当前时间为:%s", count1++, dateFormat.format(new Date())));
+    }
+
+    @Scheduled(cron = "0 0 1 * * *")
+    public void reportCurrentTimeCron() throws InterruptedException {
+//        System.out.println(String.format("+++第%s次执行,当前时间为:%s", count2++, dateFormat.format(new Date())));
+    }
+}

+ 100 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/CheckNumber.java

@@ -0,0 +1,100 @@
+package com.huimv.admin.utils;
+
+import javax.imageio.ImageIO;
+import java.awt.*;
+import java.awt.image.BufferedImage;
+import java.io.IOException;
+import java.io.OutputStream;
+import java.util.Random;
+
+public class CheckNumber {
+    private int w = 70;//验证码图片宽
+    private int h = 35;//验证码图片高
+    private Random r = new Random();//随机对象
+    // {"宋体", "华文楷体", "黑体", "华文新魏", "华文隶书", "微软雅黑", "楷体_GB2312"}
+    private String[] fontNames = {"宋体", "华文楷体", "黑体", "微软雅黑", "楷体_GB2312"};
+    // 可选字符
+    private String codes = "0123456789abcdefghjkmnopqrstuvwxyz";
+    // 背景色
+    private Color bgColor = new Color(255, 255, 255);
+    // 验证码上的文本
+    private String text;
+
+    // 生成随机的颜色
+    private Color randomColor() {
+        int red = r.nextInt(150);
+        int green = r.nextInt(150);
+        int blue = r.nextInt(150);
+        return new Color(red, green, blue);
+    }
+
+    // 生成随机的字体
+    private Font randomFont() {
+        int index = r.nextInt(fontNames.length);
+        String fontName = fontNames[index];//生成随机的字体名称
+        int style = r.nextInt(4);//生成随机的样式, 0(无样式), 1(粗体), 2(斜体), 3(粗体+斜体)
+        int size = r.nextInt(5) + 24; //生成随机字号, 24 ~ 28
+        //Font对象的参数:1.字体名称2.字体样式3.字体大小
+        return new Font(fontName, style, size);
+    }
+
+    // 传入一个BufferImage对象,给图片画干扰线
+    private void drawLine(BufferedImage image) {
+        int num = 3;//一共画3条
+        Graphics2D g2 = (Graphics2D) image.getGraphics();
+        for (int i = 0; i < num; i++) {//生成两个点的坐标,即4个值
+            int x1 = r.nextInt(w);
+            int y1 = r.nextInt(h);
+            int x2 = r.nextInt(w);
+            int y2 = r.nextInt(h);
+            g2.setStroke(new BasicStroke(1.5F));
+            g2.setColor(Color.BLUE); //干扰线是蓝色
+            g2.drawLine(x1, y1, x2, y2);//画线
+        }
+    }
+
+    // 随机生成一个字符
+    private char randomChar() {
+        int index = r.nextInt(codes.length());
+        return codes.charAt(index);
+    }
+
+    // 创建BufferedImage
+    private BufferedImage createImage() {
+        BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
+        Graphics2D g2 = (Graphics2D) image.getGraphics();
+        g2.setColor(this.bgColor);
+        g2.fillRect(0, 0, w, h);
+        return image;
+    }
+
+    // 调用这个方法得到验证码
+    public BufferedImage getImage() {
+        BufferedImage image = createImage();//创建图片缓冲区
+        Graphics2D g2 = (Graphics2D) image.getGraphics();//得到绘制环境
+        StringBuilder sb = new StringBuilder();//用来装载生成的验证码文本
+        // 向图片中画4个字符
+        for (int i = 0; i < 4; i++) {//循环四次,每次生成一个字符
+            String s = randomChar() + "";//随机生成一个字母
+            sb.append(s); //把字母添加到sb中
+            float x = i * 1.0F * w / 4; //设置当前字符的x轴坐标
+            g2.setFont(randomFont()); //设置随机字体
+            g2.setColor(randomColor()); //设置随机颜色
+            g2.drawString(s, x, h - 5); //画图
+        }
+        this.text = sb.toString(); //把生成的字符串赋给了this.text
+        drawLine(image); //添加干扰线
+        return image;
+    }
+
+    // 返回验证码图片上的文本
+    public String getText() {
+        return text;
+    }
+
+    // 保存图片到指定的输出流
+    public static void output(BufferedImage image, OutputStream out)
+            throws IOException {
+        ImageIO.write(image, "JPEG", out);
+    }
+}

+ 27 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/GetMD5Str.java

@@ -0,0 +1,27 @@
+package com.huimv.admin.utils;
+
+import java.math.BigInteger;
+import java.security.MessageDigest;
+
+public class GetMD5Str {
+    /**
+     * 对字符串md5加密
+     *
+     * @param str
+     * @return
+     * @throws Exception
+     */
+    public static String getMD5Str(String str) throws Exception {
+        try {
+            // 生成一个MD5加密计算摘要
+            MessageDigest md = MessageDigest.getInstance("MD5");
+            // 计算md5函数
+            md.update(str.getBytes());
+            // digest()最后确定返回md5 hash值,返回值为8为字符串。因为md5 hash值是16位的hex值,实际上就是8位的字符
+            // BigInteger函数则将8位的字符串转换成16位hex值,用字符串来表示;得到字符串形式的hash值
+            return new BigInteger(1, md.digest()).toString(16);
+        } catch (Exception e) {
+            throw new Exception("MD5加密出现错误,"+e.toString());
+        }
+    }
+}

+ 27 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/IpTools.java

@@ -0,0 +1,27 @@
+package com.huimv.admin.utils;
+
+import org.springframework.stereotype.Component;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * @author yejijie
+ * @created 2020年7月17日 上午11:24:20
+*/
+@Component
+public class IpTools {
+
+    public static String getRemoteHost(HttpServletRequest request){
+        String ip = request.getHeader("x-forwarded-for");
+        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
+            ip = request.getHeader("Proxy-Client-IP");
+        }
+        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
+            ip = request.getHeader("WL-Proxy-Client-IP");
+        }
+        if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)){
+            ip = request.getRemoteAddr();
+        }
+        return ip.equals("0:0:0:0:0:0:0:1")?"127.0.0.1":ip;
+    }
+}

+ 8 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/PageResult.java

@@ -0,0 +1,8 @@
+package com.huimv.admin.utils;
+
+import java.util.List;
+
+public class PageResult<T> {
+    private Long total;
+    private List<T> rows;
+}

+ 38 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/PlatformException.java

@@ -0,0 +1,38 @@
+/**
+ * @Copyright (C), 2014-2020, 杭州慧牧科技有限公司
+ * @ClassName: RobotException
+ * @Author: yejijie
+ * @E-mail: yejijie@huimv.com
+ * @Date: 2020年4月23日
+ * @Version: V1.0
+ * @Description:
+ */
+package com.huimv.admin.utils;
+
+/**
+ * @author yejijie
+ *
+ */
+public class PlatformException extends RuntimeException {
+
+	/**
+	 * 
+	 */
+	private static final long serialVersionUID = 6529181147584750288L;
+	private String errCode;
+	private String errMsg;
+	public PlatformException() {
+		super();
+	}
+	public PlatformException(String code, String msg) {
+		super(msg);
+		this.errCode = code;
+		this.errMsg = msg;
+	}
+	public String getErrCode() {
+		return errCode;
+	}
+	public String getErrMsg() {
+		return errMsg;
+	}
+}

+ 79 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/Result.java

@@ -0,0 +1,79 @@
+package com.huimv.admin.utils;
+
+import java.io.Serializable;
+
+public class Result implements Serializable {
+
+    private boolean success;
+    private Integer code;
+    private String message;
+
+    public boolean isSuccess() {
+        return success;
+    }
+
+    public void setSuccess(boolean success) {
+        this.success = success;
+    }
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    public Object getData() {
+        return data;
+    }
+
+    public void setData(Object data) {
+        this.data = data;
+    }
+
+    private Object data;
+
+    //不需要返回数据时使用
+    public Result(ResultCode code) {
+        this.success = code.success;
+        this.code = code.code;
+        this.message = code.message;
+    }
+
+    public Result(ResultCode code, Object data) {
+        this.success = code.success;
+        this.code = code.code;
+        this.message = code.message;
+        this.data = data;
+    }
+
+    public Result(Integer code, String message, boolean success) {
+        this.code = code;
+        this.message = message;
+        this.success = success;
+    }
+
+    /*
+     * 调用ResultCode类封装常用的返回数据
+     */
+    public static Result SUCCESS(){
+        return new Result(ResultCode.SUCCESS);
+    }
+
+    public static Result ERROR(){
+        return new Result(ResultCode.SERVER_ERROR);
+    }
+
+    public static Result FAIL(){
+        return new Result(ResultCode.FAIL);
+    }
+}

+ 41 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/ResultCode.java

@@ -0,0 +1,41 @@
+package com.huimv.admin.utils;
+
+public enum ResultCode {
+    SUCCESS(true,10000,"操作成功!"),
+    //---系统错误返回码-----
+    FAIL(false,10001,"操作失败"),
+    UNAUTHENTICATED(false,10002,"您还未登录"),
+    UNAUTHORISE(false,10003,"权限不足"),
+    SERVER_ERROR(false,99999,"抱歉,系统繁忙,请稍后重试!"),
+
+    //---用户操作返回码  2xxxx----
+    MOBILEORPASSWORDERROR(false,20001,"用户名或密码错误");
+    //---企业操作返回码  3xxxx----
+    //---权限操作返回码----
+    //---其他操作返回码----
+
+    //操作是否成功
+    boolean success;
+    //操作代码
+    int code;
+    //提示信息
+    String message;
+
+    ResultCode(boolean success,int code, String message){
+        this.success = success;
+        this.code = code;
+        this.message = message;
+    }
+
+    public boolean success() {
+        return success;
+    }
+
+    public int code() {
+        return code;
+    }
+
+    public String message() {
+        return message;
+    }
+}

+ 171 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/id/SnowflakeIdWorker.java

@@ -0,0 +1,171 @@
+package com.huimv.admin.utils.id;
+
+public class SnowflakeIdWorker {
+    // ==============================Fields===========================================
+    /**
+     * 开始时间截 (2015-01-01)
+     */
+    private final long twepoch = 1420041600000L;
+
+    /**
+     * 机器id所占的位数
+     */
+    private final long workerIdBits = 5L;
+
+    /**
+     * 数据标识id所占的位数
+     */
+    private final long datacenterIdBits = 5L;
+
+    /**
+     * 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数)
+     */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    /**
+     * 支持的最大数据标识id,结果是31
+     */
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+    /**
+     * 序列在id中占的位数
+     */
+    private final long sequenceBits = 12L;
+
+    /**
+     * 机器ID向左移12位
+     */
+    private final long workerIdShift = sequenceBits;
+
+    /**
+     * 数据标识id向左移17位(12+5)
+     */
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+    /**
+     * 时间截向左移22位(5+5+12)
+     */
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+
+    /**
+     * 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095)
+     */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /**
+     * 工作机器ID(0~31)
+     */
+    private long workerId;
+
+    /**
+     * 数据中心ID(0~31)
+     */
+    private long datacenterId;
+
+    /**
+     * 毫秒内序列(0~4095)
+     */
+    private long sequence = 0L;
+
+    /**
+     * 上次生成ID的时间截
+     */
+    private long lastTimestamp = -1L;
+
+    //==============================Constructors=====================================
+
+    /**
+     * 构造函数
+     *
+     * @param workerId     工作ID (0~31)
+     * @param datacenterId 数据中心ID (0~31)
+     */
+    public SnowflakeIdWorker(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    // ==============================Methods==========================================
+
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     *
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+
+        //上次生成ID的时间截
+        lastTimestamp = timestamp;
+
+        //移位并通过或运算拼到一起组成64位的ID
+        return ((timestamp - twepoch) << timestampLeftShift) //
+                | (datacenterId << datacenterIdShift) //
+                | (workerId << workerIdShift) //
+                | sequence;
+    }
+
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     *
+     * @param lastTimestamp 上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 返回以毫秒为单位的当前时间
+     *
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+
+    //==============================Test=============================================
+
+    /**
+     * 测试
+     */
+    public static void main(String[] args) {
+        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
+
+        for (int i = 0; i < 10; i++) {
+            long id = idWorker.nextId();
+//            System.out.println(Long.toBinaryString(id));
+            System.out.println(id);
+        }
+    }
+}

+ 202 - 0
shiwan/admin/src/main/java/com/huimv/admin/utils/id/SnowflakeSequence.java

@@ -0,0 +1,202 @@
+package com.huimv.admin.utils.id;
+
+import java.lang.management.ManagementFactory;
+import java.net.InetAddress;
+import java.net.NetworkInterface;
+
+/**
+ * Twitter_Snowflake<br>
+ * SnowFlake的结构如下(每部分用-分开):<br>
+ * 0 - 0000000000 0000000000 0000000000 0000000000 0 - 00000 - 00000 - 000000000000 <br>
+ * 1位标识,由于long基本类型在Java中是带符号的,最高位是符号位,正数是0,负数是1,所以id一般是正数,最高位是0<br>
+ * 41位时间截(毫秒级),注意,41位时间截不是存储当前时间的时间截,而是存储时间截的差值(当前时间截 - 开始时间截)
+ * 得到的值),这里的的开始时间截,一般是我们的id生成器开始使用的时间,由我们程序来指定的(如下下面程序IdWorker类的startTime属性)。41位的时间截,可以使用69年,年T = (1L << 41) / (1000L * 60 * 60 * 24 * 365) = 69<br>
+ * 10位的数据机器位,可以部署在1024个节点,包括5位datacenterId和5位workerId<br>
+ * 12位序列,毫秒内的计数,12位的计数顺序号支持每个节点每毫秒(同一机器,同一时间截)产生4096个ID序号<br>
+ * 加起来刚好64位,为一个Long型。<br>
+ * SnowFlake的优点是,整体上按照时间自增排序,并且整个分布式系统内不会产生ID碰撞(由数据中心ID和机器ID作区分),并且效率较高,经测试,SnowFlake每秒能够产生26万ID左右。
+ */
+public class SnowflakeSequence {
+    // ==============================Fields===========================================
+    /** 开始时间截 (2017/11/29 18:25:29) */
+    private final long twepoch = 1511951129000L;
+
+    /** 机器id所占的位数 */
+    private final long workerIdBits = 5L;
+
+    /** 数据标识id所占的位数 */
+    private final long datacenterIdBits = 5L;
+
+    /** 支持的最大机器id,结果是31 (这个移位算法可以很快的计算出几位二进制数所能表示的最大十进制数) */
+    private final long maxWorkerId = -1L ^ (-1L << workerIdBits);
+
+    /** 支持的最大数据标识id,结果是31 */
+    private final long maxDatacenterId = -1L ^ (-1L << datacenterIdBits);
+
+    /** 序列在id中占的位数 */
+    private final long sequenceBits = 12L;
+
+    /** 机器ID向左移12位 */
+    private final long workerIdShift = sequenceBits;
+
+    /** 数据标识id向左移17位(12+5) */
+    private final long datacenterIdShift = sequenceBits + workerIdBits;
+
+    /** 时间截向左移22位(5+5+12) */
+    private final long timestampLeftShift = sequenceBits + workerIdBits + datacenterIdBits;
+
+    /** 生成序列的掩码,这里为4095 (0b111111111111=0xfff=4095) */
+    private final long sequenceMask = -1L ^ (-1L << sequenceBits);
+
+    /** 工作机器ID(0~31) */
+    private long workerId;
+
+    /** 数据中心ID(0~31) */
+    private long datacenterId;
+
+    /** 毫秒内序列(0~4095) */
+    private long sequence = 0L;
+
+    /** 上次生成ID的时间截 */
+    private long lastTimestamp = -1L;
+
+    //==============================构造函数=====================================
+    //根据mac地址产生datacenterid
+    public SnowflakeSequence() {
+        datacenterId = getDatacenterId(maxDatacenterId);
+        workerId = getMaxWorkerId(datacenterId, maxWorkerId);
+//        System.out.println("datacenterId:" + datacenterId + ",workerId:" + workerId);
+    }
+
+    /**
+     * 构造函数
+     * @param workerId 工作ID (0~31)
+     * @param datacenterId 数据中心ID (0~31)
+     */
+    public SnowflakeSequence(long workerId, long datacenterId) {
+        if (workerId > maxWorkerId || workerId < 0) {
+            throw new IllegalArgumentException(String.format("worker Id can't be greater than %d or less than 0", maxWorkerId));
+        }
+        if (datacenterId > maxDatacenterId || datacenterId < 0) {
+            throw new IllegalArgumentException(String.format("datacenter Id can't be greater than %d or less than 0", maxDatacenterId));
+        }
+        this.workerId = workerId;
+        this.datacenterId = datacenterId;
+    }
+
+    // ==============================Methods==========================================
+    /**
+     * 获得下一个ID (该方法是线程安全的)
+     * @return SnowflakeId
+     */
+    public synchronized long nextId() {
+        long timestamp = timeGen();
+
+        //如果当前时间小于上一次ID生成的时间戳,说明系统时钟回退过这个时候应当抛出异常
+        if (timestamp < lastTimestamp) {
+            throw new RuntimeException(
+                    String.format("Clock moved backwards.  Refusing to generate id for %d milliseconds", lastTimestamp - timestamp));
+        }
+
+        //如果是同一时间生成的,则进行毫秒内序列
+        if (lastTimestamp == timestamp) {
+            sequence = (sequence + 1) & sequenceMask;
+            //毫秒内序列溢出
+            if (sequence == 0) {
+                //阻塞到下一个毫秒,获得新的时间戳
+                timestamp = tilNextMillis(lastTimestamp);
+            }
+        }
+        //时间戳改变,毫秒内序列重置
+        else {
+            sequence = 0L;
+        }
+
+        //上次生成ID的时间截
+        lastTimestamp = timestamp;
+
+        //移位并通过或运算拼到一起组成64位的ID
+        return ((timestamp - twepoch) << timestampLeftShift) //
+                | (datacenterId << datacenterIdShift) //
+                | (workerId << workerIdShift) //
+                | sequence;
+    }
+
+    /**
+     * 阻塞到下一个毫秒,直到获得新的时间戳
+     * @param lastTimestamp 上次生成ID的时间截
+     * @return 当前时间戳
+     */
+    protected long tilNextMillis(long lastTimestamp) {
+        long timestamp = timeGen();
+        while (timestamp <= lastTimestamp) {
+            timestamp = timeGen();
+        }
+        return timestamp;
+    }
+
+    /**
+     * 返回以毫秒为单位的当前时间
+     * @return 当前时间(毫秒)
+     */
+    protected long timeGen() {
+        return System.currentTimeMillis();
+    }
+
+    /**
+     * <p>
+     * 数据标识id部分
+     * </p>
+     * @param maxDatacenterId
+     * @return
+     */
+    protected static long getDatacenterId(long maxDatacenterId) {
+        long id = 0L;
+        try {
+            InetAddress ip = InetAddress.getLocalHost();
+            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
+            if (network == null) {
+                id = 1L;
+            } else {
+                byte[] mac = network.getHardwareAddress();
+                if (null != mac) {
+                    id = ((0x000000FF & (long) mac[mac.length - 1]) | (0x0000FF00 & (((long) mac[mac.length - 2]) << 8))) >> 6;
+                    id = id % (maxDatacenterId + 1);
+                }
+            }
+        } catch (Exception e) {
+            System.err.println(" getDatacenterId: " + e.getMessage());
+        }
+        return id;
+    }
+
+    /**
+     * 获取 maxWorkerId
+     * @param datacenterId   数据中心id
+     * @param maxWorkerId    机器id
+     * @return  maxWorkerId
+     */
+    protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
+        StringBuilder mpid = new StringBuilder();
+        mpid.append(datacenterId);
+        String name = ManagementFactory.getRuntimeMXBean().getName();
+        if (name != null && "".equals(name)) {
+            // GET jvmPid
+            mpid.append(name.split("@")[0]);
+        }
+        //MAC + PID 的 hashcode 获取16个低位
+        return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
+    }
+
+    //==============================Test=============================================
+    /** 测试 */
+    public static void main(String[] args) {
+//        SnowflakeIdWorker idWorker = new SnowflakeIdWorker(0, 0);
+        SnowflakeSequence idWorker = new SnowflakeSequence();
+        for (int i = 0; i < 10; i++) {
+            long id = idWorker.nextId();
+//            System.out.println(Long.toBinaryString(id));
+            System.out.println(id);
+        }
+    }
+}

+ 44 - 0
shiwan/admin/src/main/resources/application-prod.yml

@@ -0,0 +1,44 @@
+server:
+  port: 8081
+spring:
+  application:
+    name: huimv-core
+
+  #------DataSource-----
+  datasource:
+    url: jdbc:mysql://127.0.0.1:3306/huimv-core_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    #url: jdbc:mysql://192.168.1.7:3306/huimv-core_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    show-sql: true
+
+  redis:
+    database: 0
+    host: 124.71.192.190
+    port: 6379
+    password: hm123456
+    jedis:
+      pool:
+        max-active: 20
+        max-wait: -1
+        max-idle: 10
+        min-idle: 0
+    timeout: 5000
+
+eureka:
+  instance:
+    instance-id: ${spring.cloud.client.ip-address}:${server.port}
+    prefer-ip-address: true
+    hostname: huimv-core
+  client:
+    service-url:
+      defaultZone: http://localhost:8001/eureka/
+      #defaultZone: http://192.168.1.5:8001/eureka/,http://192.168.1.6:8002/eureka/
+    registry-fetch-interval-seconds: 15
+
+    #enabled: false

+ 49 - 0
shiwan/admin/src/main/resources/application-test.yml

@@ -0,0 +1,49 @@
+server:
+  port: 8081
+spring:
+  application:
+    name: huimv-core
+
+  #------DataSource-----
+  datasource:
+    #url: jdbc:mysql://127.0.0.1:3306/huimv-core_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    url: jdbc:mysql://192.168.1.7:3306/huimv-core_db?useUnicode=true&characterEncoding=UTF-8&useSSL=false&autoReconnect=true&serverTimezone=Asia/Shanghai
+    username: root
+    password: hm123456
+    driver-class-name: com.mysql.cj.jdbc.Driver
+  jpa:
+    hibernate:
+      ddl-auto: update
+    database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
+    show-sql: true
+
+  mvc:
+    view:
+      prefix: /
+      suffix: .html
+
+  redis:
+    database: 0
+    host: 124.71.192.190
+    port: 6379
+    password: hm123456
+    jedis:
+      pool:
+        max-active: 20
+        max-wait: -1
+        max-idle: 10
+        min-idle: 0
+    timeout: 5000
+
+eureka:
+  instance:
+    instance-id: ${spring.cloud.client.ip-address}:${server.port}
+    prefer-ip-address: true
+    hostname: huimv-core
+  client:
+    service-url:
+      #defaultZone: http://127.0.0.1:8001/eureka/
+      defaultZone: http://192.168.1.5:8001/eureka/,http://192.168.1.6:8002/eureka/
+    registry-fetch-interval-seconds: 15
+
+    #enabled: false

+ 3 - 0
shiwan/admin/src/main/resources/application.properties

@@ -1 +1,4 @@
+spring.profiles.active=test
+#spring.profiles.active=prod
+
 
 

+ 4 - 0
shiwan/admin/src/main/resources/log4j.properties

@@ -0,0 +1,4 @@
+log4j.rootLogger=INFO, stdout
+log4j.appender.stdout=org.apache.log4j.ConsoleAppender
+log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
+log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/css/app.999bd5a8.css


+ 1 - 0
shiwan/admin/src/main/resources/static/admin/css/chunk-796bd885.c5fc08d6.css

@@ -0,0 +1 @@
+.box[data-v-18eae6c7]{width:100%;height:100%;box-sizing:border-box;padding:20px;border:1px solid #ddd}

+ 1 - 0
shiwan/admin/src/main/resources/static/admin/css/chunk-d101def2.dd69aec3.css

@@ -0,0 +1 @@
+.box[data-v-144e6d1e]{width:100%;height:100%;box-sizing:border-box;padding:20px;border:1px solid #ddd}

+ 1 - 0
shiwan/admin/src/main/resources/static/admin/css/chunk-f60e2c2a.f779a949.css

@@ -0,0 +1 @@
+.box[data-v-1dba0b84]{width:100%;height:100%;box-sizing:border-box;padding:20px;border:1px solid #ddd}

文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/css/chunk-vendors.84bb20f7.css


二进制
shiwan/admin/src/main/resources/static/admin/favicon.ico


二进制
shiwan/admin/src/main/resources/static/admin/fonts/element-icons.535877f5.woff


二进制
shiwan/admin/src/main/resources/static/admin/fonts/element-icons.732389de.ttf


二进制
shiwan/admin/src/main/resources/static/admin/img/login_bg.7dd3ba26.jpg


二进制
shiwan/admin/src/main/resources/static/admin/img/logo.d1c8b219.png


文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/index.html


文件差异内容过多而无法显示
+ 2 - 0
shiwan/admin/src/main/resources/static/admin/js/app.8c39dcf9.js


文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/js/app.8c39dcf9.js.map


文件差异内容过多而无法显示
+ 2 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-796bd885.06fe2073.js


文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-796bd885.06fe2073.js.map


文件差异内容过多而无法显示
+ 2 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-d101def2.f12093d0.js


文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-d101def2.f12093d0.js.map


文件差异内容过多而无法显示
+ 2 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-f60e2c2a.f041f79a.js


文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-f60e2c2a.f041f79a.js.map


文件差异内容过多而无法显示
+ 311 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-vendors.29f05e6d.js


文件差异内容过多而无法显示
+ 1 - 0
shiwan/admin/src/main/resources/static/admin/js/chunk-vendors.29f05e6d.js.map


+ 12 - 0
shiwan/admin/src/main/resources/static/index.html

@@ -0,0 +1,12 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+index.html
+time:${requestScope.time}
+name:${name}
+</body>
+</html>

+ 11 - 0
shiwan/admin/src/main/resources/static/index.jsp

@@ -0,0 +1,11 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+    <meta charset="UTF-8">
+    <title>Title</title>
+</head>
+<body>
+index.jsp
+time:${requestScope.time}
+</body>
+</html>