CmsWing源码分析(9)用户首页(一)

2021SC@SDUSC

早在第一篇博客中,我就声明过,我在小组中主要需要分析用户行为相关

用户行为分析,一般就是指从各个维度去看用户对于产品在某些指标上的反馈。

用户首页的种种功能,是能够让用户获取反馈的前提

这一部分的代码,主要集中在user.js这个文件中

CmsWing源码分析(9)用户首页(一)

 

用户首页分为普通用户和管理员用户两种模式

这次主要分析的是管理员用户

使用的数据库为member

constructor(ctx) {
    super(ctx); 
    this.db = this.model('cmswing/member');
    this.tactive = 'user';
  }

用户列表

将数据库中的start和length强制转化为int类型

 async userlistAction() {
    const gets = this.get();
    const start = parseInt(gets.start);
    const length = parseInt(gets.length);
    const draw = gets.draw;
    const key = gets['search[value]'];

对用户最后登陆时间和登录IP做出更新

然后将其作为用户列表的数据存储进来

const userList = await this.db.join({
      table: 'customer',
      join: 'left',
      as: 'u',
      on: ['id', 'user_id']
    }).field('id,username,score,login,last_login_ip,last_login_time,status,u.real_name,u.group_id,u.balance').limit(start, length).where({username: ['like', '%' + key + '%'], status: ['>', -1]}).order('id DESC').countSelect();
    userList.data.forEach(v => {
      v.last_login_time = times(v.last_login_time);
      v.last_login_ip = _int2iP(v.last_login_ip);
    });

join的用法是把数组转换为字符串,且不会改变原始数组

具体可以参考JavaScript Array join() 方法

则,本网页的数据属性就变为如下所示的情况

最后返回这个刚更新好的数据属性

 const data = {
      'draw': draw,
      'recordsTotal': userList.count,
      'recordsFiltered': userList.count,
      'data': userList.data
    };
    return this.json(data);
  }

 

显示用户信息

从数据库中获取当前使用者的ID,初始化一个用户对象

如果,这个用户属于管理者,则有权限显示接下来的内容

接着可以开始获取会员组的名单、管理员组的名单

最后将此页面标题设为“个人信息”

async showuserAction() {
    const id = this.get('id');
    const user = await this.model('member').find(id);
    this.assign('user', user);
    if (user.is_admin == 1) {
      const roleid = await this.model('auth_user_role').where({user_id: user.id}).getField('role_id', true);
      this.assign('roleid', roleid);
    }
    const usergroup = await this.model('member_group').select();
    this.assign('usergroup', usergroup);
    const role = await this.model('auth_role').where({status: 1}).select();
    this.assign('role', role);
    this.meta_title = '个人信息';
    return this.display();
  }

添加用户

第一次见到可以让管理员添加用户的功能.....不会让普通用户很不安吗?

首先验证输入的密码和传输过去的密码是否一致,不一致就返回错误

成功了的话,就将输入密码确立为这个数

async adduserAction() {
    if (this.isPost) {
      const data = this.post();
      if (data.password != data.repassword) {
        return this.fail('两次填入的密码不一致');
      }
      data.password = encryptPassword(data.password);

reg应该是指操作时间

然后对需要建立的用户是否是一个vip进行判断

data.reg_time = new Date().getTime();
      if (data.vip == 1) {
        data.overduedate = new Date(data.overduedate).getTime();
      } else {
        data.overduedate = think.isEmpty(data.overduedate) ? 0 : data.overduedate;
      }
      console.log(data);

强制将用户的数据中的status设置为1

如果添加的是管理员,添加到self.db中

否则,直接添加到当前数据库

data.status = 1;
      const self = this;
      let res;
      if (data.is_admin == 1) {
        res = await this.db.transaction(async() => {
          const userId = await self.db.add(data);
          return await self.model('auth_user_role').db(self.db.db()).add({
            user_id: userId,
            role_id: data.role_id
          });
        });
      } else {
        res = await this.db.add(data);
      }

之后就是大快人心的对添加是否成功做出判断

 if (res) {
        return this.success({name: '添加成功!'});
      } else {
        return this.fail('添加失败!');
      }
    

如果一开始就没能接收到数据库的返还内容

就可以随便显示一个页面了

标题为“添加用户”

else {
      // 会员组
      const usergroup = await this.model('member_group').select();
      this.assign('usergroup', usergroup);
      // 获取管理组
      const role = await this.model('auth_role').where({status: 1}).select();
      this.assign('role', role);
      this.meta_title = '添加用户';
      return this.display();
    }

上一篇:智能安全加密芯片---ACL16


下一篇:Oracle数据大小写转换