commit 758cfbf0b9c675731b303ad03b5ca0e4996aa7bb
Author: review512jwy@163.com <“review512jwy@163.com”>
Date: Fri Apr 11 09:22:54 2025 +0800
初始化
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..520c87b
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,16 @@
+/target/
+/logs/
+/.idea/
+*.iml
+*.bak
+*.log
+/.settings/
+*.project
+*.classpath
+*.factorypath
+*.springBeans
+/.apt_generated/
+/.externalToolBuilders/
+/bin/
+/model2d3d-viewer-back-controller/tmp/
+application-*.properties
diff --git a/document/cmd b/document/cmd
new file mode 100644
index 0000000..74660ad
--- /dev/null
+++ b/document/cmd
@@ -0,0 +1,31 @@
+aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 381659385655.dkr.ecr.ap-northeast-1.amazonaws.com
+
+docker tag 67f91fc6cfbf 381659385655.dkr.ecr.ap-northeast-1.amazonaws.com/tokyo-build-business:latest
+
+docker push 381659385655.dkr.ecr.ap-northeast-1.amazonaws.com/tokyo-build-business:latest
+
+docker pull 381659385655.dkr.ecr.ap-northeast-1.amazonaws.com/tokyo-build-business:latest
+
+docker run -d -p 8887:20008 -v /home/data-center-business/back/application.properties:/home/data-center-business/config/application.properties 381659385655.dkr.ecr.ap-northeast-1.amazonaws.com/tokyo-build-business
+
+aws configure
+
+docker run -e apiEnable=false -e datasourceDNS=tokyo-building-db.caetvgb7diak.ap-northeast-1.rds.amazonaws.com -e datasourceTimeZone=Asia/Tokyo -e datasourceUsername=techsor -e datasourcePassword=Abc#123456xyz -e loggingLevel=ERROR -e loggingPath=/home/data-center-business/log -e loggingAppender=SYSLOG -e redisHost=replication-group-tokyo-build.ncvpel.ng.0001.apne1.cache.amazonaws.com -e redisPassword= -e awsAccesskey=AKIA5OFH5OOZHM3U3KX4 -e awsSecretkey=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 -e awsBucket=tokyo-build-databucket-381659385655 -e ibatisLoggingLog=ERROR -e ibatisLoggingLogFactory=ERROR -d -p 20008:20008 923770123186.dkr.ecr.ap-northeast-1.amazonaws.com/tokyo-build-business:latest
+
+阿里云
+docker tag e1fe6f58961e registry.cn-shanghai.aliyuncs.com/test-data-business/data-business-server:latest
+
+docker push registry.cn-shanghai.aliyuncs.com/test-data-business/data-business-server:latest
+
+docker pull registry.cn-shanghai.aliyuncs.com/test-data-business/data-business-server:latest
+
+docker exec -it 3c77bb84d338 /bin/bash
+
+docker run -d -p 20008:20015 -v /home/application.properties:/home/model2d3d-viewer-back/config/application.properties registry.cn-shanghai.aliyuncs.com/test-data-business/data-business-server
+
+测试环境
+aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin 923770123186.dkr.ecr.ap-northeast-1.amazonaws.com
+
+docker tag ecee6b583d3c 923770123186.dkr.ecr.ap-northeast-1.amazonaws.com/tokyo-build-business:latest
+
+docker push 923770123186.dkr.ecr.ap-northeast-1.amazonaws.com/tokyo-build-business:latest
diff --git a/document/db/init.sql b/document/db/init.sql
new file mode 100644
index 0000000..6482df3
--- /dev/null
+++ b/document/db/init.sql
@@ -0,0 +1,140 @@
+/*
+SQLyog 企业版 - MySQL GUI v8.14
+MySQL - 8.0.28 : Database - model2d3d_viewer_back
+*********************************************************************
+*/
+
+/*!40101 SET NAMES utf8 */;
+
+/*!40101 SET SQL_MODE=''*/;
+
+/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
+/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
+/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
+/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
+CREATE DATABASE /*!32312 IF NOT EXISTS*/`model2d3d_viewer_back` /*!40100 DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci */ /*!80016 DEFAULT ENCRYPTION='N' */;
+
+USE `model2d3d_viewer_back`;
+
+/*Table structure for table `basic_company` */
+
+DROP TABLE IF EXISTS `basic_company`;
+
+CREATE TABLE `basic_company` (
+ `id` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL,
+ `parent_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `company_name` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `flag` int DEFAULT '0' COMMENT '0-正常,1-删除',
+ `create_time` bigint DEFAULT NULL,
+ `modify_time` bigint DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='企业表';
+
+/*Data for the table `basic_company` */
+
+insert into `basic_company`(`id`,`parent_id`,`company_name`,`flag`,`create_time`,`modify_time`) values ('1','-1','MiniSolution',0,1658978002231,1658978002231);
+/*Table structure for table `basic_menu` */
+
+DROP TABLE IF EXISTS `basic_menu`;
+
+CREATE TABLE `basic_menu` (
+ `id` bigint NOT NULL AUTO_INCREMENT,
+ `parent_menu_id` bigint DEFAULT NULL,
+ `menu_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `menu_name_en` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `menu_name_jp` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `remark` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `menu_level` int DEFAULT '1' COMMENT '菜单级别',
+ `flag` int DEFAULT '0' COMMENT '0-正常,1-删除',
+ `create_time` bigint DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+/*Data for the table `basic_menu` */
+
+/*Table structure for table `basic_role` */
+
+DROP TABLE IF EXISTS `basic_role`;
+
+CREATE TABLE `basic_role` (
+ `id` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `company_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `role_name` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `description` varchar(500) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `flag` int DEFAULT '0' COMMENT '0-正常,1-删除',
+ `creator_id` bigint DEFAULT NULL,
+ `create_time` bigint DEFAULT NULL,
+ `modifier_id` bigint DEFAULT NULL,
+ `modify_time` bigint DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+/*Table structure for table `basic_role_menu_relation` */
+
+DROP TABLE IF EXISTS `basic_role_menu_relation`;
+
+CREATE TABLE `basic_role_menu_relation` (
+ `role_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `menu_id` bigint DEFAULT NULL,
+ `creator_id` bigint DEFAULT NULL,
+ `create_time` bigint DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+
+/*Table structure for table `basic_role_user_relation` */
+
+DROP TABLE IF EXISTS `basic_role_user_relation`;
+
+CREATE TABLE `basic_role_user_relation` (
+ `user_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `role_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `creator_id` bigint DEFAULT NULL,
+ `create_time` bigint DEFAULT NULL
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+
+/*Table structure for table `basic_user` */
+
+DROP TABLE IF EXISTS `basic_user`;
+
+CREATE TABLE `basic_user` (
+ `id` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `company_id` varchar(50) COLLATE utf8mb4_unicode_ci NOT NULL,
+ `shop_uuid` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `username` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `login_name` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `password_modify_time` bigint DEFAULT NULL,
+ `salt` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `email` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `mobile_number` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `last_login_time` bigint DEFAULT NULL,
+ `remark` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL COMMENT '备注',
+ `flag` int NOT NULL DEFAULT '0' COMMENT '0-正常,1-删除',
+ `expire_time` bigint DEFAULT '4114487556000',
+ `create_time` bigint DEFAULT NULL,
+ `creator_id` bigint DEFAULT NULL,
+ `modify_time` bigint DEFAULT NULL,
+ `modifier_id` bigint DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+/*Data for the table `basic_user` */
+
+insert into `basic_user`(`id`,`company_id`,`shop_uuid`,`username`,`login_name`,`password`,`password_modify_time`,`salt`,`email`,`mobile_number`,`last_login_time`,`remark`,`flag`,`expire_time`,`create_time`,`creator_id`,`modify_time`,`modifier_id`) values ('1','1','1','admin_name','admin','nVg+buw0YAs=',1670312031273,'09bc3a7898','1053492832@qq.com',NULL,1743496632944,NULL,0,4114487556000,NULL,NULL,NULL,NULL);
+/*Table structure for table `login_history` */
+
+DROP TABLE IF EXISTS `login_history`;
+
+CREATE TABLE `login_history` (
+ `id` bigint NOT NULL AUTO_INCREMENT,
+ `user_id` varchar(50) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `request_ip` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
+ `login_time` bigint DEFAULT NULL,
+ PRIMARY KEY (`id`)
+) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
+
+/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
+/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
+/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
+/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
diff --git a/document/start.sh b/document/start.sh
new file mode 100644
index 0000000..902b2e7
--- /dev/null
+++ b/document/start.sh
@@ -0,0 +1,30 @@
+#! /bin/sh
+#启动方法
+start(){
+now=`date "+%Y%m%d%H%M%S"`
+cd /home/model2d3d-viewer-back/back/server/run && nohup /usr/local/java/jdk1.8.0_221/bin/java -server -Xms256m -Xmx256m -jar /home/model2d3d-viewer-back/back/server/run/model2d3d-viewer-back-controller-0.0.1-SNAPSHOT.jar > /dev/null 2>boot.log &
+}
+#停止方法
+stop(){
+ ps -ef|grep java|grep model2d3d-viewer-back-controller-0.0.1-SNAPSHOT.jar|awk '{print $2}'|while read pid
+ do
+ kill -9 $pid
+ done
+}
+
+case "$1" in
+start)
+start
+;;
+stop)
+stop
+;;
+restart)
+stop
+start
+;;
+*)
+printf 'Usage: %s {start|stop|restart}\n' "$prog"
+exit 1
+;;
+esac
\ No newline at end of file
diff --git a/document/update.sh b/document/update.sh
new file mode 100644
index 0000000..350563e
--- /dev/null
+++ b/document/update.sh
@@ -0,0 +1,17 @@
+#!/bin/bash
+
+projectName=model2d3d-viewer-back
+backFilePath=/home/$projectName/back/server
+
+basepath=$(cd `dirname $0`; pwd)
+cd $basepath
+
+echo "start for Web"
+
+rm -rf $backFilePath/run/lib
+unzip -o $backFilePath/$projectName.zip -d $backFilePath/run
+\cp -r $backFilePath/run/$projectName/* $backFilePath/run/
+rm -rf $backFilePath/run/$projectName
+
+sh start.sh restart
+exit
\ No newline at end of file
diff --git a/model2d3d-viewer-back-common/.gitignore b/model2d3d-viewer-back-common/.gitignore
new file mode 100644
index 0000000..aa23915
--- /dev/null
+++ b/model2d3d-viewer-back-common/.gitignore
@@ -0,0 +1,15 @@
+/target/
+/logs/
+/.idea/
+*.iml
+*.bak
+*.log
+/.settings/
+*.project
+*.classpath
+*.factorypath
+*.springBeans
+/.apt_generated/
+/.externalToolBuilders/
+/bin/
+application-*.properties
diff --git a/model2d3d-viewer-back-common/pom.xml b/model2d3d-viewer-back-common/pom.xml
new file mode 100644
index 0000000..5720709
--- /dev/null
+++ b/model2d3d-viewer-back-common/pom.xml
@@ -0,0 +1,35 @@
+
+
+ 4.0.0
+
+ com.techsor
+ model2d3d-viewer-back
+ 0.0.1-SNAPSHOT
+
+ model2d3d-viewer-back-common
+ model2d3d-viewer-back-common
+ http://maven.apache.org
+
+ UTF-8
+
+
+
+ junit
+ junit
+ test
+
+
+
+ com.techsor
+ model2d3d-viewer-back-dao
+ 0.0.1-SNAPSHOT
+
+
+ com.techsor
+ model2d3d-viewer-back-util
+ 0.0.1-SNAPSHOT
+
+
+
+
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/Constants.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/Constants.java
new file mode 100644
index 0000000..f2913ed
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/Constants.java
@@ -0,0 +1,18 @@
+package com.model2d3d.viewer.back.common;
+/**
+* @author Mr.Jiang
+* @time 2022年5月20日 下午2:01:41
+*/
+public class Constants {
+
+ //这个很重要,不要随便动
+ public static final String DES_SALT = "ci3b512jwy199511";
+
+ public static final String APP_NAME = "model2d3d_viewer_back:";
+
+ //用户ID,登录名,企业ID,token
+ public static final String ACCESS_TOKEN_FORMAT = APP_NAME + "RequestHeader:AccessToken:{0}:{1}:{2}:{3}";
+
+ public static final String CAPTCHA_VERIFICATION = APP_NAME + "CAPTCHA:VERIFICATION:";
+
+}
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/exception/BusinessException.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/exception/BusinessException.java
new file mode 100644
index 0000000..5981857
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/exception/BusinessException.java
@@ -0,0 +1,36 @@
+package com.model2d3d.viewer.back.common.exception;
+
+/**
+ * 业务异常处理
+ *
+ */
+public class BusinessException extends RuntimeException{
+
+ /**
+ * 实例化一个新的业务异常
+ *
+ * @param msg 异常信息
+ */
+ public BusinessException(String msg) {
+ super(msg);
+ }
+
+ /**
+ * 实例化一个新的业务异常
+ *
+ * @param cause 异常原因
+ */
+ public BusinessException(Throwable cause) {
+ super(cause);
+ }
+
+ /**
+ * 实例化一个新的业务异常
+ *
+ * @param msg 异常信息
+ * @param cause 异常原因
+ */
+ public BusinessException(String msg, Throwable cause) {
+ super(msg, cause);
+ }
+}
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/exception/MsgCodeException.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/exception/MsgCodeException.java
new file mode 100644
index 0000000..2930cba
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/exception/MsgCodeException.java
@@ -0,0 +1,26 @@
+package com.model2d3d.viewer.back.common.exception;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+public class MsgCodeException extends RuntimeException{
+
+ private String message;
+
+ public MsgCodeException(String message) {
+ super(message);
+ this.message = message;
+ }
+
+
+ public String getMessage() {
+ return message;
+ }
+
+ public void setMessage(String message) {
+ this.message = message;
+ }
+
+}
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/PropertySourceYumFactory.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/PropertySourceYumFactory.java
new file mode 100644
index 0000000..f936b14
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/PropertySourceYumFactory.java
@@ -0,0 +1,26 @@
+package com.model2d3d.viewer.back.common.language;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.springframework.boot.env.YamlPropertySourceLoader;
+import org.springframework.core.env.PropertySource;
+import org.springframework.core.io.support.DefaultPropertySourceFactory;
+import org.springframework.core.io.support.EncodedResource;
+
+/**
+ * @PropertySource 解析.yum文件需要指定该工厂
+ */
+public class PropertySourceYumFactory extends DefaultPropertySourceFactory {
+
+ @Override
+ public PropertySource> createPropertySource(String name, EncodedResource resource) throws IOException {
+ if (resource == null) {
+ return super.createPropertySource(name, resource);
+ }
+ List> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
+ return sources.get(0);
+ }
+
+
+}
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/MsgLanguageChange.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/MsgLanguageChange.java
new file mode 100644
index 0000000..53d4f1a
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/MsgLanguageChange.java
@@ -0,0 +1,54 @@
+package com.model2d3d.viewer.back.common.language.msg;
+
+import org.apache.commons.collections.MapUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+@Component
+public class MsgLanguageChange {
+ @Autowired
+ private Msg_EN msgEn;
+ @Autowired
+ private Msg_CN msgCn;
+ @Autowired
+ private Msg_JP msgJp;
+
+ /**
+ * 参数映射
+ * @param languaType
+ * @param code
+ * @return
+ */
+ public String getParameterMapByCode(Integer languaType,String code){
+ String msg = null;
+ if(null != languaType){
+ if(languaType == 0){//中文
+ msg = MapUtils.getString(msgCn.getParameterMap(), code, code);
+ }else if(languaType == 1){//英文
+ msg = MapUtils.getString(msgEn.getParameterMap(), code, code);
+ }else if(languaType == 2){//日语
+ msg = MapUtils.getString(msgJp.getParameterMap(), code, code);
+ }
+ }else{
+ msg = MapUtils.getString(msgJp.getParameterMap(), code, code);
+ }
+ return msg;
+ }
+
+ public String getBadRequestMessage(Integer languaType,String code){
+ String msg = null;
+ if(null != languaType){
+ if(languaType == 0){//中文
+ msg = MapUtils.getString(msgCn.getArgumentNotValid(), code, code);
+ }else if(languaType == 1){//英文
+ msg = MapUtils.getString(msgEn.getArgumentNotValid(), code, code);
+ }else if(languaType == 2){//日语
+ msg = MapUtils.getString(msgJp.getArgumentNotValid(), code, code);
+ }
+ }else{
+ msg = MapUtils.getString(msgJp.getArgumentNotValid(), code, code);
+ }
+ return msg;
+ }
+
+}
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_CN.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_CN.java
new file mode 100644
index 0000000..10aac23
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_CN.java
@@ -0,0 +1,25 @@
+package com.model2d3d.viewer.back.common.language.msg;
+
+import java.util.Map;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+import com.model2d3d.viewer.back.common.language.PropertySourceYumFactory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@Component
+@PropertySource(value = "classpath:/config/language/msg/msg_cn.yml", encoding = "UTF-8", factory = PropertySourceYumFactory.class)
+@ConfigurationProperties(prefix = "msgcn")
+public class Msg_CN {
+
+ private Map parameterMap;
+
+ private Map argumentNotValid;
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_EN.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_EN.java
new file mode 100644
index 0000000..91dfc36
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_EN.java
@@ -0,0 +1,25 @@
+package com.model2d3d.viewer.back.common.language.msg;
+
+import java.util.Map;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+import com.model2d3d.viewer.back.common.language.PropertySourceYumFactory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@Component
+@PropertySource(value = "classpath:/config/language/msg/msg_en.yml", encoding = "UTF-8", factory = PropertySourceYumFactory.class)
+@ConfigurationProperties(prefix = "msgen")
+public class Msg_EN {
+
+ private Map parameterMap;
+
+ private Map argumentNotValid;
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_JP.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_JP.java
new file mode 100644
index 0000000..7b3a5a9
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/language/msg/Msg_JP.java
@@ -0,0 +1,25 @@
+package com.model2d3d.viewer.back.common.language.msg;
+
+import java.util.Map;
+
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.PropertySource;
+import org.springframework.stereotype.Component;
+
+import com.model2d3d.viewer.back.common.language.PropertySourceYumFactory;
+
+import lombok.Getter;
+import lombok.Setter;
+
+@Setter
+@Getter
+@Component
+@PropertySource(value = "classpath:/config/language/msg/msg_jp.yml", encoding = "UTF-8", factory = PropertySourceYumFactory.class)
+@ConfigurationProperties(prefix = "msgjp")
+public class Msg_JP {
+
+ private Map parameterMap;
+
+ private Map argumentNotValid;
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/BaseResponse.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/BaseResponse.java
new file mode 100644
index 0000000..48ea11e
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/BaseResponse.java
@@ -0,0 +1,51 @@
+package com.model2d3d.viewer.back.common.response;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+public class BaseResponse {
+ /**
+ * 返回码
+ */
+ @Schema(description ="状态码, 0或者200表示成功",example = "0")
+ private int code;
+ /**
+ * 提示信息
+ */
+ @Schema(description ="简单的提示信息",example = "服务器错误")
+ private String msg = "success";
+
+ public BaseResponse() {
+
+ }
+
+ public BaseResponse(int code) {
+ this.code = code;
+ }
+
+ public BaseResponse(int code, String msg) {
+ this.code = code;
+ this.msg = msg;
+ }
+
+ public int getCode() {
+ return code;
+ }
+
+ public void setCode(int code) {
+ this.code = code;
+ }
+
+ public String getMsg() {
+ return msg;
+ }
+
+ public void setMsg(String msg) {
+ this.msg = msg;
+ }
+}
+
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/PageResponse.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/PageResponse.java
new file mode 100644
index 0000000..a6f97d3
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/PageResponse.java
@@ -0,0 +1,66 @@
+package com.model2d3d.viewer.back.common.response;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+
+import java.util.Map;
+
+/**
+ *
+ * @author jwy-style
+ *
+ * @param
+ */
+public class PageResponse extends BaseResponse{
+ /**
+ * 对象信息
+ */
+ private T data;
+
+ private Map errorMap;
+
+ public PageResponse() {
+ }
+
+ public PageResponse(int code) {
+ super(code);
+ }
+
+ public PageResponse(int code, String msg) {
+ super(code, msg);
+ }
+
+ public PageResponse(int code,String msg,Map errorMap){
+ super(code, msg);
+ this.errorMap = errorMap;
+ }
+
+ public static PageResponse success(Object data){
+ PageResponse pageResponse = new PageResponse();
+ pageResponse.setData((IPage) data);
+ pageResponse.setCode(ResponseCode.SUCCESS);
+ pageResponse.setMsg("success");
+ return pageResponse;
+ }
+
+
+ public Map getErrorMap() {
+ return errorMap;
+ }
+
+ public void setErrorMap(Map errorMap) {
+ this.errorMap = errorMap;
+ }
+
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+
+
+
+
+}
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/ResponseCode.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/ResponseCode.java
new file mode 100644
index 0000000..df791b1
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/ResponseCode.java
@@ -0,0 +1,28 @@
+package com.model2d3d.viewer.back.common.response;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+public class ResponseCode {
+
+ /** 成功 */
+ public static final int OK = 0;
+ /**
+ * 请求已成功,请求所希望的响应头或数据体将随此响应返回。
+ */
+ public static final int SUCCESS = 200;
+
+ //错误请求
+ public static final int BAD_REQUEST = 400;
+ //未授权
+ public static final int AUTHORIZE_FAILED = 401;
+
+ //服务器内部错误
+ public static final int SERVER_ERROR = 500;
+ public static final String SERVER_ERROR_MSG = "service error";
+
+ //查看msg提示信息
+ public static final int MSG_ERROR = 20001;
+}
diff --git a/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/SimpleDataResponse.java b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/SimpleDataResponse.java
new file mode 100644
index 0000000..94af3ea
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/java/com/model2d3d/viewer/back/common/response/SimpleDataResponse.java
@@ -0,0 +1,104 @@
+package com.model2d3d.viewer.back.common.response;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+
+import java.util.Map;
+
+/**
+ *
+ * @author jwy-style
+ *
+ * @param
+ */
+@JsonInclude(JsonInclude.Include.NON_NULL)
+public class SimpleDataResponse extends BaseResponse {
+ /**
+ * 单个对象
+ */
+ @Schema(description ="返回的数据",example = "object")
+ private T data;
+
+ /**
+ * The parameters Error map.
+ */
+ @Schema(description ="复杂的提示信息",example = "{\"name\":\"长度过长\",\"age\":\"年龄太大\",\"weight\":\"体重超标\"}")
+ private Map errorMap;
+
+ public SimpleDataResponse() {
+ super();
+ }
+
+ public SimpleDataResponse(int code) {
+ super(code);
+ }
+
+ public SimpleDataResponse(int code, String msg) {
+ super(code, msg);
+ }
+
+ /**
+ * 响应结果,携带错误Map
+ * @param code
+ * @param msg
+ * @param errorMap
+ */
+ public SimpleDataResponse(int code, String msg, Map errorMap) {
+ this(code, msg);
+ this.errorMap = errorMap;
+ }
+
+ /**
+ * 成功响应
+ * @return
+ */
+ public static SimpleDataResponse success(){
+ return new SimpleDataResponse(ResponseCode.SUCCESS,"Success");
+ }
+
+ /**
+ * 多条数据,成功响应
+ * @param rows
+ * @return
+ */
+ public static SimpleDataResponse success(int rows){
+ return new SimpleDataResponse(ResponseCode.SUCCESS,"Success: "+rows);
+ }
+
+ /**
+ * 成功响应,携带数据对象返回
+ * @param data
+ * @return
+ */
+ public static SimpleDataResponse success(Object data){
+ SimpleDataResponse comm = success();
+ comm.setData(data);
+ return comm;
+ }
+
+
+ public static SimpleDataResponse fail(int code,String message){
+ return new SimpleDataResponse(code,message);
+ }
+ public static SimpleDataResponse fail(int code,String message,Object data){
+ SimpleDataResponse simpleDataResponse= new SimpleDataResponse(code,message);
+ simpleDataResponse.setData(data);
+ return simpleDataResponse;
+ }
+ public T getData() {
+ return data;
+ }
+
+ public void setData(T data) {
+ this.data = data;
+ }
+
+ public Map getErrorMap() {
+ return errorMap;
+ }
+
+ public void setErrorMap(Map errorMap) {
+ this.errorMap = errorMap;
+ }
+}
diff --git a/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_cn.yml b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_cn.yml
new file mode 100644
index 0000000..0f651aa
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_cn.yml
@@ -0,0 +1,38 @@
+msgcn:
+ argumentNotValid:
+ 1000: 未通过参数校验
+ 1001: 参数不能为空
+ 1002: 长度不能超过{0}
+ 1003: 长度无效
+ 1004: 无效的邮箱
+ 1005: 数值范围在{0}到{1}之间
+ 1006: 必须大于或等于{0}
+ 1007: 必须小于或等于{0}
+ 1008: 无效的参数
+ parameterMap:
+ serviceError: 内部服务错误
+ tokenError: 接口鉴权失败
+ excelEmpty: 表格为空
+ lineNum: 第{0}行:
+ paramsFormatError: 参数格式错误
+ verifCodeExpired: 验证码过期
+ verifCodeError: 验证码错误
+ accountExpired: 该账号已过期
+ pwdError: 密码错误
+ userNotExist: 用户不存在
+ noOperationAuth: 无操作权限
+ excelBuildingLineDuplicate: 表格内存在相同的数据
+ userOrEmailNotExist: 用户名或邮箱不存在
+ companyNameHasExisted: 平台已存在此企业
+ taowaComapny: 不可使用下级企业作为父企业
+ hasSubsidiary: 删除的企业拥有下级企业,需先处理下级企业
+ roleNameExist: 角色名已存在
+ roleHasBinded: 角色已绑定用户,请先解绑再删除
+ loginNameOrEmailHasExisted: 用户名或邮箱已被使用
+ mailAddUserPwdSubject: 新建账号密码
+ mailAddUserPwdContent: 账号 {0} 的密码为:{1}, 请妥善保管
登陆网址:{2}
+ mailResetUserPwdSubject: 重置账号密码
+ pwdFormatError: 密码组成必须包含数字、英文字母、特殊符号(~!@#$%^&*)且大于等于12位
+ oldPwdError: 旧密码错误
+ newPwdSameOld: 新密码不得与旧密码相同
+ companyLimit: 最多可创建15个企业
\ No newline at end of file
diff --git a/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_en.yml b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_en.yml
new file mode 100644
index 0000000..1af63ab
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_en.yml
@@ -0,0 +1,38 @@
+msgen:
+ argumentNotValid:
+ 1000: 未通过参数校验
+ 1001: 参数不能为空
+ 1002: 长度不能超过{0}
+ 1003: 长度无效
+ 1004: 无效的邮箱
+ 1005: 数值范围在{0}到{1}之间
+ 1006: 必须大于或等于{0}
+ 1007: 必须小于或等于{0}
+ 1008: 无效的参数
+ parameterMap:
+ serviceError: Internal service error.
+ tokenError: API authentication failed.
+ excelEmpty: The spreadsheet is empty.
+ lineNum: "Lines {0}:"
+ paramsFormatError: Parameter format error.
+ verifCodeExpired: Verification code expired.
+ verifCodeError: Verification code error.
+ accountExpired: The account has expired.
+ pwdError: Password error.
+ userNotExist: User does not exist.
+ noOperationAuth: No operation permission.
+ excelBuildingLineDuplicate: Duplicate data exists in the spreadsheet.
+ userOrEmailNotExist: 用户名或邮箱不存在
+ companyNameHasExisted: 平台已存在此企业
+ taowaComapny: 不可使用下级企业作为父企业
+ hasSubsidiary: 删除的企业拥有下级企业,需先处理下级企业
+ roleNameExist: 角色名已存在
+ roleHasBinded: 角色已绑定用户,请先解绑再删除
+ loginNameOrEmailHasExisted: 用户名或邮箱已被使用
+ mailAddUserPwdSubject: 新建账号密码
+ mailAddUserPwdContent: 账号 {0} 的密码为:{1}, 请妥善保管
登陆网址:{2}
+ mailResetUserPwdSubject: 重置账号密码
+ pwdFormatError: 密码组成必须包含数字、英文字母、特殊符号(~!@#$%^&*)且大于等于12位
+ oldPwdError: 旧密码错误
+ newPwdSameOld: 新密码不得与旧密码相同
+ companyLimit: 最多可创建15个企业
\ No newline at end of file
diff --git a/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_jp.yml b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_jp.yml
new file mode 100644
index 0000000..be7730c
--- /dev/null
+++ b/model2d3d-viewer-back-common/src/main/resources/config/language/msg/msg_jp.yml
@@ -0,0 +1,38 @@
+msgjp:
+ argumentNotValid:
+ 1000: 未通过参数校验
+ 1001: 参数不能为空
+ 1002: 长度不能超过{0}
+ 1003: 长度无效
+ 1004: 无效的邮箱
+ 1005: 数值范围在{0}到{1}之间
+ 1006: 必须大于或等于{0}
+ 1007: 必须小于或等于{0}
+ 1008: 无效的参数
+ parameterMap:
+ serviceError: 内部サービスのエラー
+ tokenError: インターフェイスの認証に失敗
+ excelEmpty: フォームが空になっている
+ lineNum: 行{0}:
+ paramsFormatError: パラメータのフォーマットエラー
+ verifCodeExpired: 確認コード期限切れ
+ verifCodeError: 確認コードエラー
+ accountExpired: アカウントの有効期限が切れている
+ pwdError: パスワードエラー
+ userNotExist: ユーザーが存在しない
+ noOperationAuth: 操作権限なし
+ excelBuildingLineDuplicate: テーブルに同じデータがある
+ userOrEmailNotExist: ユーザーが存在しません
+ companyNameHasExisted: 会社はすでにプラットフォーム上に存在する
+ taowaComapny: 下位の会社を親会社として利用することは不可
+ hasSubsidiary: 削除対象の会社には下位の会社があるので、先に下位の会社を対応してください
+ roleNameExist: 役割名が既に登録済み
+ roleHasBinded: 役割はユーザーにバインドされている ので、削除する前にバインドを解除してください
+ loginNameOrEmailHasExisted: ユーザー名またはメールボックスはすでに使用されています
+ mailAddUserPwdSubject: 新規アカウント・パスワードの作成
+ mailAddUserPwdContent: アカウント {0} のパスワードは:{1}, お忘れにならないようにお願いします。
ログインWebアドレス:{2}
+ mailResetUserPwdSubject: アカウント・パスワードのリセット
+ pwdFormatError: パスワードの構成には、数字、アルファベット、特殊文字(~!@#$%^&*) で、12桁以上
+ oldPwdError: 旧パスワードエラー
+ newPwdSameOld: 注:旧パスワードと同じものを使用しないでください
+ companyLimit: 最大15のエンタープライズを作成可能
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/.gitignore b/model2d3d-viewer-back-controller/.gitignore
new file mode 100644
index 0000000..aa23915
--- /dev/null
+++ b/model2d3d-viewer-back-controller/.gitignore
@@ -0,0 +1,15 @@
+/target/
+/logs/
+/.idea/
+*.iml
+*.bak
+*.log
+/.settings/
+*.project
+*.classpath
+*.factorypath
+*.springBeans
+/.apt_generated/
+/.externalToolBuilders/
+/bin/
+application-*.properties
diff --git a/model2d3d-viewer-back-controller/dockerfile b/model2d3d-viewer-back-controller/dockerfile
new file mode 100644
index 0000000..f5341d3
--- /dev/null
+++ b/model2d3d-viewer-back-controller/dockerfile
@@ -0,0 +1,69 @@
+#FROM openjdk:8-jre-alpine
+#FROM amazon-corretto-8
+#FROM amazoncorretto:11
+
+# 使用Ubuntu 20.04 LTS作为基础镜像
+FROM ubuntu:20.04
+
+# 设置系统的默认编码方式为 UTF-8
+ENV LANG=en_US.UTF-8
+ENV LC_CTYPE=zh_CN.UTF-8
+
+# 设置环境变量,避免交互式安装
+ENV DEBIAN_FRONTEND=noninteractive
+
+# 更新APT软件包索引并安装必要的软件包
+RUN apt-get update && \
+ apt-get install -y \
+ curl \
+ unzip \
+ vim \
+ fontconfig \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+
+# 安装Terraform
+RUN curl -fsSLk https://releases.hashicorp.com/terraform/1.7.5/terraform_1.7.5_linux_amd64.zip -o /tmp/terraform.zip && \
+ unzip /tmp/terraform.zip -d /usr/local/bin/ && \
+ rm /tmp/terraform.zip
+
+# 安装Amazon Corretto 11 JDK
+RUN curl -fsSLk https://corretto.aws/downloads/resources/11.0.22.7.1/amazon-corretto-11.0.22.7.1-linux-x64.tar.gz -o /tmp/amazon-corretto-11.tar.gz && \
+ mkdir /usr/lib/jvm/ && \
+ tar -xzvf /tmp/amazon-corretto-11.tar.gz -C /usr/lib/jvm/ && \
+ rm /tmp/amazon-corretto-11.tar.gz
+
+# 设置JAVA_HOME环境变量
+ENV JAVA_HOME=/usr/lib/jvm/amazon-corretto-11.0.22.7.1-linux-x64
+ENV PATH=$JAVA_HOME/bin:$PATH
+
+ENV JAVA_TOOL_OPTIONS="-Dfile.encoding=UTF8"
+
+# 打印Terraform版本
+RUN terraform --version
+
+# 打印Java版本
+RUN java -version
+
+WORKDIR /home/data-center-admin
+
+#EXPOSE 20008
+
+# 设置时区
+#RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
+
+ARG JAR_FILE
+ARG LIB_DIR
+ARG CONFIG_DIR
+ARG AURORA_TERRAFORM
+ARG JVM_OPTS
+
+COPY ${JAR_FILE} app.jar
+COPY ${LIB_DIR} lib
+COPY ${CONFIG_DIR} config
+COPY ${AURORA_TERRAFORM} aurora_terraform
+
+#ENTRYPOINT ["java", "${JVM_OPTS}", "-jar","app.jar"]
+ENTRYPOINT java ${JVM_OPTS} -jar app.jar
+
+
diff --git a/model2d3d-viewer-back-controller/pom.xml b/model2d3d-viewer-back-controller/pom.xml
new file mode 100644
index 0000000..83871a5
--- /dev/null
+++ b/model2d3d-viewer-back-controller/pom.xml
@@ -0,0 +1,350 @@
+
+
+ 4.0.0
+
+ com.techsor
+ model2d3d-viewer-back
+ 0.0.1-SNAPSHOT
+
+ model2d3d-viewer-back-controller
+ model2d3d-viewer-back-controller
+ http://maven.apache.org
+
+ UTF-8
+
+ tokyo-build-admin
+ latest
+ ap-northeast-1
+
+ 923770123186.dkr.ecr.ap-northeast-1.amazonaws.com
+ AKIA5OFH5OOZHM3U3KX4
+ Plkid7RDnHc1gGbp2yAv/Scc+ukI0q8vzBuyEBN2
+
+ 381659385655.dkr.ecr.ap-northeast-1.amazonaws.com
+ AKIAVRXFMB43XVQ3GXAL
+ G0FaGcizm8FlgLxZsL+8xBwfPSzQF71294nrtE2y
+
+
+
+
+
+
+ com.techsor
+ model2d3d-viewer-back-service
+ 0.0.1-SNAPSHOT
+
+
+
+ com.techsor
+ model2d3d-viewer-back-common
+ 0.0.1-SNAPSHOT
+
+
+ junit
+ junit
+ test
+
+
+
+ com.spotify
+ dockerfile-maven-plugin
+ 1.4.13
+
+
+
+ javax.annotation
+ jsr250-api
+
+
+
+
+
+
+
+ only-package
+
+ true
+
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-assembly-plugin
+
+ model2d3d-viewer-back
+
+ src/main/resources/assembly.xml
+
+ false
+
+
+
+ make-assembly
+ package
+
+ single
+
+
+
+
+
+
+
+
+ docker-package
+
+
+
+
+
+ com.spotify
+ dockerfile-maven-plugin
+ 1.4.13
+
+
+ default
+
+ build
+
+
+
+
+
+ registry.cn-shanghai.aliyuncs.com/clouddog/datacenter-admin
+ ${aws.ecr.tag}
+
+ target/${project.build.finalName}.jar
+ target/lib
+ target/config
+ target/aurora_terraform
+ ${java.jvm.opts}
+
+
+
+
+
+
+
+ docker-aliyun
+
+
+
+
+
+ com.spotify
+ dockerfile-maven-plugin
+ 1.4.13
+
+
+ default
+
+ build
+
+
+
+
+
+ registry.cn-shanghai.aliyuncs.com/clouddog/datacenter-admin
+ ${aws.ecr.tag}
+
+ target/${project.build.finalName}.jar
+ target/lib
+ target/config
+ target/aurora_terraform
+ ${java.jvm.opts}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 3.0.0
+
+
+
+ package
+
+ run
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ docker-test
+
+
+
+
+
+ com.spotify
+ dockerfile-maven-plugin
+ 1.4.13
+
+
+ default
+
+ build
+
+
+
+
+
+ ${aws.ecr.registry.test}/${aws.ecr.repository}
+ ${aws.ecr.tag}
+
+ target/${project.build.finalName}.jar
+ target/lib
+ target/config
+ target/aurora_terraform
+ ${java.jvm.opts}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 3.0.0
+
+
+
+ package
+
+ run
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ docker-production
+
+
+
+
+
+ com.spotify
+ dockerfile-maven-plugin
+ 1.4.13
+
+
+ default
+
+ build
+
+
+
+
+
+ ${aws.ecr.registry.production}/${aws.ecr.repository}
+ ${aws.ecr.tag}
+
+ target/${project.build.finalName}.jar
+ target/lib
+ target/config
+ target/aurora_terraform
+ ${java.jvm.opts}
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+ 3.0.0
+
+
+
+ package
+
+ run
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/Model2d3dViewerApplication.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/Model2d3dViewerApplication.java
new file mode 100644
index 0000000..1a4fbf5
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/Model2d3dViewerApplication.java
@@ -0,0 +1,19 @@
+package com.model2d3d.viewer.back;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.web.servlet.ServletComponentScan;
+import org.springframework.scheduling.annotation.EnableAsync;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@ServletComponentScan
+@EnableAsync
+//@EnableScheduling
+public class Model2d3dViewerApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(Model2d3dViewerApplication.class, args);
+ }
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/ApiConfig.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/ApiConfig.java
new file mode 100644
index 0000000..f6bdcff
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/ApiConfig.java
@@ -0,0 +1,65 @@
+package com.model2d3d.viewer.back.configurator;
+
+import com.baomidou.mybatisplus.annotation.DbType;
+import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
+import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
+import jakarta.servlet.MultipartConfigElement;
+import org.springframework.boot.web.servlet.MultipartConfigFactory;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.mobile.device.DeviceHandlerMethodArgumentResolver;
+import org.springframework.util.unit.DataSize;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import com.model2d3d.viewer.back.configurator.interceptor.AccessApiInterceptor;
+
+import java.io.File;
+import java.util.List;
+
+@Configuration
+public class ApiConfig implements WebMvcConfigurer {
+
+ @Bean
+ public AccessApiInterceptor accessApiInterceptor(){
+ return new AccessApiInterceptor();
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry){
+ registry.addInterceptor(accessApiInterceptor());
+ }
+
+ @Bean
+ public DeviceHandlerMethodArgumentResolver deviceHandlerMethodArgumentResolver() {
+ return new DeviceHandlerMethodArgumentResolver();
+ }
+
+ @Override
+ public void addArgumentResolvers(List argumentResolvers) {
+ argumentResolvers.add(deviceHandlerMethodArgumentResolver());
+ }
+
+ @Bean
+ public MybatisPlusInterceptor mybatisPlusInterceptor() {
+ MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
+ interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 如果配置多个插件, 切记分页最后添加
+ // 如果有多数据源可以不配具体类型, 否则都建议配上具体的 DbType
+ return interceptor;
+ }
+
+
+ @Bean
+ public MultipartConfigElement multipartConfigElement() {
+ String path = System.getProperty("user.dir")+"/tmp";
+ MultipartConfigFactory factory = new MultipartConfigFactory();
+ factory.setMaxFileSize(DataSize.ofMegabytes(20L));
+ File tmpFile = new File(path);
+ if (!tmpFile.exists()) {
+ tmpFile.mkdirs();
+ }
+ factory.setLocation(path);
+ return factory.createMultipartConfig();
+ }
+}
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/CorsConfigurer.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/CorsConfigurer.java
new file mode 100644
index 0000000..6c5ad39
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/CorsConfigurer.java
@@ -0,0 +1,38 @@
+package com.model2d3d.viewer.back.configurator;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.web.servlet.FilterRegistrationBean;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.cors.CorsConfiguration;
+import org.springframework.web.cors.UrlBasedCorsConfigurationSource;
+import org.springframework.web.filter.CorsFilter;
+
+/**
+ * 跨域配置
+* @author jwy
+* @time 2022-5-12 17:54:43
+ */
+@Configuration
+public class CorsConfigurer {
+ @Value("${crosxss.origin:*}")
+ private String corsOrigin;
+ @Bean
+ public FilterRegistrationBean corsFilter() {
+ List allowedOriginPatterns = new ArrayList();
+ allowedOriginPatterns.add(corsOrigin);
+ UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
+ CorsConfiguration config = new CorsConfiguration();
+ config.setAllowCredentials(true);
+ config.setAllowedOriginPatterns(allowedOriginPatterns);
+ config.addAllowedHeader("*");
+ config.addAllowedMethod("*");
+ source.registerCorsConfiguration("/**", config);
+ FilterRegistrationBean bean = new FilterRegistrationBean(new CorsFilter(source));
+ bean.setOrder(0);
+ return bean;
+ }
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/CrosXssFilter.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/CrosXssFilter.java
new file mode 100644
index 0000000..820e6c9
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/CrosXssFilter.java
@@ -0,0 +1,78 @@
+package com.model2d3d.viewer.back.configurator;
+
+import java.io.IOException;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.FilterConfig;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.annotation.WebFilter;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Value;
+import java.util.UUID;
+
+import org.jboss.logging.MDC;
+
+@WebFilter
+public class CrosXssFilter implements Filter {
+
+ private static final Logger logger = LoggerFactory.getLogger(CrosXssFilter.class);
+
+ @Value("${crosxss.filter.disable:false}")
+ private boolean disable;
+
+ @Override
+ public void init(FilterConfig filterConfig) throws ServletException {
+ }
+
+ @Override
+ public void doFilter(ServletRequest request, ServletResponse response,
+ FilterChain chain) throws IOException, ServletException {
+ try {
+ MDC.put("processNo", UUID.randomUUID().toString().replace("-", ""));
+ request.setCharacterEncoding("utf-8");
+// response.setContentType("text/html;charset=utf-8");
+ if (disable) {
+ chain.doFilter(request, response);
+ } else {
+ //跨域设置
+ if (response instanceof HttpServletResponse) {
+ HttpServletResponse httpServletResponse = (HttpServletResponse) response;
+ //禁用浏览器缓存
+ httpServletResponse.setHeader("Cache-Control", "no-store");
+ //禁止被IFrame嵌套
+ httpServletResponse.setHeader("X-Frame-Options", "deny");
+ //安全性配置
+ httpServletResponse.setHeader("X-XSS-Protection", "1; mode=block");
+ httpServletResponse.setHeader("X-Content-Type-Options", "nosniff");
+ httpServletResponse.setHeader("Referrer-Policy", "origin");
+ }
+ ServletRequest requestWrapper = null;
+ if(request instanceof HttpServletRequest) {
+ requestWrapper = new RequestWrapper((HttpServletRequest) request);
+ }
+ if(requestWrapper == null) {
+ chain.doFilter(request, response);
+ } else {
+ chain.doFilter(requestWrapper, response);
+ }
+ }
+ } finally {
+ // 避免线程泄漏
+ MDC.clear();
+ }
+
+ }
+
+ @Override
+ public void destroy() {
+
+ }
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/RequestWrapper.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/RequestWrapper.java
new file mode 100644
index 0000000..1478c28
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/RequestWrapper.java
@@ -0,0 +1,92 @@
+package com.model2d3d.viewer.back.configurator;
+
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+
+public class RequestWrapper extends HttpServletRequestWrapper {
+
+ private static final Logger logger = LoggerFactory.getLogger(HttpServletRequestWrapper.class);
+
+ private final String body;
+
+ public RequestWrapper(HttpServletRequest request) {
+ super(request);
+ StringBuilder stringBuilder = new StringBuilder();
+ BufferedReader bufferedReader = null;
+ InputStream inputStream = null;
+ try {
+ inputStream = request.getInputStream();
+ if (inputStream != null) {
+ bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
+ char[] charBuffer = new char[128];
+ int bytesRead = -1;
+ while ((bytesRead = bufferedReader.read(charBuffer)) > 0) {
+ stringBuilder.append(charBuffer, 0, bytesRead);
+ }
+ } else {
+ stringBuilder.append("");
+ }
+ } catch (IOException ex) {
+ logger.error("RequestWrapper读取流错误", ex);
+ } finally {
+ if (inputStream != null) {
+ try {
+ inputStream.close();
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (bufferedReader != null) {
+ try {
+ bufferedReader.close();
+ }
+ catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ body = stringBuilder.toString();
+ }
+
+ @Override
+ public ServletInputStream getInputStream() throws IOException {
+ final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(body.getBytes());
+ ServletInputStream servletInputStream = new ServletInputStream() {
+ @Override
+ public boolean isFinished() {
+ return false;
+ }
+ @Override
+ public boolean isReady() {
+ return false;
+ }
+ @Override
+ public void setReadListener(ReadListener readListener) {
+ }
+ @Override
+ public int read() throws IOException {
+ return byteArrayInputStream.read();
+ }
+ };
+ return servletInputStream;
+
+ }
+
+ @Override
+ public BufferedReader getReader() throws IOException {
+ return new BufferedReader(new InputStreamReader(this.getInputStream()));
+ }
+
+ public String getBody() {
+ return this.body;
+ }
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/handler/GlobalExceptionHandler.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/handler/GlobalExceptionHandler.java
new file mode 100644
index 0000000..5d5306b
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/handler/GlobalExceptionHandler.java
@@ -0,0 +1,118 @@
+package com.model2d3d.viewer.back.configurator.handler;
+
+import com.model2d3d.viewer.back.common.language.msg.MsgLanguageChange;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Range;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.HttpStatus;
+import org.springframework.validation.FieldError;
+import org.springframework.web.bind.MethodArgumentNotValidException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.ResponseStatus;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+import java.lang.reflect.Field;
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+ @Autowired
+ private MsgLanguageChange msgLanguageChange;
+
+ // 处理@NotNull等校验异常
+ @ResponseStatus(HttpStatus.BAD_REQUEST)// 这里jakarta.validation.constraints MethodArgumentNotValidException错误码是400(Bad Request)
+ @ExceptionHandler(MethodArgumentNotValidException.class)
+ public SimpleDataResponse handleValidationExceptions(
+ MethodArgumentNotValidException ex,
+ HttpServletRequest request) {
+
+ // 获取语言类型,默认为中文
+ String languageType = request.getHeader("LanguageType");
+ if (languageType == null || languageType.isEmpty()) {
+ languageType = "0"; // 默认中文
+ }
+
+ Map errors = new HashMap<>();
+
+ Integer finalLanguageType = Integer.valueOf(languageType);
+ ex.getBindingResult().getAllErrors().forEach((error) -> {
+ String fieldName = ((FieldError) error).getField();
+ String errorMessage = error.getDefaultMessage();
+
+ // 尝试获取字段的注解信息
+ try {
+ Field field = ex.getBindingResult().getTarget().getClass().getDeclaredField(fieldName);
+
+ Length lengthAnnotation = field.getAnnotation(Length.class);
+ Range rangeAnnotation = field.getAnnotation(Range.class);
+ Min minAnnotation = field.getAnnotation(Min.class);
+ Max maxAnnotation = field.getAnnotation(Max.class);
+ // 处理Length校验
+ if (lengthAnnotation != null && ("1002".equals(errorMessage) || errorMessage.contains("length"))) {// 处理长度校验错误
+ errorMessage = handleLengthValidationError(lengthAnnotation, finalLanguageType);
+ }
+ // 处理Range校验
+ else if (rangeAnnotation != null && ("1005".equals(errorMessage) || errorMessage.contains("Range"))) {
+ errorMessage = handleRangeValidationError(rangeAnnotation, finalLanguageType);
+ }
+ // 处理min校验
+ else if (minAnnotation != null && ("1006".equals(errorMessage) || errorMessage.contains("Min"))) {
+ errorMessage = handleMinValidationError(minAnnotation, finalLanguageType);
+ }
+ // 处理max校验
+ else if (maxAnnotation != null && ("1007".equals(errorMessage) || errorMessage.contains("Max"))) {
+ errorMessage = handleMaxValidationError(maxAnnotation, finalLanguageType);
+ }
+ // 处理其他校验错误
+ else {
+ errorMessage = translateErrorMessage(errorMessage, finalLanguageType);
+ }
+ } catch (Exception e) {
+ // 如果无法获取字段信息,使用默认翻译
+ errorMessage = translateErrorMessage(errorMessage, finalLanguageType);
+ }
+
+ errors.put(fieldName, errorMessage);
+ });
+
+ return new SimpleDataResponse(
+ ResponseCode.BAD_REQUEST,
+ msgLanguageChange.getBadRequestMessage(finalLanguageType, "1000"),
+ errors);
+ }
+
+ private String handleMaxValidationError(Max max, Integer languageType) {
+ long value = max.value();
+ return MessageFormat.format(msgLanguageChange.getBadRequestMessage(languageType, "1007"), value) ;
+ }
+
+ private String handleMinValidationError(Min min, Integer languageType) {
+ long value = min.value();
+ return MessageFormat.format(msgLanguageChange.getBadRequestMessage(languageType, "1006"), value) ;
+ }
+
+ private String handleRangeValidationError(Range rangeAnnotation, Integer finalLanguageType) {
+ long max = rangeAnnotation.max();
+ long min = rangeAnnotation.min();
+ return MessageFormat.format(msgLanguageChange.getBadRequestMessage(finalLanguageType, "1005"), min, max) ;
+ }
+
+ private String handleLengthValidationError(Length lengthAnnotation, Integer languageType) {
+ int max = lengthAnnotation.max();
+// int min = lengthAnnotation.min();
+ return MessageFormat.format(msgLanguageChange.getBadRequestMessage(languageType, "1002"), max) ;
+ }
+
+ private String translateErrorMessage(String errorCode, Integer languageType) {
+ return msgLanguageChange.getBadRequestMessage(languageType, errorCode);
+ }
+
+}
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/interceptor/AccessApiInterceptor.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/interceptor/AccessApiInterceptor.java
new file mode 100644
index 0000000..bfe2261
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/interceptor/AccessApiInterceptor.java
@@ -0,0 +1,73 @@
+package com.model2d3d.viewer.back.configurator.interceptor;
+
+
+import com.alibaba.fastjson.JSONObject;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.service.AccountService;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.method.HandlerMethod;
+import org.springframework.web.servlet.HandlerInterceptor;
+import org.springframework.web.servlet.resource.ResourceHttpRequestHandler;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.lang.reflect.Method;
+
+public class AccessApiInterceptor implements HandlerInterceptor {
+
+ private static final Logger logger = LoggerFactory.getLogger(AccessApiInterceptor.class);
+
+ @Value("${user.login.keytimeout}")
+ private long keytimeout;
+
+ @Autowired
+ private AccountService accountService;
+
+ public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
+ if(handler instanceof HandlerMethod) {
+ HandlerMethod handlerMethod = (HandlerMethod) handler;
+ Class> tClass = handlerMethod.getBeanType();
+ AccessRequired annotation = tClass.getAnnotation(AccessRequired.class);
+ if (annotation == null) {
+ Method method = handlerMethod.getMethod();
+ annotation = method.getAnnotation(AccessRequired.class);
+ }
+ try {
+ if (annotation != null) {
+ String loginName = request.getHeader("LoginName");
+ String accessToken = request.getHeader("AccessToken");
+ String userId = request.getHeader("UserId");
+ String companyId = request.getHeader("CompanyId");
+
+ String languageType = request.getHeader("LanguageType");
+ response.setContentType("application/json;charset=utf-8");
+ String URI = request.getRequestURI();
+ logger.info("===============请求的URI :" + URI + " ===============");
+ JSONObject jsonObject = new JSONObject();
+
+ boolean result = accountService.accessAuth(loginName, companyId, userId, accessToken, languageType, jsonObject, keytimeout);
+ if(!result) {
+ response.getWriter().print(jsonObject.toString());
+ }
+ return result;
+ }
+ } catch (Exception e) {
+ logger.error("Error from AccessApiInterceptor!", e);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("code", ResponseCode.SERVER_ERROR);
+ jsonObject.put("msg", ResponseCode.SERVER_ERROR_MSG);
+ response.getWriter().print(jsonObject.toString());
+ return false;
+ }
+ // 没有注解通过拦截
+ return true;
+ }else if(handler instanceof ResourceHttpRequestHandler) {//资源文件不拦截
+ return true;
+ }
+ return false;
+ }
+}
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/interceptor/AccessRequired.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/interceptor/AccessRequired.java
new file mode 100644
index 0000000..eca16cf
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/configurator/interceptor/AccessRequired.java
@@ -0,0 +1,10 @@
+package com.model2d3d.viewer.back.configurator.interceptor;
+
+import java.lang.annotation.*;
+
+@Target({ElementType.TYPE,ElementType.METHOD})
+@Retention(RetentionPolicy.RUNTIME)
+@Documented
+public @interface AccessRequired {
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/AccountController.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/AccountController.java
new file mode 100644
index 0000000..a74a3ea
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/AccountController.java
@@ -0,0 +1,96 @@
+package com.model2d3d.viewer.back.controller;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.codec.binary.Base64;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.mobile.device.Device;
+import org.springframework.web.bind.annotation.*;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.configurator.interceptor.AccessRequired;
+import com.model2d3d.viewer.back.dto.account.CacheUserData;
+import com.model2d3d.viewer.back.dto.account.LoginParam;
+import com.model2d3d.viewer.back.service.AccountService;
+import com.model2d3d.viewer.back.service.captcha.CaptchaService;
+import com.model2d3d.viewer.back.service.captcha.CaptchaVO;
+
+import java.awt.image.BufferedImage;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+
+import javax.imageio.ImageIO;
+
+/**
+ * 账户管理
+ * @author jwy-style
+ *
+ */
+@RestController
+@RequestMapping("/account")
+@Tag(name = "AccountController",description = "账号登录/登出、获取验证码接口")
+public class AccountController {
+
+ @Autowired
+ private AccountService accountService;
+ @Autowired
+ private DefaultKaptcha producer;
+ @Autowired
+ private CaptchaService captchaService;
+
+
+ @Operation(summary = "用户登录")
+ @RequestMapping(value = "/login", method = RequestMethod.POST)
+ public SimpleDataResponse login(@RequestBody LoginParam loginParam,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType,
+ HttpServletRequest request,
+ HttpServletResponse response,
+ Device device) {
+ return accountService.login(loginParam,device,LanguageType,request,response);
+ }
+
+
+
+ /**
+ * 用户退出登录
+ */
+ @AccessRequired
+ @Operation(summary = "用户退出")
+ @RequestMapping(value = "/logout", method = RequestMethod.GET)
+ public SimpleDataResponse logout( @Parameter(name="LoginName",description="登录名",required=true) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false) @RequestHeader(required=false) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true, schema = @Schema(defaultValue = "2")) @RequestHeader(required=true) Integer LanguageType) {
+ return accountService.logout(AccessToken,CompanyId,LoginName,UserId);
+ }
+
+ /**
+ * 获取验证码
+ * @return
+ */
+ @Operation(summary = "获取登录验证码")
+ @RequestMapping(value = "/getCaptcha", method = RequestMethod.GET )
+ public SimpleDataResponse getCaptcha() throws IOException {
+ // 生成文字验证码
+ String content = producer.createText();
+ // 生成图片验证码
+ ByteArrayOutputStream outputStream = null;
+ BufferedImage image = producer.createImage(content);
+ outputStream = new ByteArrayOutputStream();
+ ImageIO.write(image, "jpg", outputStream);
+ // 对字节数组Base64编码
+// BASE64Encoder encoder = new BASE64Encoder();
+ String str = "data:image/jpeg;base64,";
+ String base64Img = str + Base64.encodeBase64String(outputStream.toByteArray()).replace("\n", "").replace("\r", "");
+ CaptchaVO captchaVO = captchaService.cacheCaptcha(content);
+ captchaVO.setBase64Img(base64Img);
+ return SimpleDataResponse.success(captchaVO);
+ }
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CommonController.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CommonController.java
new file mode 100644
index 0000000..f1c752e
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CommonController.java
@@ -0,0 +1,48 @@
+package com.model2d3d.viewer.back.controller;
+
+import java.util.List;
+
+import io.swagger.v3.oas.annotations.Hidden;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSONObject;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.service.CommonService;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+//@Hidden
+@RestController//代表返回的是json格式的数据,这个注解是Spring4之后新加的注解
+@RequestMapping("/common") //http请求路径映射
+@Tag(name = "CommonController",description = "公共接口")
+@SuppressWarnings("unchecked")
+public class CommonController{
+
+ private static Logger logger = LoggerFactory.getLogger(CommonController.class);
+
+ @Autowired
+ private CommonService commonService;
+
+
+ @Hidden
+ @Operation(summary = "检测apikey是否有效")
+ @RequestMapping(value = "/checkApikey",method = RequestMethod.GET)
+ public SimpleDataResponse checkApikey(
+ @Parameter(name="apikey",description="apikey值",required=true) @RequestParam String apikey){
+ return commonService.checkApikey(apikey);
+ }
+}
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CompanyController.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CompanyController.java
new file mode 100644
index 0000000..1b00d89
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/CompanyController.java
@@ -0,0 +1,126 @@
+package com.model2d3d.viewer.back.controller;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.model2d3d.viewer.back.common.response.PageResponse;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import com.model2d3d.viewer.back.common.exception.BusinessException;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.configurator.interceptor.AccessRequired;
+import com.model2d3d.viewer.back.dto.company.CompanySearchParams;
+import com.model2d3d.viewer.back.dto.company.DeleteCompanyParams;
+import com.model2d3d.viewer.back.dto.company.OptCompanyParams;
+import com.model2d3d.viewer.back.vo.company.CompanyPageDTO;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.service.CompanyService;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+@RestController//代表返回的是json格式的数据,这个注解是Spring4之后新加的注解
+//@AccessRequired //注解标识是否需要验证token
+@RequestMapping("/company") //http请求路径映射
+@Tag(name = "CompanyController",description = "企业管理的相关接口")
+@SuppressWarnings("unchecked")
+public class CompanyController {
+
+ private static Logger logger = LoggerFactory.getLogger(CompanyController.class);
+
+ @Autowired
+ private CompanyService companyService;
+
+
+ @AccessRequired
+ @Operation(summary = "添加企业")
+ @RequestMapping(value = "/add",method = RequestMethod.POST)
+ public SimpleDataResponse add(
+ @RequestBody @Validated OptCompanyParams optCompanyParams,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return companyService.add(optCompanyParams, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "编辑企业")
+ @RequestMapping(value = "/edit",method = RequestMethod.POST)
+ public SimpleDataResponse edit(
+ @RequestBody @Validated OptCompanyParams optCompanyParams,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType) {
+ return companyService.edit(optCompanyParams, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "删除企业")
+ @RequestMapping(value = "/batchDelete",method = RequestMethod.POST)
+ public SimpleDataResponse batchDelete(
+ @RequestBody @Validated DeleteCompanyParams deleteCompanyParams,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return companyService.batchDelete(deleteCompanyParams, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "获取当前登录用户下的企业菜单树")
+ @RequestMapping(value = "/getCompanyTree",method = RequestMethod.GET)
+ public SimpleDataResponse> getCompanyTree(
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return companyService.getCompanyTree(CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "获取企业列表")
+ @RequestMapping(value = "/getListPage",method = RequestMethod.GET)
+ public PageResponse> getListPage(
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) String CompanyId,
+// @Parameter(name="LoginCompanyId",description="登录用户的企业ID",required=false,schema = @Schema(defaultValue = "1") @RequestHeader(required=false) Long LoginCompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType,
+ @Parameter(name="UTCOffset",description="格林威治时间与本地时间的差值,单位是分钟,比如东八区是 -480",required=true,schema = @Schema(defaultValue = "-480")) @RequestHeader(required=true) Integer UTCOffset,
+ CompanySearchParams pageSearchParam
+ ) throws BusinessException {
+
+ pageSearchParam.setUserId(UserId);
+
+ PageResponse> pageResponse = new PageResponse>();
+ try{
+ pageResponse.setData(companyService.getListPage(pageSearchParam, CompanyId, UserId, LanguageType, UTCOffset));
+ pageResponse.setCode(ResponseCode.SUCCESS);
+ pageResponse.setMsg("success");
+ }catch (Exception e){
+ logger.error("查询列表报错",e);
+ pageResponse.setCode(ResponseCode.SERVER_ERROR);
+ pageResponse.setMsg(ResponseCode.SERVER_ERROR_MSG);
+ }
+ return pageResponse;
+ }
+
+}
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/HealthController.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/HealthController.java
new file mode 100644
index 0000000..ee47b15
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/HealthController.java
@@ -0,0 +1,37 @@
+package com.model2d3d.viewer.back.controller;
+
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.Reader;
+import java.util.Properties;
+
+@RestController
+@Tag(name = "HealthController",description = "健康检测接口")
+public class HealthController {
+
+ @GetMapping("/healthcheck")
+ public String health(){
+ return "ok";
+ }
+
+ @GetMapping("/version")
+ public String getVersion() throws IOException {
+ Properties properties = new Properties();
+ Reader in = new InputStreamReader(this.getClass().getResourceAsStream("/config/version.properties"),"utf-8");
+ BufferedReader bufferedReader = new BufferedReader(in);
+ properties.load(bufferedReader);
+ String version=properties.getProperty("project.latest.version");
+ String content = properties.getProperty(version);
+ JSONObject jsonObject = new JSONObject();
+ jsonObject.put("version", version);
+ jsonObject.put("content", content);
+ return jsonObject.toString();
+ }
+}
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/RoleController.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/RoleController.java
new file mode 100644
index 0000000..9674b9e
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/RoleController.java
@@ -0,0 +1,133 @@
+package com.model2d3d.viewer.back.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.model2d3d.viewer.back.common.exception.BusinessException;
+import com.model2d3d.viewer.back.common.response.PageResponse;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.configurator.interceptor.AccessRequired;
+import com.model2d3d.viewer.back.dto.role.DeleteRoleParam;
+import com.model2d3d.viewer.back.dto.role.OptRoleParam;
+import com.model2d3d.viewer.back.dto.role.RolePageSearchParam;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.vo.role.RolePageDTO;
+import com.model2d3d.viewer.back.service.RoleService;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+
+import java.util.List;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+@RestController//代表返回的是json格式的数据,这个注解是Spring4之后新加的注解
+@AccessRequired //注解标识是否需要验证token
+@RequestMapping("/role") //http请求路径映射
+@Tag(name = "RoleController",description = "角色权限的相关接口")
+@SuppressWarnings("unchecked")
+public class RoleController {
+
+ private static Logger logger = LoggerFactory.getLogger(RoleController.class);
+
+ @Autowired
+ private RoleService roleService;
+
+
+ @Operation(summary = "添加角色")
+ @RequestMapping(value = "/add",method = RequestMethod.POST)
+ public SimpleDataResponse add(
+ @RequestBody @Validated OptRoleParam optRoleParam,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return roleService.add(optRoleParam, CompanyId, UserId, LanguageType);
+ }
+
+ @Operation(summary = "编辑角色")
+ @RequestMapping(value = "/edit",method = RequestMethod.POST)
+ public SimpleDataResponse edit(
+ @RequestBody @Validated OptRoleParam optRoleParam,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return roleService.edit(optRoleParam, CompanyId, UserId, LanguageType);
+ }
+
+ @Operation(summary = "删除角色")
+ @RequestMapping(value = "/batchDelete",method = RequestMethod.POST)
+ public SimpleDataResponse batchDelete(
+ @RequestBody @Validated DeleteRoleParam deleteRoleParam,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return roleService.batchDelete(deleteRoleParam, CompanyId, UserId, LanguageType);
+ }
+
+ @Operation(summary = "获取角色列表")
+ @RequestMapping(value = "/getListPage",method = RequestMethod.GET)
+ public PageResponse> getListPage(
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType,
+ RolePageSearchParam pageSearchParam
+ ) throws BusinessException {
+
+ pageSearchParam.setUserId(UserId);
+// pageSearchParam.setCompanyId(CompanyId);
+ PageResponse> pageResponse = new PageResponse>();
+ try{
+ pageResponse.setData(roleService.getListPage(pageSearchParam, CompanyId, UserId, LanguageType));
+ pageResponse.setCode(ResponseCode.SUCCESS);
+ pageResponse.setMsg("success");
+ }catch (Exception e){
+ logger.error("查询列表报错",e);
+ pageResponse.setCode(ResponseCode.SERVER_ERROR);
+ pageResponse.setMsg(ResponseCode.SERVER_ERROR_MSG);
+ }
+ return pageResponse;
+ }
+
+ @Operation(summary = "获取当前登录用户拥有的权限菜单树")
+ @RequestMapping(value = "/getOwnMenuIds",method = RequestMethod.GET)
+ public SimpleDataResponse> getOwnMenuIds(
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return roleService.getOwnMenuIds(CompanyId, UserId, LanguageType);
+ }
+
+ @Operation(summary = "获取对应角色拥有的权限菜单ID")
+ @RequestMapping(value = "/getMenuIdsByRoleId",method = RequestMethod.GET)
+ public SimpleDataResponse getMenuIdsByRoleId(
+ @Parameter(name="roleId",description="角色ID",required=true, schema = @Schema(defaultValue = "28")) @RequestParam Long roleId,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return roleService.getMenuIdsByRoleId(roleId, CompanyId, UserId, LanguageType);
+ }
+
+}
diff --git a/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/UserController.java b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/UserController.java
new file mode 100644
index 0000000..4afedcc
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/java/com/model2d3d/viewer/back/controller/UserController.java
@@ -0,0 +1,138 @@
+package com.model2d3d.viewer.back.controller;
+
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.model2d3d.viewer.back.common.exception.BusinessException;
+import com.model2d3d.viewer.back.common.response.PageResponse;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.configurator.interceptor.AccessRequired;
+import com.model2d3d.viewer.back.dto.user.DeleteUserParam;
+import com.model2d3d.viewer.back.dto.user.ModifyPassword;
+import com.model2d3d.viewer.back.dto.user.OptUserParam;
+import com.model2d3d.viewer.back.dto.user.PageSearchParam;
+import com.model2d3d.viewer.back.dto.user.ResetPassword;
+import com.model2d3d.viewer.back.service.UserService;
+import com.model2d3d.viewer.back.vo.user.UserPageDTO;
+
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.media.Schema;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+@RestController//代表返回的是json格式的数据,这个注解是Spring4之后新加的注解
+//@AccessRequired //注解标识是否需要验证token
+@RequestMapping("/user") //http请求路径映射
+@Tag(name = "UserController",description = "用户管理的相关接口")
+@SuppressWarnings("unchecked")
+public class UserController {
+
+ private static Logger logger = LoggerFactory.getLogger(UserController.class);
+
+ @Autowired
+ private UserService userService;
+
+ @AccessRequired
+ @Operation(summary = "添加用户")
+ @RequestMapping(value = "/add",method = RequestMethod.POST)
+ public SimpleDataResponse add(
+ @RequestBody @Validated OptUserParam optUserParam,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return userService.add(optUserParam, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "编辑用户")
+ @RequestMapping(value = "/edit",method = RequestMethod.POST)
+ public SimpleDataResponse edit(
+ @RequestBody @Validated OptUserParam optUserParam,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return userService.edit(optUserParam, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "删除用户")
+ @RequestMapping(value = "/batchDelete",method = RequestMethod.POST)
+ public SimpleDataResponse batchDelete(
+ @RequestBody @Validated DeleteUserParam deleteUserParam,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return userService.batchDelete(deleteUserParam, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "重置密码")
+ @RequestMapping(value = "/batchResetPassword",method = RequestMethod.POST)
+ public SimpleDataResponse batchResetPassword(
+ @RequestBody @Validated ResetPassword resetPassword,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType){
+ return userService.batchResetPassword(resetPassword, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "修改密码")
+ @RequestMapping(value = "/modifyPassword",method = RequestMethod.POST)
+ public SimpleDataResponse modifyPassword(
+ @RequestBody @Validated ModifyPassword modifyPassword,
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType
+ ) {
+ return userService.modifyPassword(modifyPassword, CompanyId, UserId, LanguageType);
+ }
+
+ @AccessRequired
+ @Operation(summary = "获取用户列表")
+ @RequestMapping(value = "/getListPage",method = RequestMethod.GET)
+ public PageResponse> getListPage(
+ @Parameter(name="LoginName",description="登录名",required=true,schema = @Schema(defaultValue = "admin")) @RequestHeader(required=true) String LoginName,
+ @Parameter(name="AccessToken",description="鉴权token",required=true) @RequestHeader(required=true) String AccessToken,
+ @Parameter(name="UserId",description="用户ID",required=true,schema = @Schema(defaultValue = "1")) @RequestHeader(required=true) Long UserId,
+ @Parameter(name="CompanyId",description="所属企业ID",required=false,schema = @Schema(defaultValue = "1")) @RequestHeader(required=false) String CompanyId,
+ @Parameter(name="LanguageType",description="语言类型 0:中文 1:英文 2:日文",required=true,schema = @Schema(defaultValue = "0")) @RequestHeader(required=true) Integer LanguageType,
+ PageSearchParam pageSearchParam
+ ) throws BusinessException {
+
+ pageSearchParam.setUserId(UserId);
+// pageSearchParam.setCompanyId(CompanyId);
+ PageResponse> pageResponse = new PageResponse>();
+ try{
+ pageResponse.setData(userService.getListPage(pageSearchParam, CompanyId, UserId, LanguageType));
+ pageResponse.setCode(ResponseCode.SUCCESS);
+ pageResponse.setMsg("success");
+ }catch (Exception e){
+ logger.error("查询列表报错",e);
+ pageResponse.setCode(ResponseCode.SERVER_ERROR);
+ pageResponse.setMsg(ResponseCode.SERVER_ERROR_MSG);
+ }
+ return pageResponse;
+ }
+
+}
diff --git a/model2d3d-viewer-back-controller/src/main/resources/assembly.xml b/model2d3d-viewer-back-controller/src/main/resources/assembly.xml
new file mode 100644
index 0000000..b17b06d
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/resources/assembly.xml
@@ -0,0 +1,59 @@
+
+
+
+ model2d3d-viewer-back
+
+
+ zip
+
+
+
+
+
+
+
+ ${project.build.directory}
+ /
+
+ *.jar
+
+
+
+
+
+ ${project.build.directory}/jar
+ /
+
+ lib/*.jar
+
+
+ *.jar
+
+
+
+
+
+ ${project.build.directory}/lib
+ /lib
+
+ *.jar
+
+
+
+
+
+ ${project.build.directory}/config
+ /config
+
+ application.properties
+
+
+
+
+
+ ${project.build.directory}/sql
+ /sql
+
+
+
+
diff --git a/model2d3d-viewer-back-controller/src/main/resources/config/application.properties b/model2d3d-viewer-back-controller/src/main/resources/config/application.properties
new file mode 100644
index 0000000..600777a
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/resources/config/application.properties
@@ -0,0 +1,98 @@
+server.port=${serverPort}
+
+api.enable=${apiEnable}
+
+spring.mvc.pathmatch.matching-strategy= ANT_PATH_MATCHER
+
+#mybatis.mapperLocations=classpath:mappers/**/*.xml
+# MyBatis-Plus 配置
+mybatis-plus.mapper-locations=classpath:mappers/**/*.xml
+# MyBatis 原生配置
+mybatis-plus.configuration.map-underscore-to-camel-case=true
+mybatis-plus.configuration.cache-enabled=false
+mybatis-plus.configuration.lazy-loading-enabled=false
+mybatis-plus.configuration.multiple-result-sets-enabled=false
+# MyBatis-Plus 全局配置
+mybatis-plus.global-config.banner=false
+mybatis-plus.global-config.enable-sql-runner=false
+# 数据库相关配置
+mybatis-plus.global-config.db-config.table-underline=true
+
+spring.datasource.name=model2d3d_viewer_back
+spring.datasource.url=jdbc:mysql://${datasourceDNS}/model2d3d_viewer_back?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=${datasourceTimeZone}
+spring.datasource.username=${datasourceUsername}
+spring.datasource.password=${datasourcePassword}
+#使用druid数据源
+spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
+spring.datasource.driverClassName=com.mysql.cj.jdbc.Driver
+
+#配置log日志
+logging.config=classpath:config/logback-boot.xml
+logging_level=${loggingLevel}
+logging_path=${loggingPath}
+#部署时使用SYSLOG
+logging_appender=${loggingAppender}
+logging_maxHistory=${loggingMaxHistory:7}
+logging_maxFileSize=100MB
+mybatis_log_level=${mybatisLogLevel}
+
+user.login.keytimeout=360000
+
+#集群模式cluster
+spring.redis.cluster.nodes=192.168.0.30:7000,192.168.0.30:7001
+#跨集群执行命令时要遵循的最大重定向数量
+spring.redis.cluster.max-redirects=3
+#哨兵模式sentinel
+spring.redis.sentinel.master=mymaster
+spring.redis.sentinel.nodes=192.168.0.30:16379,192.168.0.30:16379
+
+#单机模式standalone
+spring.redis.host=${redisHost}
+spring.redis.port=6379
+
+spring.redis.password=${redisPassword}
+spring.redis.timeout=5000
+#Redis数据库索引(默认为0)
+spring.redis.database=15
+#配置启动模式cluster、sentinel、standalone
+spring.redis.mode=standalone
+# Lettuce
+# 连接池最大连接数(使用负值表示没有限制)
+spring.redis.lettuce.pool.max-active=8
+# 连接池最大阻塞等待时间(使用负值表示没有限制)
+spring.redis.lettuce.pool.max-wait=100
+# 连接池中的最大空闲连接
+spring.redis.lettuce.pool.max-idle=8
+# 连接池中的最小空闲连接
+spring.redis.lettuce.pool.min-idle=0
+# 关闭超时时间
+spring.redis.lettuce.shutdown-timeout=100
+
+
+#邮件发送信息
+mail.smtp.host=email-smtp.ap-northeast-1.amazonaws.com
+mail.smtp.port=465
+mail.smtp.auth=true
+mail.smtp.ssl=true
+mail.sender.username=AKIAVRXFMB43Z4Q6WGZN
+mail.sender.password_encrypted=true
+mail.sender.password=a/52R0rao7ksRMvl1j17fVEmPCw7gC9OreHDqWOE+S7sgmoQT0YgoLRJqOlJqX7e
+mail.sender.sendername=datacenter-info
+mail.sender.from=alert@ttkdatatechbuild.com
+#邮件通知服务开关
+mail.send.switch=true
+
+Spring.mvc.hiddenmethod.filter.enabled=true
+#单个文件上传发大小
+spring.servlet.multipart.max-file-size=20MB
+#多个文件上传的共大小不得超过100M
+spring.servlet.multipart.max-request-size=100MB
+
+server.servlet.context-path=/api
+
+web.login.url=${webLoginUrl}
+
+
+springdoc.swagger-ui.doc-expansion=none
+springdoc.swagger-ui.operations-sorter=alpha
+springdoc.swagger-ui.tags-sorter=alpha
\ No newline at end of file
diff --git a/model2d3d-viewer-back-controller/src/main/resources/config/logback-boot.xml b/model2d3d-viewer-back-controller/src/main/resources/config/logback-boot.xml
new file mode 100644
index 0000000..1557180
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/resources/config/logback-boot.xml
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %p [%t] %m%n
+
+ UTF-8
+
+
+
+
+ ${logging_path}/spring.log
+
+
+
+
+
+ ${logging_path}/spring.%d.%i.gz
+
+ ${logging_maxHistory}
+
+
+ ${logging_maxFileSize}
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} %-5p [%t] %c %m%n
+
+
+ UTF-8
+
+
+
+
+
+
+
+
+
+
+
diff --git a/model2d3d-viewer-back-controller/src/main/resources/config/version.properties b/model2d3d-viewer-back-controller/src/main/resources/config/version.properties
new file mode 100644
index 0000000..10d9a5d
--- /dev/null
+++ b/model2d3d-viewer-back-controller/src/main/resources/config/version.properties
@@ -0,0 +1,3 @@
+project.latest.version=v0.0.1.20240228
+
+v0.0.1.20240228=1.初始版本
\ No newline at end of file
diff --git a/model2d3d-viewer-back-dao/.gitignore b/model2d3d-viewer-back-dao/.gitignore
new file mode 100644
index 0000000..aa23915
--- /dev/null
+++ b/model2d3d-viewer-back-dao/.gitignore
@@ -0,0 +1,15 @@
+/target/
+/logs/
+/.idea/
+*.iml
+*.bak
+*.log
+/.settings/
+*.project
+*.classpath
+*.factorypath
+*.springBeans
+/.apt_generated/
+/.externalToolBuilders/
+/bin/
+application-*.properties
diff --git a/model2d3d-viewer-back-dao/pom.xml b/model2d3d-viewer-back-dao/pom.xml
new file mode 100644
index 0000000..31b43df
--- /dev/null
+++ b/model2d3d-viewer-back-dao/pom.xml
@@ -0,0 +1,91 @@
+
+
+ 4.0.0
+
+ com.techsor
+ model2d3d-viewer-back
+ 0.0.1-SNAPSHOT
+
+ model2d3d-viewer-back-dao
+ model2d3d-viewer-back-dao
+ http://maven.apache.org
+
+ UTF-8
+
+
+
+
+
+ org.freemarker
+ freemarker
+ 2.3.34
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.5.11
+
+
+
+ org.mybatis
+ mybatis-spring
+
+
+
+
+
+
+ com.baomidou
+ mybatis-plus-jsqlparser
+ 3.5.11
+
+
+
+
+
+ com.baomidou
+ mybatis-plus-generator
+ 3.5.11
+
+
+
+
+ org.mybatis
+ mybatis-spring
+ 3.0.4
+
+
+
+ com.techsor
+ model2d3d-viewer-back-model
+ 0.0.1-SNAPSHOT
+
+
+
+
+
+
+
+
+
+ com.mysql
+ mysql-connector-j
+ 9.2.0
+
+
+
+ com.alibaba
+ druid
+ 1.1.3
+
+
+
+ junit
+ junit
+ test
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/MyBatisPlusGenerator.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/MyBatisPlusGenerator.java
new file mode 100644
index 0000000..6061ce9
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/MyBatisPlusGenerator.java
@@ -0,0 +1,152 @@
+package com.model2d3d.viewer.back.dao;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.generator.AutoGenerator;
+import com.baomidou.mybatisplus.generator.config.*;
+import com.baomidou.mybatisplus.generator.config.builder.GeneratorBuilder;
+import com.baomidou.mybatisplus.generator.config.rules.DateType;
+import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
+import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;
+import com.baomidou.mybatisplus.generator.config.querys.MySqlQuery;
+
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+public class MyBatisPlusGenerator {
+
+ public static void main(String[] args) {
+ // 1. 数据源配置
+ DataSourceConfig dataSourceConfig = new DataSourceConfig.Builder(
+ "jdbc:mysql://rm-bp11k2zm2fr7864428o.mysql.rds.aliyuncs.com:3306/model2d3d_viewer_back?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=Asia/Shanghai",
+ "zhc",
+ "Youqu48bnb1")
+ .dbQuery(new MySqlQuery())
+ .schema("model2d3d_viewer_back")
+ .build();
+
+ // 2. 全局配置(这里设置公共配置,实际路径在pathInfo中单独指定)
+ GlobalConfig globalConfig = GeneratorBuilder.globalConfigBuilder()
+ .author("jwy")
+ .disableOpenDir()
+ .enableSwagger()
+ .dateType(DateType.TIME_PACK)
+ .commentDate("")
+ .build();
+
+ // 3. 包配置(包名设置)
+ PackageConfig packageConfig = GeneratorBuilder.packageConfigBuilder()
+ .parent("com.model2d3d.viewer.back")
+ .entity("model") // 实体类包名
+ .mapper("dao.auto") // Mapper接口包名
+ .service("service") // Service接口包名
+ .serviceImpl("service.impl") // Service实现类包名
+ .controller("controller") // Controller包名
+ .xml("mappers.auto") // XML文件包名
+ .pathInfo(getPathInfo()) // 各层级的实际输出路径
+ .build();
+
+ // 4
+ // 自增主键的表
+ List autoIncrementTables = Arrays.asList(
+ "login_history",
+ "basic_menu"
+ );
+ // uuid算法主键的表
+ List assignIdTables = Arrays.asList(
+ "basic_role",
+ "basic_company",
+ "basic_user"
+ );
+ // 没有主键的表
+ List noIdTables = Arrays.asList(
+ "basic_role_menu_relation",
+ "basic_role_user_relation"
+ );
+
+ // 5. 为不同类型表创建不同的策略配置
+ generateForTables(dataSourceConfig, globalConfig, packageConfig,
+ autoIncrementTables, IdType.AUTO);
+
+ generateForTables(dataSourceConfig, globalConfig, packageConfig,
+ assignIdTables, IdType.ASSIGN_UUID);
+
+ generateForTables(dataSourceConfig, globalConfig, packageConfig,
+ noIdTables, IdType.NONE);
+ }
+
+ private static void generateForTables(DataSourceConfig dataSourceConfig,
+ GlobalConfig globalConfig,
+ PackageConfig packageConfig,
+ List tables,
+ IdType idType) {
+ StrategyConfig strategyConfig = GeneratorBuilder.strategyConfigBuilder()
+ .addInclude(tables)
+
+ .entityBuilder()
+ .enableFileOverride() // 实体类覆盖
+ .enableLombok()
+ .enableTableFieldAnnotation()
+ .naming(NamingStrategy.underline_to_camel)
+ .columnNaming(NamingStrategy.underline_to_camel)
+ .enableChainModel()
+ .enableRemoveIsPrefix()
+ .logicDeleteColumnName("deleted")
+ .idType(idType)
+
+ .mapperBuilder()
+ .enableFileOverride() // Mapper接口覆盖
+ .enableBaseResultMap()
+ .enableBaseColumnList()
+ .formatMapperFileName("%sMapper")
+ .formatXmlFileName("%sMapper")
+
+ .controllerBuilder()
+ .enableRestStyle()
+ .disable()
+
+ .serviceBuilder()
+ .formatServiceFileName("I%sService")
+ .formatServiceImplFileName("%sServiceImpl")
+ .disable()
+
+ .build();
+
+ // 5. 模板配置
+ TemplateConfig templateConfig = GeneratorBuilder.templateConfigBuilder()
+ .entity("/templates/entity.java") //使用自定义模板
+ .build();
+
+ // 6. 创建生成器并执行
+ new AutoGenerator(dataSourceConfig)
+ .global(globalConfig)
+ .packageInfo(packageConfig)
+ .strategy(strategyConfig)
+ .template(templateConfig)
+ .execute(new FreemarkerTemplateEngine());
+ }
+
+ // 自定义各层级的实际输出路径
+ private static Map getPathInfo() {
+ String projectRoot = System.getProperty("user.dir");
+ Map pathInfo = new HashMap<>();
+
+ // 实体类输出到 model 模块
+ pathInfo.put(OutputFile.entity, projectRoot + "/model2d3d-viewer-back-model/src/main/java/com/pet/map/back/model");
+ // Mapper接口输出到 dao 模块
+ pathInfo.put(OutputFile.mapper, projectRoot + "/model2d3d-viewer-back-dao/src/main/java/com/pet/map/back/dao/auto");
+ // XML文件输出到 resources 目录
+ pathInfo.put(OutputFile.xml, projectRoot + "/model2d3d-viewer-back-dao/src/main/resources/mappers/auto");
+
+ // Service和ServiceImpl输出到 service 模块
+ pathInfo.put(OutputFile.service, projectRoot + "/model2d3d-viewer-back-service/src/main/java/com/pet/map/back/service");
+ pathInfo.put(OutputFile.serviceImpl, projectRoot + "/model2d3d-viewer-back-service/src/main/java/com/pet/map/back/service/impl");
+ // Controller输出到 controller 模块
+ pathInfo.put(OutputFile.controller, projectRoot + "/model2d3d-viewer-back-controller/src/main/java/com/pet/map/back/controller");
+
+
+
+ return pathInfo;
+ }
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicCompanyMapper.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicCompanyMapper.java
new file mode 100644
index 0000000..9b08d3d
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicCompanyMapper.java
@@ -0,0 +1,17 @@
+package com.model2d3d.viewer.back.dao.auto;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.model2d3d.viewer.back.model.BasicCompany;
+
+/**
+ *
+ * 企业表 Mapper 接口
+ *
+ *
+ * @author jwy
+ * @since
+ */
+public interface BasicCompanyMapper extends BaseMapper {
+
+}
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicMenuMapper.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicMenuMapper.java
new file mode 100644
index 0000000..259ecac
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicMenuMapper.java
@@ -0,0 +1,17 @@
+package com.model2d3d.viewer.back.dao.auto;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.model2d3d.viewer.back.model.BasicMenu;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jwy
+ * @since
+ */
+public interface BasicMenuMapper extends BaseMapper {
+
+}
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleMapper.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleMapper.java
new file mode 100644
index 0000000..319ea61
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleMapper.java
@@ -0,0 +1,17 @@
+package com.model2d3d.viewer.back.dao.auto;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.model2d3d.viewer.back.model.BasicRole;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jwy
+ * @since
+ */
+public interface BasicRoleMapper extends BaseMapper {
+
+}
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleMenuRelationMapper.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleMenuRelationMapper.java
new file mode 100644
index 0000000..60c12ff
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleMenuRelationMapper.java
@@ -0,0 +1,17 @@
+package com.model2d3d.viewer.back.dao.auto;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.model2d3d.viewer.back.model.BasicRoleMenuRelation;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jwy
+ * @since
+ */
+public interface BasicRoleMenuRelationMapper extends BaseMapper {
+
+}
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleUserRelationMapper.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleUserRelationMapper.java
new file mode 100644
index 0000000..1277921
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicRoleUserRelationMapper.java
@@ -0,0 +1,17 @@
+package com.model2d3d.viewer.back.dao.auto;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.model2d3d.viewer.back.model.BasicRoleUserRelation;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jwy
+ * @since
+ */
+public interface BasicRoleUserRelationMapper extends BaseMapper {
+
+}
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicUserMapper.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicUserMapper.java
new file mode 100644
index 0000000..b6e306c
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/BasicUserMapper.java
@@ -0,0 +1,17 @@
+package com.model2d3d.viewer.back.dao.auto;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.model2d3d.viewer.back.model.BasicUser;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jwy
+ * @since
+ */
+public interface BasicUserMapper extends BaseMapper {
+
+}
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/LoginHistoryMapper.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/LoginHistoryMapper.java
new file mode 100644
index 0000000..0dd4311
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/auto/LoginHistoryMapper.java
@@ -0,0 +1,17 @@
+package com.model2d3d.viewer.back.dao.auto;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.model2d3d.viewer.back.model.LoginHistory;
+
+/**
+ *
+ * Mapper 接口
+ *
+ *
+ * @author jwy
+ * @since
+ */
+public interface LoginHistoryMapper extends BaseMapper {
+
+}
+
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicCompanyMapperExt.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicCompanyMapperExt.java
new file mode 100644
index 0000000..a78079f
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicCompanyMapperExt.java
@@ -0,0 +1,32 @@
+package com.model2d3d.viewer.back.dao.ex;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.model2d3d.viewer.back.model.BasicCompany;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.model2d3d.viewer.back.dao.auto.BasicCompanyMapper;
+import com.model2d3d.viewer.back.dto.company.CompanySearchParams;
+import com.model2d3d.viewer.back.dto.company.OptCompanyParams;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.vo.company.CompanyPageDTO;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface BasicCompanyMapperExt extends BasicCompanyMapper{
+
+ List getSubCompanyByParentId(Map searchChildMap);
+
+ List getSelectList(Map paramMap);
+
+ int checkExist(OptCompanyParams optCompanyParams);
+
+ IPage getListPage(Page> page, @Param("params") CompanySearchParams pageSearchParam);
+
+ List getListForTree();
+
+
+}
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleMapperExt.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleMapperExt.java
new file mode 100644
index 0000000..db24709
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleMapperExt.java
@@ -0,0 +1,26 @@
+package com.model2d3d.viewer.back.dao.ex;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.model2d3d.viewer.back.dto.role.RolePageSearchParam;
+import org.apache.ibatis.annotations.Mapper;
+
+import com.model2d3d.viewer.back.dao.auto.BasicRoleMapper;
+import com.model2d3d.viewer.back.dto.role.OptRoleParam;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.vo.role.RolePageDTO;
+import org.apache.ibatis.annotations.Param;
+
+@Mapper
+public interface BasicRoleMapperExt extends BasicRoleMapper {
+
+ Long checkExist(OptRoleParam param);
+
+ List getOwnMenuIds(Map paramMap);
+
+ IPage getListPage(Page page, @Param("params") RolePageSearchParam pageSearchParam);
+
+}
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleMenuRelationMapperExt.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleMenuRelationMapperExt.java
new file mode 100644
index 0000000..76030a5
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleMenuRelationMapperExt.java
@@ -0,0 +1,16 @@
+package com.model2d3d.viewer.back.dao.ex;
+
+import java.util.Map;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.model2d3d.viewer.back.dao.auto.BasicRoleMenuRelationMapper;
+
+@Mapper
+public interface BasicRoleMenuRelationMapperExt extends BasicRoleMenuRelationMapper {
+
+ void batchInsert(Map paramMap);
+
+ String getMenuIdsByRoleId(Long roleId);
+
+}
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleUserRelationMapperExt.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleUserRelationMapperExt.java
new file mode 100644
index 0000000..3848843
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicRoleUserRelationMapperExt.java
@@ -0,0 +1,10 @@
+package com.model2d3d.viewer.back.dao.ex;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.model2d3d.viewer.back.dao.auto.BasicRoleUserRelationMapper;
+
+@Mapper
+public interface BasicRoleUserRelationMapperExt extends BasicRoleUserRelationMapper {
+
+}
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicUserMapperExt.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicUserMapperExt.java
new file mode 100644
index 0000000..c110bee
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/BasicUserMapperExt.java
@@ -0,0 +1,27 @@
+package com.model2d3d.viewer.back.dao.ex;
+
+import java.util.List;
+import java.util.Map;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import com.model2d3d.viewer.back.dao.auto.BasicUserMapper;
+import com.model2d3d.viewer.back.dto.user.OptUserParam;
+import com.model2d3d.viewer.back.dto.user.PageSearchParam;
+import com.model2d3d.viewer.back.vo.user.UserInfoVO;
+import com.model2d3d.viewer.back.vo.user.UserPageDTO;
+
+@Mapper
+public interface BasicUserMapperExt extends BasicUserMapper{
+
+ Long checkExist(OptUserParam param);
+
+ IPage getListPage(Page> page, @Param("params") PageSearchParam pageSearchParam);
+
+ String getMenuIdsByUserId(@Param("userId") String userId);
+
+ UserInfoVO getAccountInfo(Map paramMap);
+
+}
diff --git a/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/LoginHistoryMapperExt.java b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/LoginHistoryMapperExt.java
new file mode 100644
index 0000000..cf8de41
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/java/com/model2d3d/viewer/back/dao/ex/LoginHistoryMapperExt.java
@@ -0,0 +1,10 @@
+package com.model2d3d.viewer.back.dao.ex;
+
+import org.apache.ibatis.annotations.Mapper;
+
+import com.model2d3d.viewer.back.dao.auto.LoginHistoryMapper;
+
+@Mapper
+public interface LoginHistoryMapperExt extends LoginHistoryMapper{
+
+}
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicCompanyMapper.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicCompanyMapper.xml
new file mode 100644
index 0000000..a94a5a5
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicCompanyMapper.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, parent_id, company_name, flag, create_time, modify_time
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicMenuMapper.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicMenuMapper.xml
new file mode 100644
index 0000000..e7fc93d
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicMenuMapper.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, parent_menu_id, menu_name, menu_name_en, menu_name_jp, remark, menu_level, flag, create_time
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleMapper.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleMapper.xml
new file mode 100644
index 0000000..35b9ce6
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleMapper.xml
@@ -0,0 +1,23 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, company_id, role_name, description, flag, creator_id, create_time, modifier_id, modify_time
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleMenuRelationMapper.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleMenuRelationMapper.xml
new file mode 100644
index 0000000..2410100
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleMenuRelationMapper.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ role_id, menu_id, creator_id, create_time
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleUserRelationMapper.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleUserRelationMapper.xml
new file mode 100644
index 0000000..c284e22
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicRoleUserRelationMapper.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ user_id, role_id, creator_id, create_time
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicUserMapper.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicUserMapper.xml
new file mode 100644
index 0000000..d28e8b0
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/BasicUserMapper.xml
@@ -0,0 +1,32 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, company_id, shop_uuid, username, login_name, password, password_modify_time, salt, email, mobile_number, last_login_time, remark, flag, expire_time, create_time, creator_id, modify_time, modifier_id
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/LoginHistoryMapper.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/LoginHistoryMapper.xml
new file mode 100644
index 0000000..f08c7ac
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/auto/LoginHistoryMapper.xml
@@ -0,0 +1,18 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ id, user_id, request_ip, login_time
+
+
+
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicCompanyMapperExt.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicCompanyMapperExt.xml
new file mode 100644
index 0000000..4677202
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicCompanyMapperExt.xml
@@ -0,0 +1,72 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicRoleMapperExt.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicRoleMapperExt.xml
new file mode 100644
index 0000000..dbe890f
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicRoleMapperExt.xml
@@ -0,0 +1,68 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicRoleMenuRelationMapperExt.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicRoleMenuRelationMapperExt.xml
new file mode 100644
index 0000000..f72161b
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicRoleMenuRelationMapperExt.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+ INSERT INTO
+ basic_role_menu_relation (role_id, menu_id, creator_id, create_time)
+ VALUES
+
+ (#{roleId}, #{item}, #{creatorId}, #{createTime})
+
+
+
+
+
+
\ No newline at end of file
diff --git a/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicUserMapperExt.xml b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicUserMapperExt.xml
new file mode 100644
index 0000000..f2f148a
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/mappers/ex/BasicUserMapperExt.xml
@@ -0,0 +1,96 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/model2d3d-viewer-back-dao/src/main/resources/templates/entity.java.ftl b/model2d3d-viewer-back-dao/src/main/resources/templates/entity.java.ftl
new file mode 100644
index 0000000..1ced4f5
--- /dev/null
+++ b/model2d3d-viewer-back-dao/src/main/resources/templates/entity.java.ftl
@@ -0,0 +1,61 @@
+package ${package.Entity};
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+<#-- 自动导入日期类型 -->
+<#list table.fields as field>
+ <#if field.propertyType == "LocalDate">
+import java.time.LocalDate;
+ <#break>
+ #if>
+#list>
+<#list table.fields as field>
+ <#if field.propertyType == "LocalDateTime">
+import java.time.LocalDateTime;
+ <#break>
+ #if>
+#list>
+
+<#-- 类定义 -->
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("${table.name}")
+@Schema(description = "${table.comment!}")
+public class ${entity} implements Serializable {
+
+<#-- 主键字段处理 -->
+<#assign hasPk = false>
+<#list table.fields as field>
+ <#if field.keyFlag>
+ <#assign hasPk = true>
+ @TableId(value = "${field.name}", type = IdType.${idType!"ASSIGN_ID"})
+ @Schema(description = "${field.comment!}")
+ private ${field.propertyType} ${field.propertyName};
+
+ #if>
+#list>
+
+<#-- 普通字段处理 -->
+<#list table.fields as field>
+ <#if !field.keyFlag>
+ @TableField("${field.name}")
+ @Schema(description = "${field.comment!}")
+ private ${field.propertyType} ${field.propertyName};
+
+ #if>
+#list>
+
+<#-- 无主键表的额外处理 -->
+<#if !hasPk>
+<#-- 在这里可以添加无主键表特有的方法或注释 -->
+<#-- 例如,可能需要提供手动主键生成策略或者修改操作方法 -->
+#if>
+}
diff --git a/model2d3d-viewer-back-model/.gitignore b/model2d3d-viewer-back-model/.gitignore
new file mode 100644
index 0000000..aa23915
--- /dev/null
+++ b/model2d3d-viewer-back-model/.gitignore
@@ -0,0 +1,15 @@
+/target/
+/logs/
+/.idea/
+*.iml
+*.bak
+*.log
+/.settings/
+*.project
+*.classpath
+*.factorypath
+*.springBeans
+/.apt_generated/
+/.externalToolBuilders/
+/bin/
+application-*.properties
diff --git a/model2d3d-viewer-back-model/pom.xml b/model2d3d-viewer-back-model/pom.xml
new file mode 100644
index 0000000..9fee014
--- /dev/null
+++ b/model2d3d-viewer-back-model/pom.xml
@@ -0,0 +1,56 @@
+
+
+ 4.0.0
+
+ com.techsor
+ model2d3d-viewer-back
+ 0.0.1-SNAPSHOT
+
+ model2d3d-viewer-back-model
+ model2d3d-viewer-back-model
+ http://maven.apache.org
+
+ UTF-8
+
+
+
+
+
+ org.hibernate.validator
+ hibernate-validator
+ 9.0.0.CR1
+
+
+ org.glassfish
+ javax.el
+ 3.0.1-b11
+
+
+
+ org.hibernate.validator
+ hibernate-validator-cdi
+ 9.0.0.CR1
+
+
+
+
+ com.baomidou
+ mybatis-plus-boot-starter
+ 3.5.11
+
+
+
+ org.mybatis
+ mybatis-spring
+
+
+
+
+
+ junit
+ junit
+ test
+
+
+
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/BaseSearchNoCompanysParams.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/BaseSearchNoCompanysParams.java
new file mode 100644
index 0000000..c897e26
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/BaseSearchNoCompanysParams.java
@@ -0,0 +1,25 @@
+package com.model2d3d.viewer.back.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.Jiang
+* @time 2022年4月23日 下午1:55:22
+*/
+@Setter
+@Getter
+public class BaseSearchNoCompanysParams {
+
+ /** 页码 */
+ @Schema(description = "当前页码(默认第一页)",example = "1")
+ private Integer pageNum;
+ /** 每页显示的条数 */
+ @Schema(description = "每页显示的条数(默认20条)", example = "20")
+ private Integer pageSize;
+
+ @Schema(description = "用户ID", hidden = true)
+ private Long userId;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/BaseSearchParams.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/BaseSearchParams.java
new file mode 100644
index 0000000..23e7755
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/BaseSearchParams.java
@@ -0,0 +1,23 @@
+package com.model2d3d.viewer.back.dto;
+
+import java.util.List;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.Jiang
+* @time 2022年4月23日 下午1:55:22
+*/
+@Setter
+@Getter
+public class BaseSearchParams extends BaseSearchNoCompanysParams{
+
+ @Schema(description = "查询对象所属企业ID,多个使用逗号连接")
+ private String companyIds;
+
+ @Schema(description = "查询对象所属企业ID", hidden = true)
+ private List companyIdList;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/account/CacheUserData.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/account/CacheUserData.java
new file mode 100644
index 0000000..e168de4
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/account/CacheUserData.java
@@ -0,0 +1,23 @@
+package com.model2d3d.viewer.back.dto.account;
+
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年5月20日 下午2:08:50
+*/
+@Data
+public class CacheUserData {
+
+ private String accessToken;
+ private String userId;
+ private String companyId;
+ private String username;
+ private String loginName;
+ private String password;
+ private Long createTime;
+ private Long expireTime;
+ private String menuIds;
+// private String userGroupIds;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/account/LoginParam.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/account/LoginParam.java
new file mode 100644
index 0000000..496cf6e
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/account/LoginParam.java
@@ -0,0 +1,25 @@
+package com.model2d3d.viewer.back.dto.account;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年5月20日 下午7:13:50
+*/
+@Data
+public class LoginParam {
+
+ @Schema(description ="登录名",example = "admin")
+ private String loginname;
+
+ @Schema(description = "密码",example = "123456")
+ private String password;
+
+ @Schema(description = "验证码的请求标识ID",example = "111weyu2-123rt2u1-121ueiu2")
+ private String captchaRequestId;
+
+ @Schema(description = "验证码值",example = "Z3xA")
+ private String captcha;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/CompanySearchParams.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/CompanySearchParams.java
new file mode 100644
index 0000000..c495bf1
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/CompanySearchParams.java
@@ -0,0 +1,24 @@
+package com.model2d3d.viewer.back.dto.company;
+
+import com.model2d3d.viewer.back.dto.BaseSearchParams;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年7月21日 下午8:50:31
+*/
+@Data
+public class CompanySearchParams extends BaseSearchParams{
+
+ @Schema(description ="企业名",example = "张三李四")
+ private String companyName;
+
+ @Schema(description ="登录账号的企业ID",example = "1", hidden = true)
+ private String selfCompanyId;
+
+// @Schema(description ="1-未进入系统homepage页面获取,2-点击企业后进入系统后获取",example = "2")
+// private Integer searchType;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/DeleteCompanyParams.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/DeleteCompanyParams.java
new file mode 100644
index 0000000..48dc68f
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/DeleteCompanyParams.java
@@ -0,0 +1,18 @@
+package com.model2d3d.viewer.back.dto.company;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年7月21日 下午8:50:31
+*/
+@Data
+public class DeleteCompanyParams{
+
+ @NotBlank(message = "1001")
+ @Schema(description ="企业ID,多个使用半角字符逗号连接",example = "2738967,587")
+ private String companyIds;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/OptCompanyParams.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/OptCompanyParams.java
new file mode 100644
index 0000000..b56f7e6
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/company/OptCompanyParams.java
@@ -0,0 +1,28 @@
+package com.model2d3d.viewer.back.dto.company;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+import lombok.Data;
+import org.hibernate.validator.constraints.Length;
+
+/**
+* @author Mr.Jiang
+* @time 2022年7月21日 下午8:50:31
+*/
+@Data
+public class OptCompanyParams{
+
+ @Schema(description ="企业唯一标识ID,新增时无此参数",example = "2738967")
+ private String companyId;
+
+ @Schema(description ="父企业ID",example = "2738967", hidden = true)
+ private String parentId;
+
+ @NotBlank(message = "1001")
+ @Length(max = 500,message = "1002")
+ @Schema(description ="企业名称",example = "testAccount1", required = true)
+ private String companyName;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/DeleteRoleParam.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/DeleteRoleParam.java
new file mode 100644
index 0000000..1f9df03
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/DeleteRoleParam.java
@@ -0,0 +1,20 @@
+package com.model2d3d.viewer.back.dto.role;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.Jiang
+* @time 2022年4月23日 下午1:59:33
+*/
+@Setter
+@Getter
+public class DeleteRoleParam {
+
+ @NotBlank(message = "1001")
+ @Schema(description ="Id,多个使用逗号连接",example = "3,5", required = true)
+ private String roleIds;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/OptRoleParam.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/OptRoleParam.java
new file mode 100644
index 0000000..b22d6e1
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/OptRoleParam.java
@@ -0,0 +1,38 @@
+package com.model2d3d.viewer.back.dto.role;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Max;
+import jakarta.validation.constraints.Min;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Length;
+import org.hibernate.validator.constraints.Range;
+
+/**
+* @author zhc
+* @time 2022年6月14日10:56:38
+*/
+@Setter
+@Getter
+public class OptRoleParam {
+
+ @Schema(description ="角色ID, 新增时无此参数",example = "111", required = false)
+ private String roleId;
+
+ @NotBlank(message = "1001")
+ @Length(max = 100,message = "1002")
+ @Schema(description ="角色名称",example = "管理员", required = true)
+ private String roleName;
+
+ @Length(max = 500,message = "1002")
+ @Schema(description ="描述",example = "这是管理员描述")
+ private String description;
+
+ @Schema(description ="菜单权限ID,使用逗号连接",example = "1,4,5,6")
+ private String menuIds;
+
+ @Schema(description ="所属企业ID",example = "2", hidden = true)
+ private String companyId;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/RolePageSearchParam.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/RolePageSearchParam.java
new file mode 100644
index 0000000..dc2b3c0
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/role/RolePageSearchParam.java
@@ -0,0 +1,21 @@
+package com.model2d3d.viewer.back.dto.role;
+
+import com.model2d3d.viewer.back.dto.BaseSearchParams;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.zhc
+* @time 2022年7月27日12:06:35
+*/
+@Setter
+@Getter
+public class RolePageSearchParam extends BaseSearchParams{
+
+ @Schema(description ="角色名",example = "test", required = false)
+ private String roleName;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/DeleteUserParam.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/DeleteUserParam.java
new file mode 100644
index 0000000..2a84ce9
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/DeleteUserParam.java
@@ -0,0 +1,20 @@
+package com.model2d3d.viewer.back.dto.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.Jiang
+* @time 2022年4月23日 下午1:59:33
+*/
+@Setter
+@Getter
+public class DeleteUserParam {
+
+ @NotBlank(message = "1001")
+ @Schema(description ="Id,多个使用逗号连接",example = "3,5", required = true)
+ private String userIds;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/ModifyPassword.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/ModifyPassword.java
new file mode 100644
index 0000000..521ad06
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/ModifyPassword.java
@@ -0,0 +1,24 @@
+package com.model2d3d.viewer.back.dto.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.Jiang
+* @time 2022年4月23日 下午1:59:33
+*/
+@Setter
+@Getter
+public class ModifyPassword{
+
+ @NotBlank(message = "1001")
+ @Schema(description ="旧密码",example = "haoihg09278", required = true)
+ private String oldPassword;
+
+ @NotBlank(message = "1001")
+ @Schema(description ="新密码",example = "og.ayhgih", required = true)
+ private String newPassword;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/OptUserParam.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/OptUserParam.java
new file mode 100644
index 0000000..36f34da
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/OptUserParam.java
@@ -0,0 +1,44 @@
+package com.model2d3d.viewer.back.dto.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.Email;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+import org.hibernate.validator.constraints.Length;
+
+/**
+* @author zhc
+* @time 2022年6月14日10:56:38
+*/
+@Setter
+@Getter
+public class OptUserParam {
+
+
+ @Schema(description ="用户ID, 新增时无此参数",example = "111", required = false)
+ private String userId;
+
+ @Schema(description ="角色ID",example = "24", required = false)
+ private String roleId;
+
+ @NotBlank(message = "1001")
+ @Length(max = 255,message = "1002")
+ @Schema(description ="用户名",example = "管理员", required = true)
+ private String username;
+
+ @Schema(description ="登录名",example = "adminmin", hidden = true)
+ private String loginName;
+
+ @Email(message = "1004")
+ @Schema(description ="用户邮箱",example = "1057897@qq.com", required = true)
+ private String email;
+
+ @Schema(description ="手机号码,这里要加上国际区号,比如日本是+81,传给后台的就是+81-08041165856,中国是+86,传给后台的就是+86-18841165856",example = "+81-08041165856", required = false)
+ private String mobileNumber;
+
+ @Schema(description ="所属企业ID",example = "2", hidden = true)
+ private String companyId;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/PageSearchParam.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/PageSearchParam.java
new file mode 100644
index 0000000..bd61469
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/PageSearchParam.java
@@ -0,0 +1,20 @@
+package com.model2d3d.viewer.back.dto.user;
+
+import com.model2d3d.viewer.back.dto.BaseSearchParams;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.zhc
+* @time 2022年7月27日12:06:35
+*/
+@Setter
+@Getter
+public class PageSearchParam extends BaseSearchParams{
+
+ @Schema(description ="用户名/用户邮箱",example = "test", required = false)
+ private String keyword;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/ResetPassword.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/ResetPassword.java
new file mode 100644
index 0000000..bd45855
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/dto/user/ResetPassword.java
@@ -0,0 +1,23 @@
+package com.model2d3d.viewer.back.dto.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import jakarta.validation.constraints.NotBlank;
+import lombok.Getter;
+import lombok.Setter;
+
+/**
+* @author Mr.Jiang
+* @time 2022年4月23日 下午1:59:33
+*/
+@Setter
+@Getter
+public class ResetPassword{
+
+ @NotBlank(message = "1001")
+ @Schema(description ="Id,多个使用逗号连接",example = "3,5", required = true)
+ private String userIds;
+
+// @Schema(description ="重置密码方式 1-管理员直接重置密码,账号邮箱接收该密码,2-发送重置密码链接到绑定的账户邮箱中,用户自己重置密码",example = "2", required = true)
+// private Integer resetType = 1;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicCompany.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicCompany.java
new file mode 100644
index 0000000..4eb8701
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicCompany.java
@@ -0,0 +1,46 @@
+package com.model2d3d.viewer.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("basic_company")
+@Schema(description = "企业表")
+public class BasicCompany implements Serializable {
+
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ @Schema(description = "")
+ private String id;
+
+
+ @TableField("parent_id")
+ @Schema(description = "")
+ private String parentId;
+
+ @TableField("company_name")
+ @Schema(description = "")
+ private String companyName;
+
+ @TableField("flag")
+ @Schema(description = "0-正常,1-删除")
+ private Integer flag;
+
+ @TableField("create_time")
+ @Schema(description = "")
+ private Long createTime;
+
+ @TableField("modify_time")
+ @Schema(description = "")
+ private Long modifyTime;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicMenu.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicMenu.java
new file mode 100644
index 0000000..d8c8eca
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicMenu.java
@@ -0,0 +1,58 @@
+package com.model2d3d.viewer.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("basic_menu")
+@Schema(description = "")
+public class BasicMenu implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ @Schema(description = "")
+ private Long id;
+
+
+ @TableField("parent_menu_id")
+ @Schema(description = "")
+ private Long parentMenuId;
+
+ @TableField("menu_name")
+ @Schema(description = "")
+ private String menuName;
+
+ @TableField("menu_name_en")
+ @Schema(description = "")
+ private String menuNameEn;
+
+ @TableField("menu_name_jp")
+ @Schema(description = "")
+ private String menuNameJp;
+
+ @TableField("remark")
+ @Schema(description = "")
+ private String remark;
+
+ @TableField("menu_level")
+ @Schema(description = "菜单级别")
+ private Integer menuLevel;
+
+ @TableField("flag")
+ @Schema(description = "0-正常,1-删除")
+ private Integer flag;
+
+ @TableField("create_time")
+ @Schema(description = "")
+ private Long createTime;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRole.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRole.java
new file mode 100644
index 0000000..4927b88
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRole.java
@@ -0,0 +1,58 @@
+package com.model2d3d.viewer.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("basic_role")
+@Schema(description = "")
+public class BasicRole implements Serializable {
+
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ @Schema(description = "")
+ private String id;
+
+
+ @TableField("company_id")
+ @Schema(description = "")
+ private String companyId;
+
+ @TableField("role_name")
+ @Schema(description = "")
+ private String roleName;
+
+ @TableField("description")
+ @Schema(description = "")
+ private String description;
+
+ @TableField("flag")
+ @Schema(description = "0-正常,1-删除")
+ private Integer flag;
+
+ @TableField("creator_id")
+ @Schema(description = "")
+ private Long creatorId;
+
+ @TableField("create_time")
+ @Schema(description = "")
+ private Long createTime;
+
+ @TableField("modifier_id")
+ @Schema(description = "")
+ private Long modifierId;
+
+ @TableField("modify_time")
+ @Schema(description = "")
+ private Long modifyTime;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRoleMenuRelation.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRoleMenuRelation.java
new file mode 100644
index 0000000..df73ef2
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRoleMenuRelation.java
@@ -0,0 +1,38 @@
+package com.model2d3d.viewer.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("basic_role_menu_relation")
+@Schema(description = "")
+public class BasicRoleMenuRelation implements Serializable {
+
+
+ @TableField("role_id")
+ @Schema(description = "")
+ private String roleId;
+
+ @TableField("menu_id")
+ @Schema(description = "")
+ private Long menuId;
+
+ @TableField("creator_id")
+ @Schema(description = "")
+ private Long creatorId;
+
+ @TableField("create_time")
+ @Schema(description = "")
+ private Long createTime;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRoleUserRelation.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRoleUserRelation.java
new file mode 100644
index 0000000..a260bad
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicRoleUserRelation.java
@@ -0,0 +1,38 @@
+package com.model2d3d.viewer.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("basic_role_user_relation")
+@Schema(description = "")
+public class BasicRoleUserRelation implements Serializable {
+
+
+ @TableField("user_id")
+ @Schema(description = "")
+ private String userId;
+
+ @TableField("role_id")
+ @Schema(description = "")
+ private String roleId;
+
+ @TableField("creator_id")
+ @Schema(description = "")
+ private Long creatorId;
+
+ @TableField("create_time")
+ @Schema(description = "")
+ private Long createTime;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicUser.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicUser.java
new file mode 100644
index 0000000..3e8beba
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/BasicUser.java
@@ -0,0 +1,94 @@
+package com.model2d3d.viewer.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("basic_user")
+@Schema(description = "")
+public class BasicUser implements Serializable {
+
+ @TableId(value = "id", type = IdType.ASSIGN_UUID)
+ @Schema(description = "")
+ private String id;
+
+
+ @TableField("company_id")
+ @Schema(description = "")
+ private String companyId;
+
+ @TableField("shop_uuid")
+ @Schema(description = "")
+ private String shopUuid;
+
+ @TableField("username")
+ @Schema(description = "")
+ private String username;
+
+ @TableField("login_name")
+ @Schema(description = "")
+ private String loginName;
+
+ @TableField("password")
+ @Schema(description = "")
+ private String password;
+
+ @TableField("password_modify_time")
+ @Schema(description = "")
+ private Long passwordModifyTime;
+
+ @TableField("salt")
+ @Schema(description = "")
+ private String salt;
+
+ @TableField("email")
+ @Schema(description = "")
+ private String email;
+
+ @TableField("mobile_number")
+ @Schema(description = "")
+ private String mobileNumber;
+
+ @TableField("last_login_time")
+ @Schema(description = "")
+ private Long lastLoginTime;
+
+ @TableField("remark")
+ @Schema(description = "备注")
+ private String remark;
+
+ @TableField("flag")
+ @Schema(description = "0-正常,1-删除")
+ private Integer flag;
+
+ @TableField("expire_time")
+ @Schema(description = "")
+ private Long expireTime;
+
+ @TableField("create_time")
+ @Schema(description = "")
+ private Long createTime;
+
+ @TableField("creator_id")
+ @Schema(description = "")
+ private Long creatorId;
+
+ @TableField("modify_time")
+ @Schema(description = "")
+ private Long modifyTime;
+
+ @TableField("modifier_id")
+ @Schema(description = "")
+ private Long modifierId;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/LoginHistory.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/LoginHistory.java
new file mode 100644
index 0000000..ca45812
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/model/LoginHistory.java
@@ -0,0 +1,38 @@
+package com.model2d3d.viewer.back.model;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Getter;
+import lombok.Setter;
+import lombok.ToString;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Getter
+@Setter
+@ToString
+@Accessors(chain = true)
+@TableName("login_history")
+@Schema(description = "")
+public class LoginHistory implements Serializable {
+
+ @TableId(value = "id", type = IdType.AUTO)
+ @Schema(description = "")
+ private Long id;
+
+
+ @TableField("user_id")
+ @Schema(description = "")
+ private String userId;
+
+ @TableField("request_ip")
+ @Schema(description = "")
+ private String requestIp;
+
+ @TableField("login_time")
+ @Schema(description = "")
+ private Long loginTime;
+
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/TreeMenusDTO.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/TreeMenusDTO.java
new file mode 100644
index 0000000..56ebad4
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/TreeMenusDTO.java
@@ -0,0 +1,27 @@
+package com.model2d3d.viewer.back.vo;
+
+import java.util.List;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年7月29日 下午4:37:50
+*/
+@Data
+public class TreeMenusDTO {
+
+ @Schema(description ="节点ID",example = "11", required = true)
+ private String key;
+
+ @Schema(description ="父节点ID",example = "2", hidden = true)
+ private String parentKey;
+
+ @Schema(description ="节点名称",example = "添加", required = true)
+ private String label;
+
+ @Schema(description ="子节点",example = "[]", required = false)
+ private List children;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/company/CompanyPageDTO.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/company/CompanyPageDTO.java
new file mode 100644
index 0000000..9d3c3fd
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/company/CompanyPageDTO.java
@@ -0,0 +1,25 @@
+package com.model2d3d.viewer.back.vo.company;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年7月21日 下午8:50:31
+*/
+@Data
+public class CompanyPageDTO{
+
+ @Schema(description ="企业唯一标识ID,新增时无此参数",example = "2738967")
+ private String companyId;
+
+ @Schema(description ="企业名称",example = "testAccount1", required = true)
+ private String companyName;
+
+ @Schema(description ="所属企业ID",example = "2738967")
+ private String parentId;
+
+ @Schema(description ="所属企业名称",example = "testAccount1", required = true)
+ private String parentCompanyName;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/role/RoleMenuDTO.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/role/RoleMenuDTO.java
new file mode 100644
index 0000000..808f68a
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/role/RoleMenuDTO.java
@@ -0,0 +1,27 @@
+package com.model2d3d.viewer.back.vo.role;
+
+import java.util.List;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年7月29日 下午4:37:50
+*/
+@Data
+public class RoleMenuDTO {
+
+ @Schema(description ="菜单ID",example = "11", required = true)
+ private String key;
+
+ @Schema(description ="父菜单ID",example = "2", hidden = true)
+ private String parentKey;
+
+ @Schema(description ="菜单名称",example = "添加", required = true)
+ private String label;
+
+ @Schema(description ="子菜单",example = "[]", required = false)
+ private List children;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/role/RolePageDTO.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/role/RolePageDTO.java
new file mode 100644
index 0000000..555282b
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/role/RolePageDTO.java
@@ -0,0 +1,25 @@
+package com.model2d3d.viewer.back.vo.role;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年5月22日 下午10:37:02
+*/
+@Data
+public class RolePageDTO {
+
+ @Schema(description ="角色ID",example = "111", required = true)
+ private String roleId;
+
+ @Schema(description ="角色名称",example = "管理员", required = true)
+ private String roleName;
+
+ @Schema(description ="描述",example = "这是管理员描述", required = true)
+ private String description;
+
+ @Schema(description ="最后更新时间",example = "1689878789647", required = true)
+ private Long modifyTime;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/user/UserInfoVO.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/user/UserInfoVO.java
new file mode 100644
index 0000000..244352c
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/user/UserInfoVO.java
@@ -0,0 +1,15 @@
+package com.model2d3d.viewer.back.vo.user;
+
+import com.model2d3d.viewer.back.model.BasicUser;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年5月22日 下午10:37:02
+*/
+@Data
+public class UserInfoVO extends BasicUser {
+
+ private String parentCompanyId;
+
+}
diff --git a/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/user/UserPageDTO.java b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/user/UserPageDTO.java
new file mode 100644
index 0000000..8e8ad45
--- /dev/null
+++ b/model2d3d-viewer-back-model/src/main/java/com/model2d3d/viewer/back/vo/user/UserPageDTO.java
@@ -0,0 +1,43 @@
+package com.model2d3d.viewer.back.vo.user;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+* @author Mr.Jiang
+* @time 2022年5月22日 下午10:37:02
+*/
+@Data
+public class UserPageDTO {
+
+ @Schema(description ="企业唯一标识ID,新增时无此参数",example = "2738967")
+ private String companyId;
+
+ @Schema(description ="企业名称",example = "testAccount1", required = true)
+ private String companyName;
+
+ @Schema(description ="用户ID, 新增时无此参数",example = "111", required = false)
+ private String userId;
+
+ @Schema(description ="角色ID",example = "24", required = false)
+ private String roleId;
+
+ @Schema(description ="角色名",example = "24", required = false)
+ private String roleName;
+
+ @Schema(description ="用户名",example = "管理员", required = true)
+ private String username;
+
+// @Schema(description ="登录名",example = "adminmin", required = true)
+// private String loginName;
+
+ @Schema(description ="用户邮箱",example = "1057897@qq.com", required = true)
+ private String email;
+
+ @Schema(description ="手机号码,这里要加上国际区号,比如日本是+81,传给后台的就是+81-08041165856,中国是+86,传给后台的就是+86-18841165856",example = "+81-08041165856", required = false)
+ private String mobileNumber;
+
+ @Schema(description ="创建时间",example = "1678990326897", required = false)
+ private Long createTime;
+
+}
diff --git a/model2d3d-viewer-back-service/.gitignore b/model2d3d-viewer-back-service/.gitignore
new file mode 100644
index 0000000..aa23915
--- /dev/null
+++ b/model2d3d-viewer-back-service/.gitignore
@@ -0,0 +1,15 @@
+/target/
+/logs/
+/.idea/
+*.iml
+*.bak
+*.log
+/.settings/
+*.project
+*.classpath
+*.factorypath
+*.springBeans
+/.apt_generated/
+/.externalToolBuilders/
+/bin/
+application-*.properties
diff --git a/model2d3d-viewer-back-service/pom.xml b/model2d3d-viewer-back-service/pom.xml
new file mode 100644
index 0000000..94d7c3b
--- /dev/null
+++ b/model2d3d-viewer-back-service/pom.xml
@@ -0,0 +1,55 @@
+
+
+ 4.0.0
+
+ com.techsor
+ model2d3d-viewer-back
+ 0.0.1-SNAPSHOT
+
+ model2d3d-viewer-back-service
+ model2d3d-viewer-back-service
+ http://maven.apache.org
+
+ UTF-8
+
+
+
+
+ com.techsor
+ model2d3d-viewer-back-dao
+ 0.0.1-SNAPSHOT
+
+
+
+ com.techsor
+ model2d3d-viewer-back-model
+ 0.0.1-SNAPSHOT
+
+
+
+ com.techsor
+ model2d3d-viewer-back-util
+ 0.0.1-SNAPSHOT
+
+
+
+ com.techsor
+ model2d3d-viewer-back-common
+ 0.0.1-SNAPSHOT
+
+
+
+ junit
+ junit
+ test
+
+
+
+ com.github.penggle
+ kaptcha
+ 2.3.2
+
+
+
+
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/AccountService.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/AccountService.java
new file mode 100644
index 0000000..51edea6
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/AccountService.java
@@ -0,0 +1,26 @@
+package com.model2d3d.viewer.back.service;
+
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.springframework.mobile.device.Device;
+
+import com.alibaba.fastjson.JSONObject;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dto.account.LoginParam;
+
+/**
+ * 账户信息Service
+ */
+public interface AccountService {
+
+ boolean accessAuth(String userName, String companyId, String userId, String accessToken, String languageType, JSONObject jsonObject, Long keytimeout);
+
+ SimpleDataResponse login(LoginParam loginParam, Device device, Integer languageType, HttpServletRequest request,
+ HttpServletResponse response);
+
+ SimpleDataResponse logout(String accessToken, String companyId, String loginName, Long userId);
+
+ SimpleDataResponse getCaptcha(String requestId, Device device, Integer languageType, HttpServletRequest request,
+ HttpServletResponse response);
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CommonService.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CommonService.java
new file mode 100644
index 0000000..3ff248f
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CommonService.java
@@ -0,0 +1,14 @@
+package com.model2d3d.viewer.back.service;
+
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+public interface CommonService {
+
+ SimpleDataResponse checkApikey(String apikey);
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CompanyService.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CompanyService.java
new file mode 100644
index 0000000..079d4a7
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/CompanyService.java
@@ -0,0 +1,33 @@
+package com.model2d3d.viewer.back.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dto.company.CompanySearchParams;
+import com.model2d3d.viewer.back.dto.company.DeleteCompanyParams;
+import com.model2d3d.viewer.back.dto.company.OptCompanyParams;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.vo.company.CompanyPageDTO;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+public interface CompanyService {
+
+ boolean idsAuth(String valueOf, String needAuthIds);
+
+ SimpleDataResponse add(OptCompanyParams optCompanyParams, String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse edit(OptCompanyParams optCompanyParams, String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse batchDelete(DeleteCompanyParams deleteCompanyParams, String companyId, Long userId, Integer languageType);
+
+ IPage getListPage(CompanySearchParams pageSearchParam, String companyId, Long userId,
+ Integer languageType, Integer uTCOffset);
+
+ SimpleDataResponse> getCompanyTree(String companyId, Long userId, Integer languageType);
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/RoleService.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/RoleService.java
new file mode 100644
index 0000000..95fdd18
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/RoleService.java
@@ -0,0 +1,32 @@
+package com.model2d3d.viewer.back.service;
+
+import java.util.List;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dto.role.DeleteRoleParam;
+import com.model2d3d.viewer.back.dto.role.OptRoleParam;
+import com.model2d3d.viewer.back.dto.role.RolePageSearchParam;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.vo.role.RolePageDTO;
+
+/**
+ * Service.
+ */
+public interface RoleService {
+
+ SimpleDataResponse add(OptRoleParam param, String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse edit(OptRoleParam param, String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse batchDelete(DeleteRoleParam deleteRoleParam, String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse> getOwnMenuIds(String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse getMenuIdsByRoleId(Long roleId, String companyId, Long userId, Integer languageType);
+
+ IPage getListPage(RolePageSearchParam pageSearchParam,
+ String companyId, Long userId, Integer languageType);
+
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/UserService.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/UserService.java
new file mode 100644
index 0000000..e3ab4dd
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/UserService.java
@@ -0,0 +1,30 @@
+package com.model2d3d.viewer.back.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dto.user.DeleteUserParam;
+import com.model2d3d.viewer.back.dto.user.ModifyPassword;
+import com.model2d3d.viewer.back.dto.user.OptUserParam;
+import com.model2d3d.viewer.back.dto.user.ResetPassword;
+import com.model2d3d.viewer.back.vo.user.UserPageDTO;
+
+/**
+ * Agent Service.
+ */
+public interface UserService {
+
+ SimpleDataResponse add(OptUserParam optUserParam, String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse edit(OptUserParam optUserParam, String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse batchDelete(DeleteUserParam deleteUserParam, String companyId, Long userId, Integer languageType);
+
+ IPage getListPage(com.model2d3d.viewer.back.dto.user.PageSearchParam pageSearchParam,
+ String companyId, Long userId, Integer languageType);
+
+ SimpleDataResponse batchResetPassword(ResetPassword resetPassword, String companyId, Long userId,
+ Integer languageType);
+
+ SimpleDataResponse modifyPassword(ModifyPassword modifyPassword, String companyId, Long userId, Integer languageType);
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/CaptchaService.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/CaptchaService.java
new file mode 100644
index 0000000..198e3ce
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/CaptchaService.java
@@ -0,0 +1,31 @@
+package com.model2d3d.viewer.back.service.captcha;
+
+import java.util.UUID;
+
+import com.model2d3d.viewer.back.util.redis.RedisUtil;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.model2d3d.viewer.back.common.Constants;
+
+
+@Service
+public class CaptchaService {
+
+ private static final long CAPTCHA_TIMEOUT = 120L;
+
+ @Autowired
+ private RedisUtil redisUtils;
+
+ public CaptchaVO cacheCaptcha(String captcha){
+ //生成一个随机标识符
+ String captchaKey = UUID.randomUUID().toString();
+ //缓存验证码并设置过期时间
+ redisUtils.set(Constants.CAPTCHA_VERIFICATION.concat(captchaKey),captcha,CAPTCHA_TIMEOUT);
+ CaptchaVO captchaVO = new CaptchaVO();
+ captchaVO.setCaptchaRequestId(captchaKey);
+ return captchaVO;
+ }
+
+}
+
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/CaptchaVO.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/CaptchaVO.java
new file mode 100644
index 0000000..312d4e2
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/CaptchaVO.java
@@ -0,0 +1,18 @@
+package com.model2d3d.viewer.back.service.captcha;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Data
+public class CaptchaVO {
+ /**
+ *
+ */
+ @Schema(description ="验证码的请求标识ID",example = "12313-12313-123213-12313")
+ private String captchaRequestId;
+ /**
+ * base64字符串
+ */
+ @Schema(description ="验证码图片的base64编码结果",example = "data:image/jpeg;base64,/9j/4AAQSkZJRgABAgAAAQABAAD/2wBDAAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcpLDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCAAoAG4DASIAAhEBAxEB/8QAHwAAAQUBAQEBAQEAAAAAAAAAAAECAwQFBgcICQoL/8QAtRAAAgEDAwIEAwUFBAQAAAF9AQIDAAQRBRIhMUEGE1FhByJxFDKBkaEII0KxwRVS0fAkM2JyggkKFhcYGRolJicoKSo0NTY3ODk6Q0RFRkdISUpTVFVWV1hZWmNkZWZnaGlqc3R1dnd4eXqDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uHi4+Tl5ufo6erx8vP09fb3+Pn6/8QAHwEAAwEBAQEBAQEBAQAAAAAAAAECAwQFBgcICQoL/8QAtREAAgECBAQDBAcFBAQAAQJ3AAECAxEEBSExBhJBUQdhcRMiMoEIFEKRobHBCSMzUvAVYnLRChYkNOEl8RcYGRomJygpKjU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6goOEhYaHiImKkpOUlZaXmJmaoqOkpaanqKmqsrO0tba3uLm6wsPExcbHyMnK0tPU1dbX2Nna4uPk5ebn6Onq8vP09fb3+Pn6/9oADAMBAAIRAxEAPwD0JRUiimKKkUUAPUVIBTFFSCgB6ipFFMXHrXnWp+MNVg8UmysB56tuCR7gANu7e5PHyqUkX1JXvkAgHpiipAK5Twv4yg1+8uLB4ZILy24lR0f5TkgBjtCqxxnbn6ZFaWreIYNJuoYZQ37w8uq7wnBPzAHIHHXB4DHoCQAbqipFFcJqHjSW612w0PQzbzTzgPJcrJviCfNuVSMjfhHOCR9w9c1H41+I9v4Ms44I1+23wYxMpOMFURiT+EiH8/SgD0NRUgFeAwfG7xSsnmyeG1kt+h2o4xzjr9QRXovw68fz+OTe79NNkLTZv3EnJcEjH5H9PWgDvVFSAU1RUgFAHGKKkUUxRUiigCC/vodNsZbuc4SNS31wCcfpXkNrrPiv4kX9ydMvv7M0uIkF168KeD9Qa9K8a2c194O1KC3UtO0XyY6g5H9M14L4X0nQ5rmay13Wri0hjLGSGNtoZg2PQg8DNAHcfDrV9QtfHl1oM+qG+ijLgzM25SQB0P1x/wB81asVa7+Lk5lLHTyQU+bETYPmRAH13hm9zW34APhj7Rc2/hixIii/193MCWJAOCuc55z6VhSJc6P41kvxYO1rGTtUKTkAZ2jGOQOV+hHrQAeJ7dNE+K2m6nb3BR2IMvK5ZOjEkHJ4IOADwcmt3x7FeWVnc65bgIfL85WOzcNuBjdtbjkEcA57iuTiXU/F/wASLO8t9PuIdNjmVnyvy8DIJweODkd8H06db4tjGqauNGY3GDkRw4G0gA/NlwcgE5LDGMDkYoAZ8FLGBtCuNSmuI7m7knwzE5KbQVXBPP3Sw+ntXB6vAus/GrT7LUzuVpwlyCflLAnOPwCj8K6jQtG1fwL4ns4IrSW7sJQB5mzoSAp45xuwMZPABzyaufFHwNfSS23ifQIw8to5nliUct82/cPXnt6UAevQ2VtHEI0t4gmScBBjJOSfzJP41NbWlva7vIgji3kFtigbjjHOPavK/CXxr0a8sEt9fkay1GMbZCyfK59R6V6B4c8V6P4qW6fSLnz1tnCSMBgZIyMUAbqipAKaoqQCgDjFFSKKKKAHgAjBHBrl9R+G/hrVb37VcWWGJJYIdoY7cc/kD9R70UUAdRY6faadbrb2dvHBEvRY1wOuf61ZeCKZCkkaOp6hhmiigBtrpllZyeZbWkELbduY41XAznHA9earN4ftptaGpS7WZV2qoXHXruIPzA8cHjgUUUAbQVSQSASKlVRjGOPSiigDk9b+F/hPxBeG7vNMC3DEFpIWKbvqBx+la3hbwfo/hG1e30mBo1kILszZZiABz+WfxNFFAHRKKkAoooA//9k=")
+ private String base64Img;
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/KaptchaConfig.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/KaptchaConfig.java
new file mode 100644
index 0000000..f43f5eb
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/captcha/KaptchaConfig.java
@@ -0,0 +1,36 @@
+package com.model2d3d.viewer.back.service.captcha;
+
+import java.util.Properties;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import com.google.code.kaptcha.impl.DefaultKaptcha;
+import com.google.code.kaptcha.util.Config;
+
+@Configuration
+public class KaptchaConfig {
+ @Bean
+ public DefaultKaptcha producer(){
+
+ DefaultKaptcha defaultKaptcha = new DefaultKaptcha();
+ Properties properties = new Properties();
+ properties.setProperty("kaptcha.border", "no");
+ properties.setProperty("kaptcha.border.color", "105,179,90");
+ properties.setProperty("kaptcha.textproducer.font.color", "black");
+ properties.setProperty("kaptcha.image.width", "110");
+ properties.setProperty("kaptcha.image.height", "40");
+ properties.setProperty("kaptcha.textproducer.char.string","23456789abcdefghkmnpqrstuvwxyzABCDEFGHKMNPRSTUVWXYZ");
+ properties.setProperty("kaptcha.textproducer.font.size", "30");
+ properties.setProperty("kaptcha.textproducer.char.space","3");
+ properties.setProperty("kaptcha.session.key", "code");
+ properties.setProperty("kaptcha.textproducer.char.length", "4");
+ properties.setProperty("kaptcha.textproducer.font.names", "宋体,楷体,微软雅黑");
+// properties.setProperty("kaptcha.obscurificator.impl","com.xxx");可以重写实现类
+ properties.setProperty("kaptcha.noise.impl","com.google.code.kaptcha.impl.NoNoise");
+ Config config = new Config(properties);
+ defaultKaptcha.setConfig(config);
+
+ return defaultKaptcha;
+ }
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/common/CommonOpt.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/common/CommonOpt.java
new file mode 100644
index 0000000..2f72972
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/common/CommonOpt.java
@@ -0,0 +1,89 @@
+package com.model2d3d.viewer.back.service.common;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.model2d3d.viewer.back.model.BasicCompany;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import com.model2d3d.viewer.back.dao.ex.BasicCompanyMapperExt;
+import com.model2d3d.viewer.back.util.CommonUtil;
+
+/**
+* @author Mr.Jiang
+* @time 2022年5月28日 上午7:41:40
+*/
+@Component
+public class CommonOpt {
+
+ private static Logger logger = LoggerFactory.getLogger(CommonOpt.class);
+
+ @Autowired
+ private BasicCompanyMapperExt basicCompanyMapperExt;
+
+
+ /**
+ * 根据自身企业ID获取子企业ID的list,list包含自身ID
+ *
+ * @param companyId 自身ID
+ *
+ * @return
+ */
+ public List getSelfAndSubCompanyId(String companyId) {
+ List idsList = new ArrayList();
+ idsList.add(companyId);
+ collectChildIds(idsList, Collections.singletonList(companyId));
+ return idsList;
+ }
+
+
+ private void collectChildIds(List idsList, List parentCompanyIds) {
+ Map searchChildMap = new HashMap();
+ searchChildMap.put("companyIds", parentCompanyIds);
+ List childCompanyList = basicCompanyMapperExt.getSubCompanyByParentId(searchChildMap);
+ if (CollectionUtils.isNotEmpty(childCompanyList)) {
+ List childIdsList = childCompanyList.stream().map(BasicCompany::getId).collect(Collectors.toList());
+ idsList.addAll(childIdsList);
+ collectChildIds(idsList, childIdsList);
+ }
+ }
+
+
+ /**
+ * 过滤掉不属于targetCompany和它子企业的ID
+ *
+ * @param targetCompanyId 指定企业ID
+ *
+ * @param needProcessedCompanyIds 需要被处理的企业ID
+ *
+ */
+ public List filterCompanyIds(String targetCompanyId, String needProcessedCompanyIds) {
+ List selfAndSubCompanyList = getSelfAndSubCompanyId(targetCompanyId);
+ if (StringUtils.isNotBlank(needProcessedCompanyIds)) {
+ List needProcessedCompanyIdList = CommonUtil.commaStr2LongList(needProcessedCompanyIds);
+ return needProcessedCompanyIdList.stream().filter(selfAndSubCompanyList::contains).collect(Collectors.toList());
+ }
+ return null;
+ }
+
+ /**
+ * 判断subId在不在parentId子企业下
+ * @param parentId
+ * @param subId
+ * @return
+ */
+ public boolean isSubCompany(String parentId, Long subId) {
+ List selfAndSubCompanyList = getSelfAndSubCompanyId(parentId);
+ if (selfAndSubCompanyList.contains(subId)) {
+ return true;
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/common/MenuTree.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/common/MenuTree.java
new file mode 100644
index 0000000..f256e60
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/common/MenuTree.java
@@ -0,0 +1,69 @@
+package com.model2d3d.viewer.back.service.common;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+
+/**
+* @author Mr.Jiang
+* @time 2022年7月29日 下午4:50:26
+*/
+public class MenuTree {
+
+ /**
+ * 所有的菜单数据
+ */
+ private List menuList = new ArrayList();
+
+ public MenuTree(List menuList) {
+ this.menuList = menuList;
+ }
+
+ /**
+ * 建立树形结构
+ *
+ * @return
+ */
+ public List buildTree(String rootNodeKey) {
+ List treeMenus = new ArrayList();
+ for (TreeMenusDTO menuNode : getRootNode(rootNodeKey)) {
+ menuNode = buildChildTree(menuNode);
+ treeMenus.add(menuNode);
+ }
+ return treeMenus;
+ }
+
+ /**
+ * 递归,建立子树形结构
+ *
+ * @param pNode
+ * @return
+ */
+ private TreeMenusDTO buildChildTree(TreeMenusDTO pNode) {
+ List childMenus = new ArrayList();
+ for (TreeMenusDTO menuNode : menuList) {
+ if (menuNode.getParentKey().equals(pNode.getKey())) {
+ childMenus.add(buildChildTree(menuNode));
+ }
+ }
+ pNode.setChildren(childMenus);
+ return pNode;
+ }
+
+ /**
+ * 获取根节点
+ * @param rootNodeKey
+ *
+ * @return
+ */
+ private List getRootNode(String rootNodeKey) {
+ List rootMenuLists = new ArrayList();
+ for (TreeMenusDTO menuNode : menuList) {
+ if (menuNode.getParentKey().equalsIgnoreCase(rootNodeKey)) {
+ rootMenuLists.add(menuNode);
+ }
+ }
+ return rootMenuLists;
+ }
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/AccountServiceImpl.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/AccountServiceImpl.java
new file mode 100644
index 0000000..c1916dc
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/AccountServiceImpl.java
@@ -0,0 +1,273 @@
+package com.model2d3d.viewer.back.service.impl;
+
+import java.text.MessageFormat;
+import java.util.HashMap;
+import java.util.Map;
+
+import com.model2d3d.viewer.back.model.BasicUser;
+import com.model2d3d.viewer.back.model.LoginHistory;
+import com.model2d3d.viewer.back.util.redis.RedisUtil;
+import jakarta.servlet.http.HttpServletRequest;
+import jakarta.servlet.http.HttpServletResponse;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.mobile.device.Device;
+import org.springframework.stereotype.Service;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
+import com.model2d3d.viewer.back.common.Constants;
+import com.model2d3d.viewer.back.common.exception.MsgCodeException;
+import com.model2d3d.viewer.back.common.language.msg.MsgLanguageChange;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dao.ex.BasicUserMapperExt;
+import com.model2d3d.viewer.back.dao.ex.LoginHistoryMapperExt;
+import com.model2d3d.viewer.back.dto.account.CacheUserData;
+import com.model2d3d.viewer.back.dto.account.LoginParam;
+import com.model2d3d.viewer.back.service.AccountService;
+import com.model2d3d.viewer.back.util.DESUtil;
+import com.model2d3d.viewer.back.util.NetworkUtil;
+import com.model2d3d.viewer.back.util.RandomNumberUtil;
+import com.model2d3d.viewer.back.util.ServiceUtil;
+import com.model2d3d.viewer.back.util.ValidatorUtil;
+import com.model2d3d.viewer.back.vo.user.UserInfoVO;
+
+/**
+ * 账户信息ServiceImpl
+ */
+@Service
+public class AccountServiceImpl implements AccountService {
+
+ private Logger logger = LoggerFactory.getLogger(AccountServiceImpl.class);
+
+ @Value("${user.login.keytimeout:3600}")
+ private long loginTimeOut;
+
+
+ private static final long CAPTCHA_TIMEOUT = 120L;
+
+
+ @Autowired
+ private BasicUserMapperExt basicUserMapperExt;
+ @Autowired
+ private LoginHistoryMapperExt loginHistoryMapperExt;
+ @Autowired
+ private MsgLanguageChange msgLanguageChange;
+ @Autowired
+ private RedisUtil redisUtil;
+
+ @Override
+ public boolean accessAuth(String loginName, String companyId, String userId, String accessToken, String languageType, JSONObject jsonObject, Long keytimeout) {
+ if (StringUtils.isBlank(languageType)) {
+ languageType = "2";
+ }
+ //如果user_name,token不为空,则判定token合法性后取值权限,为空则返回token为空请求参数错误401
+ if (StringUtils.isBlank(accessToken) || StringUtils.isBlank(loginName)
+ || StringUtils.isBlank(companyId) || StringUtils.isBlank(userId)) {
+ jsonObject.put("code", ResponseCode.AUTHORIZE_FAILED);
+ jsonObject.put("msg", msgLanguageChange.getParameterMapByCode(Integer.valueOf(languageType), "tokenError"));
+ return false;
+ } else {
+ String key = MessageFormat.format(Constants.ACCESS_TOKEN_FORMAT, userId, loginName, companyId, accessToken);
+ Object userDataStr = redisUtil.get(key);
+ if (null != userDataStr) {
+ CacheUserData cacheUserData = (CacheUserData) JSON.parseObject(userDataStr.toString(), new TypeReference() {});
+ if (cacheUserData != null) {
+ String accessTokenOld = cacheUserData.getAccessToken();
+ if (!StringUtils.equals(accessToken, accessTokenOld)) {
+ jsonObject.put("code", ResponseCode.AUTHORIZE_FAILED);
+ jsonObject.put("msg", msgLanguageChange.getParameterMapByCode(Integer.valueOf(languageType), "tokenError"));
+ return false;
+ } else {
+ redisUtil.set(key, JSONObject.toJSONString(cacheUserData), loginTimeOut);
+ return true;
+ }
+ } else {
+ jsonObject.put("code", ResponseCode.AUTHORIZE_FAILED);
+ jsonObject.put("msg", msgLanguageChange.getParameterMapByCode(Integer.valueOf(languageType), "tokenError"));
+ return false;
+ }
+ } else{
+ jsonObject.put("code", ResponseCode.AUTHORIZE_FAILED);
+ jsonObject.put("msg", msgLanguageChange.getParameterMapByCode(Integer.valueOf(languageType), "tokenError"));
+ return false;
+ }
+ }
+ }
+
+ @Override
+ public SimpleDataResponse login(LoginParam loginParam, Device device, Integer languageType,
+ HttpServletRequest request, HttpServletResponse response) {
+ SimpleDataResponse SimpleDataResponse = new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "serviceError"));
+ LoginHistory loginHistory = new LoginHistory();
+ try {
+ String msgCode = "serviceError";
+ //基础参数校验
+ if (!validParam(loginParam).isEmpty()) {
+ throw new MsgCodeException("paramsFormatError");
+ }
+
+ if (StringUtils.isNotBlank(loginParam.getCaptchaRequestId())) {
+ String captchaKey = Constants.CAPTCHA_VERIFICATION.concat(loginParam.getCaptchaRequestId());
+ Object captch = redisUtil.get(captchaKey);
+ if(captch == null){
+ throw new MsgCodeException("verifCodeExpired");
+ }
+ if(!loginParam.getCaptcha().equalsIgnoreCase(captch.toString())){
+ throw new MsgCodeException("verifCodeError");
+ }
+ redisUtil.remove(captchaKey);
+ }
+
+ UserInfoVO userInfoVO = getAccountInfo(loginParam.getLoginname());
+ if (userInfoVO != null) {
+ long currentUnixTime = System.currentTimeMillis();
+ if(userInfoVO.getExpireTime() != null){
+ if(userInfoVO.getExpireTime() < currentUnixTime){
+ throw new MsgCodeException("accountExpired");
+ }
+ }
+
+ String inputPwd = DESUtil.encrypt(loginParam.getPassword(), userInfoVO.getSalt());
+ if (userInfoVO.getPassword().equals(inputPwd)) {
+ userInfoVO.setLastLoginTime(currentUnixTime);
+ updateUserInfo(userInfoVO);
+ //使用Redis 保存用户token
+ String accessToken = ServiceUtil.CreateAccessToken(userInfoVO.getLoginName(), String.valueOf(currentUnixTime));
+
+ CacheUserData cacheUserData = new CacheUserData();
+ cacheUserData.setAccessToken(accessToken);
+ cacheUserData.setCreateTime(userInfoVO.getCreateTime());
+ cacheUserData.setLoginName(userInfoVO.getLoginName());
+ cacheUserData.setUserId(userInfoVO.getId());
+ cacheUserData.setUsername(userInfoVO.getUsername());
+ cacheUserData.setExpireTime(userInfoVO.getExpireTime());
+ cacheUserData.setCompanyId(userInfoVO.getCompanyId());
+ cacheUserData.setMenuIds(basicUserMapperExt.getMenuIdsByUserId(userInfoVO.getId()));
+
+ response.setHeader("AccessToken", accessToken);
+
+ //设置请求ip地址和访问终端类型
+ loginHistory.setLoginTime(currentUnixTime);
+ loginHistory.setUserId(userInfoVO.getId());
+ try{
+ loginHistory.setRequestIp(NetworkUtil.getIpAddress(request));
+ }catch (Exception e){
+ logger.error("getIpAddress error",e);
+ }
+ //将 redisUserData对象 保存到redis中
+ String key = MessageFormat.format(Constants.ACCESS_TOKEN_FORMAT, userInfoVO.getId(), userInfoVO.getLoginName(), userInfoVO.getCompanyId(), accessToken);
+ boolean isWrite = redisUtil.set(key, JSONObject.toJSONString(cacheUserData), loginTimeOut);
+ if (isWrite) {
+ loginHistoryMapperExt.insert(loginHistory);
+
+ SimpleDataResponse.setMsg("account login success");
+ SimpleDataResponse.setCode(ResponseCode.OK);
+ SimpleDataResponse.setData(cacheUserData);
+ } else {
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, "account login failed, userData is write failed");
+ }
+ } else {
+ throw new MsgCodeException("pwdError");
+ }
+ } else {
+ throw new MsgCodeException("userOrEmailNotExist");
+ }
+ }catch (MsgCodeException e) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR,
+ msgLanguageChange.getParameterMapByCode(languageType, e.getMessage()));
+ } catch (Exception e) {
+ logger.error("account login failed", e);
+ return SimpleDataResponse;
+ }
+ return SimpleDataResponse;
+ }
+
+ private void updateUserInfo(BasicUser basicUser) {
+ basicUserMapperExt.updateById(basicUser);
+ }
+
+ private UserInfoVO getAccountInfo(String loginname) {
+// //邮箱或者登录名登录
+// BasicUserExample basicUserExample = new BasicUserExample();
+// BasicUserExample.Criteria criteria = basicUserExample.createCriteria();
+// criteria.andLoginNameEqualTo(loginname).andFlagNotEqualTo(1).andUserTypeEqualTo(1);
+//
+//// BasicUserExample.Criteria criteria2 = basicUserExample.createCriteria();
+//// criteria2.andEmailEqualTo(loginname).andFlagNotEqualTo(1).andUserTypeEqualTo(1);
+////
+//// basicUserExample.or(criteria2);
+//
+// List users = basicUserMapperExt.selectByExample(basicUserExample);
+// if (CollectionUtils.isNotEmpty(users)) {
+// return users.get(0);
+// } else {
+// return null;
+// }
+ Map paramMap = new HashMap<>();
+ paramMap.put("loginname", loginname);
+ return basicUserMapperExt.getAccountInfo(paramMap);
+ }
+
+ private Map validParam(LoginParam loginParam) {
+ Map errorMap = new HashMap();
+// if (ValidatorUtil.validParameterAlert(loginParam.getCaptchaRequestId(), "captchaKey", true, 1, 64, 4, errorMap) > 0) {
+// logger.info("Parameter [captchaKey] check failed.");
+// }
+// if (ValidatorUtil.validParameterAlert(loginParam.getCaptcha(), "captcha", true, 1, 6, 4, errorMap) > 0) {
+// logger.info("Parameter [captcha] check failed.");
+// }
+
+ if (ValidatorUtil.validParameterAlert(loginParam.getLoginname(), "loginname", true, 1, 20, 4, errorMap) > 0) {
+ logger.info("Parameter [account] check failed.");
+ }
+ if (ValidatorUtil.validParameterAlert(loginParam.getPassword(), "password", true, 1, 20, 4, errorMap) > 0) {
+ logger.info("Parameter [password] check failed.");
+ }
+ return errorMap;
+ }
+
+ @Override
+ public SimpleDataResponse logout(String accessToken, String companyId, String loginName, Long userId) {
+ SimpleDataResponse simpleDataResponse = new SimpleDataResponse();
+ try {
+ //移除accessToken
+ String key = MessageFormat.format(Constants.ACCESS_TOKEN_FORMAT, userId, loginName, companyId, accessToken);
+ redisUtil.delKey(key);
+ simpleDataResponse.setCode(ResponseCode.OK);
+ simpleDataResponse.setMsg("account [" + loginName + "] logout success");
+ logger.info(simpleDataResponse.getMsg());
+ } catch (Exception e) {
+ logger.error("account [" + loginName + "] logout failed", e);
+ simpleDataResponse.setCode(ResponseCode.SERVER_ERROR);
+ simpleDataResponse.setMsg(ResponseCode.SERVER_ERROR_MSG);
+ }
+ return simpleDataResponse;
+ }
+
+ @Override
+ public SimpleDataResponse getCaptcha(String requestId, Device device, Integer languageType,
+ HttpServletRequest request, HttpServletResponse response) {
+ SimpleDataResponse simpleDataResponse = new SimpleDataResponse();
+ try {
+ String code = RandomNumberUtil.createRandomNumber(4);
+ String captchaKey = Constants.CAPTCHA_VERIFICATION.concat(requestId);
+ boolean captchaIsWrited = redisUtil.set(captchaKey, code, CAPTCHA_TIMEOUT);
+
+ simpleDataResponse.setCode(ResponseCode.OK);
+ simpleDataResponse.setData(code);
+
+ } catch (Exception e) {
+ logger.error("getCaptcha failed", e);
+ simpleDataResponse.setCode(ResponseCode.OK);
+ simpleDataResponse.setMsg(ResponseCode.SERVER_ERROR_MSG);
+ }
+ return simpleDataResponse;
+ }
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CommonServiceImpl.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CommonServiceImpl.java
new file mode 100644
index 0000000..bce34d9
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CommonServiceImpl.java
@@ -0,0 +1,60 @@
+package com.model2d3d.viewer.back.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.model2d3d.viewer.back.model.BasicCompany;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dao.ex.BasicCompanyMapperExt;
+import com.model2d3d.viewer.back.service.CommonService;
+import com.model2d3d.viewer.back.service.common.CommonOpt;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+@Service
+public class CommonServiceImpl implements CommonService {
+
+ private static Logger logger = LoggerFactory.getLogger(CommonServiceImpl.class);
+
+ @Value("${spring.datasource.url}")
+ private String dbUrl;
+ @Value("${spring.datasource.username}")
+ private String dbUsername;
+ @Value("${spring.datasource.password}")
+ private String dbPassword;
+
+ @Autowired
+ private CommonOpt commonOpt;
+
+ @Autowired
+ private BasicCompanyMapperExt basicCompanyMapperExt;
+
+
+ @Override
+ public SimpleDataResponse checkApikey(String apikey) {
+ SimpleDataResponse resp = new SimpleDataResponse();
+ try {
+ long count = basicCompanyMapperExt.selectCount(new LambdaQueryWrapper()
+ .ne(BasicCompany::getFlag, 1));
+
+ resp.setCode(200);
+ if (count > 0) {
+ resp.setData(true);
+ } else {
+ resp.setData(false);
+ }
+
+ } catch (Exception e) {
+ resp.setCode(500);
+ resp.setData(e.getMessage());
+ }
+ return resp;
+ }
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CompanyServiceImpl.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CompanyServiceImpl.java
new file mode 100644
index 0000000..b4ced8d
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/CompanyServiceImpl.java
@@ -0,0 +1,295 @@
+package com.model2d3d.viewer.back.service.impl;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.model2d3d.viewer.back.dao.ex.BasicUserMapperExt;
+import com.model2d3d.viewer.back.model.BasicCompany;
+import com.model2d3d.viewer.back.model.BasicUser;
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+import com.model2d3d.viewer.back.common.exception.MsgCodeException;
+import com.model2d3d.viewer.back.common.language.msg.MsgLanguageChange;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dao.ex.BasicCompanyMapperExt;
+import com.model2d3d.viewer.back.dto.company.CompanySearchParams;
+import com.model2d3d.viewer.back.dto.company.DeleteCompanyParams;
+import com.model2d3d.viewer.back.dto.company.OptCompanyParams;
+import com.model2d3d.viewer.back.service.CompanyService;
+import com.model2d3d.viewer.back.service.common.CommonOpt;
+import com.model2d3d.viewer.back.service.common.MenuTree;
+import com.model2d3d.viewer.back.util.CommonUtil;
+import com.model2d3d.viewer.back.util.async.OptAsync;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.vo.company.CompanyPageDTO;
+
+/**
+ *
+ * @author jwy-style
+ *
+ */
+@Service
+public class CompanyServiceImpl implements CompanyService {
+
+ private static Logger logger = LoggerFactory.getLogger(CompanyServiceImpl.class);
+
+ //{0}:时间戳变量 {1}:企业ID
+ private static final String APIKEY_FORMAT = "cp_{0}_{1}";
+
+ @Autowired
+ private OptAsync optAsync;
+ @Autowired
+ private MsgLanguageChange msgLanguageChange;
+ @Autowired
+ private BasicCompanyMapperExt basicCompanyMapperExt;
+ @Autowired
+ private CommonOpt commonOpt;
+ @Autowired
+ private BasicUserMapperExt basicUserMapperExt;
+
+
+ @Override
+ public boolean idsAuth(String companyId, String needAuthIds) {
+// if (StringUtils.isBlank(needAuthIds)) {
+// return false;
+// }
+//
+// List ids = Arrays.asList(StringUtils.split(needAuthIds, ",")).stream()
+// .map(id -> CommonUtil.String2Long(id.trim())).collect(Collectors.toList());
+//
+// BasicCompanyExample basicCompanyExample = new BasicCompanyExample();
+// BasicCompanyExample.Criteria criteria = basicCompanyExample.createCriteria();
+// criteria.andFlagNotEqualTo(1).andCompanyIdEqualTo(companyId).andIdIn(ids);
+// Long count = basicCompanyMapperExt.countByExample(basicCompanyExample);
+
+// Set idSet = new HashSet<>(ids);
+// if (Objects.equals(count, (long)idSet.size())) {
+// return true;
+// }
+ return false;
+ }
+
+
+ @Override
+ @Transactional
+ public SimpleDataResponse add(OptCompanyParams optCompanyParams, String companyId, Long userId,
+ Integer languageType) {
+ try {
+ optCompanyParams.setCompanyId(null);
+ optCompanyParams.setParentId(companyId);
+ //校验参数
+ SimpleDataResponse checkResult = checkParam(optCompanyParams, languageType);
+ if (200 != checkResult.getCode()) {
+ return checkResult;
+ }
+ //重复校验
+ SimpleDataResponse checkExistResult = checkExist(optCompanyParams, languageType);
+ if (200 != checkExistResult.getCode()) {
+ return checkExistResult;
+ }
+// //数量校验
+// SimpleDataResponse checkLimitResult = checkLimit(languageType);
+// if (200 != checkLimitResult.getCode()) {
+// return checkLimitResult;
+// }
+ long currentUnix = System.currentTimeMillis();
+ BasicCompany basicCompany = new BasicCompany();
+ BeanUtils.copyProperties(optCompanyParams,basicCompany);
+ basicCompany.setId(null);
+ basicCompany.setParentId(optCompanyParams.getParentId());
+ basicCompany.setCreateTime(currentUnix);
+ basicCompanyMapperExt.insert(basicCompany);
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("新增企业出错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+ private SimpleDataResponse checkExist(OptCompanyParams optCompanyParams, Integer languageType) {
+ if (basicCompanyMapperExt.checkExist(optCompanyParams) > 0) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "companyNameHasExisted"));
+ }
+ return SimpleDataResponse.success();
+ }
+
+
+ private SimpleDataResponse checkParam(OptCompanyParams optCompanyParams, Integer languageType) {
+ if(StringUtils.isBlank(optCompanyParams.getCompanyName()) || optCompanyParams.getCompanyName().length() > 500){
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [companyName] error");
+ }
+// if(null != optCompanyParams.getCompanyId() && optCompanyParams.getCompanyId().longValue() == optCompanyParams.getParentId().longValue()){
+// return new SimpleDataResponse(ResponseCode.MSG_ERROR, "parentId can not be the same as companyId");
+// }
+ return SimpleDataResponse.success();
+ }
+
+
+ @Override
+ @Transactional
+ public SimpleDataResponse edit(OptCompanyParams optCompanyParams, String companyId, Long userId,
+ Integer languageType) {
+ try {
+// optCompanyParams.setParentId(companyId);
+ //校验参数
+ SimpleDataResponse checkResult = checkParam(optCompanyParams, languageType);
+ if (200 != checkResult.getCode()) {
+ return checkResult;
+ }
+
+ BasicCompany oldBC = basicCompanyMapperExt.selectById(optCompanyParams.getCompanyId());
+ //不存在, 这基本不可能,给个英文提示就行,省得翻译
+ if (ObjectUtils.isEmpty(oldBC) || 1 == oldBC.getFlag()){
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Not found");
+ }
+ /**一些权限校验操作**/
+ try {
+ List selfAndSubCompanyList = commonOpt.getSelfAndSubCompanyId(companyId);
+ //编辑的企业不属于自己所管的企业
+ if (!selfAndSubCompanyList.contains(oldBC.getId())){
+ throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth"));
+ }
+ //父企业ID不属于自己所管的企业
+// if (!selfAndSubCompanyList.contains(optCompanyParams.getParentId())){
+// throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth"));
+// }
+ } catch (MsgCodeException e) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, e.getMessage());
+ }
+
+ //防止套娃
+// List idsList = commonOpt.getSelfAndSubCompanyId(optCompanyParams.getCompanyId());
+// if (CollectionUtils.isNotEmpty(idsList) && idsList.contains(optCompanyParams.getParentId())) {
+// return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "taowaComapny"));
+// }
+
+ //重复校验
+ SimpleDataResponse checkExistResult = checkExist(optCompanyParams, languageType);
+ if (200 != checkExistResult.getCode()) {
+ return checkExistResult;
+ }
+ BasicCompany basicCompany = new BasicCompany();
+ BeanUtils.copyProperties(optCompanyParams,basicCompany);
+ basicCompany.setId(optCompanyParams.getCompanyId());
+ basicCompany.setParentId(null);
+ basicCompany.setModifyTime(System.currentTimeMillis());
+ basicCompanyMapperExt.updateById(basicCompany);
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("编辑企业出错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+ @Override
+ @Transactional
+ public SimpleDataResponse batchDelete(DeleteCompanyParams deleteCompanyParams, String companyId, Long userId,
+ Integer languageType) {
+ if (StringUtils.isBlank(deleteCompanyParams.getCompanyIds())) {
+ return SimpleDataResponse.success();
+ }
+ try {
+ List ids = Arrays.stream(deleteCompanyParams.getCompanyIds().split(",")).collect(Collectors.toList());
+
+ if (ids.contains(companyId)) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "can not delete your own company");
+ }
+
+ //删除的企业拥有下级企业,需先处理下级企业
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.in(BasicCompany::getParentId, ids).eq(BasicCompany::getFlag, 0);
+ List childList = basicCompanyMapperExt.selectList(queryWrapper);
+ // 判断是否有子企业
+ if (CollectionUtils.isNotEmpty(childList)) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "hasSubsidiary"));
+ }
+
+
+ LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>();
+ updateWrapper.in(BasicCompany::getId, commonOpt.filterCompanyIds(companyId, deleteCompanyParams.getCompanyIds()));
+ basicCompanyMapperExt.update(new BasicCompany().setFlag(1), updateWrapper);
+
+ //删除企业下的用户
+ LambdaUpdateWrapper updateUserWrapper = new LambdaUpdateWrapper<>();
+ updateUserWrapper.in(BasicUser::getCompanyId, ids);
+ basicUserMapperExt.update(new BasicUser().setFlag(1), updateUserWrapper);
+
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("删除企业出错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+ @Override
+ public IPage getListPage(CompanySearchParams pageSearchParam, String companyId,
+ Long userId, Integer languageType, Integer uTCOffset) {
+// pageSearchParam.setSelfCompanyId(companyId);
+ //list防${}注入
+ if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) {
+ pageSearchParam.setCompanyIdList(commonOpt.getSelfAndSubCompanyId(companyId));
+ } else {
+ pageSearchParam.setCompanyIdList(commonOpt.filterCompanyIds(companyId, pageSearchParam.getCompanyIds()));
+ }
+
+ // 使用 MyBatis-Plus 提供的分页对象 Page
+ Page page = new Page<>(
+ pageSearchParam.getPageNum() == null ? 1 : pageSearchParam.getPageNum(),
+ pageSearchParam.getPageSize() == null ? 20 : pageSearchParam.getPageSize());
+ IPage resultList = basicCompanyMapperExt.getListPage(page, pageSearchParam);
+
+ return resultList;
+ }
+
+
+ @Override
+ public SimpleDataResponse> getCompanyTree(String companyId, Long userId, Integer languageType) {
+ List companyList = basicCompanyMapperExt.getListForTree();
+ if (CollectionUtils.isNotEmpty(companyList)) {
+ TreeMenusDTO rootTree = new TreeMenusDTO();
+ //先把自身节点作为根节点
+ String rootId = companyId+"";
+ for (TreeMenusDTO treeMenusDTO : companyList) {
+ if (rootId.equals(treeMenusDTO.getKey())) {
+ rootTree = treeMenusDTO;
+ break;
+ }
+ }
+
+ MenuTree menuTree =new MenuTree(companyList);
+ companyList = menuTree.buildTree(rootId);
+
+ rootTree.setChildren(companyList);
+
+ return SimpleDataResponse.success(rootTree);
+ } else {
+ return SimpleDataResponse.success(new ArrayList());
+ }
+ }
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/RoleServiceImpl.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/RoleServiceImpl.java
new file mode 100644
index 0000000..9f4b73d
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/RoleServiceImpl.java
@@ -0,0 +1,252 @@
+package com.model2d3d.viewer.back.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.model2d3d.viewer.back.common.language.msg.MsgLanguageChange;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dao.ex.BasicRoleMapperExt;
+import com.model2d3d.viewer.back.dao.ex.BasicRoleMenuRelationMapperExt;
+import com.model2d3d.viewer.back.dao.ex.BasicRoleUserRelationMapperExt;
+import com.model2d3d.viewer.back.dto.role.DeleteRoleParam;
+import com.model2d3d.viewer.back.dto.role.OptRoleParam;
+import com.model2d3d.viewer.back.dto.role.RolePageSearchParam;
+import com.model2d3d.viewer.back.model.*;
+import com.model2d3d.viewer.back.service.RoleService;
+import com.model2d3d.viewer.back.service.common.CommonOpt;
+import com.model2d3d.viewer.back.service.common.MenuTree;
+import com.model2d3d.viewer.back.vo.TreeMenusDTO;
+import com.model2d3d.viewer.back.vo.company.CompanyPageDTO;
+import com.model2d3d.viewer.back.vo.role.RolePageDTO;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+@Service
+public class RoleServiceImpl implements RoleService {
+
+ private static Logger logger = LoggerFactory.getLogger(RoleServiceImpl.class);
+
+ @Autowired
+ private BasicRoleMapperExt basicRoleMapperExt;
+ @Autowired
+ private BasicRoleMenuRelationMapperExt basicRoleMenuRelationMapperExt;
+ @Autowired
+ private BasicRoleUserRelationMapperExt basicRoleUserRelationMapperExt;
+ @Autowired
+ private MsgLanguageChange msgLanguageChange;
+ @Autowired
+ private CommonOpt commonOpt;
+
+
+
+ @Override
+ @Transactional
+ public SimpleDataResponse add(OptRoleParam param, String companyId, Long userId, Integer languageType) {
+ try {
+ param.setCompanyId(companyId);
+ param.setRoleId(null);
+ //校验参数
+ SimpleDataResponse checkResult = checkParam(param, languageType);
+ if (200 != checkResult.getCode()) {
+ return checkResult;
+ }
+ //重复校验
+ if (checkExist(param) > 0) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "roleNameExist"));
+ }
+
+ long currentUnix = System.currentTimeMillis();
+ BasicRole basicRole = new BasicRole();
+ BeanUtils.copyProperties(param, basicRole);
+ basicRole.setCreatorId(userId);
+ basicRole.setCreateTime(currentUnix);
+ basicRole.setModifierId(userId);
+ basicRole.setModifyTime(currentUnix);
+ basicRole.setCompanyId(companyId);
+ basicRoleMapperExt.insert(basicRole);
+
+ insertRoleMenuRelation(userId, currentUnix, basicRole.getId(), param.getMenuIds());
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("添加角色报错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+
+ private void insertRoleMenuRelation(Long userId, long currentUnix, String roleId, String menuIds) {
+ if (StringUtils.isNoneBlank(menuIds)) {
+ //先删除原有的角色ID
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.eq(BasicRoleMenuRelation::getRoleId, roleId);
+ basicRoleMenuRelationMapperExt.delete(queryWrapper);
+
+ //重新插入关联关系
+ List idList = Arrays.asList(menuIds.split(",")).stream().map(s -> Long.parseLong(s.trim())).collect(Collectors.toList());
+ Map paramMap = new HashMap();
+ paramMap.put("roleId", roleId);
+ paramMap.put("menuIds", idList);
+ paramMap.put("creatorId", userId);
+ paramMap.put("createTime", currentUnix);
+ basicRoleMenuRelationMapperExt.batchInsert(paramMap);
+ }
+ }
+
+
+ private long checkExist(OptRoleParam param) {
+ return basicRoleMapperExt.checkExist(param);
+ }
+
+
+ private SimpleDataResponse checkParam(OptRoleParam param, Integer languageType) {
+// if(StringUtils.isBlank(param.getRoleName()) || param.getRoleName().length() > 100){
+// return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [roleName] error");
+// }
+ return SimpleDataResponse.success();
+ }
+
+
+ @Override
+ @Transactional
+ public SimpleDataResponse edit(OptRoleParam param, String companyId, Long userId, Integer languageType) {
+ try {
+ param.setCompanyId(companyId);
+ //校验参数
+ SimpleDataResponse checkResult = checkParam(param, languageType);
+ if (200 != checkResult.getCode()) {
+ return checkResult;
+ }
+ //重复校验
+ if (checkExist(param) > 0) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "roleNameExist"));
+ }
+
+ long currentUnix = System.currentTimeMillis();
+ BasicRole basicRole = new BasicRole();
+ BeanUtils.copyProperties(param, basicRole);
+ basicRole.setId(param.getRoleId());
+ basicRole.setModifierId(userId);
+ basicRole.setModifyTime(currentUnix);
+ basicRoleMapperExt.updateById(basicRole);
+
+ insertRoleMenuRelation(userId, currentUnix, basicRole.getId(), param.getMenuIds());
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("编辑角色报错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+
+ @Override
+ @Transactional
+ public SimpleDataResponse batchDelete(DeleteRoleParam deleteRoleParam, String companyId, Long userId,
+ Integer languageType) {
+ try {
+ List idList = Arrays.stream(deleteRoleParam.getRoleIds().split(",")).collect(Collectors.toList());
+ //先判断该角色有没有用户绑定
+ LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
+ queryWrapper.in(BasicRoleUserRelation::getRoleId, idList).last("LIMIT 1");
+ if (basicRoleUserRelationMapperExt.selectCount(queryWrapper) > 0) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "roleHasBinded"));
+ }
+
+ //基础表删除
+ basicRoleMapperExt.update(null, new LambdaUpdateWrapper()
+ .in(BasicRole::getId, idList)
+ .set(BasicRole::getFlag, 1));
+
+
+ // 删除用户-角色关联表
+ basicRoleUserRelationMapperExt.delete(new LambdaQueryWrapper()
+ .in(BasicRoleUserRelation::getRoleId, idList));
+ // 删除菜单-角色关联表
+ basicRoleMenuRelationMapperExt.delete(new LambdaQueryWrapper()
+ .in(BasicRoleMenuRelation::getRoleId, idList));
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("删除角色报错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+
+ @Override
+ public SimpleDataResponse> getOwnMenuIds(String companyId, Long userId, Integer languageType) {
+ Map paramMap = new HashMap();
+ paramMap.put("userId", userId);
+ paramMap.put("companyId", companyId);
+ paramMap.put("languageType", languageType);
+ if (1 == userId.intValue()) {
+ paramMap.put("superRole", 1);
+ }
+ List menuList = basicRoleMapperExt.getOwnMenuIds(paramMap);
+ if (CollectionUtils.isNotEmpty(menuList)) {
+ MenuTree menuTree =new MenuTree(menuList);
+ menuList=menuTree.buildTree("-1");
+ return SimpleDataResponse.success(menuList);
+ } else {
+ return SimpleDataResponse.success(new ArrayList());
+ }
+ }
+
+
+
+ @Override
+ public SimpleDataResponse getMenuIdsByRoleId(Long roleId, String companyId, Long userId,
+ Integer languageType) {
+ try {
+ return SimpleDataResponse.success(basicRoleMenuRelationMapperExt.getMenuIdsByRoleId(roleId));
+ } catch (Exception e) {
+ logger.error("获取角色菜单出错", e);
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+
+ @Override
+ public IPage getListPage(RolePageSearchParam pageSearchParam, String companyId, Long userId,
+ Integer languageType) {
+ //list防${}注入
+ if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) {
+ pageSearchParam.setCompanyIdList(commonOpt.getSelfAndSubCompanyId(companyId));
+ } else {
+ pageSearchParam.setCompanyIdList(commonOpt.filterCompanyIds(companyId, pageSearchParam.getCompanyIds()));
+ }
+
+ // 使用 MyBatis-Plus 提供的分页对象 Page
+ Page page = new Page<>(
+ pageSearchParam.getPageNum() == null ? 1 : pageSearchParam.getPageNum(),
+ pageSearchParam.getPageSize() == null ? 20 : pageSearchParam.getPageSize());
+ IPage resultList = basicRoleMapperExt.getListPage(page, pageSearchParam);
+ return resultList;
+ }
+
+}
diff --git a/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/UserServiceImpl.java b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/UserServiceImpl.java
new file mode 100644
index 0000000..5bbdb21
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/main/java/com/model2d3d/viewer/back/service/impl/UserServiceImpl.java
@@ -0,0 +1,363 @@
+package com.model2d3d.viewer.back.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.model2d3d.viewer.back.common.exception.MsgCodeException;
+import com.model2d3d.viewer.back.common.language.msg.MsgLanguageChange;
+import com.model2d3d.viewer.back.common.response.ResponseCode;
+import com.model2d3d.viewer.back.common.response.SimpleDataResponse;
+import com.model2d3d.viewer.back.dao.ex.BasicCompanyMapperExt;
+import com.model2d3d.viewer.back.dao.ex.BasicRoleUserRelationMapperExt;
+import com.model2d3d.viewer.back.dao.ex.BasicUserMapperExt;
+import com.model2d3d.viewer.back.dto.user.DeleteUserParam;
+import com.model2d3d.viewer.back.dto.user.ModifyPassword;
+import com.model2d3d.viewer.back.dto.user.OptUserParam;
+import com.model2d3d.viewer.back.dto.user.PageSearchParam;
+import com.model2d3d.viewer.back.dto.user.ResetPassword;
+import com.model2d3d.viewer.back.model.*;
+import com.model2d3d.viewer.back.service.UserService;
+import com.model2d3d.viewer.back.service.common.CommonOpt;
+import com.model2d3d.viewer.back.util.CommonUtil;
+import com.model2d3d.viewer.back.util.DESUtil;
+import com.model2d3d.viewer.back.util.RandomNumberUtil;
+import com.model2d3d.viewer.back.util.async.OptAsync;
+import com.model2d3d.viewer.back.util.redis.RedisUtil;
+import com.model2d3d.viewer.back.vo.company.CompanyPageDTO;
+import com.model2d3d.viewer.back.vo.user.UserPageDTO;
+
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.CollectionUtils;
+import org.apache.commons.lang3.ObjectUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.transaction.interceptor.TransactionAspectSupport;
+
+@Service
+public class UserServiceImpl implements UserService {
+
+ private static Logger logger = LoggerFactory.getLogger(UserServiceImpl.class);
+
+ //同时含大写字母、小写字母、数字和特殊字符且长度大于8
+ private static final String pwdPattern = "^(?=.*\\d)(?=.*[a-zA-Z])(?=.*[~!@#$%^&*])[\\da-zA-Z~!@#$%^&*]{12,}$";
+
+
+ @Value("${web.login.url}")
+ private String webLoginUrl;
+
+ @Autowired
+ private RedisUtil redisUtil;
+ @Autowired
+ private OptAsync optAsync;
+ @Autowired
+ private CommonOpt commonOpt;
+ @Autowired
+ private BasicUserMapperExt basicUserMapperExt;
+ @Autowired
+ private BasicRoleUserRelationMapperExt basicRoleUserRelationMapperExt;
+ @Autowired
+ private MsgLanguageChange msgLanguageChange;
+ @Autowired
+ private BasicCompanyMapperExt basicCompanyMapperExt;
+
+
+ @Override
+ @Transactional
+ public SimpleDataResponse add(OptUserParam param, String companyId, Long userId, Integer languageType) {
+ try {
+// if (StringUtils.isBlank(param.getLoginName())) {
+ param.setLoginName(param.getUsername());
+// }
+ if (!"1".equals(companyId)) {//非顶级账号
+ param.setCompanyId(companyId);
+ } else if (null == param.getCompanyId()) {//admin账号必须能选择企业归属
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "companyId is required");
+ }
+
+ param.setUserId(null);
+ //校验参数
+ SimpleDataResponse checkResult = checkParam(param, languageType);
+ if (200 != checkResult.getCode()) {
+ return checkResult;
+ }
+ //重复校验
+ if (checkExist(param) > 0) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "loginNameOrEmailHasExisted"));
+ }
+
+ long currentUnix = System.currentTimeMillis();
+ BasicUser basicUser = new BasicUser();
+ BeanUtils.copyProperties(param, basicUser);
+ basicUser.setCreatorId(userId);
+ basicUser.setCreateTime(currentUnix);
+ basicUser.setModifierId(userId);
+ basicUser.setModifyTime(currentUnix);
+// basicUser.setCompanyId(companyId);
+ basicUser.setSalt(RandomNumberUtil.createRandomLowerLetterAndNumber(10));
+ String rawPwd = generateRandomPwd();
+ basicUser.setPassword(DESUtil.encrypt(rawPwd, basicUser.getSalt()));
+
+ basicUserMapperExt.insert(basicUser);
+
+ insertUserRoleRelation(userId, currentUnix, basicUser.getId(), param.getRoleId());
+
+ BasicCompany basicCompany = basicCompanyMapperExt.selectById(basicUser.getCompanyId());
+
+ //邮箱通知密码
+ String loginUrl = webLoginUrl;
+ optAsync.doSendWork(
+ msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdSubject") + "【" + basicCompany.getCompanyName() +"】",
+ MessageFormat.format(msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdContent"), basicUser.getLoginName(), rawPwd, loginUrl),
+ basicUser.getEmail(),
+ null);
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("添加用户报错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+ private void insertUserRoleRelation(Long creatorId, long currentUnix, String userId, String roleId) {
+ // 先删除原有的关联关系
+ if (userId != null) {
+ basicRoleUserRelationMapperExt.delete(new LambdaQueryWrapper()
+ .eq(BasicRoleUserRelation::getUserId, userId));
+ }
+ // 重新插入关联关系
+ if (Objects.nonNull(userId) && Objects.nonNull(roleId)) {
+ BasicRoleUserRelation basicRoleUserRelation = new BasicRoleUserRelation();
+ basicRoleUserRelation.setCreateTime(currentUnix);
+ basicRoleUserRelation.setCreatorId(creatorId);
+ basicRoleUserRelation.setRoleId(roleId);
+ basicRoleUserRelation.setUserId(userId);
+ basicRoleUserRelationMapperExt.insert(basicRoleUserRelation);
+ }
+
+ }
+
+
+ private Long checkExist(OptUserParam param) {
+ return basicUserMapperExt.checkExist(param);
+ }
+
+
+ private SimpleDataResponse checkParam(OptUserParam param, Integer languageType) {
+ if(StringUtils.isBlank(param.getEmail()) || param.getEmail().length() > 100){
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [email] error");
+ }
+ if(StringUtils.isBlank(param.getLoginName()) || param.getLoginName().length() > 100){
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [loginName] error");
+ }
+ if(StringUtils.isBlank(param.getUsername()) || param.getUsername().length() > 100){
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [username] error");
+ }
+ if(StringUtils.isNotBlank(param.getMobileNumber()) && (!param.getMobileNumber().startsWith("+") || param.getMobileNumber().split("-").length != 2)){
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Parameter [mobileNumber] error");
+ }
+ return SimpleDataResponse.success();
+ }
+
+
+ @Override
+ public SimpleDataResponse edit(OptUserParam param, String companyId, Long userId, Integer languageType) {
+ try {
+// if (StringUtils.isBlank(param.getLoginName())) {
+ param.setLoginName(param.getUsername());
+// }
+ if (!"1".equals(companyId)) {//非顶级账号
+ param.setCompanyId(companyId);
+ } else if (null == param.getCompanyId()) {//admin账号必须能选择企业归属
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "companyId is required");
+ }
+ //校验参数
+ SimpleDataResponse checkResult = checkParam(param, languageType);
+ if (200 != checkResult.getCode()) {
+ return checkResult;
+ }
+
+ BasicUser oldBU = basicUserMapperExt.selectById(param.getUserId());
+ //不存在, 这基本不可能,给个英文提示就行,省得翻译
+ if (ObjectUtils.isEmpty(oldBU) || 1 == oldBU.getFlag()){
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, "Not found");
+ }
+ /**一些权限校验操作**/
+ try {
+ List selfAndSubCompanyList = commonOpt.getSelfAndSubCompanyId(companyId);
+ //编辑的用户不属于自己所管的企业
+ if (!selfAndSubCompanyList.contains(oldBU.getCompanyId())){
+ throw new MsgCodeException(msgLanguageChange.getParameterMapByCode(languageType, "noOperationAuth"));
+ }
+ } catch (MsgCodeException e) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, e.getMessage());
+ }
+
+ //重复校验
+ if (checkExist(param) > 0) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "loginNameOrEmailHasExisted"));
+ }
+
+ long currentUnix = System.currentTimeMillis();
+ BasicUser basicUser = new BasicUser();
+ BeanUtils.copyProperties(param, basicUser);
+ basicUser.setId(param.getUserId());
+ basicUser.setModifierId(userId);
+ basicUser.setModifyTime(currentUnix);
+// basicUser.setCompanyId(companyId);
+ if (StringUtils.isBlank(param.getMobileNumber())) {
+ basicUser.setMobileNumber("");
+ }
+ basicUserMapperExt.updateById(basicUser);
+
+ insertUserRoleRelation(userId, currentUnix, basicUser.getId(), param.getRoleId());
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("编辑用户报错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+ @Override
+ public SimpleDataResponse batchDelete(DeleteUserParam deleteUserParam, String companyId, Long userId,
+ Integer languageType) {
+ try {
+ //基础表删除
+ List idList = Arrays.stream(deleteUserParam.getUserIds().split(",")).collect(Collectors.toList());
+
+ basicUserMapperExt.update(new BasicUser(),
+ new LambdaUpdateWrapper()
+ .in(BasicUser::getId, idList) // 根据 idList 更新
+ .in(BasicUser::getCompanyId, commonOpt.getSelfAndSubCompanyId(companyId)) // 根据 companyId 过滤
+ .set(BasicUser::getFlag, 1)); // 设置 flag 字段为 1
+
+
+ //删除用户-角色关联表
+// BasicRoleUserRelationExample deleteRoleUserRelationExample = new BasicRoleUserRelationExample();
+// BasicRoleUserRelationExample.Criteria deleteCriteria = deleteRoleUserRelationExample.createCriteria();
+// deleteCriteria.andUserIdIn(idList);
+// basicRoleUserRelationMapperExt.deleteByExample(deleteRoleUserRelationExample);
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("删除用户报错", e);
+ TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+ @Override
+ public IPage getListPage(PageSearchParam pageSearchParam, String companyId, Long userId,
+ Integer languageType) {
+ //list防${}注入
+ if (StringUtils.isBlank(pageSearchParam.getCompanyIds())) {
+ pageSearchParam.setCompanyIdList(commonOpt.getSelfAndSubCompanyId(companyId));
+ } else {
+ pageSearchParam.setCompanyIdList(commonOpt.filterCompanyIds(companyId, pageSearchParam.getCompanyIds()));
+ }
+
+ // 使用 MyBatis-Plus 提供的分页对象 Page
+ Page page = new Page<>(
+ pageSearchParam.getPageNum() == null ? 1 : pageSearchParam.getPageNum(),
+ pageSearchParam.getPageSize() == null ? 20 : pageSearchParam.getPageSize());
+ IPage resultList = basicUserMapperExt.getListPage(page, pageSearchParam);
+ return resultList;
+ }
+
+
+ @Override
+ public SimpleDataResponse batchResetPassword(ResetPassword resetPassword, String companyId, Long userId,
+ Integer languageType) {
+ if (StringUtils.isBlank(resetPassword.getUserIds())) {
+ return SimpleDataResponse.success();
+ }
+ try {
+ List ids = Arrays.asList(StringUtils.split(resetPassword.getUserIds(), ",")).stream()
+ .map(id -> CommonUtil.String2Long(id.trim())).collect(Collectors.toList());
+
+ List userList = basicUserMapperExt.selectList(
+ new LambdaQueryWrapper()
+ .in(BasicUser::getCompanyId, commonOpt.getSelfAndSubCompanyId(companyId)) // 根据公司ID过滤
+ .in(BasicUser::getId, ids));
+
+ if (CollectionUtils.isNotEmpty(userList)) {
+ long currentUnix = System.currentTimeMillis();
+ for (BasicUser basicUser : userList) {
+ String rawPwd = generateRandomPwd();
+ basicUser.setPassword(DESUtil.encrypt(rawPwd, basicUser.getSalt()));
+// basicUser.setPasswordModifyTime(currentUnix);
+ basicUserMapperExt.updateById(basicUser);
+
+ BasicCompany basicCompany = basicCompanyMapperExt.selectById(basicUser.getCompanyId());
+
+ //邮箱通知密码
+ String loginUrl = webLoginUrl;
+ optAsync.doSendWork(
+ msgLanguageChange.getParameterMapByCode(languageType, "mailResetUserPwdSubject") + "【" + basicCompany.getCompanyName() +"】",
+ MessageFormat.format(msgLanguageChange.getParameterMapByCode(languageType, "mailAddUserPwdContent"), basicUser.getLoginName(), rawPwd, loginUrl),
+ basicUser.getEmail(),
+ null);
+ }
+ }
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("重置密码出错", e);
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+
+ private String generateRandomPwd() {
+ return RandomNumberUtil.createRandomLowerLetterAndNumber(6)
+ +"!gM@"
+ + RandomNumberUtil.createRandomLowerLetterAndNumber(6);
+ }
+
+
+ @Override
+ public SimpleDataResponse modifyPassword(ModifyPassword modifyPassword, String companyId, Long userId,
+ Integer languageType) {
+ try {
+ if (!Pattern.matches(pwdPattern, modifyPassword.getNewPassword())) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "pwdFormatError"));
+ }
+ BasicUser basicUser = basicUserMapperExt.selectById(userId);
+ if (!DESUtil.encrypt(modifyPassword.getOldPassword(), basicUser.getSalt()).equals(basicUser.getPassword())) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "oldPwdError"));
+ }
+ String newPwd = DESUtil.encrypt(modifyPassword.getNewPassword(), basicUser.getSalt());
+ if (newPwd.equals(basicUser.getPassword())) {
+ return new SimpleDataResponse(ResponseCode.MSG_ERROR, msgLanguageChange.getParameterMapByCode(languageType, "newPwdSameOld"));
+ }
+ basicUser.setPassword(newPwd);
+ basicUser.setModifyTime(System.currentTimeMillis());
+// basicUser.setPasswordModifyTime(basicUser.getModifyTime());
+ basicUserMapperExt.updateById(basicUser);
+
+ return SimpleDataResponse.success();
+ } catch (Exception e) {
+ logger.error("modifyPassword出错",e);
+ return new SimpleDataResponse(ResponseCode.SERVER_ERROR, ResponseCode.SERVER_ERROR_MSG);
+ }
+ }
+
+}
diff --git a/model2d3d-viewer-back-service/src/test/java/com/model2d3d/viewer/back/service/impl/JsonsTests.java b/model2d3d-viewer-back-service/src/test/java/com/model2d3d/viewer/back/service/impl/JsonsTests.java
new file mode 100644
index 0000000..dae0eab
--- /dev/null
+++ b/model2d3d-viewer-back-service/src/test/java/com/model2d3d/viewer/back/service/impl/JsonsTests.java
@@ -0,0 +1,21 @@
+package com.model2d3d.viewer.back.service.impl;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import com.alibaba.fastjson.JSON;
+import org.junit.Test;
+
+public class JsonsTests {
+
+ @Test
+ public void testJson(){
+ Map jsonMap=new HashMap<>();
+
+ jsonMap.put("a", "1");
+ jsonMap.put("b", "2");
+ String jsonValue="{\"a\":\"1\",\"b\":\"2\"}";
+ System.out.println(JSON.toJSONString(jsonMap));
+
+ }
+}
diff --git a/model2d3d-viewer-back-util/.gitignore b/model2d3d-viewer-back-util/.gitignore
new file mode 100644
index 0000000..aa23915
--- /dev/null
+++ b/model2d3d-viewer-back-util/.gitignore
@@ -0,0 +1,15 @@
+/target/
+/logs/
+/.idea/
+*.iml
+*.bak
+*.log
+/.settings/
+*.project
+*.classpath
+*.factorypath
+*.springBeans
+/.apt_generated/
+/.externalToolBuilders/
+/bin/
+application-*.properties
diff --git a/model2d3d-viewer-back-util/pom.xml b/model2d3d-viewer-back-util/pom.xml
new file mode 100644
index 0000000..ebab5c2
--- /dev/null
+++ b/model2d3d-viewer-back-util/pom.xml
@@ -0,0 +1,85 @@
+
+
+ 4.0.0
+
+ com.techsor
+ model2d3d-viewer-back
+ 0.0.1-SNAPSHOT
+
+ model2d3d-viewer-back-util
+ model2d3d-viewer-back-util
+ http://maven.apache.org
+
+ UTF-8
+
+
+
+ junit
+ junit
+ test
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-mobile
+ 1.5.22.RELEASE
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ io.lettuce
+ lettuce-core
+ 5.1.6.RELEASE
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ org.apache.commons
+ commons-pool2
+
+
+ commons-collections
+ commons-collections
+ 3.2.2
+
+
+ com.alibaba
+ fastjson
+ 2.0.7.graal
+
+
+
+ org.dom4j
+ dom4j
+ 2.1.3
+
+
+
+ commons-io
+ commons-io
+ 2.11.0
+
+
+
+ com.google.code.gson
+ gson
+ 2.9.0
+
+
+
+ javax.mail
+ mail
+ 1.5.0-b01
+
+
+
+
diff --git a/model2d3d-viewer-back-util/src/main/java/com/model2d3d/viewer/back/util/Arith.java b/model2d3d-viewer-back-util/src/main/java/com/model2d3d/viewer/back/util/Arith.java
new file mode 100644
index 0000000..3176e78
--- /dev/null
+++ b/model2d3d-viewer-back-util/src/main/java/com/model2d3d/viewer/back/util/Arith.java
@@ -0,0 +1,165 @@
+package com.model2d3d.viewer.back.util;
+import java.math.BigDecimal;
+
+/**
+ * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类
+ *
+ * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精
+ * 确的浮点数运算,包括加减乘除和四舍五入。
+ */
+public class Arith {
+ //默认除法运算精度
+ private static final int DEF_DIV_SCALE = 10;
+
+ //这个类不能实例化
+ private Arith(){
+ }
+
+ /**
+ * 提供精确的加法运算。
+ * @param v1 被加数
+ * @param v2 加数
+ * @return 两个参数的和
+ */
+ public static double add(double v1,double v2){
+ BigDecimal b1 = new BigDecimal(Double.toString(v1));
+ BigDecimal b2 = new BigDecimal(Double.toString(v2));
+ return b1.add(b2).doubleValue();
+ }
+
+ /**
+ * 提供精确的减法运算。
+ * @param v1 被减数
+ * @param v2 减数
+ * @return 两个参数的差
+ */
+ public static double sub(double v1,double v2){
+ BigDecimal b1 = new BigDecimal(Double.toString(v1));
+ BigDecimal b2 = new BigDecimal(Double.toString(v2));
+ return b1.subtract(b2).doubleValue();
+ }
+
+ /**
+ * 提供精确的乘法运算。
+ * @param v1 被乘数
+ * @param v2 乘数
+ * @return 两个参数的积
+ */
+ public static double mul(double v1,double v2){
+ BigDecimal b1 = new BigDecimal(Double.toString(v1));
+ BigDecimal b2 = new BigDecimal(Double.toString(v2));
+ return b1.multiply(b2).doubleValue();
+ }
+
+ /**
+ * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到
+ * 小数点以后10位,以后的数字四舍五入。
+ * @param v1 被除数
+ * @param v2 除数
+ * @return 两个参数的商
+ */
+ public static double div(double v1,double v2){
+ return div(v1,v2,DEF_DIV_SCALE);
+ }
+
+ /**
+ * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指
+ * 定精度,以后的数字四舍五入。
+ * @param v1 被除数
+ * @param v2 除数
+ * @param scale 表示表示需要精确到小数点以后几位。
+ * @return 两个参数的商
+ */
+ public static double div(double v1,double v2,int scale){
+ if(scale<0){
+ throw new IllegalArgumentException(
+ "The scale must be a positive integer or zero");
+ }
+ BigDecimal b1 = new BigDecimal(Double.toString(v1));
+ BigDecimal b2 = new BigDecimal(Double.toString(v2));
+ return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
+ }
+
+ /**
+ * 提供精确的小数位四舍五入处理。
+ * @param v 需要四舍五入的数字
+ * @param scale 小数点后保留几位
+ * @return 四舍五入后的结果
+ */
+ public static double round(double v,int scale){
+ if(scale<0){
+ throw new IllegalArgumentException(
+ "The scale must be a positive integer or zero");
+ }
+ BigDecimal b = new BigDecimal(Double.toString(v));
+ BigDecimal one = new BigDecimal("1");
+ return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
+ }
+
+ /**
+ * 提供精确的类型转换(Float)
+ * @param v 需要被转换的数字
+ * @return 返回转换结果
+ */
+ public static float convertsToFloat(double v){
+ BigDecimal b = BigDecimal.valueOf(v);
+ return b.floatValue();
+ }
+
+ /**
+ * 提供精确的类型转换(Int)不进行四舍五入
+ * @param v 需要被转换的数字
+ * @return 返回转换结果
+ */
+ public static int convertsToInt(double v){
+ BigDecimal b = BigDecimal.valueOf(v);
+ return b.intValue();
+ }
+
+ /**
+ * 提供精确的类型转换(Long)
+ * @param v 需要被转换的数字
+ * @return 返回转换结果
+ */
+ public static long convertsToLong(double v){
+ BigDecimal b = BigDecimal.valueOf(v);
+ return b.longValue();
+ }
+
+ /**
+ * 返回两个数中大的一个值
+ * @param v1 需要被对比的第一个数
+ * @param v2 需要被对比的第二个数
+ * @return 返回两个数中大的一个值
+ */
+ public static double returnMax(double v1,double v2){
+ BigDecimal b1 = BigDecimal.valueOf(v1);
+ BigDecimal b2 = BigDecimal.valueOf(v2);
+ return b1.max(b2).doubleValue();
+ }
+
+ /**
+ * 返回两个数中小的一个值
+ * @param v1 需要被对比的第一个数
+ * @param v2 需要被对比的第二个数
+ * @return 返回两个数中小的一个值
+ */
+ public static double returnMin(double v1,double v2){
+ BigDecimal b1 = BigDecimal.valueOf(v1);
+ BigDecimal b2 = BigDecimal.valueOf(v2);
+ return b1.min(b2).doubleValue();
+ }
+
+ /**
+ * 精确对比两个数字
+ * @param v1 需要被对比的第一个数
+ * @param v2 需要被对比的第二个数
+ * @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1
+ */
+ public static int compareTo(double v1,double v2){
+ BigDecimal b1 = BigDecimal.valueOf(v1);
+ BigDecimal b2 = BigDecimal.valueOf(v2);
+ return b1.compareTo(b2);
+ }
+
+}
\ No newline at end of file
diff --git a/model2d3d-viewer-back-util/src/main/java/com/model2d3d/viewer/back/util/CommonUtil.java b/model2d3d-viewer-back-util/src/main/java/com/model2d3d/viewer/back/util/CommonUtil.java
new file mode 100644
index 0000000..26eecfb
--- /dev/null
+++ b/model2d3d-viewer-back-util/src/main/java/com/model2d3d/viewer/back/util/CommonUtil.java
@@ -0,0 +1,763 @@
+package com.model2d3d.viewer.back.util;
+
+import java.lang.reflect.Field;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import org.apache.commons.collections.MapUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.util.LinkedMultiValueMap;
+import org.springframework.util.MultiValueMap;
+
+import com.alibaba.fastjson.JSONObject;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+
+
+public class CommonUtil {
+
+ private static final String decimalsRegex = "[.](.*)";
+
+ private static final String hexStringRegex = "^[A-Fa-f0-9]+$";
+
+ private static final String betweenQuotesRegex = "\"([^\"]*)\"";
+
+ /**
+ * String转Int
+ *
+ * @param s
+ * @return
+ */
+ public static int String2Int(String s) {
+ try {
+ return Integer.parseInt(s);
+ } catch (Exception e) {
+ return 0;
+ }
+ }
+
+ /**
+ * String转Long
+ *
+ * @param s
+ * @return
+ */
+ public static Long String2Long(String s) {
+ try {
+ return Long.parseLong(s);
+ } catch (Exception e) {
+ return Long.parseLong("0");
+ }
+ }
+ /**
+ * String转Double
+ *
+ * @param s
+ * @return
+ */
+ public static Double String2Double(String s) {
+ try {
+ return Double.parseDouble(s);
+ } catch (Exception e) {
+ return Double.parseDouble("0.00");
+ }
+ }
+ /**
+ * String转Float
+ *
+ * @param s
+ * @return
+ */
+ public static Float String2Float(String s) {
+ try {
+ return Float.parseFloat(s);
+ } catch (Exception e) {
+ return Float.parseFloat("0.00");
+ }
+ }
+ /**
+ * 十六进制Object转Long
+ *
+ * @param s
+ * @return
+ */
+ public static Long HexObject2Long(Object s) {
+ try {
+ return Long.parseLong(s.toString(),16);
+ } catch (Exception e) {
+ return Long.parseLong("0");
+ }
+ }
+
+ /**
+ * 十六进制Object转Int
+ *
+ * @param s
+ * @return
+ */
+ public static Integer HexObject2Int(Object s) {
+ try {
+ return Integer.parseInt(s.toString(),16);
+ } catch (Exception e) {
+ return Integer.parseInt("0");
+ }
+ }
+
+ /**
+ * 十六进制字符串转二进制字符串,高位在左,低位在右
+ * @param hexString
+ * @return
+ */
+ public static String hexString2binary(String hexString)
+ {
+ if (hexString == null || hexString.length() % 2 != 0)
+ return null;
+ String bString = "", tmp;
+ for (int i = 0; i < hexString.length(); i++)
+ {
+ tmp = "0000"+ Integer.toBinaryString(Integer.parseInt(hexString.substring(i, i + 1), 16));
+ bString += tmp.substring(tmp.length() - 4);
+ }
+ return bString;
+ }
+
+ /**
+ * 十进制转补位的byte字符串
+ * @param s 需转换的十进制值
+ * @param length 需满足的长度
+ * @return
+ */
+ public static String Int2ByteString(int s,int length) {
+ try {
+ return String.format("%0"+length+"d", Long.parseLong(Integer.toBinaryString(s)));
+ } catch (Exception e) {
+ return String.format("%0"+length+"d", Long.parseLong(Integer.toBinaryString(s)));
+ }
+ }
+
+ /**
+ * 十六进制字符串转ascii码字符串
+ * @param hex
+ * @return
+ */
+ public static String convertHexToString(String hex){
+ StringBuilder sb = new StringBuilder();
+ StringBuilder temp = new StringBuilder();
+ for( int i=0; i 0; i--) {
+ char c = binary.charAt(i - 1);
+ int algorism = c - '0';
+ result += Math.pow(2, max - i) * algorism;
+ }
+ return result;
+ }
+
+
+ /**
+ * 十进制转十六进制
+ * @param decimal
+ * @return
+ */
+ public static String decimalToHex(int decimal) {
+ String result = "";
+ result = Integer.toHexString(decimal);
+ if (result.length() % 2 == 1) {
+ result = "0" + result;
+ }
+ result = result.toUpperCase();
+ return result;
+ }
+
+ /**
+ * 将对象转换为json格式字符串
+ *
+ * @param Object
+ * @return json string
+ */
+ public static String toJSON(Object obj) {
+ ObjectMapper om = new ObjectMapper();
+ try {
+ String json = om.writeValueAsString(obj);
+ return json;
+ } catch (JsonProcessingException e) {
+ e.printStackTrace();
+ }
+ return null;
+ }
+
+
+ /**
+ * 给字符串补0
+ * @param str 需要补齐长度的字符串
+ * @param strLength 需要补足的长度
+ * @param type 1左补0, 2右补0
+ * @return
+ */
+ public static String addZeroForString(String str, int strLength, int type) {
+ int strLen = str.length();
+ StringBuffer sb = null;
+ if(type == 1){
+ while (strLen < strLength) {
+ sb = new StringBuffer();
+ sb.append("0").append(str);// 左补0
+ //sb.append(str).append("0");//右补0
+ str = sb.toString();
+ strLen = str.length();
+ }
+ }else{
+ while (strLen < strLength) {
+ sb = new StringBuffer();
+// sb.append("0").append(str);// 左补0
+ sb.append(str).append("0");//右补0
+ str = sb.toString();
+ strLen = str.length();
+ }
+ }
+ return str;
+ }
+
+
+ /**
+ * 判断是否为整数
+ * @param str
+ * @return
+ */
+ public static boolean isInteger(String str) {
+ Pattern pattern = Pattern.compile("^-?[0-9]\\d*$");
+ return pattern.matcher(str).matches();
+ }
+
+ /**
+ * 判定是否为非负数(整数、小数)
+ * @param str
+ * @return
+ */
+ public static boolean isDecimal(String str) {
+ int index = str.indexOf(".");
+ if(index<0){
+ return StringUtils.isNumeric(str);
+ }else{
+ String num1 = str.substring(0,index);
+ String num2 = str.substring(index+1);
+ return StringUtils.isNumeric(num1) && StringUtils.isNumeric(num2);
+ }
+ }
+
+ /**
+ * 判断是否为非负数
+ * @param str
+ * @return
+ */
+ public static boolean isPositiveOrZero(String str) {
+ return str.matches("(0|([1-9]\\d*))(\\.\\d+)?");
+ }
+
+
+ /**
+ * unix时间变更为datetime类型
+ *
+ * @param s
+ * @return
+ */
+ public static Date ObjectUnix2DateStr(Object s) {
+ try {
+ return new java.util.Date(1000*Long.parseLong(s.toString()));
+ } catch (Exception e) {
+ return new Date();
+ }
+ }
+
+ /**
+ * 获取UUID方法
+ * @return
+ */
+ public static String getUUID() {
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+ return sdf.format(new Date()) + UUID.randomUUID().toString().replace("-","");
+ }
+
+ /**
+ * 获取字符串型的当前年.月.日 yyyy_MM_dd 格式
+ * @return
+ */
+ public static String TableDateFM2D(){
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM_dd");
+ return sdf.format(new Date());
+ }
+
+ /**
+ * 获取字符串型的当前年.月 yyyy_MM 格式
+ * @return
+ */
+ public static String TableDateFM2M(){
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM");
+ return sdf.format(new Date());
+ }
+
+
+ /**
+ * 根据传入的date,返回数据表需要的日期格式
+ * @param date
+ * @param mode 0:yyyy_MM格式, 1:yyyy_MM_dd
+ * @return
+ */
+ public static String TableDateByDateStr(Object date, int mode){
+ String resultDate = "";
+ SimpleDateFormat sdfFull = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM");
+ if(mode > 0){
+ sdf = new SimpleDateFormat("yyyy_MM_dd");
+ }
+ try {
+ Date datetime = sdfFull.parse(date.toString());
+ resultDate = sdf.format(datetime);
+ } catch (ParseException e) {
+ e.printStackTrace();
+ }
+ return resultDate;
+ }
+
+
+ /**
+ * 根据传入的秒级时间戳,返回数据表需要的日期格式
+ * @param date
+ * @param mode 0:yyyy_MM格式, 1:yyyy_MM_dd
+ * @return
+ */
+ public static String TableDateByUnix(Object date, int mode){
+ SimpleDateFormat sdf = new SimpleDateFormat("yyyy_MM");
+ if(mode > 0){
+ sdf = new SimpleDateFormat("yyyy_MM_dd");
+ }
+ String tabTime = sdf.format(Long.parseLong(date.toString()+"000"));
+ return tabTime;
+ }
+
+ /**
+ * json排版修改
+ *
+ * @param s
+ * @return
+ */
+ public static String String2Rep(String s) {
+ try {
+ return s.replace(",", ",\n").replace("[", "\n[\n")
+ .replace("{", "\n{\n").replace("}", "\n}\n")
+ .replace("]", "\n]\n");
+ } catch (Exception e) {
+ return s;
+ }
+ }
+
+
+ /**8
+ * Convert byte[] to hex string.这里我们可以将byte转换成int,然后利用Integer.toHexString(int)来转换成16进制字符串。
+ * @param src byte[] data
+ * @return hex string
+ */
+ public static String bytesToHexString(byte[] src){
+ StringBuilder stringBuilder = new StringBuilder("");
+ if (src == null || src.length <= 0) {
+ return null;
+ }
+ for (int i = 0; i < src.length; i++) {
+ int v = src[i] & 0xFF;
+ String hv = Integer.toHexString(v);
+ if (hv.length() < 2) {
+ stringBuilder.append(0);
+ }
+ stringBuilder.append(hv);
+ }
+ return stringBuilder.toString();
+ }
+
+ public static String StringtoHexString(String s) {
+ String str = "";
+ for (int i = 0; i < s.length(); i++) {
+ int ch = (int) s.charAt(i);
+ String s4 = Integer.toHexString(ch & 0xFF);
+ if (s4.length() == 1) {
+ s4 = '0' + s4;
+ }
+ str = str + s4;
+ }
+ return str;// 0x表示十六进制
+ }
+ /**
+ * Convert hex string to byte[]
+ * @param hexString the hex string
+ * @return byte[]
+ */
+ public static byte[] HexString2Bytes(String src) {
+ int size = src.length();
+ byte[] ret = new byte[size / 2];
+ byte[] tmp = src.getBytes();
+ for (int i = 0; i < size / 2; i++) {
+ ret[i] = uniteBytes(tmp[i * 2], tmp[i * 2 + 1]);
+ }
+ return ret;
+ }
+ private static byte uniteBytes(byte src0, byte src1) {
+ char _b0 = (char) Byte.decode("0x" + new String(new byte[] { src0 })).byteValue();
+ _b0 = (char) (_b0 << 4);
+ char _b1 = (char) Byte.decode("0x" + new String(new byte[] { src1 })).byteValue();
+ byte ret = (byte) (_b0 ^ _b1);
+ return ret;
+ }
+ /**
+ * 获取更改时区后的日期
+ * @param date 日期
+ * @param oldZone 旧时区对象
+ * @param newZone 新时区对象
+ * @return 日期
+ */
+ public static String changeTimeZone(String datetime, TimeZone oldZone, TimeZone newZone) {
+ String result = "";
+ if(datetime != null && datetime.length()>0){
+ SimpleDateFormat DateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+ Date date = null;
+ try {
+ date = DateFormat.parse(datetime);
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ Date dateTmp = null;
+ if (date != null) {
+ int timeOffset = oldZone.getRawOffset() - newZone.getRawOffset();
+ dateTmp = new Date(date.getTime() - timeOffset);
+ result = DateFormat.format(dateTmp);
+ }
+ }
+ return result;
+ }
+ /**
+ * 获取浏览器版本信息
+ * @date:2016-9-19
+ * @author:jiangwy
+ * @param agent
+ * @return
+ */
+ public static String getBrowserName(String agent) {
+ if(agent.indexOf("msie 7")>0){
+ return "ie7";
+ }else if(agent.indexOf("msie 8")>0){
+ return "ie8";
+ }else if(agent.indexOf("msie 9")>0){
+ return "ie9";
+ }else if(agent.indexOf("msie 10")>0){
+ return "ie10";
+ }else if(agent.indexOf("msie")>0){
+ return "ie";
+ }else if(agent.indexOf("opera")>0){
+ return "opera";
+ }else if(agent.indexOf("firefox")>0){
+ return "firefox";
+ }else if(agent.indexOf("webkit")>0){
+ return "webkit";
+ }else if(agent.indexOf("gecko")>0 && agent.indexOf("rv:11")>0){
+ return "ie11";
+ }else{
+ return "Others";
+ }
+ }
+
+ /**
+ * 百度坐标系计算两经纬度点之间的距离(单位:米)
+ * @param lng1 经度
+ * @param lat1 纬度
+ * @param lng2
+ * @param lat2
+ * @return
+ */
+ public static double getBMapDistance(double lat_a, double lng_a, double lat_b, double lng_b){
+ double pk = 180 / Math.PI;
+ double a1 = lat_a / pk;
+ double a2 = lng_a / pk;
+ double b1 = lat_b / pk;
+ double b2 = lng_b / pk;
+ double t1 = Math.cos(a1) * Math.cos(a2) * Math.cos(b1) * Math.cos(b2);
+ double t2 = Math.cos(a1) * Math.sin(a2) * Math.cos(b1) * Math.sin(b2);
+ double t3 = Math.sin(a1) * Math.sin(b1);
+ double tt = Math.acos(t1 + t2 + t3);
+ return 6370996.81 * tt;
+ }
+
+ /**
+ * 将用角度表示的角转换为近似相等的用弧度表示的角 Math.toRadians
+ * @param d
+ * @return
+ */
+ private static double rad(double d)
+ {
+ return d * Math.PI / 180.0;
+ }
+
+ /**
+ * gps计算两经纬度点之间的距离(单位:米)
+ * @param lat1
+ * @param lng1
+ * @param lat2
+ * @param lng2
+ * @return
+ */
+ public static double getGPSDistance(double lat1, double lng1, double lat2, double lng2)
+ {
+ double radLat1 = rad(lat1);
+ double radLat2 = rad(lat2);
+ double a = radLat1 - radLat2;
+ double b = rad(lng1) - rad(lng2);
+ double s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
+ Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
+ s = s * 6370996.81;
+ s = Math.round(s * 10000.0) / 10.0;
+ return s;
+ }
+
+ /**
+ * 拼接List里Map的某个特定键对应的所有值
+ * @param list
+ * @param param
+ * @return
+ */
+ public static String JointListParam(List