From 8707aa8509239631e776cf9e0c2caf713759b9a8 Mon Sep 17 00:00:00 2001 From: buliping Date: Thu, 24 Sep 2026 10:42:50 +0800 Subject: [PATCH 01/16] =?UTF-8?q?=E4=B8=AA=E4=BA=BA=E4=B8=AD=E5=BF=83?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=AF=86=E7=A0=81=E6=8A=A5=E9=94=99=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_ui/src/api/system/user.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build_ui/src/api/system/user.js b/build_ui/src/api/system/user.js index f2f76ef9f..7a3d5e763 100644 --- a/build_ui/src/api/system/user.js +++ b/build_ui/src/api/system/user.js @@ -96,7 +96,7 @@ export function updateUserPwd(oldPassword, newPassword) { return request({ url: '/system/user/profile/updatePwd', method: 'put', - params: data + data: data }) } From 8ad3fbbc6e3916855128cbac2d6ea4e787f8b9b7 Mon Sep 17 00:00:00 2001 From: buliping Date: Mon, 28 Sep 2026 08:45:56 +0800 Subject: [PATCH 02/16] =?UTF-8?q?=E6=95=99=E5=B8=88=E3=80=81=E5=AD=A6?= =?UTF-8?q?=E5=91=98=E7=BC=96=E8=BE=91=E6=97=B6=EF=BC=8C=E6=89=80=E5=B1=9E?= =?UTF-8?q?=E5=8D=95=E4=BD=8D=E6=94=B9=E6=88=90=E4=BB=8E=E9=83=A8=E9=97=A8?= =?UTF-8?q?=E6=A0=91=E4=B8=AD=E9=80=89=E6=8B=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_ui/src/views/train/student/index.vue | 73 +++++++++++++++++++++- build_ui/src/views/train/teacher/index.vue | 69 +++++++++++++++++++- 2 files changed, 137 insertions(+), 5 deletions(-) diff --git a/build_ui/src/views/train/student/index.vue b/build_ui/src/views/train/student/index.vue index 588650506..1f2fcdc7d 100644 --- a/build_ui/src/views/train/student/index.vue +++ b/build_ui/src/views/train/student/index.vue @@ -71,6 +71,7 @@ + @@ -165,7 +166,8 @@ /> - + + @@ -276,9 +278,13 @@ - From 2c14bf2b4111b9685b5c01fda7208ccb186e7454 Mon Sep 17 00:00:00 2001 From: buliping Date: Tue, 29 Sep 2026 10:13:47 +0800 Subject: [PATCH 09/16] =?UTF-8?q?=E5=AD=A6=E5=91=98=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=B2=97=E4=BD=8D=E7=BA=A7=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../train/TrainStudentController.java | 1 - .../train/domain/dto/StudentUpdateDTO.java | 36 +++ .../service/impl/TrainStudentServiceImpl.java | 1 + build_ui/src/views/train/student/index.vue | 51 +++- .../src/views/train/student/studentAvatar.vue | 233 ++++++++++++++++++ 5 files changed, 319 insertions(+), 3 deletions(-) create mode 100644 RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/StudentUpdateDTO.java create mode 100644 build_ui/src/views/train/student/studentAvatar.vue diff --git a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentController.java b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentController.java index 2a2ae102a..8996242dd 100644 --- a/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentController.java +++ b/RuoYi-Vue/ruoyi-admin/src/main/java/com/ruoyi/web/controller/train/TrainStudentController.java @@ -5,7 +5,6 @@ import java.util.regex.Pattern; import javax.validation.Valid; import com.ruoyi.common.utils.StringUtils; -import com.ruoyi.train.domain.TrainTeacher; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.web.bind.annotation.*; import com.github.pagehelper.PageInfo; diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/StudentUpdateDTO.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/StudentUpdateDTO.java new file mode 100644 index 000000000..b0bfb97ca --- /dev/null +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/domain/dto/StudentUpdateDTO.java @@ -0,0 +1,36 @@ +package com.ruoyi.train.domain.dto; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Size; + +/** + * 学员手工修改请求。 + * + *

复用 {@link StudentCreateDTO} 的可编辑字段与校验规则,额外要求携带学员主键 sId。 + * 身份证号沿用「只写不读」策略:未提交时保留库内既有密文,不做清空。

+ */ +public class StudentUpdateDTO extends StudentCreateDTO +{ + private static final long serialVersionUID = 1L; + + @NotBlank(message = "学员ID不能为空") + @Size(max = 64, message = "学员ID长度不能超过64个字符") + private String sId; + + public String getsId() + { + return sId; + } + + public void setsId(String sId) + { + this.sId = sId; + } + + @Override + public String toString() + { + return "StudentUpdateDTO{sId='" + sId + "', sName='" + getsName() + + "', idCardProvided=" + (getIdCard() != null) + "}"; + } +} diff --git a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentServiceImpl.java b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentServiceImpl.java index eed2c9ccf..b7f6bb278 100644 --- a/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentServiceImpl.java +++ b/RuoYi-Vue/ruoyi-train/src/main/java/com/ruoyi/train/service/impl/TrainStudentServiceImpl.java @@ -101,6 +101,7 @@ public class TrainStudentServiceImpl implements ITrainStudentService student.setsPhone(trimToNull(dto.getsPhone())); student.setsEmail(trimToNull(dto.getsEmail())); student.setAvatar(trimToNull(dto.getAvatar())); + student.setDutyLevel(dto.getDutyLevel()); if (normalizedIdCard != null) { diff --git a/build_ui/src/views/train/student/index.vue b/build_ui/src/views/train/student/index.vue index 0621cbe3a..f595a51e7 100644 --- a/build_ui/src/views/train/student/index.vue +++ b/build_ui/src/views/train/student/index.vue @@ -175,10 +175,18 @@
- + + + + --> + + + + + @@ -240,6 +258,10 @@ 未关联 {{ detail.orgName || '-' }} + + + - + {{ detail.sPhone || '-' }} {{ detail.sEmail || '-' }} {{ detail.idCardMasked || '-' }} @@ -322,6 +344,8 @@ import {addTeacher, updateTeacher} from "@/api/train/teacher"; export default { name: 'Student', components: { studentAvatar, Treeselect }, + // 岗位级别字典(train_duty_level),注入后可通过 dict.type.train_duty_level 访问 + dicts: ['train_duty_level', 'sys_user_sex'], data() { const validateIdCard = (rule, value, callback) => { if (!value || value.trim() === '') { @@ -382,6 +406,20 @@ export default { } } }, + computed: { + /* + * 岗位级别下拉选项:取自字典 train_duty_level。 + * 后端 duty_level 为数值型,字典 dictValue 为字符串, + * 此处将纯数字的字典值转为 Number,保证下拉回显时类型一致。 + */ + dutyLevelOptions() { + const list = (this.dict && this.dict.type && this.dict.type.train_duty_level) || [] + return list.map(item => ({ + label: item.label, + value: /^\d+$/.test(String(item.value)) ? Number(item.value) : item.value + })) + } + }, created() { this.resetCreate() this.mapDept() @@ -470,6 +508,7 @@ export default { sGender: row.sGender || '男', sBirth: row.sBirth || null, orgName: this.toDeptValue(row.orgName), + dutyLevel: row.dutyLevel !== undefined && row.dutyLevel !== null ? this.toDutyLevelValue(row.dutyLevel) : null, sPhone: row.sPhone || null, sEmail: row.sEmail || null, idCard: null, @@ -480,6 +519,13 @@ export default { this.user = { avatar: this.createForm.avatar || '' } this.createOpen = true }, + /** 岗位级别值归一化:数字字符串转 Number,保证与下拉选项 value 类型一致 */ + toDutyLevelValue(value) { + if (value === null || value === undefined || value === '') { + return null + } + return /^\d+$/.test(String(value)) ? Number(value) : value + }, /** 部门值归一化:数字字符串转 Number,保证与部门树选项 id 类型一致 */ toDeptValue(value) { if (value === null || value === undefined || value === '') { @@ -494,6 +540,7 @@ export default { sGender: '男', sBirth: null, orgName: null, + dutyLevel: null, sPhone: null, sEmail: null, idCard: null, diff --git a/build_ui/src/views/train/student/studentAvatar.vue b/build_ui/src/views/train/student/studentAvatar.vue new file mode 100644 index 000000000..8c803f6e1 --- /dev/null +++ b/build_ui/src/views/train/student/studentAvatar.vue @@ -0,0 +1,233 @@ + + + + From 9c720a25358ce469b331d7f9a571062d9ef3994f Mon Sep 17 00:00:00 2001 From: buliping Date: Tue, 29 Sep 2026 10:41:20 +0800 Subject: [PATCH 10/16] =?UTF-8?q?=E6=95=99=E5=B8=88=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=A4=B4=E5=83=8F=E3=80=81=E4=B8=93=E4=B8=9A=E3=80=81=E4=B8=BB?= =?UTF-8?q?=E8=AE=B2=E8=AF=BE=E7=A8=8B=E3=80=81=E4=BB=8E=E6=95=99=E6=97=B6?= =?UTF-8?q?=E9=97=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build_ui/src/views/train/teacher/index.vue | 103 ++++++++++++++++++++- 1 file changed, 98 insertions(+), 5 deletions(-) diff --git a/build_ui/src/views/train/teacher/index.vue b/build_ui/src/views/train/teacher/index.vue index 6bdfa1612..2e1252aa5 100644 --- a/build_ui/src/views/train/teacher/index.vue +++ b/build_ui/src/views/train/teacher/index.vue @@ -72,6 +72,20 @@ + + +