523096025 пре 3 година
комит
9028fad55d
60 измењених фајлова са 3008 додато и 0 уклоњено
  1. 75 0
      pom.xml
  2. 15 0
      src/main/java/com/huimv/authority/AuthorityApplication.java
  3. 133 0
      src/main/java/com/huimv/authority/config/GeneratorCodeConfig.java
  4. 17 0
      src/main/java/com/huimv/authority/config/MybatisPlusConfig.java
  5. 57 0
      src/main/java/com/huimv/authority/controller/AccountController.java
  6. 87 0
      src/main/java/com/huimv/authority/controller/AuthorizeController.java
  7. 92 0
      src/main/java/com/huimv/authority/controller/LoginController.java
  8. 42 0
      src/main/java/com/huimv/authority/controller/MenuController.java
  9. 48 0
      src/main/java/com/huimv/authority/controller/SysGroupController.java
  10. 50 0
      src/main/java/com/huimv/authority/controller/SysUserController.java
  11. 43 0
      src/main/java/com/huimv/authority/entity/Account.java
  12. 35 0
      src/main/java/com/huimv/authority/entity/AccountGroup.java
  13. 35 0
      src/main/java/com/huimv/authority/entity/Group.java
  14. 35 0
      src/main/java/com/huimv/authority/entity/GroupMenu.java
  15. 47 0
      src/main/java/com/huimv/authority/entity/Menu.java
  16. 47 0
      src/main/java/com/huimv/authority/entity/User.java
  17. 43 0
      src/main/java/com/huimv/authority/entity/dto/MenuDto.java
  18. 29 0
      src/main/java/com/huimv/authority/entity/dto/UserAccountDto.java
  19. 28 0
      src/main/java/com/huimv/authority/entity/dto/UserAndAccountGroup.java
  20. 20 0
      src/main/java/com/huimv/authority/mapper/AccountGroupMapper.java
  21. 18 0
      src/main/java/com/huimv/authority/mapper/AccountMapper.java
  22. 18 0
      src/main/java/com/huimv/authority/mapper/GroupMapper.java
  23. 20 0
      src/main/java/com/huimv/authority/mapper/GroupMenuMapper.java
  24. 22 0
      src/main/java/com/huimv/authority/mapper/MenuMapper.java
  25. 25 0
      src/main/java/com/huimv/authority/mapper/UserMapper.java
  26. 16 0
      src/main/java/com/huimv/authority/service/IAccountGroupService.java
  27. 27 0
      src/main/java/com/huimv/authority/service/IAccountService.java
  28. 34 0
      src/main/java/com/huimv/authority/service/IAuthorizeService.java
  29. 16 0
      src/main/java/com/huimv/authority/service/IGroupMenuService.java
  30. 26 0
      src/main/java/com/huimv/authority/service/IGroupService.java
  31. 11 0
      src/main/java/com/huimv/authority/service/ILoginService.java
  32. 33 0
      src/main/java/com/huimv/authority/service/IMenuService.java
  33. 32 0
      src/main/java/com/huimv/authority/service/IUserService.java
  34. 20 0
      src/main/java/com/huimv/authority/service/impl/AccountGroupServiceImpl.java
  35. 109 0
      src/main/java/com/huimv/authority/service/impl/AccountServiceImpl.java
  36. 235 0
      src/main/java/com/huimv/authority/service/impl/AuthorizeServiceImpl.java
  37. 20 0
      src/main/java/com/huimv/authority/service/impl/GroupMenuServiceImpl.java
  38. 87 0
      src/main/java/com/huimv/authority/service/impl/GroupServiceImpl.java
  39. 55 0
      src/main/java/com/huimv/authority/service/impl/LoginServiceImpl.java
  40. 121 0
      src/main/java/com/huimv/authority/service/impl/MenuServiceImpl.java
  41. 237 0
      src/main/java/com/huimv/authority/service/impl/UserServiceImpl.java
  42. 77 0
      src/main/java/com/huimv/authority/session/AccessToken.java
  43. 17 0
      src/main/java/com/huimv/authority/session/HmSession.java
  44. 100 0
      src/main/java/com/huimv/authority/utils/CheckNumber.java
  45. 27 0
      src/main/java/com/huimv/authority/utils/GetMD5Str.java
  46. 58 0
      src/main/java/com/huimv/authority/utils/HttpUtils.java
  47. 27 0
      src/main/java/com/huimv/authority/utils/IpTools.java
  48. 81 0
      src/main/java/com/huimv/authority/utils/PageFactory.java
  49. 8 0
      src/main/java/com/huimv/authority/utils/PageResult.java
  50. 38 0
      src/main/java/com/huimv/authority/utils/PlatformException.java
  51. 79 0
      src/main/java/com/huimv/authority/utils/Result.java
  52. 41 0
      src/main/java/com/huimv/authority/utils/ResultCode.java
  53. 202 0
      src/main/java/com/huimv/authority/utils/SnowflakeSequence.java
  54. 30 0
      src/main/resources/application-dev.yml
  55. 1 0
      src/main/resources/application.properties
  56. 9 0
      src/main/resources/com/huimv/authority/mapper/AccountGroupMapper.xml
  57. 10 0
      src/main/resources/com/huimv/authority/mapper/GroupMenuMapper.xml
  58. 14 0
      src/main/resources/com/huimv/authority/mapper/MenuMapper.xml
  59. 20 0
      src/main/resources/com/huimv/authority/mapper/UserMapper.xml
  60. 9 0
      src/test/java/com/huimv/authority/AuthorityApplicationTests.java

+ 75 - 0
pom.xml

@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.5.4</version>
+        <relativePath/> <!-- lookup parent from repository -->
+    </parent>
+    <groupId>com.huimv</groupId>
+    <artifactId>authority</artifactId>
+    <version>0.0.1-SNAPSHOT</version>
+    <name>authority</name>
+    <description>com.huimv</description>
+    <properties>
+        <java.version>11</java.version>
+    </properties>
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <scope>runtime</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.projectlombok</groupId>
+            <artifactId>lombok</artifactId>
+            <optional>true</optional>
+        </dependency>
+        <!-- mybatis plus 代码生成器 -->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <version>3.2.0</version>
+        </dependency>
+        <dependency>
+            <groupId>org.freemarker</groupId>
+            <artifactId>freemarker</artifactId>
+            <version>2.3.28</version>
+        </dependency>
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.47</version>
+        </dependency>
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>5.7.11</version>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 15 - 0
src/main/java/com/huimv/authority/AuthorityApplication.java

@@ -0,0 +1,15 @@
+package com.huimv.authority;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+@MapperScan("com.huimv.authority.mapper")
+public class AuthorityApplication {
+
+    public static void main(String[] args) {
+        SpringApplication.run(AuthorityApplication.class, args);
+    }
+
+}

+ 133 - 0
src/main/java/com/huimv/authority/config/GeneratorCodeConfig.java

@@ -0,0 +1,133 @@
+package com.huimv.authority.config;
+
+import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+
+import java.util.Scanner;
+
+/**
+ * 自动生成mybatisplus的相关代码
+ */
+public class GeneratorCodeConfig {
+
+    public static String scanner(String tip) {
+        Scanner scanner = new Scanner(System.in);
+        StringBuilder help = new StringBuilder();
+        help.append("请输入" + tip + ":");
+        System.out.println(help.toString());
+        if (scanner.hasNext()) {
+            String ipt = scanner.next();
+            if (StringUtils.isNotEmpty(ipt)) {
+                return ipt;
+            }
+        }
+        throw new MybatisPlusException("请输入正确的" + tip + "!");
+    }
+
+    public static void main(String[] args) {
+        // 代码生成器
+        AutoGenerator mpg = new AutoGenerator();
+
+        // 全局配置
+        GlobalConfig gc = new GlobalConfig();
+        String projectPath = System.getProperty("user.dir");
+        gc.setOutputDir(projectPath + "/src/main/java");
+        gc.setAuthor("astupidcoder");
+        gc.setOpen(false);
+        //实体属性 Swagger2 注解
+        gc.setSwagger2(false);
+        mpg.setGlobalConfig(gc);
+
+        // 数据源配置
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://127.0.0.1:3306/authority?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true");
+        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
+        dsc.setUsername("root");
+        dsc.setPassword("root");
+        mpg.setDataSource(dsc);
+
+        // 包配置
+        PackageConfig pc = new PackageConfig();
+//        pc.setModuleName(scanner("模块名"));
+        pc.setParent("com.huimv.authority");
+        pc.setEntity("entity");
+        pc.setMapper("dao");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+        mpg.setPackageInfo(pc);
+
+        // 自定义配置
+//        InjectionConfig cfg = new InjectionConfig() {
+//            @Override
+//            public void initMap() {
+//                // to do nothing
+//            }
+//        };
+
+        // 如果模板引擎是 freemarker
+//        String templatePath = "/templates/mapper.xml.ftl";
+        // 如果模板引擎是 velocity
+        // String templatePath = "/templates/mapper.xml.vm";
+
+        // 自定义输出配置
+//        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+//        focList.add(new FileOutConfig(templatePath) {
+//            @Override
+//            public String outputFile(TableInfo tableInfo) {
+//                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+//                return projectPath + "/src/main/resources/mapper/" + pc.getModuleName()
+//                        + "/" + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+//            }
+//        });
+        /*
+        cfg.setFileCreate(new IFileCreate() {
+            @Override
+            public boolean isCreate(ConfigBuilder configBuilder, FileType fileType, String filePath) {
+                // 判断自定义文件夹是否需要创建
+                checkDir("调用默认方法创建的目录");
+                return false;
+            }
+        });
+        */
+//        cfg.setFileOutConfigList(focList);
+//        mpg.setCfg(cfg);
+
+        // 配置模板
+        TemplateConfig templateConfig = new TemplateConfig();
+
+        // 配置自定义输出模板
+        //指定自定义模板路径,注意不要带上.ftl/.vm, 会根据使用的模板引擎自动识别
+        // templateConfig.setEntity("templates/entity2.java");
+        // templateConfig.setService();
+        // templateConfig.setController();
+
+        templateConfig.setXml(null);
+        mpg.setTemplate(templateConfig);
+
+        // 策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperEntityClass("com.baomidou.mybatisplus.extension.activerecord.Model");
+        strategy.setEntityLombokModel(true);
+        strategy.setRestControllerStyle(true);
+
+        strategy.setEntityLombokModel(true);
+        // 公共父类
+//        strategy.setSuperControllerClass("com.baomidou.ant.common.BaseController");
+        // 写于父类中的公共字段
+//        strategy.setSuperEntityColumns("id");
+        strategy.setInclude(scanner("表名,多个英文逗号分割").split(","));
+        strategy.setControllerMappingHyphenStyle(true);
+        strategy.setTablePrefix(pc.getModuleName() + "_");
+        strategy.setTablePrefix("sys_");
+        mpg.setStrategy(strategy);
+        mpg.setTemplateEngine(new FreemarkerTemplateEngine());
+        mpg.execute();
+    }
+}

+ 17 - 0
src/main/java/com/huimv/authority/config/MybatisPlusConfig.java

@@ -0,0 +1,17 @@
+package com.huimv.authority.config;
+
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class MybatisPlusConfig {
+
+    /**
+     * 分页插件
+     */
+    @Bean
+    public PaginationInterceptor paginationInterceptor() {
+        return new PaginationInterceptor();
+    }
+}

+ 57 - 0
src/main/java/com/huimv/authority/controller/AccountController.java

@@ -0,0 +1,57 @@
+package com.huimv.authority.controller;
+
+
+import com.huimv.authority.service.IAccountService;
+import com.huimv.authority.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;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@RestController
+@CrossOrigin
+@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 Result 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
src/main/java/com/huimv/authority/controller/AuthorizeController.java

@@ -0,0 +1,87 @@
+package com.huimv.authority.controller;
+
+import com.huimv.authority.entity.Menu;
+import com.huimv.authority.service.IAuthorizeService;
+import com.huimv.authority.service.IMenuService;
+import com.huimv.authority.utils.Result;
+import com.huimv.authority.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") String accountId, @RequestParam(name = "groupIds") 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<Menu> myMenu = iAuthorizeService.getMyMenuAll(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);
+    }
+}

+ 92 - 0
src/main/java/com/huimv/authority/controller/LoginController.java

@@ -0,0 +1,92 @@
+package com.huimv.authority.controller;
+
+import com.huimv.authority.entity.Account;
+import com.huimv.authority.service.ILoginService;
+import com.huimv.authority.session.AccessToken;
+import com.huimv.authority.session.HmSession;
+import com.huimv.authority.utils.CheckNumber;
+import com.huimv.authority.utils.IpTools;
+import com.huimv.authority.utils.Result;
+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);
+        if(result.getCode() != 1000){
+            AccessToken accessToken = new AccessToken();
+//            accessToken.setToken(session.getId());
+//            accessToken.setLoginIp(userIp);
+            accessToken.setCreated(new Date());
+            accessToken.setAccountName(accountName);
+            accessToken.setCode(result.getCode());
+            accessToken.setMessage(result.getMessage());
+            return accessToken;
+        }
+
+        Account accountEntity = (Account) 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);
+    }
+}

+ 42 - 0
src/main/java/com/huimv/authority/controller/MenuController.java

@@ -0,0 +1,42 @@
+package com.huimv.authority.controller;
+
+import com.huimv.authority.entity.Menu;
+import com.huimv.authority.service.IMenuService;
+import com.huimv.authority.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+@CrossOrigin
+@RestController
+@RequestMapping("/menu")
+public class MenuController {
+    @Autowired
+    private IMenuService menuService;
+
+    @RequestMapping("/add")
+    public Result addMenu(Menu menu){
+        return menuService.addMenu(menu);
+    }
+
+
+    @RequestMapping("/edit")
+    public Result editMenu( Menu 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 Result optimizeList() {
+        return menuService.optimizeList();
+    }
+}

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

@@ -0,0 +1,48 @@
+package com.huimv.authority.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huimv.authority.entity.Group;
+import com.huimv.authority.service.IGroupService;
+import com.huimv.authority.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;
+
+
+@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 IPage<Group> listGroup(@RequestParam(name = "pageNum") int pageNum,
+                                  @RequestParam(name = "pageSize") int pageSize,
+                                  @RequestParam(name = "searchStr", required = false) String searchStr) {
+        return groupService.listGroup(pageNum,pageSize,searchStr);
+    }
+}

+ 50 - 0
src/main/java/com/huimv/authority/controller/SysUserController.java

@@ -0,0 +1,50 @@
+package com.huimv.authority.controller;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.authority.entity.User;
+import com.huimv.authority.entity.dto.UserAndAccountGroup;
+import com.huimv.authority.service.IUserService;
+import com.huimv.authority.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(User user){
+        return  iUserService.addUser(user);
+    }
+
+    @RequestMapping("/edit")
+    public Result updateUser(User user){
+        return iUserService.updateUser(user);
+    }
+
+    @RequestMapping("/remove")
+    public Result removeUser( @RequestParam("userIds") List<Integer> userIds) {
+
+        return iUserService.removeUser(userIds);
+    }
+
+
+
+    @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);
+    }
+
+}

+ 43 - 0
src/main/java/com/huimv/authority/entity/Account.java

@@ -0,0 +1,43 @@
+package com.huimv.authority.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_account")
+public class Account extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String accountName;
+
+    private String password;
+
+    private Integer accountStatus;
+
+    private String remark;
+
+    private Long userId;
+
+    private String mobile;
+
+
+}

+ 35 - 0
src/main/java/com/huimv/authority/entity/AccountGroup.java

@@ -0,0 +1,35 @@
+package com.huimv.authority.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_account_group")
+public class AccountGroup extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private Integer accountId;
+
+    private Integer groupId;
+
+
+}

+ 35 - 0
src/main/java/com/huimv/authority/entity/Group.java

@@ -0,0 +1,35 @@
+package com.huimv.authority.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_group")
+public class Group extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String groupName;
+
+    private String remark;
+
+
+}

+ 35 - 0
src/main/java/com/huimv/authority/entity/GroupMenu.java

@@ -0,0 +1,35 @@
+package com.huimv.authority.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_group_menu")
+public class GroupMenu extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private Integer groupId;
+
+    private Integer menuId;
+
+
+}

+ 47 - 0
src/main/java/com/huimv/authority/entity/Menu.java

@@ -0,0 +1,47 @@
+package com.huimv.authority.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.beans.Transient;
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_menu")
+public class Menu extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Integer id;
+
+    private String menuName;
+
+    private String url;
+
+    private String remark;
+
+    private Integer parentId;
+
+    private Integer sort;
+
+//    private List<Menu> children;
+
+
+
+}

+ 47 - 0
src/main/java/com/huimv/authority/entity/User.java

@@ -0,0 +1,47 @@
+package com.huimv.authority.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.baomidou.mybatisplus.annotation.TableId;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("sys_user")
+public class User extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    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;
+
+
+}

+ 43 - 0
src/main/java/com/huimv/authority/entity/dto/MenuDto.java

@@ -0,0 +1,43 @@
+package com.huimv.authority.entity.dto;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import com.huimv.authority.entity.Menu;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Data
+public class MenuDto extends Model {
+
+    private static final long serialVersionUID = 1L;
+
+    private Integer id;
+
+    private String menuName;
+
+    private String url;
+
+    private String remark;
+
+    private Integer parentId;
+
+    private Integer sort;
+
+    private List<Menu> children;
+
+
+
+}

+ 29 - 0
src/main/java/com/huimv/authority/entity/dto/UserAccountDto.java

@@ -0,0 +1,29 @@
+package com.huimv.authority.entity.dto;
+
+import lombok.Data;
+
+@Data
+public class UserAccountDto {
+
+     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;
+
+     private  String accountName;
+
+     private  Integer accountStatus;
+}

+ 28 - 0
src/main/java/com/huimv/authority/entity/dto/UserAndAccountGroup.java

@@ -0,0 +1,28 @@
+package com.huimv.authority.entity.dto;
+
+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;
+}

+ 20 - 0
src/main/java/com/huimv/authority/mapper/AccountGroupMapper.java

@@ -0,0 +1,20 @@
+package com.huimv.authority.mapper;
+
+import com.huimv.authority.entity.AccountGroup;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface AccountGroupMapper extends BaseMapper<AccountGroup> {
+
+    void removeAccountGroup(@Param("groupIds") String groupIds);
+}

+ 18 - 0
src/main/java/com/huimv/authority/mapper/AccountMapper.java

@@ -0,0 +1,18 @@
+package com.huimv.authority.mapper;
+
+import com.huimv.authority.entity.Account;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface AccountMapper extends BaseMapper<Account> {
+
+}

+ 18 - 0
src/main/java/com/huimv/authority/mapper/GroupMapper.java

@@ -0,0 +1,18 @@
+package com.huimv.authority.mapper;
+
+import com.huimv.authority.entity.Group;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface GroupMapper extends BaseMapper<Group> {
+
+}

+ 20 - 0
src/main/java/com/huimv/authority/mapper/GroupMenuMapper.java

@@ -0,0 +1,20 @@
+package com.huimv.authority.mapper;
+
+import com.huimv.authority.entity.GroupMenu;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface GroupMenuMapper extends BaseMapper<GroupMenu> {
+
+    void removeGroupMenu(@Param("groupId")String groupId);
+}

+ 22 - 0
src/main/java/com/huimv/authority/mapper/MenuMapper.java

@@ -0,0 +1,22 @@
+package com.huimv.authority.mapper;
+
+import com.huimv.authority.entity.Menu;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface MenuMapper extends BaseMapper<Menu> {
+
+    List<Menu> getMyMenu(@Param("accountName") String accountName);
+}

+ 25 - 0
src/main/java/com/huimv/authority/mapper/UserMapper.java

@@ -0,0 +1,25 @@
+package com.huimv.authority.mapper;
+
+import com.huimv.authority.entity.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.huimv.authority.entity.dto.UserAccountDto;
+import org.apache.ibatis.annotations.Param;
+import org.springframework.stereotype.Repository;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Repository
+public interface UserMapper extends BaseMapper<User> {
+
+    List<UserAccountDto> findUserAndAccountByUserName(@Param("searchStr") String searchStr, @Param("start")int start, @Param("pageSize") int pageSize);
+
+    List<UserAccountDto> findUserAndAccount(@Param("start")int start, @Param("pageSize")int pageSize);
+}

+ 16 - 0
src/main/java/com/huimv/authority/service/IAccountGroupService.java

@@ -0,0 +1,16 @@
+package com.huimv.authority.service;
+
+import com.huimv.authority.entity.AccountGroup;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IAccountGroupService extends IService<AccountGroup> {
+
+}

+ 27 - 0
src/main/java/com/huimv/authority/service/IAccountService.java

@@ -0,0 +1,27 @@
+package com.huimv.authority.service;
+
+import com.huimv.authority.entity.Account;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.authority.utils.Result;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IAccountService extends IService<Account> {
+    Result setAccountStatus(List<Integer> ids, Integer status);
+
+    Result newAccount(Integer userId);
+
+    Result cancelAccount(Integer id, Integer accountStatus);
+
+    Result removeAccount(List<Integer> ids);
+
+    Result findAll();
+}

+ 34 - 0
src/main/java/com/huimv/authority/service/IAuthorizeService.java

@@ -0,0 +1,34 @@
+package com.huimv.authority.service;
+
+
+import com.huimv.authority.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);
+
+    /*
+    * @Method      : getMyMenuAll
+    * @Description :
+    * @Params      : [accountName]
+    * @Return      : java.util.List
+    *
+    * @Author      : yuxuexuan
+    * @Date        : 2021/1/6 0006
+    * @Time        : 10:37
+    */
+    List getMyMenuAll(String accountName);
+}

+ 16 - 0
src/main/java/com/huimv/authority/service/IGroupMenuService.java

@@ -0,0 +1,16 @@
+package com.huimv.authority.service;
+
+import com.huimv.authority.entity.GroupMenu;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IGroupMenuService extends IService<GroupMenu> {
+
+}

+ 26 - 0
src/main/java/com/huimv/authority/service/IGroupService.java

@@ -0,0 +1,26 @@
+package com.huimv.authority.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huimv.authority.entity.Group;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.authority.utils.Result;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IGroupService extends IService<Group> {
+
+    Result updateGroup(Integer groupId, String groupName, String remark);
+
+    Result removeGroup(Integer groupId);
+
+    IPage<Group> listGroup(int pageNum, int pageSize, String searchStr);
+
+    Result addGroup(String groupName, String remark);
+}

+ 11 - 0
src/main/java/com/huimv/authority/service/ILoginService.java

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

+ 33 - 0
src/main/java/com/huimv/authority/service/IMenuService.java

@@ -0,0 +1,33 @@
+package com.huimv.authority.service;
+
+import com.huimv.authority.entity.Menu;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.authority.utils.Result;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IMenuService extends IService<Menu> {
+    Result addMenu(Menu menu);
+    //修改菜单
+    Result editMenu(Menu menu);
+    //删除菜单(批量)
+    Result removeMenu(Integer menuId);
+   /* //查询所有
+    List<Map> listMenu();
+    //菜单递归
+    List listMenuUtil(List<Menu> list);*/
+
+    //优化查询所有
+    Result optimizeList();
+    //优化菜单递归
+    List<Map> optimizeListUtil(int parentId, List<Menu> menuEntityList);
+}

+ 32 - 0
src/main/java/com/huimv/authority/service/IUserService.java

@@ -0,0 +1,32 @@
+package com.huimv.authority.service;
+
+import com.alibaba.fastjson.JSONObject;
+import com.huimv.authority.entity.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.huimv.authority.entity.dto.UserAndAccountGroup;
+import com.huimv.authority.utils.Result;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+public interface IUserService extends IService<User> {
+
+
+    JSONObject findUserAccount(String searchStr, int pageNum, int pageSize);
+
+
+//    List<UserAndAccountGroup> yxxList(String searchStr, int pageNum, int pageSize);
+
+    Result addUser(User user);
+
+    Result updateUser(User user);
+
+    Result removeUser(List<Integer> userIds);
+}

+ 20 - 0
src/main/java/com/huimv/authority/service/impl/AccountGroupServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.authority.service.impl;
+
+import com.huimv.authority.entity.AccountGroup;
+import com.huimv.authority.mapper.AccountGroupMapper;
+import com.huimv.authority.service.IAccountGroupService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class AccountGroupServiceImpl extends ServiceImpl<AccountGroupMapper, AccountGroup> implements IAccountGroupService {
+
+}

+ 109 - 0
src/main/java/com/huimv/authority/service/impl/AccountServiceImpl.java

@@ -0,0 +1,109 @@
+package com.huimv.authority.service.impl;
+
+import com.huimv.authority.mapper.UserMapper;
+import com.huimv.authority.entity.Account;
+import com.huimv.authority.mapper.AccountMapper;
+import com.huimv.authority.entity.User;
+import com.huimv.authority.service.IAccountService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.authority.utils.GetMD5Str;
+import com.huimv.authority.utils.Result;
+import com.huimv.authority.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class AccountServiceImpl extends ServiceImpl<AccountMapper, Account> implements IAccountService {
+    @Autowired
+    private AccountMapper accountMapper;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Transactional
+    @Override
+    public Result setAccountStatus(List<Integer> ids, Integer status) {
+        try {
+            for (Integer id : ids) {
+                Account account= new Account();
+                account.setId(id);
+                account.setAccountStatus(status);
+                accountMapper.updateById(account);
+            }
+        }catch (Exception e){
+            return new Result(10001,"插入失败",false);
+        }
+        String message = "";
+        if(status == 1){
+            message = "你选择的账号已经启用。";
+        }else{
+            message = "你选择的账号已经暂停启用。";
+        }
+        return new Result(10000,message,true);
+    }
+
+    @Override
+    public Result newAccount(Integer userId) {
+        try {
+            Account Account = new Account();
+            User User = userMapper.selectById(userId);
+            String mobile = User.getMobile();
+            String userName = User.getUserName();
+            if (mobile != null && !"".equals(mobile) ){
+                Account.setAccountName(mobile);
+            }else if (userName != null && !"".equals(userName)){
+                Account.setAccountName(userName);
+            }else {
+                return new Result(10000,"新增失败",false);
+            }
+            Account.setAccountStatus(1);
+            Account.setRemark("无");
+            Account.setPassword(GetMD5Str.getMD5Str("123456"));
+            accountMapper.insert(Account);
+            return new Result(10000,"插入成功",true);
+        }catch (Exception e){
+            return new Result(10001,"插入失败",false);
+        }
+    }
+
+    @Override
+    public Result cancelAccount(Integer id, Integer accountStatus) {
+        try {
+            Account Account = accountMapper.selectById(id);
+            Account.setAccountStatus(accountStatus);
+            accountMapper.updateById(Account);
+            return new Result(10000,"修改成功",true);
+        }catch (Exception e){
+            return new Result(10001,"修改失败",false);
+        }
+    }
+
+    @Override
+    public Result removeAccount(List<Integer> ids) {
+        try {
+            for (Integer id : ids) {
+                accountMapper.deleteById(id);
+            }
+        }catch (Exception e){
+            return new Result(10001,"删除失败",false);
+        }
+        return new Result(10000,"删除成功",true);
+    }
+
+    @Override
+    public Result findAll() {
+        List<Account> all = accountMapper.selectList(null);
+        return new Result(ResultCode.SUCCESS,all);
+    }
+}

+ 235 - 0
src/main/java/com/huimv/authority/service/impl/AuthorizeServiceImpl.java

@@ -0,0 +1,235 @@
+package com.huimv.authority.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.ObjectUtils;
+import com.huimv.authority.entity.dto.MenuDto;
+import com.huimv.authority.mapper.AccountGroupMapper;
+import com.huimv.authority.mapper.GroupMenuMapper;
+import com.huimv.authority.mapper.MenuMapper;
+import com.huimv.authority.entity.AccountGroup;
+import com.huimv.authority.entity.GroupMenu;
+import com.huimv.authority.entity.Menu;
+import com.huimv.authority.service.IAuthorizeService;
+import com.huimv.authority.utils.Result;
+import com.huimv.authority.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
+    AccountGroupMapper accountGroupMapper;
+    @Autowired
+    GroupMenuMapper groupMenuMapper;
+    @Autowired
+    private MenuMapper menuMapper;
+    
+    @Override
+    @Transactional
+    public Result saveAccountGroup(String accountId, String groupIds) {
+        /**
+         * Step1:先删除原先的账号关联权限组数据;
+         * Step2:再添加新的账号关联权限组数据;
+         */
+        if (accountId == null||"".equals(accountId)){
+
+            accountGroupMapper.removeAccountGroup(groupIds);
+            return new Result(10001, "保存账号关联权限组成功", true);
+        }else {
+            String[] groupIdArray = accountId.split(",");
+            accountGroupMapper.removeAccountGroup(groupIds);
+//        for (int a = 0; a < groupIdArray.length; a++) {
+//            accountGroupMapper.removeAccountGroup(accountId,groupIdArray[a]);
+//        }
+            for (int a = 0; a < groupIdArray.length; a++) {
+                AccountGroup accountGroupEntity = new AccountGroup();
+                accountGroupEntity.setAccountId(Integer.parseInt(groupIdArray[a]));
+                accountGroupEntity.setGroupId(Integer.parseInt(groupIds));
+                accountGroupMapper.insert(accountGroupEntity);
+//            accountGroupMapper.insert(Integer.parseInt(accountId),Integer.parseInt(groupIdArray[a]));
+            }
+            return new Result(10001, "保存账号关联权限组成功", true);
+        }
+
+
+    }
+
+    @Override
+    @Transactional
+    public Result saveGroupMenu(String groupId, String menuIds) {
+        /**
+         * Step1:先删除原先的权限组关联菜单数据;
+         * Step2:再添加新的账号权限组关联菜单数据;
+         */
+        groupMenuMapper.removeGroupMenu(groupId);
+        String[] menuIdsArray = menuIds.split(",");
+     /*   for (int a = 0; a < menuIdsArray.length; a++) {
+            groupMenuMapper.removeGroupMenu(groupId, menuIdsArray[a]);
+        }*/
+        for (int a = 0; a < menuIdsArray.length; a++) {
+            GroupMenu GroupMenu = new GroupMenu();
+            GroupMenu.setGroupId(Integer.parseInt(groupId));
+            GroupMenu.setMenuId(Integer.parseInt(menuIdsArray[a]));
+            groupMenuMapper.insert(GroupMenu);
+        }
+        return new Result(10001, "保存权限组关联菜单成功", true);
+    }
+
+
+
+    @Override
+    public List getMyMenu(String accountName) {
+        List<Menu> allMenuEntityList = menuMapper.getMyMenu(accountName);
+        System.out.println("123456");
+        //
+        List<Menu> myRootMenuList = new ArrayList();
+        //pid(上级Id)为0的是根菜单
+        for (Menu menuEntity : allMenuEntityList) {
+            if (menuEntity.getParentId() == 0) {
+                myRootMenuList.add(menuEntity);
+            }
+        }
+        // 遍历,找到二级菜单(根菜单的id和所有菜单中的pid比较)
+        for (Menu myMenuEntity : myRootMenuList) {
+            /*  */
+            List<Menu> child = getChild(myMenuEntity.getId(), allMenuEntityList);
+            MenuDto menuDto = new MenuDto();
+            BeanUtil.copyProperties(myMenuEntity,menuDto);
+            menuDto.setChildren(child);
+        }
+        return myRootMenuList;
+    }
+
+    public List<Menu> getChild(int pid, List<Menu> allMenuList) {
+        //子菜单列表
+        List<Menu> childList = new ArrayList<>();
+        for (Menu menuEntity : allMenuList) {
+            if (pid == menuEntity.getParentId()) {
+                childList.add(menuEntity);
+            }
+        }
+        //遍历 获取子菜单的子菜单
+        for (Menu childMenu : childList) {
+            List<Menu> child = getChild(childMenu.getId(), allMenuList);
+            MenuDto menuDto = new MenuDto();
+            BeanUtil.copyProperties(childMenu,menuDto);
+            menuDto.setChildren(child);
+        }
+        //递归出口 childList长度为0
+        if (childList.size() == 0) {
+            return new ArrayList<>();
+        }
+        return childList;
+    }
+
+    @Override
+    public Result getMenuByGroup(String groupId) {
+        /* 根据权限组读取已关联菜单 */
+        QueryWrapper<GroupMenu> groupMenuQueryWrapper = new QueryWrapper<>();
+        groupMenuQueryWrapper.eq("group_id",groupId);
+        List<GroupMenu> groupMenuEntityList = groupMenuMapper.selectList(groupMenuQueryWrapper);
+        if (groupMenuEntityList.size() == 0) {
+            return new Result(10005, "当前权限组暂未关联任何菜单.", false);
+        }
+        /* 读取所有菜单 */
+        List<Menu> allMenuList = menuMapper.selectList(null);
+        if (allMenuList.size() == 0) {
+            return new Result(10007, "当前无任何菜单.", false);
+        }
+        List<GroupMenu> newList = new ArrayList();
+        StringBuilder idSb2 = new StringBuilder();
+
+        for (int a = 0; a < groupMenuEntityList.size(); a++) {
+            GroupMenu groupMenuEntity = groupMenuEntityList.get(a);
+            for (Menu 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 (Menu 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 (GroupMenu 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读取已关联权限组 */
+        QueryWrapper<AccountGroup> accountGroupQueryWrapper = new QueryWrapper<>();
+        accountGroupQueryWrapper.eq("account_id",accountId);
+        List<AccountGroup> accountGroupEntityList = accountGroupMapper.selectList(accountGroupQueryWrapper);
+        if (accountGroupEntityList.size() == 0) {
+            return new Result(10006, "当前用户账号暂未关联任何权限组.", false);
+        }
+        StringBuilder idSb = new StringBuilder();
+        for (AccountGroup 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读取已关联权限组 */
+        QueryWrapper<AccountGroup> accountGroupQueryWrapper = new QueryWrapper<>();
+        accountGroupQueryWrapper.eq("group_id",groupId);
+        List<AccountGroup> accountGroupEntityList = accountGroupMapper.selectList(accountGroupQueryWrapper);
+        if (accountGroupEntityList.size() == 0) {
+            return new Result(10006, "当前权限组暂未关联任何用户账号.", false);
+        }
+        StringBuilder idSb = new StringBuilder();
+        for (AccountGroup accountGroupEntity : accountGroupEntityList) {
+            if (idSb.length() > 0) {
+                idSb.append(",");
+            }
+            idSb.append(accountGroupEntity.getAccountId());
+        }
+        return new Result(ResultCode.SUCCESS, idSb.toString());
+    }
+
+    @Override
+    public List getMyMenuAll(String accountName) {
+        return menuMapper.getMyMenu(accountName);
+    }
+}

+ 20 - 0
src/main/java/com/huimv/authority/service/impl/GroupMenuServiceImpl.java

@@ -0,0 +1,20 @@
+package com.huimv.authority.service.impl;
+
+import com.huimv.authority.entity.GroupMenu;
+import com.huimv.authority.mapper.GroupMenuMapper;
+import com.huimv.authority.service.IGroupMenuService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class GroupMenuServiceImpl extends ServiceImpl<GroupMenuMapper, GroupMenu> implements IGroupMenuService {
+
+}

+ 87 - 0
src/main/java/com/huimv/authority/service/impl/GroupServiceImpl.java

@@ -0,0 +1,87 @@
+package com.huimv.authority.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.huimv.authority.mapper.GroupMenuMapper;
+import com.huimv.authority.entity.Group;
+import com.huimv.authority.mapper.GroupMapper;
+import com.huimv.authority.entity.GroupMenu;
+import com.huimv.authority.service.IGroupService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.authority.utils.Result;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class GroupServiceImpl extends ServiceImpl<GroupMapper, Group> implements IGroupService {
+    @Autowired
+    private GroupMapper GroupMapper;
+    @Autowired
+    private GroupMenuMapper groupMenuMapper;
+
+    @Override
+    public Result updateGroup(Integer groupId, String groupName, String remark) {
+        try {
+            Group group = this.GroupMapper.selectById(groupId);
+            if (group == null) {
+                return new Result(10002,"请选择数据",false);
+            }
+            group.setGroupName(groupName);
+            group.setRemark(remark);
+            GroupMapper.updateById(group);
+            return new Result(10000,"修改成功",true);
+        }catch (Exception e){
+            return new Result(10001,"修改失败",false);
+        }
+    }
+
+    @Override
+    @Transactional
+    public Result removeGroup(Integer groupId) {
+        try {
+            Group group = this.GroupMapper.selectById(groupId);
+            if (group == null) {
+                return new Result(10002,"请选择数据",false);
+            }
+            // 删除权限组
+            this.GroupMapper.deleteById(groupId);
+            // 删除权限组关联菜单
+            QueryWrapper<GroupMenu> groupMenuQueryWrapper = new QueryWrapper<>();
+            groupMenuQueryWrapper.eq("group_id",groupId);
+            groupMenuMapper.delete(groupMenuQueryWrapper);
+            return new Result(10000,"删除成功",true);
+        }catch (Exception e){
+            return new Result(10001,"删除失败",false);
+        }
+    }
+
+    @Override
+    public  IPage<Group> listGroup(int pageNum, int pageSize, String searchStr) {
+
+
+        return this.page(new Page<>(pageNum, pageSize),new QueryWrapper<Group>().orderByDesc("id"));
+    }
+
+    @Override
+    public Result addGroup(String groupName, String remark) {
+        try {
+            Group group = new Group();
+            group.setGroupName(groupName);
+            group.setRemark(remark);
+            GroupMapper.insert(group);
+            return new Result(10000,"添加成功",true);
+        }catch (Exception e){
+            return new Result(10001,"添加失败",false);
+        }
+    }
+}

+ 55 - 0
src/main/java/com/huimv/authority/service/impl/LoginServiceImpl.java

@@ -0,0 +1,55 @@
+package com.huimv.authority.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.authority.entity.User;
+import com.huimv.authority.mapper.AccountMapper;
+import com.huimv.authority.entity.Account;
+import com.huimv.authority.mapper.UserMapper;
+import com.huimv.authority.service.ILoginService;
+import com.huimv.authority.utils.Result;
+import com.huimv.authority.utils.ResultCode;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+@Service
+public class LoginServiceImpl implements ILoginService {
+
+    @Autowired
+    private AccountMapper accountMapper;
+
+    @Autowired
+    private UserMapper userMapper;
+
+    @Override
+    public Result login(String accountName, String password) {
+        //Step1:判断账户状态
+        //Step2:读取菜单组
+        QueryWrapper<Account> accountQueryWrapper = new QueryWrapper<>();
+        accountQueryWrapper.eq("account_name",accountName).or().eq("mobile",accountName);
+        accountQueryWrapper.eq("password",password);
+        Account accountEntity = accountMapper.selectOne(accountQueryWrapper);
+        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;
+    }
+}

+ 121 - 0
src/main/java/com/huimv/authority/service/impl/MenuServiceImpl.java

@@ -0,0 +1,121 @@
+package com.huimv.authority.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.authority.entity.Menu;
+import com.huimv.authority.mapper.MenuMapper;
+import com.huimv.authority.service.IMenuService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.authority.utils.Result;
+import com.huimv.authority.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;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {
+    @Autowired
+    private MenuMapper menuMapper;
+
+    @Override
+    public Result addMenu(Menu menu) {
+        System.out.println(menu);
+        try {
+            if (menu == null){
+                return  new Result(10002,"参数错误",false);
+            }
+            menuMapper.insert(menu);
+            return new Result(10000,"添加成功",true);
+        }catch (Exception e){
+            return new Result(10001,"添加失败",false);
+        }
+    }
+
+    @Override
+    public Result editMenu(Menu menu) {
+        try {
+            if (menu.getId() == null){
+                return new Result(10002,"请选择要修改的菜单",false);
+            }
+            menuMapper.updateById(menu);
+            return new Result(10000,"修改成功",true);
+        }catch (Exception e){
+            return new Result(10001,"修改失败",false);
+        }
+
+    }
+
+    @Override
+    public Result removeMenu(Integer menuId) {
+        try {
+            QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
+            menuQueryWrapper.eq("parent_id",menuId);
+            List<Menu> lists = menuMapper.selectList(menuQueryWrapper);
+            if (lists != null && lists.size()>0){
+                for (Menu menu : lists) {
+                    removeMenu(menu.getId());
+                    menuMapper.deleteById(menu);
+                }
+            }
+            menuMapper.deleteById(menuId);
+        }catch (Exception e){
+            return new Result(10001,"删除失败",false);
+        }
+        return new Result(10000,"删除成功",true);
+    }
+
+    //查询菜单,只查一次数据库
+    @Override
+    public Result optimizeList() {
+        QueryWrapper<Menu> menuQueryWrapper = new QueryWrapper<>();
+        menuQueryWrapper.orderByAsc("sort");
+
+        List<Menu> all = menuMapper.selectList(menuQueryWrapper);
+        List list = optimizeListUtil(0,all);
+        return new Result(ResultCode.SUCCESS,list);
+    }
+
+    @Override
+    public List<Map> optimizeListUtil(int parentId, List<Menu> menuEntityList){
+        List<Map> list = new ArrayList<>();
+        for (Menu 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(Menu menuEntity, List<Menu> menuEntityList) {
+        for (Menu Menu : menuEntityList) {
+            if (menuEntity.getId().equals(Menu.getParentId()) ){
+                return true;
+            }
+        }
+        return false;
+    }
+}

+ 237 - 0
src/main/java/com/huimv/authority/service/impl/UserServiceImpl.java

@@ -0,0 +1,237 @@
+package com.huimv.authority.service.impl;
+
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.huimv.authority.entity.dto.UserAccountDto;
+import com.huimv.authority.mapper.AccountMapper;
+import com.huimv.authority.entity.Account;
+import com.huimv.authority.entity.User;
+import com.huimv.authority.mapper.UserMapper;
+import com.huimv.authority.entity.dto.UserAndAccountGroup;
+import com.huimv.authority.service.IUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.huimv.authority.utils.Result;
+import com.huimv.authority.utils.ResultCode;
+import com.huimv.authority.utils.SnowflakeSequence;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author astupidcoder
+ * @since 2021-09-09
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements IUserService {
+    @Autowired
+    private UserMapper userMapper;
+    @Autowired
+    private AccountMapper accountMapper;
+
+    @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<UserAccountDto> userAccountList = userMapper.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));
+//            }
+            QueryWrapper<User> userQueryWrapper = new QueryWrapper<>();
+            userQueryWrapper.eq("user_name",searchStr);
+            int total = userMapper.selectCount(userQueryWrapper);
+            JSONObject resultJo = new JSONObject();
+            resultJo.put("code",10001);
+            resultJo.put("totalElements",total);
+            resultJo.put("data",userAccountList);
+            return resultJo;
+        }
+        List<UserAccountDto> allUserAccountList = userMapper.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));
+//        }
+        Integer total = userMapper.selectCount(null);
+        JSONObject resultJo = new JSONObject();
+        resultJo.put("code",10001);
+        resultJo.put("totalElements",total);
+        resultJo.put("data",allUserAccountList);
+        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 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<User> users = userMapper.findByUserNameOOrMobile(searchStr, pageable);
+//            for (User user : users) {
+//                Account account = accountMapper.findByUserId(user.getUserId()).get(0);
+//                UserAndAccountGroup userAndAccountGroup = saveUser(user);
+//                userAndAccountGroup.setAccountName(account.getAccountName());
+//                userAndAccountGroup.setAccountStatus(account.getAccountStatus());
+//                list.add(userAndAccountGroup);
+//            }
+//        }
+//        Page<User> users = userMapper.findAll(pageable);
+//        for (User user : users) {
+//            Account account = accountMapper.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(User user) {
+        try {
+            SnowflakeSequence idWorker = new SnowflakeSequence();
+            long userId = idWorker.nextId();
+            // 添加用户信息
+            user.setUserId(userId);
+            userMapper.insert(user);
+
+            // 添加账号信息
+            String mobile = user.getMobile();
+            String userName = user.getUserName();
+            Account Account = new Account();
+            if (mobile != null && !"".equals(mobile) ){
+                Account.setAccountName(mobile);
+            }else if (userName != null && !"".equals(userName)){
+                Account.setAccountName(userName);
+            }
+            Account.setAccountStatus(0);
+            Account.setRemark("");
+//            Account.setPassword(GetMD5Str.getMD5Str("123456"));
+            Account.setPassword("123456");
+            Account.setUserId(userId);
+            Account.setMobile(mobile);
+            accountMapper.insert(Account);
+            return new Result(10000,"修改成功",true);
+        }catch (Exception e){
+            return new Result(10001,"添加失败",false);
+        }
+    }
+
+    @Override
+    public Result updateUser(User user) {
+        try {
+            if (user == null) {
+                return  new Result(ResultCode.FAIL);
+            }
+            userMapper.updateById(user);
+            return new Result(10000,"修改成功",true);
+        }catch (Exception e){
+            return new Result(10001,"修改失败",false);
+        }
+    }
+
+    @Override
+    public Result removeUser(List<Integer> userIds) {
+        for (Integer userId : userIds) {
+            try {
+                User user = this.userMapper.selectById(userId);
+                if (user == null) {
+                    return new Result(10002,"请选择数据",false);
+                }
+                this.userMapper.deleteById(userId);
+                // 删除账号
+                this.accountMapper.deleteById(userId);
+            }catch (Exception e){
+                return new Result(10001,"删除失败",false);
+            }
+        }
+        return new Result(10000,"删除成功",false);
+    }
+
+    private UserAndAccountGroup saveUser(User 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;
+    }
+}

+ 77 - 0
src/main/java/com/huimv/authority/session/AccessToken.java

@@ -0,0 +1,77 @@
+package com.huimv.authority.session;
+
+import java.util.Date;
+
+/**
+ * 登录的token信息
+ * @author guojian
+ */
+public class AccessToken {
+    private String token;
+    private String loginIp;
+    private Date created;
+    private String accountName;
+    private Integer code;
+
+    public String getMessage() {
+        return message;
+    }
+
+    public void setMessage(String message) {
+        this.message = message;
+    }
+
+    private String message;
+
+    public Integer getCode() {
+        return code;
+    }
+
+    public void setCode(Integer code) {
+        this.code = code;
+    }
+
+    public String getAccountName() {
+        return accountName;
+    }
+
+    public void setAccountName(String accountName) {
+        this.accountName = accountName;
+    }
+
+    public String getToken() {
+        return token;
+    }
+
+    public void setToken(String token) {
+        this.token = token;
+    }
+
+    public Date getCreated() {
+        return created;
+    }
+
+    public void setCreated(Date created) {
+        this.created = created;
+    }
+
+	public String getLoginIp() {
+		return loginIp;
+	}
+
+	public void setLoginIp(String loginIp) {
+		this.loginIp = loginIp;
+	}
+
+    @Override
+    public String toString() {
+        return "AccessToken{" +
+                "token='" + token + '\'' +
+                ", loginIp='" + loginIp + '\'' +
+                ", created=" + created +
+                ", accountName='" + accountName + '\'' +
+                ", code=" + code +
+                ", message='" + message + '\'' +
+                '}';
+    }
+}

+ 17 - 0
src/main/java/com/huimv/authority/session/HmSession.java

@@ -0,0 +1,17 @@
+package com.huimv.authority.session;
+
+import com.huimv.authority.entity.Account;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 自定义的session存储结构
+ * @author guojian
+ */
+@Data
+public class HmSession implements Serializable {
+
+    private Account accountEntity;
+
+}

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

@@ -0,0 +1,100 @@
+package com.huimv.authority.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
src/main/java/com/huimv/authority/utils/GetMD5Str.java

@@ -0,0 +1,27 @@
+package com.huimv.authority.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());
+        }
+    }
+}

+ 58 - 0
src/main/java/com/huimv/authority/utils/HttpUtils.java

@@ -0,0 +1,58 @@
+package com.huimv.authority.utils;
+
+import java.io.BufferedReader;
+import java.io.DataOutputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.URL;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * http 工具类
+ */
+public class HttpUtils {
+
+    public static String post(String requestUrl, String accessToken, String params) throws Exception {
+        String generalUrl = requestUrl + "?access_token=" + accessToken;
+        URL url = new URL(generalUrl);
+        // 打开和URL之间的连接
+        HttpURLConnection connection = (HttpURLConnection) url.openConnection();
+        connection.setRequestMethod("POST");
+        // 设置通用的请求属性
+        connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
+        connection.setRequestProperty("Connection", "Keep-Alive");
+        connection.setUseCaches(false);
+        connection.setDoOutput(true);
+        connection.setDoInput(true);
+
+        // 得到请求的输出流对象
+        DataOutputStream out = new DataOutputStream(connection.getOutputStream());
+        out.writeBytes(params);
+        out.flush();
+        out.close();
+
+        // 建立实际的连接
+        connection.connect();
+        // 获取所有响应头字段
+        Map<String, List<String>> headers = connection.getHeaderFields();
+        // 遍历所有的响应头字段
+        for (String key : headers.keySet()) {
+            System.out.println(key + "--->" + headers.get(key));
+        }
+        // 定义 BufferedReader输入流来读取URL的响应
+        BufferedReader in = null;
+        if (requestUrl.contains("nlp"))
+            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "GBK"));
+        else
+            in = new BufferedReader(new InputStreamReader(connection.getInputStream(), "UTF-8"));
+        String result = "";
+        String getLine;
+        while ((getLine = in.readLine()) != null) {
+            result += getLine;
+        }
+        in.close();
+        System.out.println("result:" + result);
+        return result;
+    }
+}

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

@@ -0,0 +1,27 @@
+package com.huimv.authority.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;
+    }
+}

+ 81 - 0
src/main/java/com/huimv/authority/utils/PageFactory.java

@@ -0,0 +1,81 @@
+/*
+Copyright [2020] [https://www.xiaonuo.vip]
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Snowy采用APACHE LICENSE 2.0开源协议,您在使用过程中,需要注意以下几点:
+
+1.请不要删除和修改根目录下的LICENSE文件。
+2.请不要删除和修改Snowy源码头部的版权声明。
+3.请保留源码和相关描述文件的项目出处,作者声明等。
+4.分发源码时候,请注明软件出处 https://gitee.com/xiaonuobase/snowy
+5.在修改包名,模块名称,项目代码等时,请注明软件出处 https://gitee.com/xiaonuobase/snowy
+6.若您的项目无法满足以上几点,可申请商业授权,获取Snowy商业授权许可,请在官网购买授权,地址为 https://www.xiaonuo.vip
+ */
+package com.huimv.authority.utils;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+
+import javax.servlet.http.HttpServletRequest;
+
+
+/**
+ * 默认分页参数构建
+ *
+ * @author yubaoshan
+ * @date 2017/11/15 13:52
+ */
+public class PageFactory {
+
+    /**
+     * 每页大小(默认20)
+     */
+    private static final String PAGE_SIZE_PARAM_NAME = "pageSize";
+
+    /**
+     * 第几页(从1开始)
+     */
+    private static final String PAGE_NO_PARAM_NAME = "pageNo";
+
+    /**
+     * 默认分页,在使用时PageFactory.defaultPage会自动获取pageSize和pageNo参数
+     *
+     * @author xuyuxiang
+     * @date 2020/3/30 16:42
+     */
+    public static <T> Page<T> defaultPage() {
+
+        int pageSize = 20;
+        int pageNo = 1;
+
+
+        return new Page<>(pageNo, pageSize);
+    }
+}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+

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

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

+ 38 - 0
src/main/java/com/huimv/authority/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.authority.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
src/main/java/com/huimv/authority/utils/Result.java

@@ -0,0 +1,79 @@
+package com.huimv.authority.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
src/main/java/com/huimv/authority/utils/ResultCode.java

@@ -0,0 +1,41 @@
+package com.huimv.authority.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;
+    }
+}

+ 202 - 0
src/main/java/com/huimv/authority/utils/SnowflakeSequence.java

@@ -0,0 +1,202 @@
+package com.huimv.authority.utils;
+
+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);
+        }
+    }
+}

+ 30 - 0
src/main/resources/application-dev.yml

@@ -0,0 +1,30 @@
+server:
+  port: 8081
+  servlet:
+    context-path: /
+
+spring:
+  datasource:
+    driver-class-name: com.mysql.cj.jdbc.Driver
+    url: jdbc:mysql://127.0.0.1:3306/authority?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&zeroDateTimeBehavior=convertToNull&useSSL=false&allowPublicKeyRetrieval=true
+    username: root
+    password: root
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+    serialization:
+      write-dates-as-timestamps: false
+
+mybatis-plus:
+  configuration:
+    map-underscore-to-camel-case: true
+    auto-mapping-behavior: full
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
+  mapper-locations: classpath*:mapper/**/*Mapper.xml
+  global-config:
+    # 逻辑删除配置
+    db-config:
+      # 删除前
+      logic-not-delete-value: 1
+      # 删除后
+      logic-delete-value: 0

+ 1 - 0
src/main/resources/application.properties

@@ -0,0 +1 @@
+spring.profiles.active=dev

+ 9 - 0
src/main/resources/com/huimv/authority/mapper/AccountGroupMapper.xml

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.authority.mapper.AccountGroupMapper">
+
+
+    <delete id="removeAccountGroup">
+        DELETE FROM sys_account_group WHERE group_id=#{groupIds}
+    </delete>
+</mapper>

+ 10 - 0
src/main/resources/com/huimv/authority/mapper/GroupMenuMapper.xml

@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.authority.mapper.GroupMenuMapper">
+
+
+
+    <delete id="removeGroupMenu">
+        DELETE FROM sys_group_menu WHERE group_id=#{groupId}
+    </delete>
+</mapper>

+ 14 - 0
src/main/resources/com/huimv/authority/mapper/MenuMapper.xml

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.authority.mapper.MenuMapper">
+
+
+    <select id="getMyMenu" resultType="com.huimv.authority.entity.Menu">
+        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=#{accountName} AND account.user_id=user1.user_id)))
+        ORDER BY sort ASC
+    </select>
+</mapper>

+ 20 - 0
src/main/resources/com/huimv/authority/mapper/UserMapper.xml

@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.huimv.authority.mapper.UserMapper">
+    <select id="findUserAndAccountByUserName" resultType="com.huimv.authority.entity.dto.UserAccountDto">
+        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=#{searchStr}  OR user.mobile=#{searchStr} order by id desc limit #{start},#{pageSize}
+
+    </select>
+    <select id="findUserAndAccount" resultType="com.huimv.authority.entity.dto.UserAccountDto">
+        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 #{start},#{pageSize}
+    </select>
+
+
+</mapper>

+ 9 - 0
src/test/java/com/huimv/authority/AuthorityApplicationTests.java

@@ -0,0 +1,9 @@
+package com.huimv.authority;
+
+
+class AuthorityApplicationTests {
+
+    void contextLoads() {
+    }
+
+}