lrf 8 месяцев назад
Родитель
Сommit
ba93d2cecc
25 измененных файлов с 1044 добавлено и 114 удалено
  1. 54 3
      src/main/java/com/free/controller/LoginController.java
  2. 74 13
      src/main/java/com/free/controller/system/AdminController.java
  3. 0 16
      src/main/java/com/free/controller/system/AdminRoleController.java
  4. 139 0
      src/main/java/com/free/controller/system/CustomerController.java
  5. 150 0
      src/main/java/com/free/controller/system/MenusController.java
  6. 37 28
      src/main/java/com/free/utils/BaseController.java
  7. 18 0
      src/main/java/com/free/dto/PasswordUpdateDTO.java
  8. 16 0
      src/main/java/com/free/dto/system/customer/CustomerCreateDTO.java
  9. 26 0
      src/main/java/com/free/dto/system/menus/MenusCreateDTO.java
  10. 0 26
      src/main/java/com/free/entity/system/AdminRole.java
  11. 46 0
      src/main/java/com/free/entity/system/Customer.java
  12. 75 0
      src/main/java/com/free/entity/system/Menus.java
  13. 44 0
      src/main/java/com/free/entity/system/Role.java
  14. 2 1
      src/main/java/com/free/frame/ExceptionEnum.java
  15. 3 3
      src/main/java/com/free/mapper/system/AdminRoleMapper.java
  16. 13 0
      src/main/java/com/free/mapper/system/MenusMapper.java
  17. 11 0
      src/main/java/com/free/mapper/system/RoleMapper.java
  18. 0 12
      src/main/java/com/free/service/system/AdminRoleService.java
  19. 12 0
      src/main/java/com/free/service/system/CustomerService.java
  20. 87 0
      src/main/java/com/free/service/system/MenusService.java
  21. 12 0
      src/main/java/com/free/service/system/RoleService.java
  22. 9 10
      src/main/java/com/free/utils/JwtUtil.java
  23. 83 0
      src/main/java/com/free/utils/Utils.java
  24. 20 2
      src/main/resources/application.yml
  25. 113 0
      src/main/resources/db/menus.json

+ 54 - 3
src/main/java/com/free/controller/LoginController.java

@@ -13,11 +13,14 @@ import org.springframework.web.bind.annotation.RestController;
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.free.dto.LoginDTO;
+import com.free.dto.PasswordUpdateDTO;
 import com.free.entity.system.Admin;
+import com.free.entity.system.Customer;
 import com.free.frame.CustomizationException;
 import com.free.frame.ExceptionEnum;
 import com.free.frame.ResponseFormat;
 import com.free.service.system.AdminService;
+import com.free.service.system.CustomerService;
 import com.free.utils.BcryptUtil;
 import com.free.utils.JwtUtil;
 
@@ -32,23 +35,33 @@ public class LoginController {
   /** 管理员登录类型 */
   private String adminLoginType = "Admin";
   /** 客服人员登录类型 */
-  private String csLoginType = "User";
+  private String csLoginType = "Customer";
 
   @Autowired
   private AdminService adminService;
 
+  @Autowired
+  private CustomerService customerService;
+
   @ApiOperation("客服服务登录")
   @PostMapping("/kf/login/{type}")
   public Object login(@PathVariable String type, @RequestBody @Valid LoginDTO data) {
     Map<String, Object> userInfo = null;
     if (this.adminLoginType.equals(type)) {
-      // 管理员service
+      // 管理员
       QueryWrapper<Admin> qw = new QueryWrapper<>();
       qw.select("id", "nick_name", "account", "password", "role", "is_use", "is_super");
       qw.eq("account", data.getAccount());
       userInfo = this.adminService.getMap(qw);
     } else if (this.csLoginType.equals(type)) {
-      // 客服service
+      // 客服人员
+      QueryWrapper<Customer> qw = new QueryWrapper<>();
+      qw.select("id", "nick_name", "account", "password", "role", "is_use");
+      qw.eq("account", data.getAccount());
+      userInfo = this.customerService.getMap(qw);
+    } else {
+      // 用户类型不对,抛出异常
+      throw new CustomizationException(ExceptionEnum.USER_TYPE_ERROR);
     }
     // 未根据账号信息找到用户数据,抛出异常
     if (null == userInfo) {
@@ -79,4 +92,42 @@ public class LoginController {
     return ResponseFormat.success();
   }
 
+  @ApiOperation("修改密码")
+  @PostMapping("/pwd")
+  public Object passwordUpdate(@RequestBody @Valid PasswordUpdateDTO data) {
+    String type = data.getType();
+    /** 加密后的密码 */
+    String cpwd = BcryptUtil.encryptPassword(data.getPassword());
+    if (null == cpwd) {
+      throw new CustomizationException(ExceptionEnum.SERVICE_FAULT);
+    }
+    if (adminLoginType.equals(type)) {
+      Admin adminData = new Admin();
+      adminData.setId(data.getId());
+      adminData.setPassword(cpwd);
+      this.adminService.updateById(adminData);
+    } else if (csLoginType.equals(type)) {
+      // 客服人员修改密码
+      Customer customerData = new Customer();
+      customerData.setId(data.getId());
+      customerData.setPassword(cpwd);
+      this.customerService.updateById(customerData);
+    } else {
+      // 用户类型不对,抛出异常
+      throw new CustomizationException(ExceptionEnum.USER_TYPE_ERROR);
+    }
+
+    return ResponseFormat.success();
+  }
+
+  /**
+   * 根据token,查询出用户的权限,目录
+   * @return
+   */
+  public Object tokenView() {
+    Map userMap = JwtUtil.getDetails(null);
+    // TODO: 找出用户,再找到角色,转换成列表
+    
+    return ResponseFormat.success();
+  }
 }

+ 74 - 13
src/main/java/com/free/controller/system/AdminController.java

@@ -1,24 +1,31 @@
 package com.free.controller.system;
 
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
 import javax.validation.Valid;
 
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.cglib.beans.BeanCopier;
-import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
 import org.springframework.web.bind.annotation.RestController;
 
 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.free.dto.system.admin.AdminCreateDTO;
 import com.free.entity.system.Admin;
 import com.free.frame.CustomizationException;
 import com.free.frame.ExceptionEnum;
 import com.free.frame.ResponseFormat;
 import com.free.service.system.AdminService;
-import com.free.utils.BaseController;
 import com.free.utils.BcryptUtil;
 
 import io.swagger.annotations.Api;
@@ -27,19 +34,18 @@ import io.swagger.annotations.ApiOperation;
 @RestController
 @RequestMapping("/admin")
 @Api(tags = "管理员用户")
-public class AdminController extends BaseController<AdminService> {
+public class AdminController {
   @Autowired
-  private AdminService adminService;
+  private AdminService service;
 
   /** 创建数据 */
   @ApiOperation("创建数据")
-  @PostMapping("/")
+  @PostMapping("")
   public Object save(@RequestBody @Valid AdminCreateDTO data) {
-    System.out.println(data);
     // 检查账号是否重复
     QueryWrapper<Admin> qw = new QueryWrapper<Admin>();
     qw.eq("account", data.getAccount());
-    Long num = this.adminService.count(qw);
+    Long num = this.service.count(qw);
     // 重复抛出异常
     if (num > 0) {
       throw new CustomizationException(ExceptionEnum.ACCOUNT_IS_EXIST);
@@ -52,27 +58,82 @@ public class AdminController extends BaseController<AdminService> {
     if (null != ep) {
       adminData.setPassword(ep);
     }
-    this.adminService.save(adminData);
+    this.service.save(adminData);
     // 再将数据查出来返回
-    Admin returnData = this.adminService.getById(adminData.getId());
+    Admin returnData = this.service.getById(adminData.getId());
     return ResponseFormat.success(returnData);
   }
 
-   /** 修改数据 */
+  /** 修改数据 */
   @ApiOperation("修改数据")
   @PostMapping("/{id}")
   public Object update(@PathVariable long id, @RequestBody Admin data) {
     QueryWrapper<Admin> qw = new QueryWrapper<Admin>();
     qw.eq("id", id);
-    Long num = this.adminService.count(qw);
+    Long num = this.service.count(qw);
     if (num <= 0)
       throw new CustomizationException(ExceptionEnum.NOT_FOUND);
     data.setId(id);
     // 密码不在修改范围内,清空
     data.setPassword(null);
-    this.adminService.updateById(data);
-    Object newData = this.adminService.getById(id);
+    this.service.updateById(data);
+    Object newData = this.service.getById(id);
+    return ResponseFormat.success(newData);
+  }
+
+  /** 列表查询 */
+  @ApiOperation("查询数据列表")
+  @SuppressWarnings({ "unchecked" })
+  @GetMapping()
+  public Object list(@RequestParam Map<String, Object> allParams) {
+    Long skip = null, limit = null;
+    Map map = new HashMap();
+    QueryWrapper qw = new QueryWrapper<>();
+    /** 参数处理处理 */
+    for (String key : allParams.keySet()) {
+      Object value = allParams.get(key);
+      if (key.equals("skip")) {
+        skip = Long.valueOf(String.valueOf(value));
+      } else if (key.equals("limit")) {
+        limit = Long.valueOf(String.valueOf(value));
+      } else {
+        // 其他为查询条件
+        qw.eq(key, value);
+      }
+    }
+    /** 分页处理 */
+    if (null != skip && null != limit) {
+      IPage page = new Page<>(skip, limit);
+      IPage pageResult = service.page(page, qw);
+      List data = pageResult.getRecords();
+      long total = pageResult.getTotal();
+      map.put("data", data);
+      map.put("total", total);
+    } else {
+      List list = service.list(qw);
+      map.put("data", list);
+    }
+    return ResponseFormat.success(map);
+  }
+
+  /** 根据id查询 */
+  @ApiOperation("查询数据")
+  @GetMapping("/{id}")
+  public Object fetch(@PathVariable long id) {
+    Object newData = service.getById(id);
     return ResponseFormat.success(newData);
   }
 
+  /** 根据id删除数据 */
+  @ApiOperation("删除数据")
+  @DeleteMapping("/{id}")
+  public Object delete(@PathVariable long id) {
+    QueryWrapper<Admin> qw = new QueryWrapper<>();
+    qw.eq("id", id);
+    Long num = service.count(qw);
+    if (num <= 0)
+      throw new CustomizationException(ExceptionEnum.NOT_FOUND);
+    service.removeById(id);
+    return ResponseFormat.success();
+  }
 }

+ 0 - 16
src/main/java/com/free/controller/system/AdminRoleController.java

@@ -1,16 +0,0 @@
-package com.free.controller.system;
-
-import org.springframework.web.bind.annotation.RequestMapping;
-import org.springframework.web.bind.annotation.RestController;
-
-import com.free.service.system.AdminRoleService;
-import com.free.utils.BaseController;
-
-import io.swagger.annotations.Api;
-
-@RestController
-@RequestMapping("/adminRole")
-@Api(tags = "管理员用户-角色")
-public class AdminRoleController extends BaseController<AdminRoleService>{
-  /** 单独一个函数处理即可,1个用户1条数据,数据转换成json */
-}

+ 139 - 0
src/main/java/com/free/controller/system/CustomerController.java

@@ -0,0 +1,139 @@
+package com.free.controller.system;
+
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+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.free.dto.system.customer.CustomerCreateDTO;
+import com.free.entity.system.Customer;
+import com.free.frame.CustomizationException;
+import com.free.frame.ExceptionEnum;
+import com.free.frame.ResponseFormat;
+import com.free.service.system.CustomerService;
+import com.free.utils.BcryptUtil;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@RestController
+@RequestMapping("/customer")
+@Api(tags = "客服人员")
+public class CustomerController {
+  @Autowired
+  private CustomerService service;
+
+  /** 创建数据 */
+  @ApiOperation("创建数据")
+  @PostMapping("")
+  public Object save(@RequestBody @Valid CustomerCreateDTO data) {
+    // 检查账号是否重复
+    QueryWrapper<Customer> qw = new QueryWrapper<Customer>();
+    qw.eq("account", data.getAccount());
+    Long num = this.service.count(qw);
+    // 重复抛出异常
+    if (num > 0) {
+      throw new CustomizationException(ExceptionEnum.ACCOUNT_IS_EXIST);
+    }
+    BeanCopier copier = BeanCopier.create(CustomerCreateDTO.class, Customer.class, false);
+    Customer insertData = new Customer();
+    copier.copy(data, insertData, null);
+    // 密码加密
+    String ep = BcryptUtil.encryptPassword(insertData.getPassword());
+    if (null != ep) {
+      insertData.setPassword(ep);
+    }
+    this.service.save(insertData);
+    // 再将数据查出来返回
+    Customer returnData = this.service.getById(insertData.getId());
+    return ResponseFormat.success(returnData);
+  }
+
+  /** 修改数据 */
+  @ApiOperation("修改数据")
+  @PostMapping("/{id}")
+  public Object update(@PathVariable long id, @RequestBody Customer data) {
+    QueryWrapper<Customer> qw = new QueryWrapper<Customer>();
+    qw.eq("id", id);
+    Long num = this.service.count(qw);
+    if (num <= 0)
+      throw new CustomizationException(ExceptionEnum.NOT_FOUND);
+    data.setId(id);
+    // 密码不在修改范围内,清空
+    data.setPassword(null);
+    this.service.updateById(data);
+    Object newData = this.service.getById(id);
+    return ResponseFormat.success(newData);
+  }
+
+  /** 列表查询 */
+  @ApiOperation("查询数据列表")
+  @SuppressWarnings({ "unchecked" })
+  @GetMapping()
+  public Object list(@RequestParam Map<String, Object> allParams) {
+    Long skip = null, limit = null;
+    Map map = new HashMap();
+    QueryWrapper qw = new QueryWrapper<>();
+    /** 参数处理处理 */
+    for (String key : allParams.keySet()) {
+      Object value = allParams.get(key);
+      if (key.equals("skip")) {
+        skip = Long.valueOf(String.valueOf(value));
+      } else if (key.equals("limit")) {
+        limit = Long.valueOf(String.valueOf(value));
+      } else {
+        // 其他为查询条件
+        qw.eq(key, value);
+      }
+    }
+    /** 分页处理 */
+    if (null != skip && null != limit) {
+      IPage page = new Page<>(skip, limit);
+      IPage pageResult = service.page(page, qw);
+      List data = pageResult.getRecords();
+      long total = pageResult.getTotal();
+      map.put("data", data);
+      map.put("total", total);
+    } else {
+      List list = service.list(qw);
+      map.put("data", list);
+    }
+    return ResponseFormat.success(map);
+  }
+
+  /** 根据id查询 */
+  @ApiOperation("查询数据")
+  @GetMapping("/{id}")
+  public Object fetch(@PathVariable long id) {
+    Object newData = service.getById(id);
+    return ResponseFormat.success(newData);
+  }
+
+  /** 根据id删除数据 */
+  @ApiOperation("删除数据")
+  @DeleteMapping("/{id}")
+  public Object delete(@PathVariable long id) {
+    QueryWrapper<Customer> qw = new QueryWrapper<>();
+    qw.eq("id", id);
+    Long num = service.count(qw);
+    if (num <= 0)
+      throw new CustomizationException(ExceptionEnum.NOT_FOUND);
+    service.removeById(id);
+    return ResponseFormat.success();
+  }
+}

+ 150 - 0
src/main/java/com/free/controller/system/MenusController.java

@@ -0,0 +1,150 @@
+package com.free.controller.system;
+
+import java.util.List;
+import java.util.Map;
+
+import javax.validation.Valid;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.beans.BeanCopier;
+import org.springframework.web.bind.annotation.DeleteMapping;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.type.CollectionType;
+import com.free.annotation.PassToken;
+import com.free.dto.system.menus.MenusCreateDTO;
+import com.free.entity.system.Menus;
+import com.free.frame.CustomizationException;
+import com.free.frame.ExceptionEnum;
+import com.free.frame.ResponseFormat;
+import com.free.mapper.system.MenusMapper;
+import com.free.service.system.MenusService;
+import com.free.utils.Utils;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@RestController
+@RequestMapping("/menus")
+@Api(tags = "目录")
+public class MenusController {
+  @Autowired
+  private MenusService service;
+
+  @Autowired
+  private MenusMapper menusMapper;
+
+  /** 创建数据 */
+  @ApiOperation("创建数据")
+  @PostMapping("")
+  public Object save(@RequestBody @Valid MenusCreateDTO data) {
+    BeanCopier copier = BeanCopier.create(MenusCreateDTO.class, Menus.class, false);
+    Menus insertData = new Menus();
+    copier.copy(data, insertData, null);
+    this.service.save(insertData);
+    QueryWrapper qw = new QueryWrapper<>();
+    qw.eq("id", insertData.getId());
+    Map returnData = this.service.getMap(qw);
+    return ResponseFormat.success(returnData);
+  }
+
+  /** 修改数据 */
+  @ApiOperation("修改数据")
+  @PostMapping("/{id}")
+  public Object update(@PathVariable long id, @RequestBody Menus data) {
+    QueryWrapper<Menus> qw = new QueryWrapper<>();
+    qw.eq("id", id);
+    Long num = this.service.count(qw);
+    if (num <= 0)
+      throw new CustomizationException(ExceptionEnum.NOT_FOUND);
+    data.setId(id);
+    this.service.updateById(data);
+    Object newData = this.service.getById(id);
+    return ResponseFormat.success(newData);
+  }
+
+  /** 递归查询 */
+  @ApiOperation("目录递归查询")
+  @GetMapping()
+  public Object list() {
+    List returnData = this.service.recursionMenus();
+    return ResponseFormat.success(returnData);
+  }
+
+  /** 根据id查询 */
+  @ApiOperation("查询数据")
+  @GetMapping("/{id}")
+  public Object fetch(@PathVariable long id) {
+    Object newData = service.getById(id);
+    return ResponseFormat.success(newData);
+  }
+
+  /** 根据id删除数据 */
+  @ApiOperation("删除数据")
+  @DeleteMapping("/{id}")
+  public Object delete(@PathVariable long id) {
+    QueryWrapper qw = new QueryWrapper<>();
+    qw.eq("id", id);
+    Long num = service.count(qw);
+    if (num <= 0)
+      throw new CustomizationException(ExceptionEnum.NOT_FOUND);
+    // TODO: 递归删除
+    service.removeById(id);
+    return ResponseFormat.success();
+  }
+
+  @PassToken
+  @ApiOperation("初始化目录")
+  @PostMapping("/initData")
+  public Object initData() throws JsonProcessingException {
+    String filePath = "db/menus.json";
+    ObjectMapper mapper = new ObjectMapper();
+    String str = Utils.readJsonFile(filePath);
+    CollectionType javaType = mapper.getTypeFactory().constructCollectionType(List.class, Map.class);
+    List<Map> list = mapper.readValue(str, javaType);
+    // 整理数据
+    menusMapper.truncate();
+    this.toInsertMenusData(list, null);
+    return ResponseFormat.success(list);
+  }
+
+  private void toInsertMenusData(List<Map> list, Long parent_id) {
+    ObjectMapper mapper = new ObjectMapper();
+    for (int i = 0; i < list.size(); i++) {
+      Map m = list.get(i);
+      // 获取children,然后把map里的children删了,要不影响之后转换成Menus
+      List<Map> children = (List<Map>) m.get("children");
+      m.remove("children");
+      // 获取排序,没有顺序就填充
+      Integer on = (Integer) m.get("order_num");
+      Long order_num = null;
+      if (null == on) {
+        order_num = i + 1L;
+      } else {
+        order_num = Long.valueOf(on);
+      }
+      // 如果有parent_id,说明是子目录,需要加上
+      m.put("parent_id", parent_id);
+      // 转船成menus对象
+      Menus menuData = mapper.convertValue(m, Menus.class);
+      menuData.setOrder_num(order_num);
+      // 创建数据,并获得当前id
+      this.service.save(menuData);
+      if (null == children) {
+        continue;
+      }
+      // 处理children,获取parent_id
+      Long children_parent_id = menuData.getId();
+      toInsertMenusData(children, children_parent_id);
+    }
+  }
+
+}

+ 37 - 28
src/main/java/com/free/utils/BaseController.java

@@ -1,33 +1,50 @@
-package com.free.utils;
+package com.free.controller.system;
 
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
+import javax.validation.Valid;
+
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.DeleteMapping;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
 import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
 
 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.free.entity.system.Admin;
+import com.free.entity.system.Role;
 import com.free.frame.CustomizationException;
 import com.free.frame.ExceptionEnum;
 import com.free.frame.ResponseFormat;
+import com.free.service.system.RoleService;
 
+import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-
-@SuppressWarnings("rawtypes")
-public class BaseController<K extends ServiceImpl> {
+@RestController
+@RequestMapping("/role")
+@Api(tags = "角色")
+public class RoleController {
   @Autowired
-  private K service;
+  private RoleService service;
+
+  /** 创建数据 */
+  @ApiOperation("创建数据")
+  @PostMapping("")
+  public Object save(@RequestBody @Valid Role data) {
+    this.service.save(data);
+    QueryWrapper qw = new QueryWrapper<>();
+    qw.eq("id", data.getId());
+    Map returnData = this.service.getMap(qw);
+    return ResponseFormat.success(returnData);
+  }
 
   /** 列表查询 */
   @ApiOperation("查询数据列表")
@@ -63,41 +80,32 @@ public class BaseController<K extends ServiceImpl> {
     }
     return ResponseFormat.success(map);
   }
-  /** 根据id查询 */
-  @ApiOperation("查询数据")
-  @GetMapping("/{id}")
-  public Object fetch(@PathVariable long id) {
-    Object newData = service.getById(id);
-    return ResponseFormat.success(newData);
-  }
-
-  /** 创建数据 */
-  @ApiOperation("创建数据")
-  @SuppressWarnings("unchecked")
-  // @PostMapping()
-  public Object save(@RequestBody Admin data) {
-    boolean result = service.save(data);
-    return ResponseFormat.success(result);
-  }
 
   /** 修改数据 */
   @ApiOperation("修改数据")
-  @SuppressWarnings({ "unchecked" })
   @PostMapping("/{id}")
-  public Object update(@PathVariable long id, @RequestBody Admin data) {
+  public Object update(@PathVariable long id, @RequestBody Role data) {
     QueryWrapper qw = new QueryWrapper<>();
     qw.eq("id", id);
-    Long num = service.count(qw);
+    Long num = this.service.count(qw);
     if (num <= 0)
       throw new CustomizationException(ExceptionEnum.NOT_FOUND);
-    service.updateById(data);
+    data.setId(id);
+    this.service.updateById(data);
+    Object newData = this.service.getById(id);
+    return ResponseFormat.success(newData);
+  }
+
+  /** 根据id查询 */
+  @ApiOperation("查询数据")
+  @GetMapping("/{id}")
+  public Object fetch(@PathVariable long id) {
     Object newData = service.getById(id);
     return ResponseFormat.success(newData);
   }
 
   /** 根据id删除数据 */
   @ApiOperation("删除数据")
-  @SuppressWarnings({ "unchecked" })
   @DeleteMapping("/{id}")
   public Object delete(@PathVariable long id) {
     QueryWrapper qw = new QueryWrapper<>();
@@ -105,6 +113,7 @@ public class BaseController<K extends ServiceImpl> {
     Long num = service.count(qw);
     if (num <= 0)
       throw new CustomizationException(ExceptionEnum.NOT_FOUND);
+    // TODO: 递归删除
     service.removeById(id);
     return ResponseFormat.success();
   }

+ 18 - 0
src/main/java/com/free/dto/PasswordUpdateDTO.java

@@ -0,0 +1,18 @@
+package com.free.dto;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotNull;
+
+import lombok.Data;
+
+@Data
+public class PasswordUpdateDTO {
+  @NotNull(message = "缺少用户信息")
+  private Long id;
+
+  @NotBlank(message = "请填写新密码")
+  private String password;
+
+  @NotBlank(message = "缺少用户类型")
+  private String type;
+}

+ 16 - 0
src/main/java/com/free/dto/system/customer/CustomerCreateDTO.java

@@ -0,0 +1,16 @@
+package com.free.dto.system.customer;
+
+import javax.validation.constraints.NotBlank;
+
+import lombok.Data;
+
+@Data
+public class CustomerCreateDTO {
+  @NotBlank(message = "请填写昵称")
+  private String nick_name;
+  @NotBlank(message = "请填写账号")
+  private String account;
+  @NotBlank(message = "请填写密码")
+  private String password;
+  private String role;
+}

+ 26 - 0
src/main/java/com/free/dto/system/menus/MenusCreateDTO.java

@@ -0,0 +1,26 @@
+package com.free.dto.system.menus;
+
+import javax.validation.constraints.NotBlank;
+
+import lombok.Data;
+
+@Data
+public class MenusCreateDTO {
+  @NotBlank(message = "请填写目录名称")
+  private String name;
+
+  private String component;
+
+  @NotBlank(message = "请填写路由名称")
+  private String route_name;
+
+  private String path;
+
+  @NotBlank(message = "请填写目录类型")
+  private String type;
+
+  private Long parent_id;
+  
+  private Long order_num;
+
+}

+ 0 - 26
src/main/java/com/free/entity/system/AdminRole.java

@@ -1,26 +0,0 @@
-package com.free.entity.system;
-
-import com.baomidou.mybatisplus.annotation.TableField;
-import com.baomidou.mybatisplus.annotation.TableName;
-import com.free.utils.BaseEntity;
-import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
-import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
-
-import io.swagger.annotations.ApiModel;
-import lombok.Data;
-import lombok.EqualsAndHashCode;
-
-@Data
-@EqualsAndHashCode(callSuper = false)
-@Table(name = "adminRole")
-@TableName(value = "adminRole")
-@ApiModel("管理员-角色")
-public class AdminRole extends BaseEntity{
-  @Column(comment = "所属用户id")
-  @TableField(value = "uid")
-  private Long uid;
-
-  @Column(comment = "角色id")
-  @TableField(value = "rid")
-  private Long rid;
-}

+ 46 - 0
src/main/java/com/free/entity/system/Customer.java

@@ -0,0 +1,46 @@
+package com.free.entity.system;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.free.utils.BaseEntity;
+import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
+import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
+import com.gitee.sunchenbin.mybatis.actable.annotation.Unique;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Table(name = "customer")
+@TableName(value = "customer")
+@ApiModel("客服人员")
+public class Customer extends BaseEntity {
+  @Column(comment = "客服人员名称")
+  @TableField(value = "nick_name")
+  @ApiModelProperty("客服人员名称")
+  private String nick_name;
+
+  @Column(comment = "账号")
+  @Unique
+  @TableField(value = "account")
+  @ApiModelProperty("账号")
+  private String account;
+
+  @Column(comment = "密码")
+  @TableField(value = "password", select = false)
+  @ApiModelProperty("密码")
+  private String password;
+
+  @Column(comment = "角色")
+  @TableField(value = "role")
+  @ApiModelProperty("角色")
+  private String role;
+
+  @Column(comment = "是否使用", defaultValue = "0")
+  @TableField(value = "is_use")
+  @ApiModelProperty("是否使用")
+  private String is_use;
+}

+ 75 - 0
src/main/java/com/free/entity/system/Menus.java

@@ -0,0 +1,75 @@
+package com.free.entity.system;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.free.utils.BaseEntity;
+import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
+import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Table(name = "menus")
+@TableName(value = "menus")
+@ApiModel("管理端目录表")
+public class Menus extends BaseEntity{
+  
+  @Column(comment = "名称")
+  @TableField(value = "name")
+  @ApiModelProperty("名称")
+  private String name;
+
+  @Column(comment = "组件")
+  @TableField(value = "component")
+  @ApiModelProperty("组件")
+  private String component;
+
+  @Column(comment = "路由名称")
+  @TableField(value = "route_name")
+  @ApiModelProperty("路由名称")
+  private String route_name;
+  
+  @Column(comment = "父级id")
+  @TableField(value = "parent_id")
+  @ApiModelProperty("父级id")
+  private Long parent_id;
+
+  @Column(comment = "显示顺序")
+  @TableField(value = "order_num")
+  @ApiModelProperty("显示顺序")
+  private Long order_num;
+
+  @Column(comment = "路由")
+  @TableField(value = "path")
+  @ApiModelProperty("路由")
+  private String path;
+
+  @Column(comment = "类型: 0-目录;1-页面")
+  @TableField(value = "type")
+  @ApiModelProperty("类型")
+  private String type;
+
+  @Column(comment = "图标")
+  @TableField(value = "icon")
+  @ApiModelProperty("图标")
+  private String icon;
+
+  @Column(comment = "是否默认", defaultValue = "1")
+  @TableField(value = "is_default")
+  @ApiModelProperty("是否默认")
+  private String is_default;
+
+  @Column(comment = "是否使用", defaultValue = "0")
+  @TableField(value = "is_use")
+  @ApiModelProperty("是否使用")
+  private String is_use;
+
+  @Column(comment = "备注")
+  @TableField(value = "remark")
+  @ApiModelProperty("备注")
+  private String remark;
+}

+ 44 - 0
src/main/java/com/free/entity/system/Role.java

@@ -0,0 +1,44 @@
+package com.free.entity.system;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.free.utils.BaseEntity;
+import com.gitee.sunchenbin.mybatis.actable.annotation.Column;
+import com.gitee.sunchenbin.mybatis.actable.annotation.Table;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Table(name = "role")
+@TableName(value = "role")
+@ApiModel("角色")
+public class Role extends BaseEntity {
+  @Column(comment = "角色名称")
+  @TableField(value = "name")
+  @ApiModelProperty("角色名称")
+  private String name;
+
+  @Column(comment = "角色目录")
+  @TableField(value = "menu")
+  @ApiModelProperty("角色目录")
+  private String menu;
+
+  @Column(comment = "简介")
+  @TableField(value = "brief")
+  @ApiModelProperty("简介")
+  private String brief;
+
+  @Column(comment = "是否使用", defaultValue = "0")
+  @TableField(value = "is_use")
+  @ApiModelProperty("是否使用")
+  private String is_use;
+
+  @Column(comment = "是否是默认角色", defaultValue = "1")
+  @TableField(value = "is_default")
+  @ApiModelProperty("是否是默认角色")
+  private String is_default;
+}

+ 2 - 1
src/main/java/com/free/frame/ExceptionEnum.java

@@ -11,9 +11,10 @@ public enum ExceptionEnum {
   PASSWORD_ERROR("4012", "密码错误"),
   TOKEN_NOT_FOUND("4013", "未找到登录信息"),
   TOKEN_INVALID("4014", "登录已超时,请重新登录"),
-  TOKEN_ERROR("4015", "该账号已在其他地点登录,请重新登录"),
+  TOKEN_ERROR("4015", "该用户已在其他地点登录,请重新登录"),
   NO_LOGIN_RECORD("4016", "未找到登录信息,请重新登录"),
   ACCOUNT_IS_LOGOUT("4017","该用户已登出,如要使用请重新登录"),
+  USER_TYPE_ERROR("4018","用户类型错误"),
   // 数据操作异常定义
   NOT_FOUND("404", "数据不存在或已删除!");
 

+ 3 - 3
src/main/java/com/free/mapper/system/AdminRoleMapper.java

@@ -3,9 +3,9 @@ package com.free.mapper.system;
 import org.apache.ibatis.annotations.Mapper;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.free.entity.system.AdminRole;
+import com.free.entity.system.Customer;
 
 @Mapper
-public interface AdminRoleMapper extends BaseMapper<AdminRole> {
-
+public interface CustomerMapper extends BaseMapper<Customer>{
+  
 }

+ 13 - 0
src/main/java/com/free/mapper/system/MenusMapper.java

@@ -0,0 +1,13 @@
+package com.free.mapper.system;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Update;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.free.entity.system.Menus;
+
+@Mapper
+public interface MenusMapper extends BaseMapper<Menus> {
+  @Update("truncate table menus")
+  void truncate();
+}

+ 11 - 0
src/main/java/com/free/mapper/system/RoleMapper.java

@@ -0,0 +1,11 @@
+package com.free.mapper.system;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.free.entity.system.Role;
+
+@Mapper
+public interface RoleMapper extends BaseMapper<Role>{
+  
+}

+ 0 - 12
src/main/java/com/free/service/system/AdminRoleService.java

@@ -1,12 +0,0 @@
-package com.free.service.system;
-
-import org.springframework.stereotype.Service;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.free.entity.system.AdminRole;
-import com.free.mapper.system.AdminRoleMapper;
-
-@Service
-public class AdminRoleService extends ServiceImpl<AdminRoleMapper, AdminRole> {
-
-}

+ 12 - 0
src/main/java/com/free/service/system/CustomerService.java

@@ -0,0 +1,12 @@
+package com.free.service.system;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.free.entity.system.Customer;
+import com.free.mapper.system.CustomerMapper;
+
+@Service
+public class CustomerService extends ServiceImpl<CustomerMapper, Customer> {
+
+}

+ 87 - 0
src/main/java/com/free/service/system/MenusService.java

@@ -0,0 +1,87 @@
+package com.free.service.system;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.free.entity.system.Menus;
+import com.free.mapper.system.MenusMapper;
+import com.free.utils.Utils;
+
+@Service
+public class MenusService extends ServiceImpl<MenusMapper, Menus> {
+
+  /**
+   * 递归查询所有菜单
+   * 
+   * @return
+   */
+  public List recursionMenus() {
+    List<Menus> list = this.list();
+    // 转换成Map-List,因为之后要增加children属性.Menus不能直接加
+    List<Map<String, Object>> allMapList = new ArrayList<>();
+    for (Menus m : list) {
+      Map<String, Object> midMap = Utils.objectToMap(m);
+      allMapList.add(midMap);
+    }
+    // List<Map<String, Object>> firstLevelList = new ArrayList<>();
+    // 1.取出第一层级,随后开始递归
+    // for (Map<String, Object> m : allMapList) {
+    // Long parent_id = (Long) m.get("parent_id");
+    // if (null == parent_id) {
+    // // 没有parent_id的为第一层级;
+    // firstLevelList.add(m);
+    // }
+    // }
+    List<Map<String, Object>> firstLevelList = allMapList.stream().filter(f -> null == f.get("parent_id"))
+        .collect(Collectors.toList());
+
+    List<Map<String, Object>> returnList = this.treeMenu(firstLevelList, allMapList);
+    return returnList;
+  }
+
+  /**
+   * 递归,第一层级开始,递归找子目录
+   * 
+   * @param list    第一层级列表
+   * @param allList 所有目录
+   * @return
+   */
+  private List treeMenu(List<Map<String, Object>> list, List<Map<String, Object>> allList) {
+    for (Map<String, Object> m : list) {
+      // 取id,找parent_id 与其一致的数据
+      Long id = (Long) m.get("id");
+      String name = (String) m.get("name");
+      List<Map<String, Object>> children = new ArrayList<>();
+      // 找children
+      for (Map<String, Object> am : allList) {
+        Object value = am.get("parent_id");
+        if (null == value) {
+          continue;
+        }
+        Long parent_id = Long.valueOf(String.valueOf(value));
+        if (parent_id == id) {
+          // 为子目录,放入children中
+          am.put("parent_name", name);
+          children.add(am);
+        }
+      }
+      // children中没有数据,直接跳过
+      System.out.println("children size" + children.size());
+      if (children.size() <= 0) {
+        continue;
+      }
+      // children中有数据,需要进入children中找子目录
+      children = this.treeMenu(children, allList);
+      m.put("children", children);
+    }
+    return list;
+  }
+
+}

+ 12 - 0
src/main/java/com/free/service/system/RoleService.java

@@ -0,0 +1,12 @@
+package com.free.service.system;
+
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.free.entity.system.Role;
+import com.free.mapper.system.RoleMapper;
+
+@Service
+public class RoleService extends ServiceImpl<RoleMapper, Role>{
+  
+}

+ 9 - 10
src/main/java/com/free/utils/JwtUtil.java

@@ -5,6 +5,7 @@ import com.auth0.jwt.algorithms.Algorithm;
 import com.auth0.jwt.interfaces.Claim;
 import com.auth0.jwt.interfaces.DecodedJWT;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.free.entity.system.LoginRecord;
 import com.free.frame.CustomizationException;
 import com.free.frame.ExceptionEnum;
@@ -103,7 +104,7 @@ public class JwtUtil {
     }
     // token不一致,不需要处理
     String dbToken = record.getToken();
-    if (null==dbToken || !dbToken.equals(token)) {
+    if (null == dbToken || !dbToken.equals(token)) {
       return;
     }
     // token置空
@@ -181,6 +182,7 @@ public class JwtUtil {
       lr.setId(histroy.getId());
       lr.setLast_ip(ip);
       lr.setLast_time(last_time);
+      lr.setToken(token);
       jwtUtil.lrs.updateById(lr);
     }
   }
@@ -192,13 +194,7 @@ public class JwtUtil {
    * @return 是否正确
    */
   public static void verify(String token) {
-    try {
-      // jwt先解密,如果解不开,那就不用往后继续查时间的问题了
-      JWT.require(Algorithm.HMAC256(SECRET)).build().verify(token);
-    } catch (Exception e) {
-      throw new CustomizationException(ExceptionEnum.TOKEN_ERROR);
-    }
-    // 再解开token,查看数据
+    // 解开token,查看数据
     Map<String, Object> map = getDetails(token);
     Long user_id = (Long) map.get("id");
     String type = (String) map.get("type");
@@ -232,6 +228,9 @@ public class JwtUtil {
    * @return token中包含的名称
    */
   public static Map<String, Object> getDetails(String token) {
+    if (null == token) {
+      token = getToken();
+    }
     try {
       DecodedJWT jwt = JWT.decode(token);
       Map<String, Claim> map = jwt.getClaims();
@@ -260,11 +259,11 @@ public class JwtUtil {
   public static String getToken() {
     HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
     String tokenHeader = request.getHeader(TOKEN_HEADER);
-    if (tokenHeader == null) {
+    if (StringUtils.isBlank(tokenHeader)) {
       throw new CustomizationException(ExceptionEnum.TOKEN_NOT_FOUND);
     }
     String token = tokenHeader.replace(JwtUtil.TOKEN_PREFIX, "");
-    if (token == null) {
+    if (StringUtils.isBlank(tokenHeader)) {
       throw new CustomizationException(ExceptionEnum.TOKEN_NOT_FOUND);
     }
     return token;

+ 83 - 0
src/main/java/com/free/utils/Utils.java

@@ -0,0 +1,83 @@
+package com.free.utils;
+
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FileReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.lang.reflect.Field;
+import java.util.HashMap;
+import java.util.Map;
+
+import org.springframework.util.ResourceUtils;
+
+public class Utils {
+  // 对象转Map
+  public static Map<String, Object> objectToMap(Object object) {
+    Map<String, Object> dataMap = new HashMap<>();
+    Class<?> clazz = object.getClass();
+    for (Field field : clazz.getDeclaredFields()) {
+      try {
+        field.setAccessible(true);
+        dataMap.put(field.getName(), field.get(object));
+      } catch (IllegalAccessException e) {
+        e.printStackTrace();
+      }
+    }
+    // 转换不会讲BaseEntity类中的 id,create_time,update_time转换出来,需要自己处理
+    BaseEntity be = new BaseEntity();
+    Class<?> beClazz = be.getClass();
+    for (Field field : beClazz.getDeclaredFields()) {
+      try {
+        field.setAccessible(true);
+        dataMap.put(field.getName(), field.get(object));
+      } catch (IllegalAccessException e) {
+        e.printStackTrace();
+      }
+    }
+    return dataMap;
+  }
+
+  /**
+   * 读取json文件
+   */
+  public static String readJsonFile(String filePath) {
+    FileReader fileReader = null;
+    Reader reader = null;
+    try {
+      File jsonFile = ResourceUtils.getFile("classpath:" + filePath);
+      fileReader = new FileReader(jsonFile);
+      reader = new InputStreamReader(new FileInputStream(jsonFile), "utf-8");
+      int ch;
+      StringBuffer sb = new StringBuffer();
+      while ((ch = reader.read()) != -1) {
+        sb.append((char) ch);
+      }
+      fileReader.close();
+      reader.close();
+      String jsonStr = sb.toString();
+      return jsonStr;
+    } catch (IOException e) {
+      e.printStackTrace();
+      // logger.error("读取文件报错", e);
+      System.out.println("读取文件报错!" + e);
+    } finally {
+      if (fileReader != null) {
+        try {
+          fileReader.close();
+        } catch (IOException e) {
+          e.printStackTrace();
+        }
+      }
+      if (reader != null) {
+        try {
+          reader.close();
+        } catch (IOException e) {
+          e.printStackTrace();
+        }
+      }
+    }
+    return null;
+  }
+}

+ 20 - 2
src/main/resources/application.yml

@@ -15,7 +15,25 @@ spring:
       matching-strategy: ANT_PATH_MATCHER
   autoconfigure:
     exclude: org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration
-
+  jackson:
+    date-format: yyyy-MM-dd HH:mm:ss
+    time-zone: GMT+8
+    #设置空如何序列化
+    default-property-inclusion: non_null
+    serialization:
+      #格式化输出
+      indent_output: true
+      #忽略无法转换的对象
+      fail_on_empty_beans: false
+    deserialization:
+      #允许对象忽略json中不存在的属性
+      fail_on_unknown_properties: false
+    parser:
+      #允许出现特殊字符和转义符
+      allow_unquoted_control_chars: true
+      #允许出现单引号
+      allow_single_quotes: true
+      
 mybatis:
   table:
     auto: update
@@ -26,7 +44,7 @@ mybatis:
 
 mybatis-plus:
   mapper-locations: classpath*:com/gitee/sunchenbin/mybatis/actable/mapping/*/*.xml
-#  type-aliases-package: com.free.entity
+  #  type-aliases-package: com.free.entity
   configuration:
     map-underscore-to-camel-case: false
     call-setters-on-nulls: true

+ 113 - 0
src/main/resources/db/menus.json

@@ -0,0 +1,113 @@
+[
+  {
+    "name": "首页",
+    "path": "/",
+    "type": "0",
+    "is_default": "0",
+    "is_use": "0",
+    "route_name": "home"
+  },
+  {
+    "name": "系统管理",
+    "path": "/system/index",
+    "type": "0",
+    "is_default": "0",
+    "is_use": "0",
+    "route_name": "system",
+    "children": [
+      {
+        "name": "目录管理",
+        "component": "menus",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "system_menus"
+      },
+      {
+        "name": "字典管理",
+        "component": "dict",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "system_dict"
+      },
+      {
+        "name": "系统功能重置",
+        "component": "system-func",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "system_func"
+      }
+    ]
+  },
+  {
+    "name": "平台设置",
+    "path": "/platform/index",
+    "type": "0",
+    "is_default": "0",
+    "is_use": "0",
+    "route_name": "platform",
+    "children": [
+      {
+        "name": "基础设置",
+        "component": "basic",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "platform_basic"
+      },
+      {
+        "name": "角色管理",
+        "component": "role",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "platform_role"
+      }
+    ]
+  },
+  {
+    "name": "用户管理",
+    "path": "/user/index",
+    "type": "0",
+    "is_default": "0",
+    "is_use": "0",
+    "route_name": "user",
+    "children": [
+      {
+        "name": "管理员用户",
+        "component": "admin",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "user_admin"
+      },
+      {
+        "name": "客服人员",
+        "component": "customer",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "user_customer"
+      },
+      {
+        "name": "使用用户用户",
+        "component": "user",
+        "type": "1",
+        "is_default": "0",
+        "is_use": "0",
+        "route_name": "user_user"
+      }
+    ]
+  },
+  {
+    "name": "个人中心",
+    "order_num": 1000,
+    "path": "/center",
+    "type": "0",
+    "is_default": "0",
+    "is_use": "0",
+    "route_name": "center_index"
+  }
+]