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

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

复杂的权限控制:

对于更复杂的权限控制,我们可能需要引入新的数据模型来管理角色和权限。例如,我们可以创建一个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),并备份数据,以防止数据丢失和代码错误。

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

猜你喜欢

转载自blog.csdn.net/a871923942/article/details/131253738