Skip to content

Commit 571e841

Browse files
committed
新增功能 - 用户可以选择方向来生成关卡
1 parent e0f8026 commit 571e841

File tree

16 files changed

+274
-18
lines changed

16 files changed

+274
-18
lines changed

coder-test-frontend/src/views/Admin.vue

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,27 @@
3939
<el-option label="困难" value="困难" />
4040
</el-select>
4141
</el-col>
42+
<el-col :span="6">
43+
<el-select
44+
v-model="queryParams.direction"
45+
placeholder="学习方向"
46+
clearable
47+
@change="handleSearch"
48+
>
49+
<el-option label="全栈开发" value="全栈开发" />
50+
<el-option label="前端开发" value="前端开发" />
51+
<el-option label="Java后端开发" value="Java后端开发" />
52+
<el-option label="Python后端开发" value="Python后端开发" />
53+
<el-option label="软件测试" value="软件测试" />
54+
<el-option label="AI算法" value="AI算法" />
55+
<el-option label="网络运维" value="网络运维" />
56+
<el-option label="数据分析" value="数据分析" />
57+
<el-option label="移动端开发" value="移动端开发" />
58+
<el-option label="DevOps运维" value="DevOps运维" />
59+
<el-option label="网络安全" value="网络安全" />
60+
<el-option label="游戏开发" value="游戏开发" />
61+
</el-select>
62+
</el-col>
4263
<el-col :span="6">
4364
<el-select
4465
v-model="queryParams.priority"
@@ -102,6 +123,13 @@
102123
</div>
103124
</template>
104125
</el-table-column>
126+
<el-table-column prop="direction" label="学习方向" width="120">
127+
<template #default="{ row }">
128+
<el-tag type="primary" size="small">
129+
{{ row.direction || '全栈开发' }}
130+
</el-tag>
131+
</template>
132+
</el-table-column>
105133
<el-table-column prop="difficulty" label="难度" width="100">
106134
<template #default="{ row }">
107135
<el-tag
@@ -214,6 +242,22 @@
214242
placeholder="请输入JSON格式的关卡选项"
215243
/>
216244
</el-form-item>
245+
<el-form-item label="学习方向" prop="direction">
246+
<el-select v-model="levelForm.direction" placeholder="请选择学习方向">
247+
<el-option label="全栈开发" value="全栈开发" />
248+
<el-option label="前端开发" value="前端开发" />
249+
<el-option label="Java后端开发" value="Java后端开发" />
250+
<el-option label="Python后端开发" value="Python后端开发" />
251+
<el-option label="软件测试" value="软件测试" />
252+
<el-option label="AI算法" value="AI算法" />
253+
<el-option label="网络运维" value="网络运维" />
254+
<el-option label="数据分析" value="数据分析" />
255+
<el-option label="移动端开发" value="移动端开发" />
256+
<el-option label="DevOps运维" value="DevOps运维" />
257+
<el-option label="网络安全" value="网络安全" />
258+
<el-option label="游戏开发" value="游戏开发" />
259+
</el-select>
260+
</el-form-item>
217261
<el-form-item label="难度等级" prop="difficulty">
218262
<el-select v-model="levelForm.difficulty" placeholder="请选择难度等级">
219263
<el-option label="简单" value="简单" />
@@ -286,6 +330,7 @@ const levelFormRef = ref()
286330
const queryParams = reactive({
287331
levelName: '',
288332
difficulty: '',
333+
direction: '',
289334
priority: null,
290335
current: 1,
291336
pageSize: 10
@@ -299,6 +344,7 @@ const levelForm = reactive({
299344
options: '',
300345
difficulty: '',
301346
targetSalary: 10000,
347+
direction: '全栈开发',
302348
priority: 0
303349
})
304350
@@ -381,6 +427,7 @@ const handleSearch = async () => {
381427
const handleReset = () => {
382428
queryParams.levelName = ''
383429
queryParams.difficulty = ''
430+
queryParams.direction = ''
384431
queryParams.priority = null
385432
queryParams.current = 1
386433
handleSearch()
@@ -536,6 +583,7 @@ const resetForm = () => {
536583
options: '',
537584
difficulty: '',
538585
targetSalary: 10000,
586+
direction: '全栈开发',
539587
priority: 0
540588
})
541589
if (levelFormRef.value) {

coder-test-frontend/src/views/Challenge.vue

Lines changed: 73 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,35 @@
99
<el-card class="generate-card">
1010
<div class="generate-content">
1111
<h2>准备开始新的挑战</h2>
12-
<p>系统将根据你当前的薪资水平生成适合的技术关卡</p>
12+
<p>选择你的学习方向,系统将根据你当前的薪资水平生成适合的技术关卡</p>
13+
14+
<!-- 学习方向选择 -->
15+
<div class="direction-selector">
16+
<h3>选择学习方向</h3>
17+
<el-select
18+
v-model="selectedDirection"
19+
placeholder="请选择学习方向"
20+
size="large"
21+
style="width: 300px; margin-bottom: 20px;"
22+
>
23+
<el-option
24+
v-for="direction in directionOptions"
25+
:key="direction.value"
26+
:label="direction.label"
27+
:value="direction.value"
28+
>
29+
<span style="float: left">{{ direction.label }}</span>
30+
<span style="float: right; color: var(--text-muted); font-size: 13px">
31+
{{ direction.desc }}
32+
</span>
33+
</el-option>
34+
</el-select>
35+
</div>
36+
1337
<el-button
1438
type="primary"
1539
size="large"
16-
:disabled="generating"
40+
:disabled="generating || !selectedDirection"
1741
@click="generateLevel"
1842
>
1943
<el-icon><MagicStick /></el-icon>
@@ -66,6 +90,13 @@
6690
<div class="featured-header">
6791
<h4 class="featured-title">{{ level.levelName }}</h4>
6892
<div class="featured-tags">
93+
<el-tag
94+
v-if="level.direction"
95+
type="primary"
96+
size="small"
97+
>
98+
{{ level.direction }}
99+
</el-tag>
69100
<el-tag
70101
v-if="level.priority >= 9999"
71102
type="danger"
@@ -127,6 +158,13 @@
127158
<div class="level-header">
128159
<h2 class="level-name">{{ currentLevel.levelName }}</h2>
129160
<div class="level-meta">
161+
<el-tag
162+
v-if="currentLevel.direction"
163+
type="primary"
164+
size="large"
165+
>
166+
{{ currentLevel.direction }}
167+
</el-tag>
130168
<el-tag :type="getDifficultyType(currentLevel.difficulty)">
131169
{{ currentLevel.difficulty }}
132170
</el-tag>
@@ -273,6 +311,23 @@ const featuredCurrent = ref(1)
273311
const featuredPageSize = ref(6)
274312
const featuredTotal = ref(0)
275313
314+
// 学习方向相关数据
315+
const selectedDirection = ref('')
316+
const directionOptions = [
317+
{ value: '全栈开发', label: '全栈开发', desc: '前后端通吃' },
318+
{ value: '前端开发', label: '前端开发', desc: 'Web界面开发' },
319+
{ value: 'Java后端开发', label: 'Java后端开发', desc: '企业级后端' },
320+
{ value: 'Python后端开发', label: 'Python后端开发', desc: '快速开发' },
321+
{ value: '软件测试', label: '软件测试', desc: '质量保障' },
322+
{ value: 'AI算法', label: 'AI算法', desc: '人工智能' },
323+
{ value: '网络运维', label: '网络运维', desc: '系统运维' },
324+
{ value: '数据分析', label: '数据分析', desc: '数据洞察' },
325+
{ value: '移动端开发', label: '移动端开发', desc: 'App开发' },
326+
{ value: 'DevOps运维', label: 'DevOps运维', desc: '自动化运维' },
327+
{ value: '网络安全', label: '网络安全', desc: '安全防护' },
328+
{ value: '游戏开发', label: '游戏开发', desc: '游戏制作' }
329+
]
330+
276331
// 进度条相关
277332
const generateProgress = ref(0)
278333
const submitProgress = ref(0)
@@ -409,7 +464,11 @@ const generateLevel = async () => {
409464
generateProgressInterval = simulateProgress(generateProgress, 'generate')
410465
411466
try {
412-
const levelData = await generateLevelAPI({ salary: userSalary })
467+
const requestData = {
468+
salary: userSalary,
469+
direction: selectedDirection.value
470+
}
471+
const levelData = await generateLevelAPI(requestData)
413472
currentLevel.value = levelData
414473
selectedOptions.value = []
415474
@@ -815,6 +874,17 @@ onUnmounted(() => {
815874
font-size: 16px;
816875
}
817876
877+
.direction-selector {
878+
margin-bottom: 30px;
879+
}
880+
881+
.direction-selector h3 {
882+
margin-bottom: 15px;
883+
color: var(--text-primary);
884+
font-size: 18px;
885+
font-weight: 600;
886+
}
887+
818888
.level-section {
819889
display: flex;
820890
flex-direction: column;

database/add_direction_column.sql

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
-- 给关卡表添加学习方向字段的迁移脚本
2+
-- 执行时间:2025-09-16
3+
4+
USE `coder-test`;
5+
6+
-- 添加学习方向字段
7+
ALTER TABLE `level` ADD COLUMN `direction` VARCHAR(100) DEFAULT '全栈开发' COMMENT '学习方向(前端开发、Java后端开发、软件测试等)' AFTER `targetSalary`;
8+
9+
-- 添加索引
10+
ALTER TABLE `level` ADD INDEX `idx_direction` (`direction`);
11+
12+
-- 验证字段是否添加成功
13+
DESC `level`;

database/create_tables.sql

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,13 +36,15 @@ CREATE TABLE `level`
3636
`options` TEXT NOT NULL COMMENT '关卡选项(JSON格式存储)',
3737
`difficulty` VARCHAR(200) NOT NULL COMMENT '难度等级(简单,中等,困难)',
3838
`targetSalary` INT DEFAULT 10000 COMMENT '目标薪资范围(用于难度匹配)',
39+
`direction` VARCHAR(100) DEFAULT '全栈开发' COMMENT '学习方向(前端开发、Java后端开发、软件测试等)',
3940
`priority` INT DEFAULT 0 COMMENT '关卡优先级(0-普通,99-推荐,999-精选,9999-置顶)',
4041
`createTime` DATETIME DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
4142
`updateTime` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
4243
`isDelete` TINYINT DEFAULT 0 COMMENT '逻辑删除(0-未删除,1-已删除)',
4344
PRIMARY KEY (`id`),
4445
KEY `idx_difficulty` (`difficulty`),
4546
KEY `idx_targetSalary` (`targetSalary`),
47+
KEY `idx_direction` (`direction`),
4648
KEY `idx_priority` (`priority`),
4749
KEY `idx_createTime` (`createTime`)
4850
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='关卡表';

src/main/java/com/yupi/codertestbackend/controller/AdminController.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ public BaseResponse<Page<Level>> listLevels(@RequestBody LevelQueryRequest query
6060
if (queryRequest.getPriority() != null) {
6161
queryWrapper.eq("priority", queryRequest.getPriority());
6262
}
63+
if (StrUtil.isNotBlank(queryRequest.getDirection())) {
64+
queryWrapper.eq("direction", queryRequest.getDirection());
65+
}
6366

6467
// 按优先级和创建时间排序
6568
queryWrapper.orderByDesc("priority", "createTime");

src/main/java/com/yupi/codertestbackend/controller/LevelController.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,12 @@ public BaseResponse<Level> generateLevel(@RequestBody GenerateLevelRequest gener
5353
salary = user.getSalary();
5454
}
5555

56-
Level level = levelService.generateLevel(salary);
56+
// 获取学习方向
57+
String direction = generateLevelRequest.getDirection();
58+
59+
// 生成关卡(如果没有指定方向,服务层会设置默认值)
60+
Level level = levelService.generateLevel(salary, direction);
61+
5762
return ResultUtils.success(level);
5863
} catch (Exception e) {
5964
log.error("生成关卡失败", e);

src/main/java/com/yupi/codertestbackend/model/dto/level/GenerateLevelRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,5 +16,10 @@ public class GenerateLevelRequest implements Serializable {
1616
* 当前薪资(用于匹配难度)
1717
*/
1818
private Integer salary;
19+
20+
/**
21+
* 学习方向
22+
*/
23+
private String direction;
1924
}
2025

src/main/java/com/yupi/codertestbackend/model/dto/level/LevelAddRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,11 @@ public class LevelAddRequest implements Serializable {
3535
*/
3636
private Integer targetSalary;
3737

38+
/**
39+
* 学习方向
40+
*/
41+
private String direction;
42+
3843
/**
3944
* 关卡优先级(0-普通,99-推荐,999-精选,9999-置顶)
4045
*/

src/main/java/com/yupi/codertestbackend/model/dto/level/LevelQueryRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@ public class LevelQueryRequest implements Serializable {
2525
*/
2626
private Integer priority;
2727

28+
/**
29+
* 学习方向
30+
*/
31+
private String direction;
32+
2833
/**
2934
* 当前页码
3035
*/

src/main/java/com/yupi/codertestbackend/model/dto/level/LevelUpdateRequest.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,11 @@ public class LevelUpdateRequest implements Serializable {
4040
*/
4141
private Integer targetSalary;
4242

43+
/**
44+
* 学习方向
45+
*/
46+
private String direction;
47+
4348
/**
4449
* 关卡优先级(0-普通,99-推荐,999-精选,9999-置顶)
4550
*/

0 commit comments

Comments
 (0)