从零开始,搭建一个简单的购物平台(八):https://blog.csdn.net/time_____/article/details/105452765
项目源码(持续更新):https://gitee.com/DieHunter/myCode/tree/master/shopping
这篇文章将前后端管理功能完成,也就是将最后修改用户信息功能实现(由于商品管理与用户管理类似,所以不做描述),并讲述一下遇到的坑
修改用户数据后端其实就是根据用户id,将从前端传来的字段对应的值更新,如果头像有变化,则删除之前用户的头像,前端相对服务端反而更繁琐一些,当用户点击修改用户信息按钮后,将用户信息初始化到form表单中(头像同样需要加载),这里考虑到初始化用户信息的实现可以直接获取表格中的数据,可减少一次请求,但是有个小坑,当用户点击修改时,Drawer组件中的form表单初始化是异步的,需要两个解决操作:1.将Drawer中的子组件预加载(开启Drawer中的forceRender属性)。2.将form初始化操作放到form更新渲染完成之后(componentDidUpdate),如果放在componentDidMount中,组件初始化只会进行第一次,下一步,直接开始整后端
- 服务端在command中新增update方法
/* 更新数据
* @param {object} mod 数据库model
* @param {string} _id 数据唯一标识
* @param {object} data 更新字段及值
*/
static updateData(mod, _id, data) {
//改
return mod
.updateOne(
{
_id,
},
data
)
.then((res) => {
return res;
})
.catch((err) => {
return false;
});
}
- 在user.js文件中添加接口用于更新用户信息
router.post(Config.ServerApi.updateUser, Util.checkToken, async (req, res) => {
if (!res._data.headPic.length) {//这里判断是否是修改头像,若是新增,则是上传相关的头像信息,是个object类型,length属性不存在
let findRes = await findData(Mod, {
_id: res._data._id,
});
if (findRes[0].headPic != "public/assets/img/default.gif") {
Util.delPicFile(findRes[0].headPic);
}
res._data.headPic = Util.readPicFile(res._data.headPic || "") || "";
}
res._data.password = Util.createBcrypt(res._data.password);//密码盐加密
let updateRes = await updateData(Mod, res._data._id, res._data);
if (updateRes) {
res.send({
result: 1,
msg: "修改成功",
});
return;
}
Util.delPicFile(res._data.headPic);
res.send({
result: 0,
msg: "修改失败",
});
});
之后我们看看前端功能实现
前端需要在之前实现的新增用户中做修改,达到相关目的
- 在upload.js组件中添加初始化显示图片功能,也就是渲染组件时给个src,并且把方法传递给父组件以供调用(放到componentDidMount中),在父组件通过组件属性为子组件设置this中的属性达到调用。当然也可以使用全局events传递参数
this.props.onUpdateRef(this);//放在子组件中,使父组件调用当前组件
onUpdateRef={(child) => {//放在父组件的子组件的属性里,通过this.updateChild调用子组件的this
this.updateChild = child;
}}
updatePic(url) {
if (url && url.length > 0) {
this.setState({
fileList: [
{
uid: "-1",
name: url,
status: "done",
url,
},
],
});
}
}
- 全部实现后,可以在自定义的drawer.js组件进行新增用户和修改用户的区分
showDrawer = (record) => {
if (record) {//传递了参数说明是更新信息,否则是新增用户
this.setState({
formType: "updata",
visible: true,
record,
});
this.updateChild.updatePic(FilePath + record.headPic);//调用上传头像组件,显示图片
} else {
this.setState({
formType: "add",
visible: true,
record: {//新增用户的初始值
sex: "man",
userType: "user",
mailurl: "@qq.com",
},
});
}
};
- 在componentDidUpdata中添加更新form方法,将state中的record初始化至form中
componentDidUpdate() {
this.formRef.current.setFieldsValue(this.state.record);
}
- 在Drawer隐藏方法中将表单初始化并清空state中的record
onClose = () => {
this.formRef.current.resetFields();
this.setState({
visible: false,
record: null,
});
};
效果如下
最后,我们试试将数据提交至后端
总结:
到现在为止,项目中的用户管理前端+服务端功能已全部实现,商品管理的功能实现与用户同理,但是字段名不同,不做说明,下一篇文章直接开始搭建商城前端及后端功能