Browse Source

项目启动初始化

lyhzzz 2 years ago
parent
commit
f09b04cde4
27 changed files with 1299 additions and 2 deletions
  1. 166 2
      pom.xml
  2. 26 0
      src/main/java/com/fdkankan/manage_jp/ManageApplication.java
  3. 50 0
      src/main/java/com/fdkankan/manage_jp/common/PageInfo.java
  4. 13 0
      src/main/java/com/fdkankan/manage_jp/common/RedisKeyUtil.java
  5. 23 0
      src/main/java/com/fdkankan/manage_jp/common/RequestBase.java
  6. 87 0
      src/main/java/com/fdkankan/manage_jp/common/ResultCode.java
  7. 72 0
      src/main/java/com/fdkankan/manage_jp/common/ResultData.java
  8. 22 0
      src/main/java/com/fdkankan/manage_jp/config/MybatisPlusPageConfig.java
  9. 133 0
      src/main/java/com/fdkankan/manage_jp/config/SaTokenConfigure.java
  10. 50 0
      src/main/java/com/fdkankan/manage_jp/config/StpInterfaceImpl.java
  11. 26 0
      src/main/java/com/fdkankan/manage_jp/controller/CompanyController.java
  12. 27 0
      src/main/java/com/fdkankan/manage_jp/controller/UserController.java
  13. 120 0
      src/main/java/com/fdkankan/manage_jp/entity/Company.java
  14. 156 0
      src/main/java/com/fdkankan/manage_jp/entity/User.java
  15. 23 0
      src/main/java/com/fdkankan/manage_jp/exception/BusinessException.java
  16. 49 0
      src/main/java/com/fdkankan/manage_jp/exception/GlobalExceptionHandler.java
  17. 98 0
      src/main/java/com/fdkankan/manage_jp/generate/AutoGenerate.java
  18. 18 0
      src/main/java/com/fdkankan/manage_jp/mapper/ICompanyMapper.java
  19. 18 0
      src/main/java/com/fdkankan/manage_jp/mapper/IUserMapper.java
  20. 16 0
      src/main/java/com/fdkankan/manage_jp/service/ICompanyService.java
  21. 16 0
      src/main/java/com/fdkankan/manage_jp/service/IUserService.java
  22. 20 0
      src/main/java/com/fdkankan/manage_jp/service/impl/CompanyServiceImpl.java
  23. 20 0
      src/main/java/com/fdkankan/manage_jp/service/impl/UserServiceImpl.java
  24. 32 0
      src/main/resources/bootstrap-test.yml
  25. 8 0
      src/main/resources/bootstrap.yml
  26. 5 0
      src/main/resources/mapper/manage_jp/CompanyMapper.xml
  27. 5 0
      src/main/resources/mapper/manage_jp/UserMapper.xml

+ 166 - 2
pom.xml

@@ -4,9 +4,173 @@
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
          xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
     <modelVersion>4.0.0</modelVersion>
     <modelVersion>4.0.0</modelVersion>
 
 
-    <groupId>org.example</groupId>
+    <groupId>com.fdkankan.manage_jp</groupId>
     <artifactId>4dkankan-manage-jp</artifactId>
     <artifactId>4dkankan-manage-jp</artifactId>
-    <version>1.0-SNAPSHOT</version>
+    <version>1.1.0</version>
+    <packaging>jar</packaging>
 
 
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>2.3.12.RELEASE</version>
+        <relativePath/>
+    </parent>
+
+    <dependencies>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun-oss</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun-local</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-fyun-s3</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.fdkankan</groupId>
+            <artifactId>4dkankan-utils-redis</artifactId>
+            <version>3.0.0-SNAPSHOT</version>
+        </dependency>
+
+
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>8.0.25</version>
+            <scope>runtime</scope>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <scope>compile</scope>
+            <version>3.4.3.4</version>
+        </dependency>
+
+        <!--mybatis-plus代码生成器-->
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-generator</artifactId>
+            <scope>compile</scope>
+            <version>3.5.1</version>
+        </dependency>
+
+        <!--velocity模板-->
+        <dependency>
+            <groupId>org.apache.velocity</groupId>
+            <artifactId>velocity-engine-core</artifactId>
+            <version>2.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
+            <version>2.2.7.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba.cloud</groupId>
+            <artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
+            <version>2.2.7.RELEASE</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>fastjson</artifactId>
+            <version>1.2.83</version>
+        </dependency>
+
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-validation</artifactId>
+        </dependency>
+
+
+        <!--htt请求工具-->
+        <dependency>
+            <groupId>com.dtflys.forest</groupId>
+            <artifactId>forest-spring-boot-starter</artifactId>
+            <version>1.5.24</version>
+        </dependency>
+
+        <!--    分布式日志追踪-->
+        <dependency>
+            <groupId>com.yomahub</groupId>
+            <artifactId>tlog-web-spring-boot-starter</artifactId>
+            <version>1.3.6</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.alibaba</groupId>
+            <artifactId>easyexcel</artifactId>
+            <version>3.1.0</version>
+        </dependency>
+
+        <!-- Sa-Token 权限认证, 在线文档:http://sa-token.dev33.cn/ -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-spring-boot-starter</artifactId>
+            <version>1.30.0</version>
+        </dependency>
+        <!-- Sa-Token 整合 jwt -->
+        <dependency>
+            <groupId>cn.dev33</groupId>
+            <artifactId>sa-token-jwt</artifactId>
+            <version>1.30.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.sun.mail</groupId>
+            <artifactId>javax.mail</artifactId>
+            <version>1.5.4</version>
+        </dependency>
+    </dependencies>
+
+
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-surefire-plugin</artifactId>
+                <configuration>
+                    <testFailureIgnore>true</testFailureIgnore>
+                </configuration>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>8</source>
+                    <target>8</target>
+                </configuration>
+            </plugin>
+        </plugins>
+
+    </build>
 
 
 </project>
 </project>

+ 26 - 0
src/main/java/com/fdkankan/manage_jp/ManageApplication.java

@@ -0,0 +1,26 @@
+package com.fdkankan.manage_jp;
+
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.CommandLineRunner;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.scheduling.annotation.EnableScheduling;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@SpringBootApplication
+@EnableTransactionManagement//开启事务
+@EnableDiscoveryClient
+@EnableScheduling
+@ComponentScan(basePackages = {"com.fdkankan.*"})
+@MapperScan("com.fdkankan.**.mapper")
+public class ManageApplication {
+
+
+    public static void main(String[] args) {
+        SpringApplication.run(ManageApplication.class, args);
+    }
+
+}

+ 50 - 0
src/main/java/com/fdkankan/manage_jp/common/PageInfo.java

@@ -0,0 +1,50 @@
+package com.fdkankan.manage_jp.common;
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class PageInfo<T> {
+
+    private long pageNum;
+
+    private long pageSize;
+
+    private long total;
+
+    private T list;
+
+    public static PageInfo PageInfo(Page page){
+        return PageInfo.builder()
+            .pageNum(page.getCurrent())
+            .pageSize(page.getSize())
+            .total(page.getTotal())
+            .list(page.getRecords())
+            .build();
+    }
+    public static PageInfo PageInfo(Long currentPage, Long pageSize, Long total, List<?> list){
+        return PageInfo.builder()
+            .pageNum(currentPage)
+            .pageSize(pageSize)
+            .total(total)
+            .list(list)
+            .build();
+    }
+
+
+    public static PageInfo PageInfoEmpty(Integer pageNum,Integer pageSize) {
+        Page<Object> voPage = new Page<>(pageNum,pageSize);
+        voPage.setRecords(new ArrayList<>());
+        voPage.setTotal(0);
+        return PageInfo.PageInfo(voPage);
+    }
+}

+ 13 - 0
src/main/java/com/fdkankan/manage_jp/common/RedisKeyUtil.java

@@ -0,0 +1,13 @@
+package com.fdkankan.manage_jp.common;
+
+public class RedisKeyUtil {
+
+
+    public static final String SCENE_UNUSED_NUMS = "4dkankan:scene:nums";
+    public static final String SCENE_NUMS_LOADING = "4dkankan:scene:nums:loading";
+    public static final String loginNum= "manage:login:userName:%s:ip:%s";
+
+    public static final String loginToken= "manage:login:token:%s";
+
+
+}

+ 23 - 0
src/main/java/com/fdkankan/manage_jp/common/RequestBase.java

@@ -0,0 +1,23 @@
+package com.fdkankan.manage_jp.common;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+@Data
+public class RequestBase implements Serializable {
+
+    private int pageNum = 1;
+
+    private int pageSize = 10;
+
+    private int start;
+
+    private String orderBy = "id";
+
+    /**
+     * DESC-降序
+     * ASC-升序
+     */
+    private String sortBy = "DESC";
+}

+ 87 - 0
src/main/java/com/fdkankan/manage_jp/common/ResultCode.java

@@ -0,0 +1,87 @@
+package com.fdkankan.manage_jp.common;
+
+
+public enum ResultCode  {
+    SYSTEM_ERROR(500, "系统异常"),
+
+    NOT_ROLE(4001, "无此角色"),
+    NOT_PERMISSION(4002, "无此权限"),
+    USER_NOT_EXIST(4003, "用户不存在"),
+    USER_EXIST(4004, "用户已存在"),
+    PASSWORD_ERROR(4005, "账号密码错误,请重新登录!"),
+    USERNAME_ERROR(4006, "该账号已停止使用"),
+    MISSING_REQUIRED_PARAMETERS(4007, "必填项不能为空"),
+    USER_NOT_LOGIN(4008, "用户未登录"),
+
+    VISION_EXIST(50001, "版本号不能重复!"),
+    LOGIN_NUM_MUCH(50003, "频繁登录失败,请五分钟后再次尝试登录!"),
+    UPLOAD_ERROR(50004, "上传失败"),
+    SDK_DEL_ERROR(50005, "删除失败,请先下架在删除"),
+    MAIL_TEMPLATE_ERROR(50006, "邮件发送模板不存在"),
+    COMPANY_DEL_ERROR(50007, "删除失败,请先解绑设备"),
+    UPLOAD_FILE_ERROR(50008, "文件不存在"),
+    V3_SCENE_REBUILD(50009, "V3场景请先升级在重算"),
+    SCENE_NOT_EXIST(50010, "场景不存在"),
+    FILE_NAME_EMPTY(50011, "文件名称为空,请输入文件名称!"),
+    APP_FILE_EMPTY(50012, "应用包文件未上传,请先上传文件!"),
+    VERSION_EMPTY(50013, "version.json 文件未上传,请先上传文件!"),
+    WIFI_NAME_ERROR(50014, "wifi名称格式错误"),
+    WIFI_NAME_REPEAT(50015, "设备wifi名称重复"),
+    WIFI_PRE_NAME_ERROR(50016, "wifi名称前缀错误!"),
+    COMPANY_NAME_NOT_EXIST(50017, "客户名称不存在!"),
+    CAMERA_NOT_EXIST(50018, "相机不存在!"),
+    CAMERA_NOT_IN(50019, "该相机未入库!"),
+    CAMERA_DEL_ERROR(50020, "相机已绑定,请先解绑后删除!"),
+    CAMERA_VERSION_NOT_EXIST(50021, "相机版本不存在"),
+    CAMERA_VERSION_STATUS_ERROR(50022, "相机版本已禁用"),
+    SHIP_NUM_EMPTY(50023, "快递单号为空"),
+    IN_TEMPLATE_EMPTY(50024, "入库模板数据为空"),
+    OUT_TEMPLATE_EMPTY(50025, "出库模板数据为空"),
+    COMPANY_TEMPLATE_EMPTY(50026, "客户关联数据为空"),
+    FILE_TYPE_ERROR(50027, "文件格式校验,需为xlsx文件"),
+    TEMPLATE_TYPE_ERROR(50028, "模板格式错误"),
+    EXCEL_MSG_ERROR(50029, "模板格式错误"),
+    CAMERA_TYPE_ERROR(50030, "相机类型错误"),
+    CAMERA_SPACE_ERROR(50031, "相机容量不足,不能迁移"),
+    CAMERA_TYPE_NOT_ERROR(50032, "必须迁移至相同的类型的相机下面!"),
+    MAIL_SEND_ERROR(50033, "邮件发送失败!"),
+    CAMERA_SN_NOT_EXIST(50034, "sn码不存在!"),
+    DEL_ROLE_ERROR(50035, "该角色已关联用户,不可删除。请先修改相关用户的角色!"),
+    ORDER_SN_ERROR(50036, "订单号不存在"),
+    OLD_PASSWORD_ERROR(50037, "原密码错误"),
+    UPLOAD_YUN_TYPE_ERROR(50038, "上传服务器类型错误,请确认环境上传"),
+    UPDATE_MYSELF_PASSWORD(50039, "只能修改自己的密码!"),
+    INCREMENT_TYPE_EMPTY(50040, "权益类型不存在!"),
+    AGENT_NEW_EMPTY(50041, "代理商不存在!"),
+    SS_NO_COPY(50042, "深时场景暂不支持复制!"),
+    AGENT_NOT_EMPTY(50043, "经销商名称已存在!"),
+    CAMERA_NOT_MOVE(50044, "场景在改相机中,无需迁移!"),
+    SCENE_REBUILD_ERROR(50045, "场景重算失败。。。"),
+    PASSWORD_ERROR_G(50046, "密码格式错误!"),
+    AGENT_U_NOT_EMPTY(50047, "经销商账号已存在!"),
+    INCREMENT_TYPE_ERROR(50048, "权益类型错误!"),
+    DEL_UCENTER_ERROR(50049, "该用户已绑定相机,请先解绑再删除用户。"),
+    DATA_TOO_LONG(50050, "长度超出限制!"),
+
+    ;
+
+    private Integer code;
+    private String message;
+
+   private ResultCode(Integer code, String message) {
+        this.code = code;
+        this.message = message;
+    }
+
+    public Integer code() {
+        return this.code;
+    }
+
+    public String message() {
+        return this.message;
+    }
+
+    public String formatMessage(Object... args) {
+        return String.format(this.message, args);
+    }
+}

+ 72 - 0
src/main/java/com/fdkankan/manage_jp/common/ResultData.java

@@ -0,0 +1,72 @@
+package com.fdkankan.manage_jp.common;
+
+import com.fdkankan.common.constant.ErrorCode;
+import com.fdkankan.common.constant.ServerCode;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+import java.io.Serializable;
+import java.util.Calendar;
+
+@Data
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResultData<T> implements Serializable {
+    /**
+     * 状态码
+     */
+    private int code;
+    /**
+     * 响应信息
+     */
+    private String message;
+    /**
+     * 后端返回结果
+     */
+    private T data;
+    /**
+     * 后端返回结果
+     */
+    private Boolean success;
+    /**
+     * 响应时间戳
+     */
+    private long timestamp = Calendar.getInstance().getTimeInMillis();
+
+    public static ResultData ok() {
+        return ok(null);
+    }
+    public static ResultData ok(Object data) {
+        return ok("成功", data);
+    }
+    public static ResultData ok(String msg, Object data) {
+        return base(ServerCode.SUCCESS.code(), msg, data,true);
+    }
+
+    public static ResultData error(int code, String msg) {
+        return error(code, msg, null); }
+    public static ResultData error(int code, String msg, Object data) {
+        return base(code, msg, data,false);
+    }
+    public static ResultData error(ErrorCode errorCode, Object data) {
+        return base(errorCode.code(), errorCode.message(), data,false);
+    }
+
+    public static ResultData error(ErrorCode errorCode) {
+        return error(errorCode.code(), errorCode.message());
+    }
+    public static ResultData error(ResultCode errorCode) {
+        return error(errorCode.code(), errorCode.message());
+    }
+
+    private static ResultData  base(int code, String msg, Object data,Boolean success) {
+        ResultData rd = new ResultData();
+        rd.setCode(code);
+        rd.setMessage(msg);
+        rd.setData(data);
+        rd.setSuccess(success);
+        return rd;
+    }
+
+}

+ 22 - 0
src/main/java/com/fdkankan/manage_jp/config/MybatisPlusPageConfig.java

@@ -0,0 +1,22 @@
+package com.fdkankan.manage_jp.config;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+
+@Configuration
+public class MybatisPlusPageConfig {
+
+    /**
+     * mybatisPlus配置分页插件
+     */
+    @Bean
+    public MybatisPlusInterceptor mybatisPlusInterceptor() {
+        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
+        return interceptor;
+    }
+}

+ 133 - 0
src/main/java/com/fdkankan/manage_jp/config/SaTokenConfigure.java

@@ -0,0 +1,133 @@
+package com.fdkankan.manage_jp.config;
+
+import cn.dev33.satoken.context.SaHolder;
+import cn.dev33.satoken.exception.NotLoginException;
+import cn.dev33.satoken.exception.NotPermissionException;
+import cn.dev33.satoken.exception.NotRoleException;
+import cn.dev33.satoken.filter.SaServletFilter;
+import cn.dev33.satoken.jwt.StpLogicJwtForMixin;
+import cn.dev33.satoken.router.SaRouter;
+import cn.dev33.satoken.stp.StpLogic;
+import cn.dev33.satoken.stp.StpUtil;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.nacos.common.utils.HttpMethod;
+import com.fdkankan.manage_jp.common.RedisKeyUtil;
+import com.fdkankan.manage_jp.common.ResultCode;
+import com.fdkankan.manage_jp.common.ResultData;
+import com.fdkankan.manage_jp.exception.BusinessException;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import java.util.HashMap;
+
+@Configuration
+@Slf4j
+public class SaTokenConfigure {
+
+    public static HashMap<String, JSONObject> manageMenuUrl = new HashMap<>();
+    public static HashMap<String, JSONObject> manageMenuId = new HashMap<>();
+
+    @Autowired
+    RedisUtil redisUtil;
+    // 注册Sa-Token的拦截器
+    @Bean
+    public SaServletFilter getSaServletFilter() {
+        return new SaServletFilter()
+                // 指定 拦截路由 与 放行路由
+                .addInclude("/**").addExclude("/**/reMyselfPassword","/test/**")
+                // 认证函数: 每次请求执行
+                .setAuth(obj -> {
+                    log.info("---------- 进入Sa-Token全局认证 -----------");
+                    // 登录认证 -- 拦截所有路由,并排除/user/doLogin 用于开放登录
+                    SaRouter.match("/**", "/service/manage/login", r ->checkLogin() );
+                    String menu = redisUtil.get(RedisKey.MANAGE_MENU);
+                    if(StringUtils.isBlank(menu)){
+                        SaRouter.match("/**", r -> StpUtil.checkRole("super-admin"));
+                        return;
+                    }
+                    JSONArray menuArray = JSONObject.parseArray(menu);
+                    for (Object o : menuArray) {
+                        JSONObject jsonObject = (JSONObject)  o;
+                        String url = jsonObject.getString("url");
+                        String perm = jsonObject.getString("perms");
+                        if(StringUtils.isEmpty(url) || StringUtils.isEmpty(perm)){
+                            continue;
+                        }
+                        manageMenuId.put(jsonObject.getString("id"),jsonObject);
+                        manageMenuUrl.put(jsonObject.getString("url"),jsonObject);
+                        if(StpUtil.hasRole("super-admin")){
+                            continue;
+                        }
+                        SaRouter.match(url, r -> StpUtil.checkPermission(perm));
+                    }
+                })
+
+                // 异常处理函数:每次认证函数发生异常时执行此函数
+                .setError(e -> {
+                    System.out.println("---------- 进入Sa-Token异常处理 -----------");
+                    SaHolder.getResponse().setHeader("Content-Type", "application/json;charset=UTF-8");
+                    ResultData aj ;
+                    if (e instanceof NotLoginException) {	// 如果是未登录异常
+                        NotLoginException ee = (NotLoginException) e;
+                        aj = ResultData.error(ResultCode.USER_NOT_LOGIN.code(),ResultCode.USER_NOT_LOGIN.message());
+                    }
+                    else if(e instanceof NotRoleException) {		// 如果是角色异常
+                        NotRoleException ee = (NotRoleException) e;
+                        aj =  ResultData.error(ResultCode.NOT_ROLE.code(),ResultCode.NOT_ROLE.message());
+                    }
+                    else if(e instanceof NotPermissionException) {	// 如果是权限异常
+                        NotPermissionException ee = (NotPermissionException) e;
+                        aj =  ResultData.error(ResultCode.NOT_PERMISSION.code(),ResultCode.NOT_PERMISSION.message());
+                    }
+                    else if(e instanceof BusinessException) {	// 如果是权限异常
+                        BusinessException ee = (BusinessException) e;
+                        aj = ResultData.error(ee.getCode(),ee.getMessage());
+                    }
+                    else {	// 普通异常, 输出:500 + 异常信息
+                        aj = ResultData.error(ResultCode.SYSTEM_ERROR.code(),ResultCode.SYSTEM_ERROR.message());
+                    }
+                    return JSONObject.toJSONString(aj);
+                })
+                // 前置函数:在每次认证函数之前执行
+                .setBeforeAuth(r -> {
+                    // ---------- 设置一些安全响应头 ----------
+                    SaHolder.getResponse()
+                            .setHeader("Access-Control-Allow-Origin", "*")
+                            .setHeader("Access-Control-Allow-Methods", "*")
+                            .setHeader("Access-Control-Max-Age", "3600")
+                            .setHeader("Access-Control-Allow-Headers", "*")
+                            .setServer("4dkk");
+
+                    // 跳过对 OPTIONS 请求的检查,否则这里会鉴权失败,导致 springboot 配置的 addCorsMappings 跨域不执行
+                    if (SaHolder.getRequest().getMethod().equals(HttpMethod.OPTIONS.toString())) {
+                        SaRouter.back();
+                    }
+                });
+
+    }
+
+    private void checkLogin(){
+        if(!redisUtil.hasKey(String.format(RedisKeyUtil.loginToken,StpUtil.getTokenValue()))){
+            throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+        }
+        redisUtil.expire(String.format(RedisKeyUtil.loginToken,StpUtil.getTokenValue()),21600);
+        StpUtil.checkLogin();
+    }
+
+
+    //Sa-Token    整合 jwt
+    //Stateless   无状态模式 纯jwt
+    //Mixin       混入模式 jwt 与 Redis 逻辑混合
+    //Simple      简单模式   Token风格替换
+    @Bean
+    public StpLogic getStpLogicJwt() {
+        return new StpLogicJwtForMixin();
+    }
+}
+

+ 50 - 0
src/main/java/com/fdkankan/manage_jp/config/StpInterfaceImpl.java

@@ -0,0 +1,50 @@
+package com.fdkankan.manage_jp.config;
+
+import cn.dev33.satoken.stp.StpInterface;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.fdkankan.manage_jp.common.ResultCode;
+import com.fdkankan.manage_jp.exception.BusinessException;
+import com.fdkankan.redis.constant.RedisKey;
+import com.fdkankan.redis.util.RedisUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Component
+public class StpInterfaceImpl implements StpInterface {
+
+    @Autowired
+    RedisUtil redisUtil;
+
+    @Override
+    public List<String> getPermissionList(Object loginId, String loginType) {
+        String redisKey = String.format(RedisKey.MANAGE_PERM_USER, loginId);
+        String permString = redisUtil.get(redisKey);
+        if(StringUtils.isBlank(permString)){
+            throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+        }
+        JSONArray jsonArray = JSONObject.parseArray(permString);
+        List<String> permList = jsonArray.toJavaList(String.class)
+                .parallelStream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
+        //从redis 中获取登录用户权限
+        return permList;
+    }
+
+    @Override
+    public List<String> getRoleList(Object loginId, String loginType) {
+        //从redis 中获取登录用户角色
+        String redisKey = String.format(RedisKey.MANAGE_ROLE_USER, loginId);
+        String roleString = redisUtil.get(redisKey);
+        if(StringUtils.isBlank(roleString)){
+            throw new BusinessException(ResultCode.USER_NOT_LOGIN);
+        }
+        JSONArray jsonArray = JSONObject.parseArray(roleString);
+        List<String> roleList = jsonArray.toJavaList(String.class)
+                .parallelStream().filter(StringUtils::isNotBlank).collect(Collectors.toList());
+        return roleList;
+    }
+}

+ 26 - 0
src/main/java/com/fdkankan/manage_jp/controller/CompanyController.java

@@ -0,0 +1,26 @@
+package com.fdkankan.manage_jp.controller;
+
+
+import com.fdkankan.manage_jp.service.ICompanyService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 客户企业logo信息 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@RestController
+@RequestMapping("/manage_jp/company")
+public class CompanyController {
+
+    @Autowired
+    ICompanyService companyService;
+
+}
+

+ 27 - 0
src/main/java/com/fdkankan/manage_jp/controller/UserController.java

@@ -0,0 +1,27 @@
+package com.fdkankan.manage_jp.controller;
+
+
+import com.fdkankan.manage_jp.service.IUserService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ * 用户信息表 前端控制器
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@RestController
+@RequestMapping("/manage_jp/user")
+public class UserController {
+
+    @Autowired
+    IUserService userService;
+
+}
+

+ 120 - 0
src/main/java/com/fdkankan/manage_jp/entity/Company.java

@@ -0,0 +1,120 @@
+package com.fdkankan.manage_jp.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 客户企业logo信息
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@Getter
+@Setter
+@TableName("t_company")
+public class Company implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 公司名称
+     */
+    @TableField("company_name")
+    private String companyName;
+
+    /**
+     * 顶部logo
+     */
+    @TableField("top_logo")
+    private String topLogo;
+
+    /**
+     * 地面logo
+     */
+    @TableField("floor_logo")
+    private String floorLogo;
+
+    /**
+     * 地面点位logo
+     */
+    @TableField("marker_logo")
+    private String markerLogo;
+
+    /**
+     * 二维码logo
+     */
+    @TableField("qr_logo")
+    private String qrLogo;
+
+    /**
+     * 是否显示初始logo,0隐藏,1显示
+     */
+    @TableField("show_logo")
+    private Integer showLogo;
+
+    /**
+     * t_manager表的id
+     */
+    @TableField("sys_user_id")
+    private Long sysUserId;
+
+    /**
+     * 新增的相机是否注册,0否,1删
+     */
+    @TableField("camera_delete")
+    private Integer cameraDelete;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+    @TableField("calculate_flexibility")
+    private Boolean calculateFlexibility;
+
+    /**
+     * 数据同步类型
+     */
+    @TableField("data_sync")
+    private String dataSync;
+
+    @TableField("company_desc")
+    private String companyDesc;
+
+    @TableField("manager_id")
+    private Integer managerId;
+
+    /**
+     * V3:计算为V3场景,V4:计算为V4场景,默认V4场景
+     */
+    @TableField("scene_version")
+    private String sceneVersion;
+
+
+}

+ 156 - 0
src/main/java/com/fdkankan/manage_jp/entity/User.java

@@ -0,0 +1,156 @@
+package com.fdkankan.manage_jp.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableLogic;
+import com.baomidou.mybatisplus.annotation.TableName;
+import java.io.Serializable;
+import java.util.Date;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+ * <p>
+ * 用户信息表
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@Getter
+@Setter
+@TableName("t_user")
+public class User implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "id", type = IdType.AUTO)
+    private Long id;
+
+    /**
+     * 头像对应的链接地址
+     */
+    @TableField("head")
+    private String head;
+
+    /**
+     * 用户密码
+     */
+    @TableField("password")
+    private String password;
+
+    /**
+     * 用户邮箱
+     */
+    @TableField("email")
+    private String email;
+
+    /**
+     * 注册时间
+     */
+    @TableField("register_time")
+    private Date registerTime;
+
+    /**
+     * 用户名
+     */
+    @TableField("user_name")
+    private String userName;
+
+    /**
+     * 昵称
+     */
+    @TableField("nick_name")
+    private String nickName;
+
+    /**
+     * 0表示禁言(bbs)
+     */
+    @TableField("status")
+    private Integer status;
+
+    /**
+     * 0表示拒绝通知,1表示接受通知
+     */
+    @TableField("is_notice")
+    private Integer isNotice;
+
+    /**
+     * 机构名称
+     */
+    @TableField("organization_name")
+    private String organizationName;
+
+    /**
+     * 主页链接
+     */
+    @TableField("main_page")
+    private String mainPage;
+
+    /**
+     * 所在国家,默认是86
+     */
+    @TableField("country")
+    private String country;
+
+    /**
+     * 所在省份
+     */
+    @TableField("province")
+    private String province;
+
+    /**
+     * 所在城市
+     */
+    @TableField("city")
+    private String city;
+
+    /**
+     * 可下载场景总数
+     */
+    @TableField("download_num_total")
+    private Integer downloadNumTotal;
+
+    /**
+     * 已下载场景总数
+     */
+    @TableField("download_num")
+    private Integer downloadNum;
+
+    /**
+     * 创建时间
+     */
+    @TableField("create_time")
+    private Date createTime;
+
+    /**
+     * 记录的状态,A: 生效,I: 禁用
+     */
+    @TableField("rec_status")
+    @TableLogic
+    private String recStatus;
+
+    /**
+     * 更新时间
+     */
+    @TableField("update_time")
+    private Date updateTime;
+
+    @TableField("company_id")
+    private Integer companyId;
+
+    /**
+     * 深时场景下载总次数
+     */
+    @TableField("ss_download_num_total")
+    private Integer ssDownloadNumTotal;
+
+    /**
+     * 深时场景已下载次数
+     */
+    @TableField("ss_download_num")
+    private Integer ssDownloadNum;
+
+
+}

+ 23 - 0
src/main/java/com/fdkankan/manage_jp/exception/BusinessException.java

@@ -0,0 +1,23 @@
+package com.fdkankan.manage_jp.exception;
+
+import com.fdkankan.manage_jp.common.ResultCode;
+import lombok.Data;
+
+/**
+ * 自定义业务异常类
+ */
+@Data
+public class BusinessException extends RuntimeException {
+    private int code;
+    private String message;
+
+    public BusinessException(Integer code,String msg){
+        this.code = code;
+        this.message = msg;
+    }
+
+    public BusinessException(ResultCode errorCode) {
+        this.code = errorCode.code();
+        this.message = errorCode.message();
+    }
+}

+ 49 - 0
src/main/java/com/fdkankan/manage_jp/exception/GlobalExceptionHandler.java

@@ -0,0 +1,49 @@
+package com.fdkankan.manage_jp.exception;
+
+import com.fdkankan.manage_jp.common.ResultCode;
+import com.fdkankan.manage_jp.common.ResultData;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.dao.DataIntegrityViolationException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+/**
+ * 全局异常处理器
+ */
+@RestControllerAdvice
+@Slf4j
+public class GlobalExceptionHandler {
+
+    /**
+     * 处理未知异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = Exception.class)
+    public ResultData exceptionHandler(Exception e) throws Exception {
+        log.error("服务错误:", e);
+        return ResultData.error( 500, e.getCause().getMessage());
+    }
+
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = BusinessException.class)
+    public ResultData businessExceptionHandler(BusinessException e) {
+        log.info("业务异常code:{},message:{}", e.getCode(), e.getMessage());
+        return ResultData.error(e.getCode(), e.getMessage());
+    }
+    /**
+     * 处理业务异常
+     */
+    @ResponseBody
+    @ExceptionHandler(value = DataIntegrityViolationException.class)
+    public ResultData DataIntegrityViolationExceptionHandler(DataIntegrityViolationException e) {
+        log.error("mysql服务错误:", e);
+        if(e.getCause().getMessage().contains("Data too long")){
+            return ResultData.error(ResultCode.DATA_TOO_LONG);
+        }
+        return ResultData.error( 500, e.getCause().getMessage());
+    }
+}

+ 98 - 0
src/main/java/com/fdkankan/manage_jp/generate/AutoGenerate.java

@@ -0,0 +1,98 @@
+package com.fdkankan.manage_jp.generate;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.generator.FastAutoGenerator;
+import com.baomidou.mybatisplus.generator.config.OutputFile;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+public class AutoGenerate {
+
+
+    public static void main(String[] args) {
+
+        String path =System.getProperty("user.dir");
+
+        generate(path,"manage_jp", getTables(new String[]{
+                "t_company","t_user",
+        }));
+
+//        generate(path,"goods", getTables(new String[]{
+//                        "t_camera","t_camera_detail","t_camera_out","t_camera_space","t_camera_version",
+//                        "t_company","t_goods","t_goods_sku","t_cart","t_goods_spec",
+//                        "t_goods_spec_value","t_goods_spu_spec","t_sn_code"
+//        }));
+//
+//        generate(path,"order", getTables(new String[]{
+//                        "t_increment_order","t_invoice","t_order","t_order_item",
+//                        "t_pre_sale","t_space_sdk","t_trade_log","t_commerce_order","t_download_order","t_expansion_order"
+//        }));
+//        generate(path,"order", getTables(new String[]{
+//                        "t_virtual_order"
+//        }));
+//
+//        generate(path,"user", getTables(new String[]{
+//                        "t_user","t_user_increment","t_manager","t_province","t_increment_type","t_intercom_message","t_receiver_info"
+//        }));
+    }
+
+    public static List<String> getTables(String [] tableNames){
+        return new ArrayList<>(Arrays.asList(tableNames));
+    }
+
+
+    public static void  generate(String path,String moduleName,  List<String> tables){
+        FastAutoGenerator.create("jdbc:mysql://120.77.76.141:13306/4dkankan_v4",
+                "root","JK20220120%JIK")
+                .globalConfig(builder -> {
+                    builder.author("")               //作者
+                            .outputDir(path+"\\src\\main\\java")    //输出路径(写到java目录)
+                            //.enableSwagger()           //开启swagger
+                            .commentDate("yyyy-MM-dd")
+                            .dateType(DateType.ONLY_DATE)
+                            .fileOverride();            //开启覆盖之前生成的文件
+
+                })
+                .packageConfig(builder -> {
+                    builder.parent("com.fdkankan")
+                            .moduleName(moduleName)
+                            .entity("entity")
+                            .service("service")
+                            .serviceImpl("service.impl")
+                            .controller("controller")
+                            .mapper("mapper")
+                            .xml("test.mapper")
+                            .pathInfo(Collections.singletonMap(OutputFile.mapperXml,path+"\\src\\main\\resources\\mapper\\"+moduleName));
+                })
+                .strategyConfig(builder -> {
+                    builder.addInclude(tables)
+                            .addTablePrefix("t_")
+
+                            .serviceBuilder()
+                            .formatServiceFileName("I%sService")
+                            .formatServiceImplFileName("%sServiceImpl")
+
+                            .entityBuilder()
+                            .enableLombok()
+                            .logicDeleteColumnName("rec_status")
+                            .enableTableFieldAnnotation()
+                            //.superClass(BaseEntity.class)
+
+                            .controllerBuilder()
+                            .formatFileName("%sController")
+                            .enableRestStyle()
+
+                            .mapperBuilder()
+                            .superClass(BaseMapper.class)
+                            .formatMapperFileName("I%sMapper")
+                            .enableMapperAnnotation()
+                            .formatXmlFileName("%sMapper");
+                })
+                // .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker引擎模板,默认的是Velocity引擎模板
+                .execute();
+    }
+}

+ 18 - 0
src/main/java/com/fdkankan/manage_jp/mapper/ICompanyMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.manage_jp.mapper;
+
+import com.fdkankan.manage_jp.entity.Company;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 客户企业logo信息 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@Mapper
+public interface ICompanyMapper extends BaseMapper<Company> {
+
+}

+ 18 - 0
src/main/java/com/fdkankan/manage_jp/mapper/IUserMapper.java

@@ -0,0 +1,18 @@
+package com.fdkankan.manage_jp.mapper;
+
+import com.fdkankan.manage_jp.entity.User;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * <p>
+ * 用户信息表 Mapper 接口
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@Mapper
+public interface IUserMapper extends BaseMapper<User> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/manage_jp/service/ICompanyService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.manage_jp.service;
+
+import com.fdkankan.manage_jp.entity.Company;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 客户企业logo信息 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+public interface ICompanyService extends IService<Company> {
+
+}

+ 16 - 0
src/main/java/com/fdkankan/manage_jp/service/IUserService.java

@@ -0,0 +1,16 @@
+package com.fdkankan.manage_jp.service;
+
+import com.fdkankan.manage_jp.entity.User;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+public interface IUserService extends IService<User> {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/manage_jp/service/impl/CompanyServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.manage_jp.service.impl;
+
+import com.fdkankan.manage_jp.entity.Company;
+import com.fdkankan.manage_jp.mapper.ICompanyMapper;
+import com.fdkankan.manage_jp.service.ICompanyService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 客户企业logo信息 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@Service
+public class CompanyServiceImpl extends ServiceImpl<ICompanyMapper, Company> implements ICompanyService {
+
+}

+ 20 - 0
src/main/java/com/fdkankan/manage_jp/service/impl/UserServiceImpl.java

@@ -0,0 +1,20 @@
+package com.fdkankan.manage_jp.service.impl;
+
+import com.fdkankan.manage_jp.entity.User;
+import com.fdkankan.manage_jp.mapper.IUserMapper;
+import com.fdkankan.manage_jp.service.IUserService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户信息表 服务实现类
+ * </p>
+ *
+ * @author 
+ * @since 2022-12-22
+ */
+@Service
+public class UserServiceImpl extends ServiceImpl<IUserMapper, User> implements IUserService {
+
+}

+ 32 - 0
src/main/resources/bootstrap-test.yml

@@ -0,0 +1,32 @@
+spring:
+  application:
+    name: 4dkankan-manage-jp
+  cloud:
+    nacos:
+      config:
+        server-addr: 120.24.144.164:8848
+        file-extension: yaml
+        namespace: 4dkankan-jp-v4-test
+        extension-configs:
+          - data-id: 4dkankan-manage-jp.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+        shared-configs:
+          - data-id: common-redis-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: common-fyun-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+          - data-id: forest-config.yaml
+            group: DEFAULT_GROUP
+            refresh: true
+
+      discovery:
+        server-addr: ${spring.cloud.nacos.config.server-addr}
+        namespace: ${spring.cloud.nacos.config.namespace}
+
+
+

+ 8 - 0
src/main/resources/bootstrap.yml

@@ -0,0 +1,8 @@
+spring:
+  profiles:
+    active: test
+logging:
+  config: classpath:logback-spring.xml
+mybatis-plus:
+  configuration:
+    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl #开启sql日志

+ 5 - 0
src/main/resources/mapper/manage_jp/CompanyMapper.xml

@@ -0,0 +1,5 @@
+<?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.fdkankan.manage_jp.mapper.ICompanyMapper">
+
+</mapper>

+ 5 - 0
src/main/resources/mapper/manage_jp/UserMapper.xml

@@ -0,0 +1,5 @@
+<?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.fdkankan.manage_jp.mapper.IUserMapper">
+
+</mapper>