@llryiop/avatar-boot-cli 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +309 -0
- package/bin/cli.js +3 -0
- package/docs/plans/2026-03-12-avatar-boot-cli-design.md +73 -0
- package/docs/plans/2026-03-12-avatar-boot-cli-plan.md +681 -0
- package/package.json +28 -0
- package/src/index.js +78 -0
- package/src/prompts.js +78 -0
- package/src/template.js +37 -0
- package/src/transform.js +172 -0
- package/src/utils.js +34 -0
- package/templates/.claude/rules/architecture-redlines.md +146 -0
- package/templates/.claude/rules/code-review-standards.md +137 -0
- package/templates/.claude/rules/coding-standards.md +56 -0
- package/templates/.claude/rules/git-commit.md +59 -0
- package/templates/.claude/rules/layered-architecture.md +201 -0
- package/templates/.claude/rules/mybatis-plus.md +263 -0
- package/templates/.claude/rules/tech-stack.md +41 -0
- package/templates/.claude/rules/version.md +467 -0
- package/templates/.claude/settings.local.json +18 -0
- package/templates/.claude/skills/ai-tool-guide/SKILL.md +314 -0
- package/templates/.claude/skills/api-design/SKILL.md +200 -0
- package/templates/.claude/skills/api-doc-generator/SKILL.md +380 -0
- package/templates/.claude/skills/api-service-module-creator/SKILL.md +1114 -0
- package/templates/.claude/skills/avatar-boot-starter-feign/SKILL.md +243 -0
- package/templates/.claude/skills/avatar-boot-starter-job/SKILL.md +437 -0
- package/templates/.claude/skills/avatar-boot-starter-kafka/SKILL.md +580 -0
- package/templates/.claude/skills/avatar-boot-starter-mysql/SKILL.md +572 -0
- package/templates/.claude/skills/avatar-boot-starter-nacos/SKILL.md +901 -0
- package/templates/.claude/skills/avatar-boot-starter-oss/SKILL.md +594 -0
- package/templates/.claude/skills/avatar-boot-starter-redis/SKILL.md +586 -0
- package/templates/.claude/skills/avatar-boot-starter-rocketmq/SKILL.md +662 -0
- package/templates/.claude/skills/avatar-boot-starter-web/SKILL.md +1007 -0
- package/templates/.claude/skills/changelog-generator/SKILL.md +114 -0
- package/templates/.claude/skills/code-review/SKILL.md +239 -0
- package/templates/.claude/skills/crud-generator/SKILL.md +824 -0
- package/templates/.claude/skills/database-design/SKILL.md +377 -0
- package/templates/.claude/skills/deployment-config/SKILL.md +277 -0
- package/templates/.claude/skills/incident-analysis/SKILL.md +241 -0
- package/templates/.claude/skills/integration-test-generator/SKILL.md +496 -0
- package/templates/.claude/skills/prompt-engineering/SKILL.md +249 -0
- package/templates/.claude/skills/requirement-management/SKILL.md +244 -0
- package/templates/.claude/skills/security-audit/SKILL.md +330 -0
- package/templates/.claude/skills/test-case-design/SKILL.md +257 -0
- package/templates/.claude/skills/testing-workflow/SKILL.md +68 -0
- package/templates/.claude/skills/troubleshooting/SKILL.md +240 -0
- package/templates/CLAUDE.md +173 -0
- package/templates/README.md +303 -0
- package/templates/avatar-scaffold-api/pom.xml +41 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/api/LoginFeignClient.java +40 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/constant/LoginConstant.java +21 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/LoginRequest.java +17 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/request/RefreshTokenRequest.java +14 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/LoginResponse.java +31 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/dto/response/TokenInfoResponse.java +25 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/enums/LoginTypeEnum.java +23 -0
- package/templates/avatar-scaffold-api/src/main/java/com/iflytek/avatar/login/exception/LoginException.java +23 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile +14 -0
- package/templates/avatar-scaffold-service/k8s-app/Dockerfile-arm64 +14 -0
- package/templates/avatar-scaffold-service/packaging/assembly.xml +16 -0
- package/templates/avatar-scaffold-service/pom.xml +150 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/Application.java +21 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/config/LoginConfig.java +20 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/controller/LoginController.java +37 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/converter/LoginConverter.java +54 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/feign/DemoFeign.java +21 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserLoginEntity.java +33 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/entity/UserTokenEntity.java +39 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/repository/mapper/UserLoginMapper.java +20 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/LoginService.java +22 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/service/impl/LoginServiceImpl.java +43 -0
- package/templates/avatar-scaffold-service/src/main/java/com/iflytek/avatar/login/utils/LoginUtils.java +31 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-dev.yaml +29 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-local.yaml +61 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-prod.yaml +28 -0
- package/templates/avatar-scaffold-service/src/main/resources/application-test.yaml +28 -0
- package/templates/avatar-scaffold-service/src/main/resources/application.yaml +12 -0
- package/templates/pom.xml +98 -0
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
# avatar-template
|
|
2
|
+
|
|
3
|
+
## 介绍
|
|
4
|
+
|
|
5
|
+
该服务做为虚拟人服务端公用脚手架模板,包括通用功能模块(avatar-scaffold-api)和项目工程模板(avatar-scaffold-service)两个模块。
|
|
6
|
+
|
|
7
|
+
## 依赖
|
|
8
|
+
优先使用部门底层sdk框架,
|
|
9
|
+
|
|
10
|
+
### 使用说明
|
|
11
|
+
|
|
12
|
+
在根目录pom.xml文件中引用依赖
|
|
13
|
+
|
|
14
|
+
### 方式一:通过 Parent 接入(推荐)
|
|
15
|
+
|
|
16
|
+
适用于新项目或可以修改父 POM 的项目。
|
|
17
|
+
|
|
18
|
+
```xml
|
|
19
|
+
<project>
|
|
20
|
+
<parent>
|
|
21
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
22
|
+
<artifactId>avatar-boot-parent</artifactId>
|
|
23
|
+
<version>1.0.0-SNAPSHOT</version>
|
|
24
|
+
</parent>
|
|
25
|
+
|
|
26
|
+
<groupId>com.example</groupId>
|
|
27
|
+
<artifactId>your-service</artifactId>
|
|
28
|
+
<version>1.0.0</version>
|
|
29
|
+
|
|
30
|
+
<dependencies>
|
|
31
|
+
<!-- 直接引入 starter,无需指定版本 -->
|
|
32
|
+
<dependency>
|
|
33
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
34
|
+
<artifactId>avatar-boot-starter-web</artifactId>
|
|
35
|
+
</dependency>
|
|
36
|
+
<dependency>
|
|
37
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
38
|
+
<artifactId>avatar-boot-starter-mysql</artifactId>
|
|
39
|
+
</dependency>
|
|
40
|
+
</dependencies>
|
|
41
|
+
</project>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**自动获得的公共依赖:**
|
|
45
|
+
|
|
46
|
+
继承 `avatar-boot-parent` 后,你的项目会自动拥有以下依赖,无需手动声明:
|
|
47
|
+
|
|
48
|
+
| 依赖 | 说明 | Scope |
|
|
49
|
+
|------|------|-------|
|
|
50
|
+
| Lombok | 简化 Java 代码(@Data, @Slf4j 等) | compile (optional) |
|
|
51
|
+
| Hutool | 常用工具类库 | compile |
|
|
52
|
+
| Fastjson2 | 高性能 JSON 处理 | compile |
|
|
53
|
+
| Commons Lang3 | 字符串、数组等工具 | compile |
|
|
54
|
+
| Commons Collections4 | 集合工具类 | compile |
|
|
55
|
+
| Spring Boot Configuration Processor | 配置属性提示 | compile (optional) |
|
|
56
|
+
| Spring Boot Starter Test | 测试框架(JUnit 5, Mockito, AssertJ) | test |
|
|
57
|
+
| JUnit Jupiter | 单元测试框架 | test |
|
|
58
|
+
| Mockito | Mock 测试框架 | test |
|
|
59
|
+
| AssertJ | 流式断言库 | test |
|
|
60
|
+
|
|
61
|
+
这意味着你可以直接使用:
|
|
62
|
+
- `@Data`, `@Slf4j`, `@Builder` 等 Lombok 注解
|
|
63
|
+
- `StrUtil`, `CollUtil`, `DateUtil` 等 Hutool 工具类
|
|
64
|
+
- `JSON.parseObject()`, `JSON.toJSONString()` 等 Fastjson2 方法
|
|
65
|
+
- `StringUtils`, `ArrayUtils` 等 Commons 工具类
|
|
66
|
+
- `@Test`, `@Mock`, `assertThat()` 等测试注解和方法
|
|
67
|
+
|
|
68
|
+
### 方式二:通过 DependencyManagement 接入
|
|
69
|
+
|
|
70
|
+
适用于已有父 POM 的项目,或需要保持现有项目结构的场景。
|
|
71
|
+
|
|
72
|
+
```xml
|
|
73
|
+
<project>
|
|
74
|
+
<parent>
|
|
75
|
+
<!-- 保留你原有的 parent -->
|
|
76
|
+
<groupId>com.example</groupId>
|
|
77
|
+
<artifactId>your-parent</artifactId>
|
|
78
|
+
<version>1.0.0</version>
|
|
79
|
+
</parent>
|
|
80
|
+
|
|
81
|
+
<dependencyManagement>
|
|
82
|
+
<dependencies>
|
|
83
|
+
<!-- 导入 Avatar Boot 依赖管理 -->
|
|
84
|
+
<dependency>
|
|
85
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
86
|
+
<artifactId>avatar-boot-dependency</artifactId>
|
|
87
|
+
<version>1.0.0-SNAPSHOT</version>
|
|
88
|
+
<type>pom</type>
|
|
89
|
+
<scope>import</scope>
|
|
90
|
+
</dependency>
|
|
91
|
+
</dependencies>
|
|
92
|
+
</dependencyManagement>
|
|
93
|
+
|
|
94
|
+
<dependencies>
|
|
95
|
+
<!-- 引入 starter,无需指定版本 -->
|
|
96
|
+
<dependency>
|
|
97
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
98
|
+
<artifactId>avatar-boot-starter-web</artifactId>
|
|
99
|
+
</dependency>
|
|
100
|
+
<dependency>
|
|
101
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
102
|
+
<artifactId>avatar-boot-starter-redis</artifactId>
|
|
103
|
+
</dependency>
|
|
104
|
+
|
|
105
|
+
<!-- 需要手动添加公共依赖 -->
|
|
106
|
+
<dependency>
|
|
107
|
+
<groupId>org.projectlombok</groupId>
|
|
108
|
+
<artifactId>lombok</artifactId>
|
|
109
|
+
<optional>true</optional>
|
|
110
|
+
</dependency>
|
|
111
|
+
<dependency>
|
|
112
|
+
<groupId>cn.hutool</groupId>
|
|
113
|
+
<artifactId>hutool-all</artifactId>
|
|
114
|
+
</dependency>
|
|
115
|
+
<dependency>
|
|
116
|
+
<groupId>com.alibaba.fastjson2</groupId>
|
|
117
|
+
<artifactId>fastjson2</artifactId>
|
|
118
|
+
</dependency>
|
|
119
|
+
</dependencies>
|
|
120
|
+
</project>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## 可用的 Starter 模块
|
|
124
|
+
|
|
125
|
+
| Starter | 功能说明 |
|
|
126
|
+
|------------------------------|---------|
|
|
127
|
+
| avatar-boot-core | 核心工具类和基础功能 |
|
|
128
|
+
| avatar-boot-starter-web | Web 应用支持(含 Knife4j API 文档) |
|
|
129
|
+
| avatar-boot-starter-nacos | Nacos 服务发现和配置中心 |
|
|
130
|
+
| avatar-boot-starter-redis | Redis 集成(含 Redisson) |
|
|
131
|
+
| avatar-boot-starter-mysql | MySQL 数据库集成(含 MyBatis Plus) |
|
|
132
|
+
| avatar-boot-starter-kafka | Kafka 消息队列集成 |
|
|
133
|
+
| avatar-boot-starter-rocketmq | rocketmq 消息队列集成 |
|
|
134
|
+
| avatar-boot-starter-oss | 对象存储服务集成 |
|
|
135
|
+
| avatar-boot-starter-feign | Feign HTTP 客户端集成 |
|
|
136
|
+
| avatar-boot-ai | AI 相关功能集成 |
|
|
137
|
+
|
|
138
|
+
## 项目架构规范
|
|
139
|
+
|
|
140
|
+
### 目录结构原则
|
|
141
|
+
|
|
142
|
+
**核心原则:按功能垂直划分,各功能完全隔离**
|
|
143
|
+
|
|
144
|
+
项目采用 API + Service 双模块结构,每个功能模块在两个工程中都有对应的独立包结构:
|
|
145
|
+
|
|
146
|
+
```
|
|
147
|
+
avatar-scaffold-project/
|
|
148
|
+
├── avatar-scaffold-api/ # API 模块(接口定义)
|
|
149
|
+
│ └── src/main/java/com/iflytek/avatar/
|
|
150
|
+
│ ├── common/ # 公共模块(跨功能共享)
|
|
151
|
+
│ │ ├── constant/ # 系统级常量
|
|
152
|
+
│ │ │ └── ApiConstant.java
|
|
153
|
+
│ │ ├── enums/ # 公共枚举
|
|
154
|
+
│ │ │ └── ResultCodeEnum.java
|
|
155
|
+
│ │ ├── exception/ # 公共异常
|
|
156
|
+
│ │ │ ├── BusinessException.java
|
|
157
|
+
│ │ │ └── ErrorCode.java
|
|
158
|
+
│ │ └── dto/ # 公共DTO
|
|
159
|
+
│ │ ├── PageRequest.java # 分页请求基类
|
|
160
|
+
│ │ └── PageResponse.java # 分页响应基类
|
|
161
|
+
│ │
|
|
162
|
+
│ ├── login/ # 登录功能模块
|
|
163
|
+
│ │ ├── api/ # Feign接口定义
|
|
164
|
+
│ │ │ └── LoginFeignClient.java
|
|
165
|
+
│ │ ├── constant/ # 模块常量
|
|
166
|
+
│ │ │ └── LoginConstant.java
|
|
167
|
+
│ │ ├── enums/ # 模块枚举
|
|
168
|
+
│ │ │ └── LoginTypeEnum.java
|
|
169
|
+
│ │ ├── exception/ # 模块异常
|
|
170
|
+
│ │ │ └── LoginException.java
|
|
171
|
+
│ │ └── dto/ # **DTO目录(统一命名)**
|
|
172
|
+
│ │ ├── request/ # 请求DTO
|
|
173
|
+
│ │ │ ├── LoginRequest.java
|
|
174
|
+
│ │ │ └── RefreshTokenRequest.java
|
|
175
|
+
│ │ └── response/ # 响应DTO
|
|
176
|
+
│ │ ├── LoginResponse.java
|
|
177
|
+
│ │ └── TokenInfoResponse.java
|
|
178
|
+
│ │
|
|
179
|
+
│ └── user/ # 用户功能模块
|
|
180
|
+
│ ├── api/
|
|
181
|
+
│ │ └── UserFeignClient.java
|
|
182
|
+
│ ├── constant/
|
|
183
|
+
│ │ └── UserConstant.java
|
|
184
|
+
│ ├── enums/
|
|
185
|
+
│ │ └── UserStatusEnum.java
|
|
186
|
+
│ ├── exception/
|
|
187
|
+
│ │ └── UserException.java
|
|
188
|
+
│ └── dto/
|
|
189
|
+
│ ├── request/
|
|
190
|
+
│ │ ├── CreateUserRequest.java
|
|
191
|
+
│ │ ├── UpdateUserRequest.java
|
|
192
|
+
│ │ └── UserQueryRequest.java
|
|
193
|
+
│ └── response/
|
|
194
|
+
│ ├── UserDetailResponse.java
|
|
195
|
+
│ └── UserSimpleResponse.java
|
|
196
|
+
│
|
|
197
|
+
└── avatar-scaffold-service/ # Service 模块(业务实现)
|
|
198
|
+
└── src/main/java/com/iflytek/avatar/
|
|
199
|
+
├── common/ # 公共实现
|
|
200
|
+
│ ├── config/ # 全局配置
|
|
201
|
+
│ │ ├── MyBatisConfig.java
|
|
202
|
+
│ │ ├── RedisConfig.java
|
|
203
|
+
│ │ └── SwaggerConfig.java
|
|
204
|
+
│ ├── utils/ # 公共工具类
|
|
205
|
+
│ │ ├── JwtUtils.java
|
|
206
|
+
│ │ └── RedisUtils.java
|
|
207
|
+
│ └── interceptor/ # 全局拦截器
|
|
208
|
+
│ └── LoginInterceptor.java
|
|
209
|
+
│
|
|
210
|
+
├── login/ # 登录功能实现
|
|
211
|
+
│ ├── config/ # 模块配置
|
|
212
|
+
│ │ └── LoginConfig.java
|
|
213
|
+
│ ├── controller/ # REST控制器(实现API)
|
|
214
|
+
│ │ └── LoginController.java
|
|
215
|
+
│ ├── service/ # 业务逻辑层
|
|
216
|
+
│ │ ├── LoginService.java # 接口
|
|
217
|
+
│ │ └── impl/
|
|
218
|
+
│ │ └── LoginServiceImpl.java # 实现
|
|
219
|
+
│ ├── repository/ # **数据访问层(使用repository)**
|
|
220
|
+
│ │ ├── mapper/ # MyBatis Mapper接口
|
|
221
|
+
│ │ │ └── UserLoginMapper.java
|
|
222
|
+
│ │ └── entity/ # **数据库实体(统一用entity)**
|
|
223
|
+
│ │ ├── UserLoginEntity.java # 用户登录表实体
|
|
224
|
+
│ │ └── UserTokenEntity.java # 用户Token表实体
|
|
225
|
+
│ ├── converter/ # **对象转换器(DO <-> DTO)**
|
|
226
|
+
│ │ └── LoginConverter.java
|
|
227
|
+
│ └── utils/ # 模块工具类
|
|
228
|
+
│ └── LoginUtils.java
|
|
229
|
+
│
|
|
230
|
+
└── user/ # 用户功能实现
|
|
231
|
+
├── controller/
|
|
232
|
+
│ └── UserController.java
|
|
233
|
+
├── service/
|
|
234
|
+
│ ├── UserService.java
|
|
235
|
+
│ └── impl/
|
|
236
|
+
│ └── UserServiceImpl.java
|
|
237
|
+
├── repository/
|
|
238
|
+
│ ├── mapper/
|
|
239
|
+
│ │ └── UserMapper.java
|
|
240
|
+
│ └── entity/
|
|
241
|
+
│ ├── UserEntity.java # 用户主表实体
|
|
242
|
+
│ └── UserProfileEntity.java # 用户档案表实体
|
|
243
|
+
├── converter/
|
|
244
|
+
│ └── UserConverter.java
|
|
245
|
+
└── validator/ # **参数校验器**
|
|
246
|
+
└── UserValidator.java
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### 架构规则
|
|
250
|
+
|
|
251
|
+
1. **功能隔离**:每个业务功能(如 login、user)都有独立的包结构,功能之间完全隔离
|
|
252
|
+
2. **垂直划分**:功能包内包含该功能的所有层次(controller、service、dao、entity),避免水平分层
|
|
253
|
+
3. **API 分离**:API 模块只包含接口定义和数据传输对象(DTO),不包含业务逻辑
|
|
254
|
+
4. **Service 实现**:Service 模块包含具体的业务逻辑实现,实现 API 模块定义的接口
|
|
255
|
+
5. **统一返回格式**:所有 API 接口必须使用 `avatar-boot-core` 包中的 `Result<T>` 类作为返回类型,确保响应格式统一
|
|
256
|
+
|
|
257
|
+
### 包结构说明
|
|
258
|
+
|
|
259
|
+
**API 模块包结构**(avatar-scaffold-api):
|
|
260
|
+
- `api/` - 接口定义(供外部调用的 REST API 接口)
|
|
261
|
+
- `constant/` - 常量定义(业务常量、配置常量)
|
|
262
|
+
- `enums/` - 枚举定义(业务枚举类型)
|
|
263
|
+
- `exception/` - 异常定义(业务异常类)
|
|
264
|
+
- `entity/request/` - 请求参数实体(DTO,用于接收客户端请求)
|
|
265
|
+
- `entity/response/` - 响应结果实体(DTO,必须使用 `Result<T>` 包装)
|
|
266
|
+
- `feign/` - Feign 客户端(用于服务间调用,基于 `avatar-boot-starter-feign`)
|
|
267
|
+
|
|
268
|
+
**Service 模块包结构**(avatar-scaffold-service):
|
|
269
|
+
- `config/` - 配置类(Spring 配置、Bean 定义)
|
|
270
|
+
- `controller/` - REST 控制器(实现 API 接口,所有方法返回 `Result<T>`)
|
|
271
|
+
- `service/` - 业务逻辑层(Service 接口和实现类)
|
|
272
|
+
- `dao/` - 数据访问层(MyBatis Mapper 接口)
|
|
273
|
+
- `dao/beans/` - 数据库实体类(DO/PO,对应数据库表结构)
|
|
274
|
+
- `utils/` - 工具类(功能模块内部使用的工具方法)
|
|
275
|
+
|
|
276
|
+
**Result 类使用规范**:
|
|
277
|
+
- 所有 Controller 方法必须返回 `com.iflytek.avatar.boot.entity.response.Result<T>` 类型
|
|
278
|
+
- 成功响应:`Result.success(data)` 或 `Result.success()`
|
|
279
|
+
- 失败响应:`Result.fail(errorCode, errorMessage)` 或 `Result.fail(errorMessage)`
|
|
280
|
+
- Response DTO 作为泛型参数:`Result<UserResponse>`
|
|
281
|
+
- 统一的响应格式确保前后端接口规范一致
|
|
282
|
+
|
|
283
|
+
### 新增功能开发流程
|
|
284
|
+
|
|
285
|
+
当需要添加新功能时,按照以下步骤进行:
|
|
286
|
+
|
|
287
|
+
1. **在 API 模块创建功能包**:`com.iflytek.avatar.{功能名}`
|
|
288
|
+
- 创建 `api/` 目录,定义接口
|
|
289
|
+
- 创建 `entity/request/` 和 `entity/response/` 目录,定义 DTO
|
|
290
|
+
- 创建 `feign/` 目录,定义 Feign 客户端
|
|
291
|
+
- 创建 `constant/` 目录,定义常量
|
|
292
|
+
- 创建 `enums/` 目录,定义枚举
|
|
293
|
+
- 创建 `exception/` 目录,定义错误定义
|
|
294
|
+
- 创建 `utils/` 目录,定义工具类
|
|
295
|
+
|
|
296
|
+
2. **在 Service 模块创建功能包**:`com.iflytek.avatar.{功能名}`
|
|
297
|
+
- 创建 `controller/` 目录,实现 REST 接口
|
|
298
|
+
- 创建 `service/` 目录,实现业务逻辑
|
|
299
|
+
- 创建 `dao/` 目录,实现数据访问
|
|
300
|
+
- 创建 `config/` 目录,定义配置类
|
|
301
|
+
- 创建 `utils/` 目录,定义数据库实体
|
|
302
|
+
|
|
303
|
+
3. **保持功能独立**:不同功能之间通过 Feign 客户端或消息队列进行通信,避免直接依赖
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<project xmlns="http://maven.apache.org/POM/4.0.0"
|
|
3
|
+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
|
4
|
+
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
|
|
5
|
+
<modelVersion>4.0.0</modelVersion>
|
|
6
|
+
<parent>
|
|
7
|
+
<groupId>com.iflytek.avatar</groupId>
|
|
8
|
+
<artifactId>avatar-template</artifactId>
|
|
9
|
+
<version>1.0.0-SNAPSHOT</version>
|
|
10
|
+
<relativePath>../pom.xml</relativePath>
|
|
11
|
+
</parent>
|
|
12
|
+
|
|
13
|
+
<artifactId>avatar-template-api</artifactId>
|
|
14
|
+
|
|
15
|
+
<properties>
|
|
16
|
+
<maven.compiler.source>21</maven.compiler.source>
|
|
17
|
+
<maven.compiler.target>21</maven.compiler.target>
|
|
18
|
+
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
|
|
19
|
+
</properties>
|
|
20
|
+
|
|
21
|
+
<dependencies>
|
|
22
|
+
<dependency>
|
|
23
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
24
|
+
<artifactId>avatar-boot-core</artifactId>
|
|
25
|
+
</dependency>
|
|
26
|
+
<dependency>
|
|
27
|
+
<groupId>com.iflytek.avatar.boot</groupId>
|
|
28
|
+
<artifactId>avatar-boot-starter-feign</artifactId>
|
|
29
|
+
</dependency>
|
|
30
|
+
<dependency>
|
|
31
|
+
<groupId>jakarta.validation</groupId>
|
|
32
|
+
<artifactId>jakarta.validation-api</artifactId>
|
|
33
|
+
</dependency>
|
|
34
|
+
<dependency>
|
|
35
|
+
<groupId>org.projectlombok</groupId>
|
|
36
|
+
<artifactId>lombok</artifactId>
|
|
37
|
+
<optional>true</optional>
|
|
38
|
+
</dependency>
|
|
39
|
+
</dependencies>
|
|
40
|
+
|
|
41
|
+
</project>
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.api;
|
|
2
|
+
|
|
3
|
+
import com.iflytek.avatar.boot.entity.response.Result;
|
|
4
|
+
import com.iflytek.avatar.login.dto.request.LoginRequest;
|
|
5
|
+
import com.iflytek.avatar.login.dto.request.RefreshTokenRequest;
|
|
6
|
+
import com.iflytek.avatar.login.dto.response.LoginResponse;
|
|
7
|
+
import com.iflytek.avatar.login.dto.response.TokenInfoResponse;
|
|
8
|
+
import org.springframework.cloud.openfeign.FeignClient;
|
|
9
|
+
import org.springframework.web.bind.annotation.PostMapping;
|
|
10
|
+
import org.springframework.web.bind.annotation.RequestBody;
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 登录服务 Feign 客户端。
|
|
14
|
+
* 供其他微服务通过 Feign 调用登录相关接口。
|
|
15
|
+
*/
|
|
16
|
+
@FeignClient(
|
|
17
|
+
name = "avatar-scaffold-service",
|
|
18
|
+
path = "/api/login",
|
|
19
|
+
configuration = com.iflytek.avatar.boot.config.FeignLoggingConfiguration.class
|
|
20
|
+
)
|
|
21
|
+
public interface LoginFeignClient {
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* 用户登录
|
|
25
|
+
*
|
|
26
|
+
* @param request 登录请求(用户名、密码等)
|
|
27
|
+
* @return 登录结果,包含 token 与用户信息
|
|
28
|
+
*/
|
|
29
|
+
@PostMapping("/login")
|
|
30
|
+
Result<LoginResponse> login(@RequestBody LoginRequest request);
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 刷新 Token
|
|
34
|
+
*
|
|
35
|
+
* @param request 刷新请求(refreshToken)
|
|
36
|
+
* @return 新的 Token 信息
|
|
37
|
+
*/
|
|
38
|
+
@PostMapping("/refresh")
|
|
39
|
+
Result<TokenInfoResponse> refreshToken(@RequestBody RefreshTokenRequest request);
|
|
40
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.constant;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 登录模块常量
|
|
5
|
+
*/
|
|
6
|
+
public final class LoginConstant {
|
|
7
|
+
|
|
8
|
+
private LoginConstant() {}
|
|
9
|
+
|
|
10
|
+
/** 默认 Token 过期时间(秒) */
|
|
11
|
+
public static final int DEFAULT_TOKEN_EXPIRE_SECONDS = 7200;
|
|
12
|
+
|
|
13
|
+
/** 刷新 Token 过期时间(秒) */
|
|
14
|
+
public static final int REFRESH_TOKEN_EXPIRE_SECONDS = 604800;
|
|
15
|
+
|
|
16
|
+
/** 请求头:Authorization */
|
|
17
|
+
public static final String HEADER_AUTHORIZATION = "Authorization";
|
|
18
|
+
|
|
19
|
+
/** Bearer 前缀 */
|
|
20
|
+
public static final String BEARER_PREFIX = "Bearer ";
|
|
21
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.dto.request;
|
|
2
|
+
|
|
3
|
+
import jakarta.validation.constraints.NotBlank;
|
|
4
|
+
import lombok.Data;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 登录请求 DTO
|
|
8
|
+
*/
|
|
9
|
+
@Data
|
|
10
|
+
public class LoginRequest {
|
|
11
|
+
|
|
12
|
+
@NotBlank(message = "用户名不能为空")
|
|
13
|
+
private String username;
|
|
14
|
+
|
|
15
|
+
@NotBlank(message = "密码不能为空")
|
|
16
|
+
private String password;
|
|
17
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.dto.request;
|
|
2
|
+
|
|
3
|
+
import jakarta.validation.constraints.NotBlank;
|
|
4
|
+
import lombok.Data;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 刷新 Token 请求 DTO
|
|
8
|
+
*/
|
|
9
|
+
@Data
|
|
10
|
+
public class RefreshTokenRequest {
|
|
11
|
+
|
|
12
|
+
@NotBlank(message = "refreshToken 不能为空")
|
|
13
|
+
private String refreshToken;
|
|
14
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.dto.response;
|
|
2
|
+
|
|
3
|
+
import lombok.AllArgsConstructor;
|
|
4
|
+
import lombok.Builder;
|
|
5
|
+
import lombok.Data;
|
|
6
|
+
import lombok.NoArgsConstructor;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* 登录响应 DTO
|
|
10
|
+
*/
|
|
11
|
+
@Data
|
|
12
|
+
@Builder
|
|
13
|
+
@NoArgsConstructor
|
|
14
|
+
@AllArgsConstructor
|
|
15
|
+
public class LoginResponse {
|
|
16
|
+
|
|
17
|
+
/** 访问令牌 */
|
|
18
|
+
private String token;
|
|
19
|
+
|
|
20
|
+
/** 刷新令牌 */
|
|
21
|
+
private String refreshToken;
|
|
22
|
+
|
|
23
|
+
/** 用户 ID */
|
|
24
|
+
private Long userId;
|
|
25
|
+
|
|
26
|
+
/** 用户名 */
|
|
27
|
+
private String username;
|
|
28
|
+
|
|
29
|
+
/** 过期时间戳(毫秒) */
|
|
30
|
+
private Long expireTime;
|
|
31
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.dto.response;
|
|
2
|
+
|
|
3
|
+
import lombok.AllArgsConstructor;
|
|
4
|
+
import lombok.Builder;
|
|
5
|
+
import lombok.Data;
|
|
6
|
+
import lombok.NoArgsConstructor;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* Token 信息响应 DTO(用于刷新 Token 等场景)
|
|
10
|
+
*/
|
|
11
|
+
@Data
|
|
12
|
+
@Builder
|
|
13
|
+
@NoArgsConstructor
|
|
14
|
+
@AllArgsConstructor
|
|
15
|
+
public class TokenInfoResponse {
|
|
16
|
+
|
|
17
|
+
/** 新的访问令牌 */
|
|
18
|
+
private String token;
|
|
19
|
+
|
|
20
|
+
/** 新的刷新令牌 */
|
|
21
|
+
private String refreshToken;
|
|
22
|
+
|
|
23
|
+
/** 过期时间戳(毫秒) */
|
|
24
|
+
private Long expireTime;
|
|
25
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.enums;
|
|
2
|
+
|
|
3
|
+
import lombok.Getter;
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* 登录方式枚举
|
|
7
|
+
*/
|
|
8
|
+
@Getter
|
|
9
|
+
public enum LoginTypeEnum {
|
|
10
|
+
|
|
11
|
+
PASSWORD(1, "密码登录"),
|
|
12
|
+
SMS(2, "短信验证码登录"),
|
|
13
|
+
WECHAT(3, "微信登录"),
|
|
14
|
+
;
|
|
15
|
+
|
|
16
|
+
private final int code;
|
|
17
|
+
private final String desc;
|
|
18
|
+
|
|
19
|
+
LoginTypeEnum(int code, String desc) {
|
|
20
|
+
this.code = code;
|
|
21
|
+
this.desc = desc;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
package com.iflytek.avatar.login.exception;
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* 登录模块业务异常
|
|
5
|
+
*/
|
|
6
|
+
public class LoginException extends RuntimeException {
|
|
7
|
+
|
|
8
|
+
private final int code;
|
|
9
|
+
|
|
10
|
+
public LoginException(String message) {
|
|
11
|
+
super(message);
|
|
12
|
+
this.code = 400;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
public LoginException(int code, String message) {
|
|
16
|
+
super(message);
|
|
17
|
+
this.code = code;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public int getCode() {
|
|
21
|
+
return code;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
FROM artifacts.iflytek.com/cbg-docker-private/yspt/open-jdk:21
|
|
2
|
+
|
|
3
|
+
ARG BUILD_ENV
|
|
4
|
+
ARG APP_NAME
|
|
5
|
+
|
|
6
|
+
# 设置默认环境变量
|
|
7
|
+
ENV JAVA_OPTS="-Xms512m -Xmx512m" \
|
|
8
|
+
SPRING_PROFILES_ACTIVE=${BUILD_ENV} \
|
|
9
|
+
TZ="Asia/Shanghai"
|
|
10
|
+
ADD ${APP_NAME}/target/${APP_NAME}*.tar.gz /data/server/
|
|
11
|
+
WORKDIR /data/server/${APP_NAME}
|
|
12
|
+
RUN chmod +x ./bin/startup.sh
|
|
13
|
+
|
|
14
|
+
ENTRYPOINT ["sh", "-c", "./bin/startup.sh --spring.profiles.active=${SPRING_PROFILES_ACTIVE}"]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
FROM artifacts.iflytek.com/cbg-docker-private/yspt/openjdk:21-linuxarm64
|
|
2
|
+
|
|
3
|
+
ARG BUILD_ENV
|
|
4
|
+
ARG APP_NAME
|
|
5
|
+
|
|
6
|
+
# 设置默认环境变量
|
|
7
|
+
ENV JAVA_OPTS="-Xms512m -Xmx512m" \
|
|
8
|
+
SPRING_PROFILES_ACTIVE=${BUILD_ENV} \
|
|
9
|
+
TZ="Asia/Shanghai"
|
|
10
|
+
ADD ${APP_NAME}/target/${APP_NAME}*.tar.gz /data/server/
|
|
11
|
+
WORKDIR /data/server/${APP_NAME}
|
|
12
|
+
RUN chmod +x ./bin/startup.sh
|
|
13
|
+
|
|
14
|
+
ENTRYPOINT ["sh", "-c", "./bin/startup.sh --spring.profiles.active=${SPRING_PROFILES_ACTIVE}"]
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
|
2
|
+
<assembly>
|
|
3
|
+
<id>releases</id>
|
|
4
|
+
<baseDirectory>avatar-template-service</baseDirectory>
|
|
5
|
+
<formats>
|
|
6
|
+
<format>zip</format>
|
|
7
|
+
<format>tar.gz</format>
|
|
8
|
+
</formats>
|
|
9
|
+
<includeBaseDirectory>true</includeBaseDirectory>
|
|
10
|
+
<fileSets>
|
|
11
|
+
<fileSet>
|
|
12
|
+
<directory>target/appassembler</directory>
|
|
13
|
+
<outputDirectory>./</outputDirectory>
|
|
14
|
+
</fileSet>
|
|
15
|
+
</fileSets>
|
|
16
|
+
</assembly>
|