03. 带你开发一个基础的用户管理模块(下)
Element-Plus 中文网站
https://doc-archive.element-plus.org/
⭐新增数据
后端接口实现
新增接口
/**
* 新增数据
* @param user 参数的对象
*/
@PostMapping("/add")
public Result add(@RequestBody User user) {
userService.add(user);
return Result.success();
}
新增的业务 Service, 默认账户数据
public void add(User user) {
String username = user.getUsername();
// 校验账户是否重复
User dbUser = userMapper.selectByUsername(username);
if (dbUser != null) {
throw new CustomException("新增失败!账号重复");
}
if (StrUtil.isBlank(user.getPassword())) {
// 默认密码
user.setPassword("123");
}
if (StrUtil.isBlank(user.getName())) {
// 默认姓名
user.setName(user.getUsername());
}
user.setRole("普通用户"); // 默认用户的角色
user.setAccount(BigDecimal.ZERO); // 默认用户的账户余额
userMapper.insert(user);
}
新增的 sql
<insert id="insert" parameterType="com.example.entity.User">
insert into `user` (username, password, name, avatar, role, account)
values (#{username}, #{password}, #{name}, #{avatar}, #{role}, #{account})
</insert>
新增失败,会返回 500 的 code,同时返回错误信息

前端页面实现
新增按钮
<div style="margin-bottom: 10px">
<el-button @click="handleAdd" type="primary">新增</el-button>
</div>
新增数据的表单(跟编辑共用)
<el-dialog title="用户信息" v-model="data.formVisible" width="30%" destroy-on-close>
<el-form ref="formRef" :model="data.form" :rules="data.rules" label-width="80px" style="padding-right: 30px">
<el-form-item prop="username" label="账号">
<el-input :disabled="data.form.id !== undefined" v-model="data.form.username" placeholder="请输入账号" autocomplete="off"></el-input>
</el-form-item>
<el-form-item prop="name" label="姓名">
<el-input v-model="data.form.name" placeholder="请输入姓名" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="data.formVisible = false">取 消</el-button>
<el-button type="primary" @click="save">确 定</el-button>
</span>
</template>
</el-dialog>
新增数据调用接口
const handleAdd = () => {
data.form = {}
data.formVisible = true
}
const add = () => {
request.post('/user/add', data.form).then(res => {
if (res.code === '200') {
ElMessage.success('操作成功')
data.formVisible = false
load()
} else {
ElMessage.error(res.msg)
}
})
}
⭐编辑数据
后端接口实现
controller 接口
/**
* 更新数据
* @param user 参数的对象 编辑后的数据
*/
@PutMapping("/update")
public Result update(@RequestBody User user) {
userService.update(user);
return Result.success();
}
Service 方法
public void update(User user) {
// user对象里面必须包含ID,否则无法更新数据
userMapper.updateById(user);
}
sql
<update id="updateById">
update `user` set username = #{username}, password = #{password}, name = #{name}, avatar = #{avatar},
role = #{role}, account = #{account}
where id = #{id}
</update>
前端页面实现
表格里面的编辑按钮
<el-table-column label="操作" width="180" fixed="right" >
<template #default="scope">
<el-button type="primary" @click="handleEdit(scope.row)">编辑</el-button>
</template>
</el-table-column>
更新数据调用接口
const handleEdit = (row) => {
data.form = JSON.parse(JSON.stringify(row))
data.formVisible = true
}
const update = () => {
request.put('/user/update', data.form).then(res => {
if (res.code === '200') {
ElMessage.success('操作成功')
data.formVisible = false
load()
} else {
ElMessage.error(res.msg)
}
})
}
const save = () => {
formRef.value.validate((valid) => {
if (valid) { // 表示表单校验通过
data.form.id ? update() : add()
}
})
}
用户头像上传
文件的下载链接

图片上传的表单组件
<el-upload
:action="baseUrl + '/files/upload'"
list-type="picture"
:on-success="handleFileUpload"
>
<el-button type="primary">点击上传</el-button>
</el-upload>
回调函数
// 表单头像上传组件的回调函数 res.data 就是头像的url
const handleFileUpload = (res) => {
data.form.avatar = res.data
}
用户头像展示
<el-table-column prop="avatar" label="头像">
<template #default="scope">
<el-image v-if="scope.row.avatar" style="width: 50px; height: 50px; display: block; border-radius: 50%"
:src="scope.row.avatar" :preview-src-list="[scope.row.avatar]" preview-teleported></el-image>
</template>
</el-table-column>
效果:

