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 @@ + + + +