热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

资源共享功能实现(二)

资源共享功能实现(二)用户登录基本功能登录对用户身份合法性检验限流功能登出封号或者解封用户用户积分机制用户登录基本功能登录exports.maina


资源共享功能实现(二)

  • 用户登录基本功能
    • 登录
    • 对用户身份合法性检验
    • 限流功能
    • 登出
    • 封号或者解封用户
    • 用户积分机制


用户登录基本功能


登录

exports.main = async (event, context) => {const clientIp = context.ip;const { captcha } = event;if (!captcha) {console.error(`captcha is null, ip = ${clientIp}`);return null;}const user = await db.collection('user').where({captcha,captchaExpireTime: _.gt(new Date()),isDelete: false,}).limit(1).get().then(({ data }) => data[0]);

对用户身份合法性检验

// 用户不存在if (!user) {console.log(`user not exists, captcha = ${captcha}`);return null;}// 用户非法if (!isValidUser(user)) {console.error(`user is invalid, ip = ${clientIp}, user = ${JSON.stringify(user)}`);throw new MyError(FORBIDDEN_ERROR_CODE, '禁止访问');}

若用户合法,则创建登录凭证

// 创建登录凭证const ticket = app.auth().createTicket(user.unionId, {refresh: 30 * 24 * 60 * 60 * 1000, // 30 天刷新一次});// 存 session 登录态context.session.userInfo = user;return {ticket,user,};

限流功能

如果由于人数太多不响应,那就锁定登录功能

const getLock = await app.callFunction({name: 'redisService',data: {op: 'setnx',key: `login_${clientIp}`,value: 1,expireSeconds: 3,},}).then((tmpRes) => tmpRes.result);if (!getLock) {console.error(`cannot getLock, ip = ${clientIp}`);return FORBIDDEN_CODE;}

登出

exports.main = async (event, context) => {// 清除登录态context.session.userInfo = undefined;return true;
};

封号或者解封用户

此功能仅管理员可以操作,对于一些用户发表不当言论或者违规操作,管理员可以审核后将其加入黑名单中,用户的账号将会被封禁;当封禁到期,管理员可以移除用户账号,用户即可正常登录。

exports.main = async (event, context) => {const { userId } = event;if (!userId) {return false;}// 获取当前登录用户const currentUser = await getLoginUser(context);// 仅管理员可操作if (!isAdminUser(currentUser)) {throw new MyError(FORBIDDEN_ERROR_CODE, '禁止访问');}const user = await db.collection('user').where({_id: userId,isDelete: false,}).limit(1).get().then(({ data }) => data[0]);if (!user) {return false;}const updateData = {authority: user.authority?.includes('ban') ? 'user' : 'ban',_updateTime: new Date(),};// 更新const result = await db.collection('user').doc(user._id).update(updateData);console.log(`updateUser data = ${JSON.stringify(updateData)}`);return {code: 200,data: result,};
};

用户积分机制

更新用户积分,用户通过优质评论可以获得一定积分,用户下载他人得资源,管理员负责发放积分。

exports.main &#61; async (event, context) &#61;> {const { userId, score, reason &#61; -1, detail } &#61; event;// 请求参数校验if (!userId || !score || reason < 0) {return false;}// 封装数据const data &#61; {userId,score,reason,detail,_createTime: new Date(),_updateTime: new Date(),isDelete: false,};const transaction &#61; await db.startTransaction();let res;try {// 插入用户积分记录res &#61; await transaction.collection(&#39;userScore&#39;).add(data).then((res) &#61;> {console.log(&#96;addUserScore succeed, id &#61; ${res.id}&#96;);return true;}).catch((e) &#61;> {console.error(&#39;addUserScore error&#39;, e);throw e;});// 更新用户积分res &#61; await transaction.collection(&#39;user&#39;).where({_id: userId,isDelete: false,}).update({score: _.inc(score),_updateTime: new Date(),}).then((res) &#61;> {console.log(&#39;updateUserScore succeed&#39;, res);return true;}).catch((e) &#61;> {console.error(&#39;updateUserScore error&#39;, e);throw e;});await transaction.commit();return res;} catch (e) {await transaction.rollback();console.error(&#39;未知错误&#xff01;&#39;, e);return false;}
};

推荐阅读
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • Webpack5内置处理图片资源的配置方法
    本文介绍了在Webpack5中处理图片资源的配置方法。在Webpack4中,我们需要使用file-loader和url-loader来处理图片资源,但是在Webpack5中,这两个Loader的功能已经被内置到Webpack中,我们只需要简单配置即可实现图片资源的处理。本文还介绍了一些常用的配置方法,如匹配不同类型的图片文件、设置输出路径等。通过本文的学习,读者可以快速掌握Webpack5处理图片资源的方法。 ... [详细]
  • 本文介绍了Redis的基础数据结构string的应用场景,并以面试的形式进行问答讲解,帮助读者更好地理解和应用Redis。同时,描述了一位面试者的心理状态和面试官的行为。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 电话号码的字母组合解题思路和代码示例
    本文介绍了力扣题目《电话号码的字母组合》的解题思路和代码示例。通过使用哈希表和递归求解的方法,可以将给定的电话号码转换为对应的字母组合。详细的解题思路和代码示例可以帮助读者更好地理解和实现该题目。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 预备知识可参考我整理的博客Windows编程之线程:https:www.cnblogs.comZhuSenlinp16662075.htmlWindows编程之线程同步:https ... [详细]
author-avatar
xiaojin
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有