diff --git a/pom.xml b/pom.xml
index 96eaf43d..0928ad1a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,7 @@
user-service-project
user-web-app
+ system-service-project
pom
diff --git a/system-service-project/pom.xml b/system-service-project/pom.xml
new file mode 100644
index 00000000..bc920f5a
--- /dev/null
+++ b/system-service-project/pom.xml
@@ -0,0 +1,45 @@
+
+
+
+ onemall
+ cn.iocoder.mall
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ system-service-project
+ pom
+
+ system-service-api
+ system-service-app
+
+
+
+
+
+
+ cn.iocoder.mall
+ mall-dependencies
+ 1.0-SNAPSHOT
+ pom
+ import
+
+
+
+ cn.iocoder.mall
+ common-framework
+ 1.0-SNAPSHOT
+
+
+
+
+ cn.iocoder.mall
+ system-service-api
+ 1.0-SNAPSHOT
+
+
+
+
+
diff --git a/user/user-application/pom.xml b/system-service-project/system-service-api/pom.xml
similarity index 58%
rename from user/user-application/pom.xml
rename to system-service-project/system-service-api/pom.xml
index 2ad3fbe8..9d0ae27b 100644
--- a/user/user-application/pom.xml
+++ b/system-service-project/system-service-api/pom.xml
@@ -3,28 +3,29 @@
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
- user
+ system-service-project
cn.iocoder.mall
1.0-SNAPSHOT
4.0.0
- user-application
-
+ system-service-api
-
cn.iocoder.mall
- user-rest
- 1.0-SNAPSHOT
-
-
- cn.iocoder.mall
- user-rpc
- 1.0-SNAPSHOT
+ common-framework
+
+
+ javax.validation
+ validation-api
+
+
+ org.projectlombok
+ lombok
+
diff --git a/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/enums/SystemErrorCodeEnum.java b/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/enums/SystemErrorCodeEnum.java
new file mode 100644
index 00000000..76fd3f68
--- /dev/null
+++ b/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/enums/SystemErrorCodeEnum.java
@@ -0,0 +1,109 @@
+package cn.iocoder.mall.systemservice.enums;
+
+import cn.iocoder.common.framework.util.ServiceExceptionUtil;
+
+/**
+ * 错误码枚举类
+ *
+ * system 系统,使用 1-002-000-000 段
+ */
+public enum SystemErrorCodeEnum implements ServiceExceptionUtil.Enumerable {
+
+ // ========== OAUTH2 模块 ==========
+ OAUTH2_UNKNOWN(1001001000, "未知错误"), // 预留
+ // 预留 1001001001 ~ 1001001099 错误码,方便前端
+ OAUTH2_ACCESS_TOKEN_NOT_FOUND(1001001001, "访问令牌不存在"),
+ OAUTH2_ACCESS_TOKEN_TOKEN_EXPIRED(1001001002, "访问令牌已过期"),
+ OAUTH2_ACCESS_TOKEN_INVALID(1001001003, "访问令牌已失效"),
+ OAUTH2_NOT_AUTHENTICATE(1001001004, "账号未登陆"),
+ OAUTH2_REFRESH_TOKEN_NOT_FOUND(1001001005, "刷新令牌不存在"),
+ OAUTH_REFRESH_TOKEN_EXPIRED(1001001006, "访问令牌已过期"),
+ OAUTH_REFRESH_TOKEN_INVALID(1001001007, "刷新令牌已失效"),
+ // 其它 1001001100 开始
+ OAUTH2_ACCOUNT_NOT_FOUND(1001001100, "账号不存在"),
+ OAUTH2_ACCOUNT_PASSWORD_ERROR(1001001101, "密码不正确"),
+
+ // ========== 管理员模块 1002002000 ==========
+ ADMIN_NOT_FOUND(1002002000, "管理员不存在"),
+// 废弃 ADMIN_USERNAME_NOT_REGISTERED(1002002000, "账号不存在"),
+// 废弃 ADMIN_PASSWORD_ERROR(1002002001, "密码不正确"),
+// ADMIN_IS_DISABLE(1002002002, "账号被禁用"),
+// ADMIN_USERNAME_EXISTS(1002002002, "账号已经存在"),
+// ADMIN_STATUS_EQUALS(1002002003, "账号已经是该状态"),
+// ADMIN_DELETE_ONLY_DISABLE(1002002004, "只有关闭的账号才可以删除"),
+// ADMIN_ADMIN_STATUS_CAN_NOT_UPDATE(1002002005, "管理员的账号状态不允许变更"),
+// ADMIN_ASSIGN_ROLE_NOT_EXISTS(1002002006, "分配员工角色时,有角色不存在"),
+// ADMIN_ADMIN_CAN_NOT_UPDATE(1002002008, "管理员的账号不允许变更"),
+
+ // ========== 资源模块 1002003000 ==========
+ RESOURCE_NAME_DUPLICATE(1002003000, "已经存在该名字的资源"),
+ RESOURCE_PARENT_NOT_EXISTS(1002003001, "父资源不存在"),
+ RESOURCE_PARENT_ERROR(1002003002, "不能设置自己为父资源"),
+ RESOURCE_NOT_EXISTS(1002003003, "资源不存在"),
+ RESOURCE_EXISTS_CHILDREN(1002003004, "存在子资源,无法删除"),
+ RESOURCE_PARENT_NOT_MENU(1002003005, "父资源的类型必须是菜单"),
+
+ // ========== 角色模块 1002004000 ==========
+ ROLE_NOT_EXISTS(1002004000, "角色不存在"),
+ ROLE_NAME_DUPLICATE(1002004001, "已经存在名为【{}}】的角色"),
+ ROLE_CODE_DUPLICATE(1002004002, "已经存在编码为【{}}】的角色"),
+ ROLE_CAN_NOT_UPDATE_SYSTEM_TYPE_ROLE(1002004004, "不能修改类型为系统内置的角色"),
+ ROLE_CAN_NOT_DELETE_SYSTEM_TYPE_ROLE(1002004005, "不能删除类型为系统内置的角色"),
+
+ // ========== 数据字典模块 1002005000 ==========
+// DATA_DICT_EXISTS(1002005000, "该数据字典已经存在"),
+// DATA_DICT_NOT_EXISTS(1002005001, "该数据字典不存在"),
+
+ // ========== 短信模板 1002006000 ==========
+ SMS_PLATFORM_FAIL(1002006000, "短信平台调用失败【具体错误会动态替换】"),
+ SMS_SIGN_NOT_EXISTENT(1002006001, "短信签名不存在"),
+ SMS_SIGN_IS_EXISTENT(1002006002, "短信签名已存在"),
+ SMS_TEMPLATE_NOT_EXISTENT(1002006020, "短信签名不存在"),
+ SMS_TEMPLATE_IS_EXISTENT(1002006021, "短信签名不存在"),
+ SMS_NOT_SEND_CLIENT(1002006030, "短信没有发送的client"),
+
+ // ========== 部门模块 1002007000 ==========
+// DEPT_SAME_LEVEL_NAME_EXITS(1002007001,"当前级别部门名字已存在"),
+// DEPT_PARENT_NOT_EXITS(1002007002,"父级部门不存在"),
+// DEPT_NOT_EXITS(1002007003, "当前部门不存在"),
+// DEPT_EXITS_CHILDREN(1002007004, "当前部门存在子部门"),
+// DEPT_PARENT_NOT_LEGAL(1002007005, "父级部门不合法"),
+
+ // ========== 授权模块 1002008000 ==========
+ AUTHORIZATION_PERMISSION_DENY(1002008001, "没有该操作权限"),
+ AUTHORIZATION_DEMO_PERMISSION_DENY(1002008002, "演示账号,暂不允许写操作。欢迎加入我们的交流群:http://t.cn/EKEr5WE"),
+ AUTHORIZATION_ROLE_ASSIGN_RESOURCE_NOT_EXISTS(1002004001, "分配角色资源时,有资源不存在"),
+
+ // ========== 错误码模块 1002009000 ==========
+ ERROR_CODE_NOT_EXISTS(1002009000, "错误码不存在"),
+ ERROR_CODE_DUPLICATE(1002009001, "已经存在编码为【{}}】的错误码"),
+ ERROR_CAN_NOT_UPDATE_SYSTEM_TYPE_ERROR(1002004003, "不能修改类型为系统内置的错误码"),
+ ;
+
+
+ private final int code;
+ private final String message;
+
+ SystemErrorCodeEnum(int code, String message) {
+ this.code = code;
+ this.message = message;
+ }
+
+ @Override
+ public int getCode() {
+ return code;
+ }
+
+ @Override
+ public String getMessage() {
+ return message;
+ }
+
+ // TODO: 2020-05-22 封装成start的时候,直接在start中定义一个统一的枚举,从中取值;
+ @Override
+ public int getGroup() {
+ return 0;
+ }
+
+
+}
diff --git a/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/rpc/oauth/OAuth2Rpc.java b/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/rpc/oauth/OAuth2Rpc.java
new file mode 100644
index 00000000..fcfacb25
--- /dev/null
+++ b/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/rpc/oauth/OAuth2Rpc.java
@@ -0,0 +1,4 @@
+package cn.iocoder.mall.systemservice.rpc.oauth;
+
+public interface OAuth2Rpc {
+}
diff --git a/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/rpc/package-info.java b/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/rpc/package-info.java
new file mode 100644
index 00000000..e75b646b
--- /dev/null
+++ b/system-service-project/system-service-api/src/main/java/cn/iocoder/mall/systemservice/rpc/package-info.java
@@ -0,0 +1 @@
+package cn.iocoder.mall.systemservice.rpc;
diff --git a/system-service-project/system-service-app/pom.xml b/system-service-project/system-service-app/pom.xml
new file mode 100644
index 00000000..506947a4
--- /dev/null
+++ b/system-service-project/system-service-app/pom.xml
@@ -0,0 +1,85 @@
+
+
+
+ system-service-project
+ cn.iocoder.mall
+ 1.0-SNAPSHOT
+
+ 4.0.0
+
+ system-service-service
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-dubbo
+
+
+
+
+ cn.iocoder.mall
+ system-service-api
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ mysql
+ mysql-connector-java
+
+
+
+ org.springframework
+ spring-tx
+
+
+ org.springframework
+ spring-jdbc
+
+
+ com.alibaba
+ druid-spring-boot-starter
+
+
+
+ cn.iocoder.mall
+ mall-spring-boot-starter-mybatis
+
+
+
+
+ org.projectlombok
+ lombok
+
+
+
+ org.mapstruct
+ mapstruct
+
+
+ org.mapstruct
+ mapstruct-jdk8
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/SystemServiceApplication.java b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/SystemServiceApplication.java
new file mode 100644
index 00000000..13349c96
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/SystemServiceApplication.java
@@ -0,0 +1,13 @@
+package cn.iocoder.mall.systemservice;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SystemServiceApplication {
+
+ public static void main(String[] args) {
+ SpringApplication.run(SystemServiceApplication.class, args);
+ }
+
+}
diff --git a/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/config/DatabaseConfiguration.java b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/config/DatabaseConfiguration.java
new file mode 100644
index 00000000..a83ca5f1
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/config/DatabaseConfiguration.java
@@ -0,0 +1,28 @@
+package cn.iocoder.mall.systemservice.config;
+
+import com.baomidou.mybatisplus.core.injector.DefaultSqlInjector;
+import com.baomidou.mybatisplus.core.injector.ISqlInjector;
+import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
+import org.mybatis.spring.annotation.MapperScan;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.transaction.annotation.EnableTransactionManagement;
+
+@Configuration
+@MapperScan("cn.iocoder.mall.systemservice.dal.mysql.mapper") // 扫描对应的 Mapper 接口
+@EnableTransactionManagement(proxyTargetClass = true) // 启动事务管理。
+public class DatabaseConfiguration {
+
+ // 数据库连接池 Druid
+
+ @Bean
+ public ISqlInjector sqlInjector() {
+ return new DefaultSqlInjector(); // MyBatis Plus 逻辑删除
+ }
+
+ @Bean
+ public PaginationInterceptor paginationInterceptor() {
+ return new PaginationInterceptor(); // MyBatis Plus 分页插件
+ }
+
+}
diff --git a/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/config/ServiceExceptionConfiguration.java b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/config/ServiceExceptionConfiguration.java
new file mode 100644
index 00000000..493f2a35
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/config/ServiceExceptionConfiguration.java
@@ -0,0 +1,20 @@
+package cn.iocoder.mall.systemservice.config;
+
+import cn.iocoder.common.framework.util.ServiceExceptionUtil;
+import cn.iocoder.mall.systemservice.enums.SystemErrorCodeEnum;
+import org.springframework.boot.context.event.ApplicationReadyEvent;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.EventListener;
+
+import java.util.Arrays;
+
+@Configuration
+public class ServiceExceptionConfiguration {
+
+ @EventListener(ApplicationReadyEvent.class)
+ public void initMessages() {
+ Arrays.stream(SystemErrorCodeEnum.values()).forEach(
+ item -> ServiceExceptionUtil.put(item.getCode(), item.getMessage()));
+ }
+
+}
diff --git a/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/rpc/oauth/OAuth2RpcImpl.java b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/rpc/oauth/OAuth2RpcImpl.java
new file mode 100644
index 00000000..22d4933b
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/rpc/oauth/OAuth2RpcImpl.java
@@ -0,0 +1,7 @@
+package cn.iocoder.mall.systemservice.rpc.oauth;
+
+import org.apache.dubbo.config.annotation.Service;
+
+@Service(version = "${dubbo.provider.OAuth2Rpc.version}", validation = "false")
+public class OAuth2RpcImpl implements OAuth2Rpc {
+}
diff --git a/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/rpc/package-info.java b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/rpc/package-info.java
new file mode 100644
index 00000000..e75b646b
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/java/cn/iocoder/mall/systemservice/rpc/package-info.java
@@ -0,0 +1 @@
+package cn.iocoder.mall.systemservice.rpc;
diff --git a/system-service-project/system-service-app/src/main/resources/application-dev.yaml b/system-service-project/system-service-app/src/main/resources/application-dev.yaml
new file mode 100644
index 00000000..cfae12b0
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/resources/application-dev.yaml
@@ -0,0 +1,20 @@
+spring:
+ # 数据源配置项
+ datasource:
+ url: jdbc:mysql://400-infra.server.iocoder.cn:3306/mall_system?useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ driver-class-name: com.mysql.jdbc.Driver
+ username: root
+ password: 3WLiVUBEwTbvAfsh
+ # Spring Cloud 配置项
+ cloud:
+ nacos:
+ # Spring Cloud Nacos Discovery 配置项
+ discovery:
+ server-addr: 400-infra.server.iocoder.cn:8848 # Nacos 服务器地址
+ namespace: dev # Nacos 命名空间
+
+# Dubbo 配置项
+dubbo:
+ # Dubbo 注册中心
+ registry:
+ address: spring-cloud://400-infra.server.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
diff --git a/system-service-project/system-service-app/src/main/resources/application-local.yaml b/system-service-project/system-service-app/src/main/resources/application-local.yaml
new file mode 100644
index 00000000..bf97cae9
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/resources/application-local.yaml
@@ -0,0 +1,20 @@
+spring:
+ # 数据源配置项
+ datasource:
+ url: jdbc:mysql://400-infra.server.iocoder.cn:3306/mall_system?useSSL=false&useUnicode=true&characterEncoding=UTF-8
+ driver-class-name: com.mysql.jdbc.Driver
+ username: root
+ password: 3WLiVUBEwTbvAfsh
+ # Spring Cloud 配置项
+ cloud:
+ nacos:
+ # Spring Cloud Nacos Discovery 配置项
+ discovery:
+ server-addr: 400-infra.server.iocoder.cn:8848 # Nacos 服务器地址
+ namespace: local # Nacos 命名空间
+
+# Dubbo 配置项
+dubbo:
+ # Dubbo 注册中心
+ registry:
+ address: spring-cloud://400-infra.server.iocoder.cn:8848 # 指定 Dubbo 服务注册中心的地址
diff --git a/system-service-project/system-service-app/src/main/resources/application.yaml b/system-service-project/system-service-app/src/main/resources/application.yaml
new file mode 100644
index 00000000..d3840c46
--- /dev/null
+++ b/system-service-project/system-service-app/src/main/resources/application.yaml
@@ -0,0 +1,37 @@
+spring:
+ # Application 的配置项
+ application:
+ name: system-service
+ # Profile 的配置项
+ profiles:
+ active: local
+
+# MyBatis Plus 配置项
+mybatis-plus:
+ configuration:
+ map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
+ global-config:
+ db-config:
+ id-type: auto
+ logic-delete-value: 1 # 逻辑已删除值(默认为 1)
+ logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
+ mapper-locations: classpath*:mapper/*.xml
+ type-aliases-package: cn.iocoder.mall.systemservice.dal.mysql.dataobject
+
+# Dubbo 配置项
+dubbo:
+ # Spring Cloud Alibaba Dubbo 专属配置
+ cloud:
+ subscribed-services: '' # 设置订阅的应用列表,默认为 * 订阅所有应用
+ # Dubbo 提供者的协议
+ protocol:
+ name: dubbo
+ port: -1
+ # Dubbo 提供服务的扫描基础包
+ scan:
+ base-packages: cn.iocoder.mall.systemservice.rpc
+ # Dubbo 服务提供者的配置
+ provider:
+ filter: -exception
+ OAuth2Rpc:
+ version: 1.0.0
diff --git a/user/pom.xml b/user/pom.xml
index 6418775b..a4d6449c 100644
--- a/user/pom.xml
+++ b/user/pom.xml
@@ -15,7 +15,6 @@
- user-application
user-rest
user-rpc
user-rpc-api
diff --git a/user/user-application/src/main/java/cn/iocoder/mall/user/application/UserApplication.java b/user/user-application/src/main/java/cn/iocoder/mall/user/application/UserApplication.java
deleted file mode 100644
index 3f2c7625..00000000
--- a/user/user-application/src/main/java/cn/iocoder/mall/user/application/UserApplication.java
+++ /dev/null
@@ -1,24 +0,0 @@
-package cn.iocoder.mall.user.application;
-
-import org.springframework.boot.SpringApplication;
-import org.springframework.boot.autoconfigure.SpringBootApplication;
-import org.springframework.boot.context.config.ConfigFileApplicationListener;
-
-@SpringBootApplication(scanBasePackages = {"cn.iocoder.mall.system"})
-public class UserApplication {
-
- /**
- * 设置需要读取的配置文件的名字。
- * 基于 {@link org.springframework.boot.context.config.ConfigFileApplicationListener#CONFIG_NAME_PROPERTY} 实现。
- */
- private static final String CONFIG_NAME_VALUE = "biz,rest,rpc,application";
-
- public static void main(String[] args) {
- // 设置环境变量
- System.setProperty(ConfigFileApplicationListener.CONFIG_NAME_PROPERTY, CONFIG_NAME_VALUE);
-
- // 启动 Spring Boot 应用
- SpringApplication.run(UserApplication.class, args);
- }
-
-}
diff --git a/user/user-application/src/main/resources/application.yaml b/user/user-application/src/main/resources/application.yaml
deleted file mode 100644
index d4ef580c..00000000
--- a/user/user-application/src/main/resources/application.yaml
+++ /dev/null
@@ -1,8 +0,0 @@
-spring:
- # Application 的配置项
- application:
- name: user-application
- # Profile 的配置项
- profiles:
- active: local
-