Browse Source

Merge branch 'usky-zyj' of uskycloud/usky-modules into server-165

James 1 year ago
parent
commit
a502decdb1
38 changed files with 1833 additions and 0 deletions
  1. 4 0
      pom.xml
  2. 17 0
      service-meet/pom.xml
  3. 29 0
      service-meet/service-meet-api/pom.xml
  4. 28 0
      service-meet/service-meet-api/src/main/java/com/usky/demo/RemoteUserService.java
  5. 105 0
      service-meet/service-meet-api/src/main/java/com/usky/demo/domain/SysUserVO.java
  6. 48 0
      service-meet/service-meet-api/src/main/java/com/usky/demo/factory/RemoteUserFallbackFactory.java
  7. 127 0
      service-meet/service-meet-biz/pom.xml
  8. 49 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/ApplicationRun.java
  9. 107 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/MybatisGenerator.java
  10. 10 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/annotation/FaceLog.java
  11. 40 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/annotation/aspect/FaceAspect.java
  12. 60 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/api/SysUserControllerApi.java
  13. 92 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/web/FaceController.java
  14. 58 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/web/FaceVefLogController.java
  15. 36 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/web/SysUserController.java
  16. 76 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/domain/Face.java
  17. 51 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/domain/FaceVefLog.java
  18. 123 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/domain/SysUser.java
  19. 16 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/mapper/FaceMapper.java
  20. 16 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/mapper/FaceVefLogMapper.java
  21. 15 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/mapper/SysUserMapper.java
  22. 55 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/server/FaceContrastServer.java
  23. 24 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/service/FaceService.java
  24. 16 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/service/FaceVefLogService.java
  25. 17 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/service/SysUserService.java
  26. 110 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/service/impl/FaceServiceImpl.java
  27. 20 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/service/impl/FaceVefLogServiceImpl.java
  28. 18 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/service/impl/SysUserServiceImpl.java
  29. 98 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/service/vo/FaceResultVO.java
  30. 60 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/utils/JwtUtils.java
  31. 25 0
      service-meet/service-meet-biz/src/main/java/com/usky/demo/utils/TimeUtils.java
  32. 25 0
      service-meet/service-meet-biz/src/main/resources/bootstrap.yml
  33. 108 0
      service-meet/service-meet-biz/src/main/resources/doc/index.adoc
  34. 74 0
      service-meet/service-meet-biz/src/main/resources/logback.xml
  35. 28 0
      service-meet/service-meet-biz/src/main/resources/mapper.demo/SysUserMapper.xml
  36. 19 0
      service-meet/service-meet-biz/src/main/resources/mapper/demo/FaceMapper.xml
  37. 14 0
      service-meet/service-meet-biz/src/main/resources/mapper/demo/FaceVefLogMapper.xml
  38. 15 0
      service-meet/service-meet-biz/src/main/resources/smart-doc.json

+ 4 - 0
pom.xml

@@ -75,6 +75,10 @@
 
     <module>service-issue</module>
 
+
+
+    <module>service-meet</module>
+
   </modules>
           
   

+ 17 - 0
service-meet/pom.xml

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>usky-modules</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-meet</artifactId>
+    <packaging>pom</packaging>
+    <modules>
+        <module>service-meet-biz</module>
+        <module>service-meet-api</module>
+  </modules>
+
+</project>

+ 29 - 0
service-meet/service-meet-api/pom.xml

@@ -0,0 +1,29 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>service-meet</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-meet-api</artifactId>
+    <!-- SpringCloud Openfeign -->
+    <dependencies>
+        <dependency>
+            <groupId>org.springframework.cloud</groupId>
+            <artifactId>spring-cloud-starter-openfeign</artifactId>
+        </dependency>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>usky-common-core</artifactId>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+    </build>
+
+</project>

+ 28 - 0
service-meet/service-meet-api/src/main/java/com/usky/demo/RemoteUserService.java

@@ -0,0 +1,28 @@
+package com.usky.demo;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.demo.domain.SysUserVO;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+@FeignClient(contextId = "remoteUserService", value = "usky-demo")
+public interface RemoteUserService {
+
+
+
+    @GetMapping("/byUserName")
+    ApiResult<List<SysUserVO>> getByUserName(@RequestParam("userName") String userName);
+
+
+    @PostMapping("/byUserName")
+    ApiResult<List<SysUserVO>> add(@RequestBody SysUserVO sysUserVO);
+
+
+    @PostMapping(value = "/upload", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
+    ApiResult<String> upload(@RequestPart(value = "file") MultipartFile file);
+}

+ 105 - 0
service-meet/service-meet-api/src/main/java/com/usky/demo/domain/SysUserVO.java

@@ -0,0 +1,105 @@
+package com.usky.demo.domain;
+
+
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Data
+public class SysUserVO {
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户类型(00系统用户)
+     */
+    private String userType;
+
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+
+    /**
+     * 用户性别(0男 1女 2未知)
+     */
+    private String sex;
+
+    /**
+     * 头像地址
+     */
+    private String avatar;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private LocalDateTime loginDate;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 48 - 0
service-meet/service-meet-api/src/main/java/com/usky/demo/factory/RemoteUserFallbackFactory.java

@@ -0,0 +1,48 @@
+package com.usky.demo.factory;
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.common.core.exception.BusinessException;
+import com.usky.demo.RemoteUserService;
+import com.usky.demo.domain.SysUserVO;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import org.springframework.cloud.openfeign.FallbackFactory;
+import org.springframework.stereotype.Component;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.util.List;
+
+
+/**
+ * 用户服务降级处理
+ *
+ * @author ruoyi
+ */
+@Component
+public class RemoteUserFallbackFactory implements FallbackFactory<RemoteUserService>
+{
+    private static final Logger log = LoggerFactory.getLogger(RemoteUserFallbackFactory.class);
+
+    @Override
+    public RemoteUserService create(Throwable throwable)
+    {
+        log.error("用户服务调用失败:{}", throwable.getMessage());
+        return new RemoteUserService() {
+            @Override
+            public ApiResult<List<SysUserVO>> getByUserName(String userName) {
+                throw new BusinessException(throwable.getMessage());
+            }
+
+            @Override
+            public ApiResult<List<SysUserVO>> add(SysUserVO sysUserVO) {
+                throw new BusinessException(throwable.getMessage());
+            }
+
+            @Override
+            public ApiResult<String> upload(MultipartFile file) {
+                throw new BusinessException(throwable.getMessage());
+            }
+        };
+    }
+}

+ 127 - 0
service-meet/service-meet-biz/pom.xml

@@ -0,0 +1,127 @@
+<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <parent>
+        <artifactId>service-meet</artifactId>
+        <groupId>com.usky</groupId>
+        <version>0.0.1</version>
+    </parent>
+    <modelVersion>4.0.0</modelVersion>
+
+    <artifactId>service-meet-biz</artifactId>
+    <dependencies>
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>common-cloud-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+        <!-- Pagehelper -->
+        <dependency>
+            <groupId>com.github.pagehelper</groupId>
+            <artifactId>pagehelper-spring-boot-starter</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.usky</groupId>
+            <artifactId>ruoyi-common-swagger</artifactId>
+        </dependency>
+
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.auth0</groupId>
+            <artifactId>java-jwt</artifactId>
+            <version>3.18.3</version>
+        </dependency>
+
+        <dependency>
+            <groupId>com.baomidou</groupId>
+            <artifactId>mybatis-plus-boot-starter</artifactId>
+            <version>3.4.2</version>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.hutool</groupId>
+            <artifactId>hutool-all</artifactId>
+            <version>${hutool.version}</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>com.tencentcloudapi</groupId>
+            <artifactId>tencentcloud-sdk-java</artifactId>
+            <version>3.1.322</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>2.2.0</version>
+        </dependency>
+
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-devtools</artifactId>
+            <scope>runtime</scope>
+            <optional>true</optional>
+        </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>
+    </dependencies>
+
+    <build>
+        <finalName>${project.artifactId}</finalName>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+                <version>2.2.6.RELEASE</version>
+                <executions>
+                    <execution>
+                        <goals>
+                            <goal>repackage</goal>
+                        </goals>
+                    </execution>
+                </executions>
+            </plugin>
+            <plugin>
+                <groupId>com.github.shalousun</groupId>
+                <artifactId>smart-doc-maven-plugin</artifactId>
+                <version>2.1.1</version>
+                <configuration>
+                    <!--指定生成文档的使用的配置文件,配置文件放在自己的项目中-->
+                    <configFile>./src/main/resources/smart-doc.json</configFile>
+                    <!--指定项目名称-->
+                    <projectName>test</projectName>
+                    <!--                    <excludes>-->
+                    <!--                        <exclude>com.bizmatics:product-service-provider</exclude>-->
+                    <!--                        <exclude>cn.afterturn:easypoi-web</exclude>-->
+                    <!--                    </excludes>-->
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+
+</project>

+ 49 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/ApplicationRun.java

@@ -0,0 +1,49 @@
+package com.usky.demo;
+
+
+import com.ruoyi.common.swagger.annotation.EnableCustomSwagger2;
+import org.mybatis.spring.annotation.MapperScan;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.cloud.openfeign.EnableFeignClients;
+import org.springframework.context.ConfigurableApplicationContext;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.core.env.Environment;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+import java.net.InetAddress;
+import java.net.UnknownHostException;
+
+/**
+ * 应用启动模块
+ * 
+ */
+
+
+@EnableCustomSwagger2
+//@EnableSwagger2
+@EnableFeignClients(basePackages = "com.usky")
+@MapperScan(value = "com.usky.demo.mapper")
+@ComponentScan("com.usky")
+@SpringBootApplication
+public class ApplicationRun
+{
+
+    private static final Logger LOGGER = LoggerFactory.getLogger(ApplicationRun.class);
+
+    public static void main(String[] args) throws UnknownHostException {
+        ConfigurableApplicationContext application = SpringApplication.run(ApplicationRun.class, args);
+        Environment env = application.getEnvironment();
+        String ip = InetAddress.getLocalHost().getHostAddress();
+        String port = env.getProperty("server.port");
+        String path = env.getProperty("server.servlet.context-path");
+        LOGGER.info("\n----------------------------------------------------------\n\t" +
+                "Application is running! Access URLs:\n\t" +
+                "Local: \t\thttp://localhost:" + port + (null==path?"":path) + "/\n\t" +
+                "External: \thttp://" + ip + ":" + port + (null==path?"":path) + "/\n\t" +
+                "Api: \t\thttp://" + ip + ":" + port + (null==path?"":path) + "/swagger-ui/index.html\n\t" +
+                "----------------------------------------------------------");
+    }
+}

+ 107 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/MybatisGenerator.java

@@ -0,0 +1,107 @@
+package com.usky.demo;//package com.usky.demo.controller;//package com.usky.dm.controller.web.business;//package com.usky.dm.controller.web;
+
+
+
+import com.baomidou.mybatisplus.core.toolkit.StringPool;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.InjectionConfig;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.po.TableInfo;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ */
+public class MybatisGenerator {
+    public static void main(String[] args) {
+
+            shell("service-meet","service-meet-biz");
+    }
+
+    private static void shell(String parentName,String model) {
+
+        AutoGenerator mpg = new AutoGenerator();
+        //1、全局配置
+        GlobalConfig gc = new GlobalConfig();
+//        File file = new File(model);
+//        String path = file.getAbsolutePath();
+        String projectPath = System.getProperty("user.dir");
+        projectPath+="/"+parentName;
+        projectPath+="/"+model;
+        gc.setOutputDir(projectPath+ "/src/main/java");  //生成路径(一般都是生成在此项目的src/main/java下面)
+        //修改为自己的名字
+        gc.setAuthor("zyj"); //设置作者
+        gc.setOpen(false);
+        gc.setFileOverride(true); //第二次生成会把第一次生成的覆盖掉
+        gc.setServiceName("%sService"); //生成的service接口名字首字母是否为I,这样设置就没有
+        gc.setBaseResultMap(true); //生成resultMap
+        mpg.setGlobalConfig(gc);
+
+        //2、数据源配置
+        //修改数据源
+        DataSourceConfig dsc = new DataSourceConfig();
+        dsc.setUrl("jdbc:mysql://172.16.120.165:3306/dm_meeting?useUnicode=true&serverTimezone=GMT&useSSL=false&characterEncoding=utf8");
+        dsc.setDriverName("com.mysql.jdbc.Driver");
+        dsc.setUsername("usky");
+        dsc.setPassword("Yt#75Usky");
+        mpg.setDataSource(dsc);
+
+        // 3、包配置
+        PackageConfig pc = new PackageConfig();
+        pc.setParent("com.usky.demo");
+        pc.setController("controller.web");
+        pc.setEntity("domain");
+        pc.setMapper("mapper");
+        pc.setService("service");
+        pc.setServiceImpl("service.impl");
+//        pc.setXml("mapper.demo");
+        //pc.setModuleName("test");
+        mpg.setPackageInfo(pc);
+
+        // 4、策略配置
+        StrategyConfig strategy = new StrategyConfig();
+        strategy.setNaming(NamingStrategy.underline_to_camel);
+        strategy.setColumnNaming(NamingStrategy.underline_to_camel);
+        strategy.setSuperMapperClass("com.usky.common.mybatis.core.CrudMapper");
+        strategy.setSuperServiceClass("com.usky.common.mybatis.core.CrudService");
+        strategy.setSuperServiceImplClass("com.usky.common.mybatis.core.AbstractCrudService");
+        // strategy.setTablePrefix("t_"); // 表名前缀
+        strategy.setEntityLombokModel(true); //使用lombok
+        //修改自己想要生成的表
+        strategy.setInclude("face","face_vef_log");  // 逆向工程使用的表   如果要生成多个,这里可以传入String[]
+        mpg.setStrategy(strategy);
+
+        // 关闭默认 xml 生成,调整生成 至 根目录
+        //修改对应的模块名称
+        TemplateConfig tc = new TemplateConfig();
+        // 自定义配置
+        InjectionConfig cfg = new InjectionConfig() {
+            @Override
+            public void initMap() {
+                // to do nothing
+            }
+        };
+        //如果模板引擎是 velocity
+        String templatePath = "/templates/mapper.xml.vm";
+        // 自定义输出配置
+        List<FileOutConfig> focList = new ArrayList<>();
+        // 自定义配置会被优先输出
+        String finalProjectPath = projectPath;
+        focList.add(new FileOutConfig(templatePath) {
+            @Override
+            public String outputFile(TableInfo tableInfo) {
+                // 自定义输出文件名 , 如果你 Entity 设置了前后缀、此处注意 xml 的名称会跟着发生变化!!
+                return finalProjectPath + "/src/main/resources/mapper/demo" + "/"
+                        + tableInfo.getEntityName() + "Mapper" + StringPool.DOT_XML;
+            }
+        });
+        cfg.setFileOutConfigList(focList);
+        mpg.setCfg(cfg);
+        tc.setXml(null);
+        mpg.setTemplate(tc);
+        //5、执行
+        mpg.execute();
+    }
+}

+ 10 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/annotation/FaceLog.java

@@ -0,0 +1,10 @@
+package com.usky.demo.annotation;
+
+import java.lang.annotation.*;
+
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(value = ElementType.METHOD)
+public @interface FaceLog {
+
+}

+ 40 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/annotation/aspect/FaceAspect.java

@@ -0,0 +1,40 @@
+package com.usky.demo.annotation.aspect;
+
+
+import com.usky.demo.domain.FaceVefLog;
+import com.usky.demo.service.FaceVefLogService;
+import com.usky.demo.service.vo.FaceResultVO;
+import org.aspectj.lang.JoinPoint;
+import org.aspectj.lang.annotation.After;
+import org.aspectj.lang.annotation.AfterReturning;
+import org.aspectj.lang.annotation.Aspect;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * @author tanyongpeng
+ * <p>方法执行后,添加日志</p>
+ **/
+@Component
+@Aspect
+public class FaceAspect {
+
+    @Autowired
+    private FaceVefLogService faceVefLogService;
+
+    @AfterReturning(value = "@annotation(com.usky.demo.annotation.FaceLog)",returning = "res")
+    public void addLog(JoinPoint joinPoint ,Object res){
+        FaceResultVO result = (FaceResultVO)res;
+        FaceVefLog faceVefLog = new FaceVefLog();
+        faceVefLog.setVefTime(LocalDateTime.now());
+        faceVefLog.setVefCode(result.getCode());
+        faceVefLog.setVefMsg(result.getMsg());
+        faceVefLog.setLoginName(result.getName());
+        faceVefLogService.save(faceVefLog);
+    }
+
+
+}

+ 60 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/api/SysUserControllerApi.java

@@ -0,0 +1,60 @@
+//package com.usky.demo.controller.api;
+//
+//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+//import com.usky.common.core.bean.ApiResult;
+//import com.usky.common.core.exception.BusinessException;
+//import com.usky.common.core.util.BeanMapperUtils;
+//import com.usky.common.core.util.FileUtils;
+//import com.usky.common.core.util.GlobalUtils;
+//import com.usky.demo.domain.SysUser;
+//import com.usky.demo.service.SysUserService;
+//import com.usky.system.RemoteUserService;
+//import com.usky.system.domain.SysUserVO;
+//import org.springframework.beans.factory.annotation.Autowired;
+//import org.springframework.web.bind.annotation.RestController;
+//import org.springframework.web.multipart.MultipartFile;
+//
+//import java.io.File;
+//import java.io.IOException;
+//import java.util.ArrayList;
+//import java.util.List;
+//import java.util.Optional;
+//
+//@RestController
+//public class SysUserControllerApi implements RemoteUserService {
+//
+//    @Autowired
+//    private SysUserService sysUserService;
+//    @Override
+//    public ApiResult<List<SysUserVO>> getByUserName(String userName) {
+//        LambdaQueryWrapper<SysUser> queryWrapper = Wrappers.lambdaQuery();
+//        queryWrapper.eq(SysUser::getUserName,userName);
+//        return ApiResult.success(BeanMapperUtils.mapList(sysUserService.list(queryWrapper),SysUser.class,SysUserVO.class));
+//    }
+//
+//    @Override
+//    public ApiResult<List<SysUserVO>> add(SysUserVO sysUserVO) {
+//        sysUserService.save(BeanMapperUtils.map(sysUserVO, SysUser.class));
+//        return ApiResult.success(new ArrayList<>());
+//    }
+//
+//    @Override
+//    public ApiResult<String> upload(MultipartFile multipartFile) {
+//        Optional.ofNullable(multipartFile).orElseThrow(() ->  new BusinessException("文件为空"));
+//        String originalFilename = multipartFile.getOriginalFilename();
+//        String newFileName = System.currentTimeMillis() + originalFilename;
+//        File file = FileUtils.getFile(GlobalUtils.getTempBaseDir(), newFileName);
+//        String urlPath = "";
+//        try {
+//            try {
+//                multipartFile.transferTo(file);
+//            } catch (IOException e) {
+//                throw new BusinessException("文件上传失败");
+//            }
+//        } catch (Exception e) {
+//
+//        }
+//        return ApiResult.success(urlPath);
+//    }
+//}

+ 92 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/web/FaceController.java

@@ -0,0 +1,92 @@
+package com.usky.demo.controller.web;
+
+
+import cn.hutool.core.util.StrUtil;
+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.usky.demo.annotation.FaceLog;
+import com.usky.demo.domain.Face;
+import com.usky.demo.service.FaceService;
+import com.usky.demo.service.vo.FaceResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import org.springframework.stereotype.Controller;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+@RestController
+@RequestMapping("/face")
+@Api("人脸验证接口")
+@Slf4j
+public class FaceController {
+
+    @Autowired
+    FaceService faceService;
+
+    @PostMapping("/vef")
+    @ApiOperation(value="人脸验证", notes="根据传入的base64编码和数据的base64编码进行对比")
+    @FaceLog
+    public FaceResultVO faceVef(@RequestBody String imageBase){
+        return faceService.vef(imageBase);
+    }
+
+    @GetMapping("/faceList")
+    @ApiOperation(value = "人脸列表",notes = "查询所有的人脸信息")
+    public FaceResultVO faceList(
+            @RequestParam Integer current,
+            @RequestParam Integer size,
+            @RequestParam(required = false) String faceName,
+            @RequestParam(required = false) String faceStatus
+    ){
+        IPage<Face> page = faceService.page(new Page(current, size), new QueryWrapper<Face>()
+                .like(StrUtil.isNotBlank(faceName),"face_name",faceName)
+                .like(StrUtil.isNotBlank(faceStatus),"face_status",faceStatus));
+        return FaceResultVO.success(page);
+    }
+
+
+    @GetMapping("/faceDelete/{fid}")
+    @ApiOperation(value = "删除人脸",notes = "根据id进行删除")
+    public FaceResultVO faceDelete(@PathVariable Integer fid){
+        faceService.removeById(fid);
+        return FaceResultVO.success("删除成功");
+    }
+
+    @GetMapping("/info/{fid}")
+    @ApiOperation(value = "查询方法",notes = "根据id查询人脸信息")
+    public FaceResultVO info(@PathVariable Integer fid){
+        return FaceResultVO.success(faceService.getById(fid));
+    }
+
+    @PostMapping("/save")
+    @ApiOperation(value = "添加")
+    public FaceResultVO save(@RequestBody Face face){
+        face.setVefNum(0);
+        face.setCreateTime(LocalDateTime.now());
+        faceService.save(face);
+        return FaceResultVO.success("添加成功");
+    }
+
+    @PostMapping("/update")
+    @ApiOperation(value = "修改")
+    public FaceResultVO update(@RequestBody Face face){
+        faceService.updateById(face);
+        return FaceResultVO.success("修改成功");
+    }
+
+}
+

+ 58 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/web/FaceVefLogController.java

@@ -0,0 +1,58 @@
+package com.usky.demo.controller.web;
+
+
+import cn.hutool.core.util.StrUtil;
+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.usky.demo.domain.FaceVefLog;
+import com.usky.demo.service.FaceVefLogService;
+import com.usky.demo.service.vo.FaceResultVO;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+/**
+ * <p>
+ *  前端控制器
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+@RestController
+@RequestMapping("/face/log")
+@Api("人脸日志接口")
+@Slf4j
+public class FaceVefLogController {
+
+    @Autowired
+    FaceVefLogService faceVefLogService;
+
+    @GetMapping("/list")
+    @ApiOperation(value = "日志接口",notes = "查询所有验证人脸日志信息")
+    public FaceResultVO faceList(
+            @RequestParam Integer current,
+            @RequestParam Integer size,
+            @RequestParam(required = false) String startTime,
+            @RequestParam(required = false) String endTime,
+            @RequestParam(required = false) String vefCode,
+            @RequestParam(required = false) String loginName
+    ){
+        IPage<FaceVefLog> page = faceVefLogService.page(new Page(current, size), new QueryWrapper<FaceVefLog>()
+                .like(StrUtil.isNotBlank(vefCode),"vef_code",vefCode)
+                .like(StrUtil.isNotBlank(loginName),"login_name",loginName)
+                .between(StrUtil.isNotBlank(startTime) && StrUtil.isNotBlank(endTime),"vef_time",startTime,endTime)
+                .orderByDesc("vef_time"));
+        return FaceResultVO.success(page);
+    }
+
+}
+

+ 36 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/controller/web/SysUserController.java

@@ -0,0 +1,36 @@
+package com.usky.demo.controller.web;
+
+
+import com.usky.common.core.bean.ApiResult;
+import com.usky.demo.domain.SysUser;
+import com.usky.demo.service.SysUserService;
+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;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 用户信息表 前端控制器
+ * </p>
+ *
+ * @author ya
+ * @since 2022-04-21
+ */
+@RestController
+@RequestMapping("/sysUser")
+public class SysUserController {
+
+
+    @Autowired
+    private SysUserService sysUserService;
+
+    @GetMapping("/list")
+    public ApiResult<List<SysUser>> list(){
+        return ApiResult.success(sysUserService.list());
+    }
+}
+

+ 76 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/domain/Face.java

@@ -0,0 +1,76 @@
+package com.usky.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class Face implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "fid", type = IdType.AUTO)
+    private Integer fid;
+
+    /**
+     * 图片数据 base_64编码
+     */
+    private String faceBase;
+
+    /**
+     * 插入时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 验证次数
+     */
+    private Integer vefNum;
+
+    /**
+     * 人脸名称
+     */
+    private String faceName;
+
+    /**
+     * 人脸备注
+     */
+    private String remark;
+
+    /**
+     * 人脸是否可用,(0==可用,1,不可用)
+     */
+    private Integer faceStatus;
+
+    /**
+     * 扩展字段1(user_id)
+     */
+    private String updateExtend1;
+
+    /**
+     * 扩展字段2
+     */
+    private String updateExtend2;
+
+    /**
+     * 扩展字段3
+     */
+    private String updateExtend3;
+
+
+}

+ 51 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/domain/FaceVefLog.java

@@ -0,0 +1,51 @@
+package com.usky.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * <p>
+ * 
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+public class FaceVefLog implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(value = "lid", type = IdType.AUTO)
+    private Integer lid;
+
+    /**
+     * 验证时间
+     */
+    private LocalDateTime vefTime;
+
+    /**
+     * 返回code
+     */
+    private Integer vefCode;
+
+    /**
+     * 返回的消息
+     */
+    private String vefMsg;
+
+    /**
+     * 验证人
+     */
+    private String loginName;
+
+
+}

+ 123 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/domain/SysUser.java

@@ -0,0 +1,123 @@
+package com.usky.demo.domain;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import java.time.LocalDateTime;
+import java.io.Serializable;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 用户信息表
+ * </p>
+ *
+ * @author ya
+ * @since 2022-04-21
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+public class SysUser implements Serializable {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 用户ID
+     */
+    @TableId(value = "user_id", type = IdType.AUTO)
+    private Long userId;
+
+    /**
+     * 部门ID
+     */
+    private Long deptId;
+
+    /**
+     * 用户账号
+     */
+    private String userName;
+
+    /**
+     * 用户昵称
+     */
+    private String nickName;
+
+    /**
+     * 用户类型(00系统用户)
+     */
+    private String userType;
+
+    /**
+     * 用户邮箱
+     */
+    private String email;
+
+    /**
+     * 手机号码
+     */
+    private String phonenumber;
+
+    /**
+     * 用户性别(0男 1女 2未知)
+     */
+    private String sex;
+
+    /**
+     * 头像地址
+     */
+    private String avatar;
+
+    /**
+     * 密码
+     */
+    private String password;
+
+    /**
+     * 帐号状态(0正常 1停用)
+     */
+    private String status;
+
+    /**
+     * 删除标志(0代表存在 2代表删除)
+     */
+    private String delFlag;
+
+    /**
+     * 最后登录IP
+     */
+    private String loginIp;
+
+    /**
+     * 最后登录时间
+     */
+    private LocalDateTime loginDate;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    private LocalDateTime createTime;
+
+    /**
+     * 更新者
+     */
+    private String updateBy;
+
+    /**
+     * 更新时间
+     */
+    private LocalDateTime updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+
+
+}

+ 16 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/mapper/FaceMapper.java

@@ -0,0 +1,16 @@
+package com.usky.demo.mapper;
+
+import com.usky.demo.domain.Face;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+public interface FaceMapper extends CrudMapper<Face> {
+
+}

+ 16 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/mapper/FaceVefLogMapper.java

@@ -0,0 +1,16 @@
+package com.usky.demo.mapper;
+
+import com.usky.demo.domain.FaceVefLog;
+import com.usky.common.mybatis.core.CrudMapper;
+
+/**
+ * <p>
+ *  Mapper 接口
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+public interface FaceVefLogMapper extends CrudMapper<FaceVefLog> {
+
+}

+ 15 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/mapper/SysUserMapper.java

@@ -0,0 +1,15 @@
+package com.usky.demo.mapper;
+
+import com.usky.common.mybatis.core.CrudMapper;
+import com.usky.demo.domain.SysUser;
+
+/**
+ * <p>
+ * 用户信息表 Mapper 接口
+ * </p>
+ *
+ * @since 2022-04-21
+ */
+public interface SysUserMapper extends CrudMapper<SysUser> {
+
+}

+ 55 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/server/FaceContrastServer.java

@@ -0,0 +1,55 @@
+package com.usky.demo.server;
+
+import com.tencentcloudapi.common.Credential;
+import com.tencentcloudapi.common.exception.TencentCloudSDKException;
+import com.tencentcloudapi.common.profile.ClientProfile;
+import com.tencentcloudapi.common.profile.HttpProfile;
+import com.tencentcloudapi.iai.v20180301.IaiClient;
+import com.tencentcloudapi.iai.v20180301.models.CompareFaceRequest;
+import com.tencentcloudapi.iai.v20180301.models.CompareFaceResponse;
+import com.usky.demo.service.vo.FaceResultVO;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Component;
+
+/**
+ * @author tanyongpeng
+ * <p>调用腾讯接口</p>
+ **/
+@Component
+@Data
+@Slf4j
+public class FaceContrastServer {
+
+    @Value("${tencentcloudapi.secretId}")
+    private String secretId;
+    @Value("${tencentcloudapi.secretKey}")
+    private String secretKey;
+    @Value("${tencentcloudapi.endpoint}")
+    private String endpoint;
+    @Value("${tencentcloudapi.region}")
+    private String region;
+
+    public FaceResultVO faceContrast(String imageA, String imageB){
+        FaceResultVO faceResult = new FaceResultVO();
+        try{
+            Credential cred = new Credential(secretId, secretKey);
+            HttpProfile httpProfile = new HttpProfile();
+            httpProfile.setEndpoint(endpoint);
+            ClientProfile clientProfile = new ClientProfile();
+            clientProfile.setHttpProfile(httpProfile);
+            IaiClient client = new IaiClient(cred, region, clientProfile);
+            CompareFaceRequest req = new CompareFaceRequest();
+            req.setImageA(imageA);
+            req.setImageB(imageB);
+            CompareFaceResponse resp = client.CompareFace(req);
+            faceResult.setScore(resp.getScore());
+            faceResult.setCode(FaceResultVO.SUCCESS_CODE);
+        } catch (TencentCloudSDKException e) {
+            faceResult.setCode(FaceResultVO.FACE_ERROR);
+            faceResult.setMsg(e.getMessage());
+        }
+        return faceResult;
+    }
+}

+ 24 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/service/FaceService.java

@@ -0,0 +1,24 @@
+package com.usky.demo.service;
+
+import com.usky.demo.domain.Face;
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.demo.service.vo.FaceResultVO;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+public interface FaceService extends CrudService<Face> {
+
+    /**
+     * 人脸校验
+     * @param imageBase
+     * @return
+     */
+    FaceResultVO vef(String imageBase);
+
+}

+ 16 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/service/FaceVefLogService.java

@@ -0,0 +1,16 @@
+package com.usky.demo.service;
+
+import com.usky.demo.domain.FaceVefLog;
+import com.usky.common.mybatis.core.CrudService;
+
+/**
+ * <p>
+ *  服务类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+public interface FaceVefLogService extends CrudService<FaceVefLog> {
+
+}

+ 17 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/service/SysUserService.java

@@ -0,0 +1,17 @@
+package com.usky.demo.service;
+
+import com.usky.common.mybatis.core.CrudService;
+import com.usky.demo.domain.SysUser;
+
+
+/**
+ * <p>
+ * 用户信息表 服务类
+ * </p>
+ *
+ * @author ya
+ * @since 2022-04-21
+ */
+public interface SysUserService extends CrudService<SysUser> {
+
+}

+ 110 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/service/impl/FaceServiceImpl.java

@@ -0,0 +1,110 @@
+package com.usky.demo.service.impl;
+
+import cn.hutool.json.JSONUtil;
+import com.usky.demo.domain.Face;
+import com.usky.demo.mapper.FaceMapper;
+import com.usky.demo.server.FaceContrastServer;
+import com.usky.demo.service.FaceService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.demo.service.vo.FaceResultVO;
+import com.usky.demo.utils.JwtUtils;
+import com.usky.demo.utils.TimeUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+@Service
+public class FaceServiceImpl extends AbstractCrudService<FaceMapper, Face> implements FaceService {
+
+    @Autowired
+    FaceContrastServer faceContrastServer;
+
+    @Override
+    public FaceResultVO vef(String imageBase) {
+        imageBase = JSONUtil.parseObj(imageBase).getStr("imageBase");
+        List<Face> faceList = lambdaQuery().orderByDesc(Face::getVefNum).list();
+        FaceResultVO faceState = null;
+        // 如果人脸库为空,则第一次登录为录入人脸
+        if (faceList.size() == 0){
+            return initFace(imageBase);
+        }else {
+            int faceLength = faceList.size();
+            for (Face face : faceList) {
+                FaceResultVO faceResult = faceContrastServer.faceContrast(face.getFaceBase(), imageBase);
+                // 是否比对成功
+                if (faceResult.getCode() == FaceResultVO.SUCCESS_CODE ){
+                    // 相似度是否大于80
+                    if (faceResult.getScore() > FaceResultVO.SATISFY_SCORE){
+                        if (face.getFaceStatus() == 0){
+                            // 成功
+                            lambdaUpdate().set(Face::getVefNum,face.getVefNum()+1).eq(Face::getFid,face.getFid()).update();
+                            faceResult.setMsg(TimeUtils.timeQuantum()+"好,"+face.getFaceName());
+                            faceResult.setName(face.getFaceName());
+                            Map<String,String> map = new HashMap<>();
+                            map.put("score",String.valueOf(faceResult.getScore()));
+                            map.put("faceName",faceResult.getName());
+                            faceResult.setToken(JwtUtils.genereteToken(map));
+                            return faceResult;
+                        }else {
+                            // 失败 人脸被禁用
+                            lambdaUpdate().set(Face::getVefNum,face.getVefNum()+1).eq(Face::getFid,face.getFid()).update();
+                            faceResult.setMsg(face.getFaceName()+",当前人脸被禁用");
+                            faceResult.setName(face.getFaceName());
+                            faceResult.setCode(FaceResultVO.FORBIDDEN_FACE);
+                            faceState = faceResult;
+                            // 就算上一张人脸被禁用还得往下执行
+                            // 可能当前用户存在多张人脸,
+                            if (faceLength == 1){
+                                return faceResult;
+                            }
+                            faceLength --;
+                        }
+                    }else {
+                        // 人脸库没有检测到人脸
+                        if (faceLength == 1){
+                            // 判断当前人脸是否被禁用,如被禁用,提示被禁用
+                            // 禁用优先级大于 没有检测到人脸
+                            return faceState != null?faceState:FaceResultVO.error(FaceResultVO.NOT_FOUND_FACE,"人脸库不存在该人脸",faceResult.getScore());
+                        }
+                        faceLength --;
+                    }
+                }else {
+                    // 接口返回异常
+                    return faceResult;
+                }
+            }
+        }
+        // 空异常
+        return FaceResultVO.error(FaceResultVO.NULL_ERROR,"空指针异常");
+    }
+
+
+    public FaceResultVO initFace(String imageBase){
+        FaceResultVO faceResult = new FaceResultVO();
+        Face face = new Face();
+        face.setFaceBase(imageBase);
+        face.setCreateTime(LocalDateTime.now());
+        face.setVefNum(0);
+        face.setFaceName("admin");
+        face.setFaceStatus(0);
+        boolean save = save(face);
+        faceResult.setCode(FaceResultVO.INIT_FACE);
+        faceResult.setMsg("人脸初始化"+(save?"成功":"失败")+","+(save?"请验证登录":"请稍后再试"));
+        faceResult.setName(face.getFaceName());
+        return faceResult;
+    }
+
+}

+ 20 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/service/impl/FaceVefLogServiceImpl.java

@@ -0,0 +1,20 @@
+package com.usky.demo.service.impl;
+
+import com.usky.demo.domain.FaceVefLog;
+import com.usky.demo.mapper.FaceVefLogMapper;
+import com.usky.demo.service.FaceVefLogService;
+import com.usky.common.mybatis.core.AbstractCrudService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ *  服务实现类
+ * </p>
+ *
+ * @author zyj
+ * @since 2024-03-06
+ */
+@Service
+public class FaceVefLogServiceImpl extends AbstractCrudService<FaceVefLogMapper, FaceVefLog> implements FaceVefLogService {
+
+}

+ 18 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/service/impl/SysUserServiceImpl.java

@@ -0,0 +1,18 @@
+package com.usky.demo.service.impl;
+
+import com.usky.common.mybatis.core.AbstractCrudService;
+import com.usky.demo.domain.SysUser;
+import com.usky.demo.mapper.SysUserMapper;
+import com.usky.demo.service.SysUserService;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 用户信息表 服务实现类
+ * </p>
+ *
+ */
+@Service
+public class SysUserServiceImpl extends AbstractCrudService<SysUserMapper, SysUser> implements SysUserService {
+
+}

+ 98 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/service/vo/FaceResultVO.java

@@ -0,0 +1,98 @@
+package com.usky.demo.service.vo;
+
+import lombok.Data;
+
+/**
+ * @author tanyongpeng
+ * <p>des</p>
+ **/
+@Data
+public class FaceResultVO {
+
+    /**
+     * 返回消息
+     */
+    private String msg;
+
+    /**
+     * 状态码
+     */
+    private int code;
+
+    /**
+     * 验证人姓名
+     */
+    private String name;
+
+    /**
+     * 返回token
+     */
+    private String token;
+
+    /**
+     * 数据集
+     */
+    private Object data;
+
+    /**
+     * 相似度
+     */
+    private Float score;
+
+    /*成功*/
+    public static final Integer SUCCESS_CODE = 200;
+    /*相似匹配度*/
+    public static final Integer SATISFY_SCORE = 80;
+    /*调用腾讯云接口发生的异常*/
+    public static final Integer FACE_ERROR = -1;
+    /*数据库没有该人脸*/
+    public static final Integer NOT_FOUND_FACE = -2;
+    /*人脸数据为空*/
+    public static final Integer NULL_ERROR = -3;
+    /*当前人脸被禁用*/
+    public static final Integer FORBIDDEN_FACE = -4;
+    /*初始化人脸*/
+    public static final Integer INIT_FACE = 201;
+
+    public FaceResultVO setCode(int code) {
+        this.code = code;
+        return this;
+    }
+
+    public FaceResultVO setData(Object data) {
+        this.data = data;
+        return this;
+    }
+
+    public FaceResultVO setMsg(String msg) {
+        this.msg = msg;
+        return this;
+    }
+
+    public FaceResultVO setScore(Float score) {
+        this.score = score;
+        return this;
+    }
+
+    public static FaceResultVO error(int code, String msg){
+        return new FaceResultVO().setCode(code).setMsg(msg);
+    }
+
+    public static FaceResultVO error(int code,String msg,Float score){
+        return new FaceResultVO().setCode(code).setMsg(msg).setScore(score);
+    }
+
+    public static FaceResultVO error(int code){
+        return new FaceResultVO().setCode(code);
+    }
+
+    public static FaceResultVO success(){
+        return new FaceResultVO().setCode(SUCCESS_CODE);
+    }
+    public static FaceResultVO success(Object data){
+        return new FaceResultVO().setCode(SUCCESS_CODE).setData(data);
+    }
+    public static FaceResultVO success(String msg){
+        return new FaceResultVO().setCode(SUCCESS_CODE).setMsg(msg);
+    }
+}

+ 60 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/utils/JwtUtils.java

@@ -0,0 +1,60 @@
+package com.usky.demo.utils;
+
+import com.auth0.jwt.JWT;
+import com.auth0.jwt.JWTCreator;
+import com.auth0.jwt.algorithms.Algorithm;
+import com.auth0.jwt.interfaces.DecodedJWT;
+
+import java.util.Calendar;
+import java.util.HashMap;
+import java.util.Map;
+
+/**
+ * @author tanyongpeng
+ * <p>des</p>
+ **/
+public class JwtUtils {
+
+    //properties
+    private static final String SIGN="adefaceeasyMI89AYISLAJspsl=da`23s56!@ds";
+
+    public static String genereteToken(Map<String,String> mapinfo){
+        Calendar instance = Calendar.getInstance();
+        //有效期为24小时
+        instance.add(Calendar.MINUTE,60*24);
+        //map用户存储claim——声明的信息
+        Map<String,Object> map=new HashMap<>();
+        //生成token
+        JWTCreator.Builder builder = JWT.create();
+        //添加payload
+        mapinfo.forEach((k,v)->{
+            builder.withClaim(k,v);
+        });
+        //指定令牌过期时间
+        builder.withExpiresAt(instance.getTime());
+        //指定算法-生成token
+        String token = builder.sign(Algorithm.HMAC256(SIGN));
+        return token;
+    }
+
+    /**
+     * 验证token的合法性
+     * @param token token令牌值
+     * throw 抛出异常-表示验证失败
+     */
+    public synchronized static void decodeToken(String token){
+        JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
+    }
+
+    /**
+     * 获取token信息的方法
+     * @param token token令牌值
+     * @return DecodedJWT对象
+     * throw 抛出异常-表示验证失败
+     */
+    public synchronized static DecodedJWT getTokenInfo(String token){
+        DecodedJWT decodedJWT = JWT.require(Algorithm.HMAC256(SIGN)).build().verify(token);
+        return decodedJWT;
+    }
+
+}

+ 25 - 0
service-meet/service-meet-biz/src/main/java/com/usky/demo/utils/TimeUtils.java

@@ -0,0 +1,25 @@
+package com.usky.demo.utils;
+
+import java.text.SimpleDateFormat;
+import java.util.Date;
+
+/**
+ * @author tanyongpeng
+ * <p>des</p>
+ **/
+public class TimeUtils {
+
+    public static String timeQuantum(){
+        int hour = Integer.parseInt(new SimpleDateFormat("HH").format(new Date()));
+        if (hour >=0 && hour <= 11){
+            return "上午";
+        }
+        if (hour == 12 || hour == 13){
+            return "中午";
+        }
+        if (hour > 13 && hour <= 18){
+            return "下午";
+        }
+        return "晚上";
+    }
+}

+ 25 - 0
service-meet/service-meet-biz/src/main/resources/bootstrap.yml

@@ -0,0 +1,25 @@
+# Tomcat
+server:
+  port: 9897
+
+# Spring
+spring: 
+  application:
+    # 应用名称
+    name: service-meet
+  profiles:
+    # 环境配置
+    active: dev
+  cloud:
+    nacos:
+      discovery:
+        # 服务注册地址
+        server-addr: usky-cloud-nacos:8848
+      config:
+        # 配置中心地址
+        server-addr: usky-cloud-nacos:8848
+        # 配置文件格式
+        file-extension: yml
+        # 共享配置
+        shared-configs:
+          - application-${spring.profiles.active}.${spring.cloud.nacos.config.file-extension}

+ 108 - 0
service-meet/service-meet-biz/src/main/resources/doc/index.adoc

@@ -0,0 +1,108 @@
+= 安防项目
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Version |  Update Time  | Status | Author |  Description
+|v2022-04-21 16:57:08|2022-04-21 16:57:08|auto|@yq|Created by smart-doc
+|====================
+
+
+== &lt;p&gt;参数配置表 前端控制器&lt;/p&gt;
+== &lt;p&gt;部门信息&lt;/p&gt;
+=== 查看部门信息
+*URL:* http:10.23.39.1:8082/sysDept/list
+
+*Type:* POST
+
+*Author:* ya
+
+*Content-Type:* application/json; charset=utf-8
+
+
+
+
+*Body-parameters:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Parameter | Type|Description|Required|Since
+|deptId|int64|部门id|false|-
+|parentId|int64|父部门id|false|-
+|ancestors|string|祖级列表|false|-
+|deptName|string|部门名称|false|-
+|orderNum|int32|显示顺序|false|-
+|leader|string|负责人|false|-
+|phone|string|联系电话|false|-
+|email|string|邮箱|false|-
+|status|string|部门状态(0正常 1停用)|false|-
+|delFlag|string|删除标志(0代表存在 2代表删除)|false|-
+|createBy|string|创建者|false|-
+|createTime|string|创建时间|false|-
+|updateBy|string|更新者|false|-
+|updateTime|string|更新时间|false|-
+|bId|int64|建筑id|false|-
+|====================
+
+*Response-fields:*
+
+[width="100%",options="header"]
+[stripes=even]
+|====================
+|Field | Type|Description|Since
+|status|object|No comments found.|-
+|code|string|No comments found.|-
+|msg|string|No comments found.|-
+|data|object|No comments found.|-
+|└─deptId|int64|部门id|-
+|└─parentId|int64|父部门id|-
+|└─ancestors|string|祖级列表|-
+|└─deptName|string|部门名称|-
+|└─orderNum|int32|显示顺序|-
+|└─leader|string|负责人|-
+|└─phone|string|联系电话|-
+|└─email|string|邮箱|-
+|└─status|string|部门状态(0正常 1停用)|-
+|└─delFlag|string|删除标志(0代表存在 2代表删除)|-
+|└─createBy|string|创建者|-
+|└─createTime|string|创建时间|-
+|└─updateBy|string|更新者|-
+|└─updateTime|string|更新时间|-
+|└─bId|int64|建筑id|-
+|exception|string|No comments found.|-
+|====================
+
+*Response-example:*
+----
+{
+	"status": {
+		
+	},
+	"code": "97564",
+	"msg": "wnr5qt",
+	"data": [
+		{
+			"deptId": 540,
+			"parentId": 858,
+			"ancestors": "o5lg60",
+			"deptName": "文.沈",
+			"orderNum": 260,
+			"leader": "ufz93p",
+			"phone": "17852835049",
+			"email": "智渊.徐@yahoo.com",
+			"status": "nu6cnp",
+			"delFlag": "72oiji",
+			"createBy": "5fxr6j",
+			"createTime": "2022-04-21 16:57:10",
+			"updateBy": "4kcs4e",
+			"updateTime": "2022-04-21 16:57:10",
+			"bId": 977
+		}
+	],
+	"exception": "53u6bg"
+}
+----
+
+== &lt;p&gt;用户信息表 前端控制器&lt;/p&gt;
+

+ 74 - 0
service-meet/service-meet-biz/src/main/resources/logback.xml

@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<configuration scan="true" scanPeriod="60 seconds" debug="false">
+    <!-- 日志存放路径 -->
+	<property name="log.path" value="/var/log/uskycloud/usky-demo" />
+   <!-- 日志输出格式 -->
+	<property name="log.pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{20} - [%method,%line] - %msg%n" />
+
+    <!-- 控制台输出 -->
+	<appender name="console" class="ch.qos.logback.core.ConsoleAppender">
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+	</appender>
+
+    <!-- 系统日志输出 -->
+	<appender name="file_info" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/info.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+		<rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+			<fileNamePattern>${log.path}/info.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+		</rollingPolicy>
+		<encoder>
+			<pattern>${log.pattern}</pattern>
+		</encoder>
+		<filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>INFO</level>
+            <!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+            <!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+	</appender>
+
+    <appender name="file_error" class="ch.qos.logback.core.rolling.RollingFileAppender">
+	    <file>${log.path}/error.log</file>
+        <!-- 循环政策:基于时间创建日志文件 -->
+        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
+            <!-- 日志文件名格式 -->
+            <fileNamePattern>${log.path}/error.%d{yyyy-MM-dd}.log</fileNamePattern>
+			<!-- 日志最大的历史 60天 -->
+			<maxHistory>60</maxHistory>
+        </rollingPolicy>
+        <encoder>
+            <pattern>${log.pattern}</pattern>
+        </encoder>
+        <filter class="ch.qos.logback.classic.filter.LevelFilter">
+            <!-- 过滤的级别 -->
+            <level>ERROR</level>
+			<!-- 匹配时的操作:接收(记录) -->
+            <onMatch>ACCEPT</onMatch>
+			<!-- 不匹配时的操作:拒绝(不记录) -->
+            <onMismatch>DENY</onMismatch>
+        </filter>
+    </appender>
+
+    <!-- 系统模块日志级别控制  -->
+	<logger name="com.usky" level="info" />
+	<!-- Spring日志级别控制  -->
+	<logger name="org.springframework" level="warn" />
+
+	<root level="info">
+		<appender-ref ref="console" />
+	</root>
+	
+	<!--系统操作日志-->
+    <root level="info">
+        <appender-ref ref="file_info" />
+        <appender-ref ref="file_error" />
+    </root>
+</configuration>

+ 28 - 0
service-meet/service-meet-biz/src/main/resources/mapper.demo/SysUserMapper.xml

@@ -0,0 +1,28 @@
+<?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.usky.demo.mapper.SysUserMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.demo.domain.SysUser">
+        <id column="user_id" property="userId" />
+        <result column="dept_id" property="deptId" />
+        <result column="user_name" property="userName" />
+        <result column="nick_name" property="nickName" />
+        <result column="user_type" property="userType" />
+        <result column="email" property="email" />
+        <result column="phonenumber" property="phonenumber" />
+        <result column="sex" property="sex" />
+        <result column="avatar" property="avatar" />
+        <result column="password" property="password" />
+        <result column="status" property="status" />
+        <result column="del_flag" property="delFlag" />
+        <result column="login_ip" property="loginIp" />
+        <result column="login_date" property="loginDate" />
+        <result column="create_by" property="createBy" />
+        <result column="create_time" property="createTime" />
+        <result column="update_by" property="updateBy" />
+        <result column="update_time" property="updateTime" />
+        <result column="remark" property="remark" />
+    </resultMap>
+
+</mapper>

+ 19 - 0
service-meet/service-meet-biz/src/main/resources/mapper/demo/FaceMapper.xml

@@ -0,0 +1,19 @@
+<?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.usky.demo.mapper.FaceMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.demo.domain.Face">
+        <id column="fid" property="fid" />
+        <result column="face_base" property="faceBase" />
+        <result column="create_time" property="createTime" />
+        <result column="vef_num" property="vefNum" />
+        <result column="face_name" property="faceName" />
+        <result column="remark" property="remark" />
+        <result column="face_status" property="faceStatus" />
+        <result column="update_extend1" property="updateExtend1" />
+        <result column="update_extend2" property="updateExtend2" />
+        <result column="update_extend3" property="updateExtend3" />
+    </resultMap>
+
+</mapper>

+ 14 - 0
service-meet/service-meet-biz/src/main/resources/mapper/demo/FaceVefLogMapper.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.usky.demo.mapper.FaceVefLogMapper">
+
+    <!-- 通用查询映射结果 -->
+    <resultMap id="BaseResultMap" type="com.usky.demo.domain.FaceVefLog">
+        <id column="lid" property="lid" />
+        <result column="vef_time" property="vefTime" />
+        <result column="vef_code" property="vefCode" />
+        <result column="vef_msg" property="vefMsg" />
+        <result column="login_name" property="loginName" />
+    </resultMap>
+
+</mapper>

+ 15 - 0
service-meet/service-meet-biz/src/main/resources/smart-doc.json

@@ -0,0 +1,15 @@
+{
+  "outPath":"./src/main/resources/doc",
+  "serverUrl": "http:10.23.39.1:8082/",
+  "isStrict": false,
+  "coverOld": true,
+  "allInOne": true,
+  "packageFilters": "com.usky.demo.controller.web",
+  "requestExample":"false",
+  "responseExample":"true",
+  "projectName": "安防项目",
+  "appKey": "20211216921084883495813120",
+  "appToken":"36bde2426ad546a5a50311bb747e7e61",
+  "secret": "N@Pd,KXAHki*BW3=zK.XPNykf!=CM79J",
+  "openUrl": "http://101.133.214.75:7700/api"
+}