从零开始搭建群众权益平台(四)

news/2024/10/18 6:01:07/

这篇博客我们可以添加以下功能以进一步提高我们的应用程序的复杂性和密码找回的功能性:

复杂的权限控制:

对于更复杂的权限控制,我们可能需要引入新的数据模型来管理角色和权限。例如,我们可以创建一个Role模型和一个Permission模型。每个角色可以有多个权限,每个用户可以有多个角色。我们可以使用mongoose的关联功能来实现这个需求。

我们还需要添加一些路由来管理角色和权限,例如添加角色,删除角色,为角色添加权限等。

以下是一些示例代码:

// server.js
// 在文件顶部引入需要的库
const mongoose = require('mongoose');// 创建Role和Permission模型
const permissionSchema = new mongoose.Schema({name: String
});
const Permission = mongoose.model('Permission', permissionSchema);const roleSchema = new mongoose.Schema({name: String,permissions: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Permission' }]
});
const Role = mongoose.model('Role', roleSchema);// 在User模型中添加角色字段
const userSchema = new mongoose.Schema({username: String,password: String,phone: String,roles: [{ type: mongoose.Schema.Types.ObjectId, ref: 'Role' }]
});
const User = mongoose.model('User', userSchema);// 更新requireRole中间件来支持多角色
function requireRole(...roles) {return async (req, res, next) => {const user = await User.findById(req.user.id).populate({path: 'roles',populate: {path: 'permissions'}});const userRoles = user.roles.map(role => role.name);if (!roles.some(role => userRoles.includes(role))) {return res.status(403).send({ message: 'Forbidden' });}req.user = user;next();};
}// 添加一些新的路由来管理角色和权限
app.post('/api/roles', requireRole('admin'), async (req, res) => {const role = new Role(req.body);await role.save();res.send(role);
});app.delete('/api/roles/:id', requireRole('admin'), async (req, res) => {await Role.findByIdAndDelete(req.params.id);res.send({ message: 'Role deleted' });
});
// ...app.post('/api/permissions', requireRole('admin'), async (req, res) => {const permission = new Permission(req.body);await permission.save();res.send(permission);
});app.delete('/api/permissions/:id', requireRole('admin'), async (req, res) => {await Permission.findByIdAndDelete(req.params.id);res.send({ message: 'Permission deleted' });
});

用户的密码找回和更改:

我们可以添加一个/api/forgot-password路由来处理忘记密码的请求,发送一个重置密码的链接到用户的邮箱。我们同样可以添加一个/api/reset-password路由来处理重置密码的请求。

我们也可以添加一个/api/change-password路由来处理更改密码的请求。这个路由需要用户登录才能访问。

这些功能可能需要使用到第三方服务来发送电子邮件,例如SendGrid或Mailgun。

**用户的个人用户的个人信息管理:

我们可以添加以下两个路由以允许用户获取和更新他们的个人信息:

// server.js
// 添加新的路由来获取和更新用户信息
app.get('/api/me', async (req, res) => {const user = await User.findById(req.user.id);if (!user) {return res.status(401).send({ message: 'User not found' });}res.send(user);
});app.put('/api/me', async (req, res) => {const user = await User.findByIdAndUpdate(req.user.id, req.body, { new: true });res.send(user);
});

这些代码让我们能够查看和更新用户名和电话号码,如果需要其他字段(例如电子邮件,地址等),只需在用户模型和路由处理器中相应地添加即可。

注意,当更新用户信息时,你可能需要进行一些验证,例如检查新的用户名或电子邮件是否已被其他用户使用。如果是这样,你应该返回一个错误消息。

现在我们已经添加了很多新的功能,但是这还只是基本的,有很多细节和其他功能需要我们去完善和实现,例如:输入验证、文件上传、支付、通知等功能。专栏后续将实现以上功能,你也需要写前端代码来与后端交互,展示数据,处理用户的输入和操作等。

还需要注意的是,当添加新的功能和修改代码时,应该编写和运行测试来确保代码的正确性和质量。并且,应该定期提交代码到版本控制系统(如Git),并备份数据,以防止数据丢失和代码错误。

以上我们后续都将一一讲解。


http://www.ppmy.cn/news/431911.html

相关文章

【数据分析之道-Matplotlib(九)】Matplotlib棉棒图

文章目录 专栏导读1、Matplotlib棉棒图stem()基本语法2、Matplotlib棉棒图stem()定义样式2.1linefmt参数2.2markerfmt参数2.3举例一:直线样式2.4举例二:圆点样式 3、棉棒图案例实战3.1绘制每月销量的棉棒图3.2绘制每月销量与平均销量之差 专栏导读 ✍ 作…

关于jmeter body Data 传参报错message“:“\u7528\u6237\u540d \u4e0d\u80fd\u4e3a\u7a7a\u3002“的解决方法

因为之前一直使用Parameters传参或者使用postman 突发奇想想用用jmeter测测接口,POST接口习惯性的把参数写到Body Date里 然后就发现报错了 后面一直以为是json格式没写对 弄了半天发现jmeter Body Date传参需要加HTTP信息请求体管理器来说明Body Date的类型 步骤 …

python写入文件乱码\u559c\u6b22\u4e00\u4e2a\u4eba

当python爬虫出来的数据在txt文件显示为\u559c\u6b22\u4e00\u4e2a\u4eba乱码时,解决方案为: def save_content_list(self, content_list): # 保存with open("qiushi.txt", "a",encoding"gbk") as f:for content in conte…

unity将 \u4E00 这种 编码 转汉字 方法

unity中 直接使用 JsonMapper.ToJson(对象),取到的字符串,里面汉字可能是\u4E00类似这种 其实也不用转,服务器会通过类似fastjson发序列化的方式,将json转对象,获取对象的值就是中文 但是有时服务器要求将传参中字符串…

2022 RoboCom 世界机器人开发者大赛-本科组(省赛)RC-u4 攻略分队

本题思路较为清晰&#xff0c;考场时结构体内部数组开小了&#xff0c;导致wa。 #include <bits/stdc.h>using namespace std; #define ll long long const int N 1e5 10; int v[10]; int a[10][4]; struct node {int b[7];int num1 0;int c[7];int num2 0;int dx;i…

U4D和Blender怎么选

C4D Blender 怎么选 建模 Blender 更倾向于硬表面模型和角色模型C4D 广泛 材质、灯光、渲染 C4D oc渲染器 贵Blender 自带Cycles渲染器可选GPU或CPU渲染 动画 C4D 运动图形系统Blender 角色动画系统 插件 C4D支持的xparticle粒子功能特别强大 C4D结合Ps Ae多用于广告领…

python爬虫或web中出现\\u4e00unicode字符串的原因

我们的python在爬虫或web中,默认是不需要我们获取进行编码和解码的 因为框架自动帮我们编码然后返回给我们,但是一般用的都是UTF-8,如果这个数据的编码方式是unicode-escape怎么办呢,那么我们就会获得一堆类似于"\u4e00"这样的字符串 解决办法: unicode_str \\u4e…

Atmega32U4烧写Bootloader

熔丝位设置 leonardo.bootloader.low_fuses0xff leonardo.bootloader.high_fuses0xd8 leonardo.bootloader.extended_fuses0xcb leonardo.bootloader.unlock_bits0x3F leonardo.bootloader.filecaterina/Caterina-Leonardo.hex导入Flash 位置在 D:\Arduino\hardware\arduino…