def logout(request): try: clear_session(request) return get_res_json(code=200) except BaseException as e: print(e) return get_res_json(code=0, msg='未知错误')
def uploader_create(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = UploaderCreate(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) # 先获取当前用户的id owner = request.session.get('id', '') # 当前用户 # 获取创建的用户名 uploader_name = uf.cleaned_data['uploader_name'] # 检查当前用户是否有权限创建up主账号 check_result = is_user_can_create_uploader(user_id=owner, uploader_name=uploader_name) # 返回结果不为True,则为错误提示信息 if check_result is not True: return get_res_json(code=0, msg=check_result) # 创建账号,并返回提示信息 if create_uploader_account(user_id=owner, uploader_name=uploader_name) is True: return get_res_json(code=200) else: # 此时失败了 return get_res_json(code=0, msg='创建失败,请重试或联系管理员')
def login(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = LoginForm(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) # 拿到用户名和密码 username = uf.cleaned_data['username'] password = uf.cleaned_data['password'] # 先查重 search_info = UserModel.objects.order_by('-id').filter(username=username) if len(search_info) == 0: return get_res_json(code=0, msg='该用户名不存在或密码错误。\n重设密码请联系 QQ:20004604') user = search_info[0] # 校验密码 if user.is_pw_correct(password) is False: # 密码错误 return get_res_json(code=0, msg='该用户名不存在或密码错误。\n重设密码请联系 QQ:20004604') # 登录成功,设置session set_user_session(request, user) user.set_last_login() user.save() return get_res_json(code=200, msg='登录成功', data={ 'username': username, 'userid': user.id })
def load_data(self, request): # 取出数据 if len(request.body) is 0: return { 'is_pass': False, 'res': get_res_json(code=0, msg='需要【邮箱】、【密码】') } try: data = json.loads(request.body) except BaseException as e: return { 'is_pass': False, 'res': get_res_json(code=0, msg='登录数据非法') } verify_result = self._verify(data) # 如果验证通过 if verify_result['is_pass'] is True: self.email = data.get('email') self.password = data.get('password') return { 'is_pass': True } else: return verify_result
def _pw_reset(self, mtool, email, pw): # 密码加密 tool = Md5Tool() md5pw = tool.get_md5(pw) u_result = mtool.update_row( 'UPDATE user_auth SET pw = %s WHERE email = %s', [md5pw, email]) if u_result is False or u_result is 0: # 回滚数据库操作 mtool.set_uncommit() return { 'is_pass': False, 'res': get_res_json(code=0, msg='服务器错误(0),请重试') } # 此时,还要让之前更新密码那行数据失效 u_reset = mtool.update_row( 'UPDATE reset_pw_list SET is_invalid=1 and is_pass=1 WHERE email=%s', [email]) if u_reset is False or u_reset is 0: # 回滚数据库操作 mtool.set_uncommit() return { 'is_pass': False, 'res': get_res_json(code=0, msg='服务器错误(1),请重试') } return {'is_pass': True}
def load_data_verify(self, request): try: email = request.GET['email'] except MultiValueDictKeyError as e: return { 'is_pass': False, 'res': get_res_json(code=0, msg='需要【邮箱】') } try: vcode = request.GET['vcode'] except MultiValueDictKeyError as e: return { 'is_pass': False, 'res': get_res_json(code=0, msg='需要【验证码】') } data = {'email': email, 'vcode': vcode} uf = VerifyRPHrefForm(data) # 验证不通过,返回错误信息 if not uf.is_valid(): msg = uf.get_form_error_msg() return { 'is_pass': False, 'res': get_res_json(code=0, msg=msg), 'data': data } return {'is_pass': True, 'res': data}
def uploader_name_edit(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = UploaderNameEditForm(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) owner = request.session.get('id', '') # 当前用户 # 拿到姓名,注意,这个姓名可能是空 upid = uf.cleaned_data['upid'] name = uf.cleaned_data['name'] # 先查看有没有数据 mp_data = MsgPuber.objects.filter(id=upid, user_id=owner) # 不存在,报错并返回 if len(mp_data) == 0: return get_res_json(code=0, msg='该UP主并不存在') # 名字重复 if len(MsgPuber.objects.filter(name=name)) > 0: return get_res_json(code=0, msg='已有同名账号,请使用其他名字') mp_data = mp_data[0] # 修改名字 mp_data.set_name(name=name) # 保存 mp_data.save() return get_res_json(code=200, msg='用户信息更新成功')
def uploader_key_refresh(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = UploaderKeyRefreshForm(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) owner = request.session.get('id', '') # 当前用户 # 拿到 up主的id upid = uf.cleaned_data['upid'] # 校验用户,检查该用户是否存在 mp_data = MsgPuber.objects.filter(id=upid, user_id=owner) # 不存在,报错并返回 if len(mp_data) == 0: return get_res_json(code=0, msg='该UP主并不存在') mp_data = mp_data[0] # 重新生成密钥 mp_data.make_secret_key() # 保存 mp_data.save() return get_res_json(code=200, msg='密钥更新成功')
def wrapper(*args, **kw): request = args[0] # 先要求是登录状态 if is_logined(request) is False: return get_res_json(code=5, msg='请先登录') if request.session.get("usertype") != USERTYPE_ORDER_TAKER: return get_res_json(code=10, msg='用户类型错误,角色必须是订单接单人才能执行该操作') return func(*args, **kw)
def had_logined(request): if is_logined(request) is True: return get_res_json(code=200, data={ 'username': request.session.get('username'), 'userid': request.session.get('id'), }) else: return get_res_json(code=5, msg='')
def load_data(self, request, id): data = None # 取出数据 if len(request.body) is 0: return { 'is_pass': False, 'res': get_res_json(code=0, msg='数据非法(0)') } try: data = json.loads(request.body) data['id'] = id hidden_columns = None # uf.is_valid() 校验数组类型的时候非法,所以玩点骚操作 if data['hidden_columns'] is not None: # 将该行数据暂时取出来 hidden_columns = data['hidden_columns'] # 从 data 里移除 hidden_columns 属性 del data['hidden_columns'] # 处理过的数据再搞到数组里 uf = UserInfoForm(data) # 验证不通过,返回错误信息 if not uf.is_valid(): msg = uf.get_form_error_msg() return {'is_pass': False, 'res': get_res_json(code=0, msg=msg)} # 再把数据加回去 if hidden_columns is not None: data['hidden_columns'] = hidden_columns # 由于我不会用 django 的 form 校验数组,因此这里追加校验数组 # 数组的校验,是通过 USER_INFO_DICT 的第四个元素——函数来校验的 # 其他类型,也可以通过 这个函数 来追加校验 # 1. 先遍历 USER_INFO_DICT for col_info in USER_INFO_DICT: # 2. 如果没有第四个参数,则继续下一个 if len(col_info) < 4 or col_info[3] is None: continue else: # 3. 有函数的话,进行函数校验 if col_info[3](data[col_info[0]]) is False: # 校验失败,返回报错信息 return { 'is_pass': False, 'res': get_res_json(code=0, msg='%s数据非法(2)' % col_info[0]) } return {'is_pass': True, 'data': data} except BaseException as e: print(e) return { 'is_pass': False, 'res': get_res_json(code=0, msg='数据非法(1)') }
def user_detail(request): # 先获取当前用户的id owner = request.session.get('id', '') # 当前用户 # 先获取当前用户的信息 user_info = UserModel.objects.filter(id=owner) # 当前用户不存在?? if len(user_info) == 0: clear_session() return get_res_json(code=0, msg='当前用户不存在') user_info = user_info[0] user_info = { 'username': user_info.username, 'register_date': user_info.register_date.strftime("%Y-%m-%d %H:%M:%S"), 'last_login': user_info.last_login.strftime("%Y-%m-%d %H:%M:%S"), 'user_permission_cn': get_user_permission_cn(user_info.user_permission), 'create_uploader': can_create_uploader(user_info.user_permission) } # 先查询列表 mp_list = MsgPuber.objects.filter(user_id=owner) # 没数据的话直接返回 if len(mp_list) == 0: return get_res_json(code=200, data={'userinfo': user_info, 'list': []}) result = [] for mp_info in mp_list: uploader_id = mp_info.id # 获取 UP主 信息 d = get_msgpub_info(mp_info) # 拿取他推送的所有信息(倒叙排列) feed_list = Feeds.objects.filter( uploader_id=uploader_id).order_by('-id') if len(feed_list) == 0: d['last_msg'] = None else: # 将最近一条推送消息添加进去 feed = feed_list[0] d['last_msg'] = { 'id': feed.id, 'uploader_id': feed.uploader_id, 'pub_time': feed.pub_time.strftime("%Y-%m-%d %H:%M:%S"), 'content': feed.content, 'sendtime': get_sendtime_cn(feed.sendtime), 'action_type': feed.action_type } result.append(d) # 然后返回给用户 return get_res_json(code=200, data={'userinfo': user_info, 'list': result})
def user_unsubscribe(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = SubscribeForm(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) """ 流程: 1. 拿到被订阅者id和订阅类型; 2. 检测是QQ订阅还是邮件订阅; 2.1 如果是QQ订阅,则检查QQ字段是否存在,没有则报错; 3. 查询 Subscribe 表的订阅信息; 3.1 不存在则报错; 3.2 修改该字段的 is_active 为 False; 4. 插入一条记录到 SubscribeHistory 表 """ # 拿到各个数据 upid = uf.cleaned_data['upid'] # 被订阅者 user_id = request.session.get('id', '') # 当前用户 # 先查该 up 主是否存在 mp_info = MsgPuber.objects.filter(id=upid) if len(mp_info) == 0: return get_res_json(code=0, msg='该 up 主不存在。该UP主id为:%s' % upid) # 先找该用户之前有没有订阅过这个消息号 sf_result = SubscribeFeeds.objects.filter(uploader_id=upid, user_id=user_id) # 如果查到,则说明他订阅过 if len(sf_result) > 0: sf_result = sf_result[0] # 如果是True,说明当前正处于订阅中 if sf_result.is_active is False: return get_res_json(code=0, msg='你已经取消订阅,无需重复取消。该UP主id为:%s' % upid) else: sf_result.is_active = False sf_result.save() # 插入一条历史取消订阅记录 SubscribeHistory.objects.create(uploader_id=upid, user_id=user_id, action='02').save() return get_res_json(code=200, msg='已取消订阅,该UP主的id为:%s' % upid) else: return get_res_json(code=200, msg='你尚未订阅过该 up 主,无法取消订阅。该UP主id为:%s' % upid)
def get_userinfo(self, id): d = uid.get_mysql_select_sql(id) with MySQLTool(host=mysql_config['host'], user=mysql_config['user'], password=mysql_config['pw'], port=mysql_config['port'], database=mysql_config['database']) as mtool: print(d) select_result = mtool.run_sql([[d['sql'], d['val_list']]]) if select_result is False: return get_res_json(code=0, msg='查询用户信息失败') userinfo = uid.get_mysql_select_data(select_result) return get_res_json(code=200, data=userinfo)
def update(self, data): d = uid.get_mysql_update_sql(data) print(d) with MySQLTool(host=mysql_config['host'], user=mysql_config['user'], password=mysql_config['pw'], port=mysql_config['port'], database=mysql_config['database']) as mtool: u_result = mtool.update_row(d['sql'], d['val_list']) if u_result is not False: return get_res_json(code=200, msg='修改成功') else: return get_res_json(code=0, msg='修改用户信息失败')
def logout(request): if request.method != 'POST': return get_res_json(code=0, msg="请通过POST请求访问接口") # 没登录的话 token = request.session.get('token') if token is None: return get_res_json(code=0, msg='你还没有登录,不需要登出喔') # 注意,此时可以排除登录过期的情况(login_intercept 已经处理过了) # 清除登录信息,分别清除内存和用户 session 里的 SM.delete(token) request.session.delete('token') return get_res_json(code=200, msg="success", data={'msg': '登出成功'})
def is_can_send(self, email, mtool): exist_result = mtool.run_sql( [['SELECT * FROM user_auth WHERE email = %s', [email]]]) # 3、判定邮箱是否存在 if len(exist_result) is 0: # 回滚数据库操作 mtool.set_uncommit() return { 'is_pass': False, 'res': get_res_json(code=0, msg="该邮箱不存在,请重试或者联系管理员") } # 4、验证上一次发送重置密码邮件的时间(每次时间间隔不少于180秒)(低于这个时间,返回提示信息) # 尝试获取上一次发送信息 send_result = mtool.run_sql([[ 'SELECT * FROM reset_pw_list WHERE email = %s and is_invalid = 0', [email] ]]) if send_result is False: # 回滚数据库操作 mtool.set_uncommit() return { 'is_pass': False, 'res': get_res_json(code=0, msg="服务器错误(2),请稍后再重试") } if len(send_result) > 0: # 说明之前有未生效重置密码的邮件。此时需要判断时间间隔 last_send = send_result[len(send_result) - 1] last_send_ctime = last_send[3] last_sec = int(time.mktime(last_send_ctime.timetuple())) now_sec = int(time.time()) sec_dur = now_sec - last_sec # 间隔少于指定时间,则返回错误提示信息 if sec_dur <= PW_RWSET_MAILSEND_DURATION_SEC: # 回滚数据库操作 mtool.set_uncommit() return { 'is_pass': False, 'res': get_res_json(code=0, msg="每次发送密码重置邮件的间隔不能少于180秒,请稍后再重新尝试发送") } return {'is_pass': True}
def load_data(self, request): data = None # 取出数据 if len(request.body) is 0: return { 'is_pass': False, 'res': get_res_json(code=0, msg='需要【邮箱】') } try: data = json.loads(request.body) uf = SendResetPasswordMailForm(data) # 验证不通过,返回错误信息 if not uf.is_valid(): msg = uf.get_form_error_msg() return {'is_pass': False, 'res': get_res_json(code=0, msg=msg)} return {'is_pass': True, 'res': data} except BaseException as e: return {'is_pass': False, 'res': get_res_json(code=0, msg='数据非法')}
def vote(request): # 加载数据 post_data = json.loads(request.body) # 表单校验 uf = VoteForm(post_data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) # 拿到数据 qq = uf.data['qq'] score = uf.data['score'] vote_id = uf.data['vote_id'] # 获取当前用户 user = User.objects.filter(qq=qq, vote_id=vote_id) if len(user) == 0: return get_res_json(code=0, msg='该用户不存在') user = user[0] if user.has_voted == '1': return get_res_json(code=0, msg='你已经投过票了') # 拆分 split_list = [x for x in score.split('|') if x] # 获取投票选项 vote_options = VoteOptions.objects.filter(vote_id=vote_id) for item in split_list: # 再讲数据以逗号形式分割,第一个元素是投票id,第二个元素是分数 id_score = [y for y in item.split(',') if y] # 分别拿到选项id和评分 id = int(id_score[0]) s = int(id_score[1]) # 更新数据 one = vote_options.filter(id=id)[0] one.score = one.score + s one.vote_people = one.vote_people + 1 one.save() # 更新数据 user.vote(score) user.save() return get_res_json(code=200, msg='投票成功')
def register(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = RegisterForm(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) # 拿到用户名和密码(并去掉中间的空格) username = uf.cleaned_data['username'].replace(' ', '') password = uf.cleaned_data['password'].replace(' ', '') email = uf.cleaned_data['email'].replace(' ', '') regcode = uf.cleaned_data['regcode'].replace(' ', '') if username in BANNED_USERNAME: return get_res_json(code=0, msg='非法的用户名,请勿使用敏感词作为用户名') # 1. 账号、邮箱已使用,则不能继续注册 # 2. 检查验证码+邮箱 是否有数据。如果有数据,该条数据是否过期 # 3. 创建一条注册信息,设置密码(加密) # 先查账号、邮件是否已存在 search_info = is_can_reg(username=username, email=email) if search_info is not None: return get_res_json(code=0, msg=search_info) # 查数据 check_result = mail_utils.is_regcode_correct(email=email, regcode=regcode) if check_result is not None: return get_res_json(code=0, msg=check_result) user = UserModel.objects.create(username=username, email=email) # 设置密码 user.set_pw(password) user.save() set_user_session(request, user) return get_res_json(code=200, msg='注册成功', data={ 'username': username, 'userid': user.id })
def uploader_rec_set(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = SetUserRecForm(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) # 流程梳理: # 1. 拿取订阅者 id 和 当前用户 id; # 2. 查看当前用户 MsgPuber 表的 auth 是不是 02 # 2.1 不是 02,返回错误提示信息(没有权限修改) # 2.2 是 02,进入 3 # 3. 查询订阅表 SubscribeFeeds 表,修改 puber_allow_rec 为相反的值 # 4. 保存,返回信息 # 拿取数据 upid = uf.cleaned_data['upid'] user_id = uf.cleaned_data['user_id'] owner = request.session.get('id', '') # 当前用户 # 先校验该用户有无权限对该up主进行操作 mp_info = MsgPuber.objects.filter(id=upid, user_id=owner) if len(mp_info) == 0: return get_res_json(code=0, msg='UP 主不存在或你无权限对该用户进行操作') # 获取订阅信息。只能对生效中的进行操作 # (若想禁止曾经订阅过但现在取消的人,请禁止用户订阅) # todo 有一种场景,是你想默认禁止用户订阅,只允许你打开权限的人收取邮件。 # 这个需要后期添加一个接口,修改订阅后,puber_allow_rec 默认为 False) # 目前默认是 True——即允许收取 sub_info = SubscribeFeeds.objects.filter(uploader_id=upid, user_id=user_id) if len(sub_info) == 0: return get_res_json(code=0, msg='该用户并未订阅,无法进行操作') sub_info = sub_info[0] sub_info.puber_allow_rec = bool(1 - sub_info.puber_allow_rec) sub_info.save() return get_res_json(code=200, msg='订阅者 id 为:%s 的 接受邮件权限 修改成功' % user_id)
def add_user(request): # 加载数据 post_data = json.loads(request.body) # 表单校验 uf = AddVoteUserForm(post_data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) # 拿到数据 qq = uf.data['qq'] vote_id = uf.data['vote_id'] # 查看该用户是否存在 user = User.objects.filter(qq=qq, vote_id=vote_id) if len(user) > 0: return get_res_json(code=0, msg='该用户已存在') new_user = User.objects.create(qq=qq, vote_id=vote_id) new_user.save() return get_res_json(code=200, msg='创建成功')
def send_email_regcode(request): # 加载数据 data = json.loads(request.body) # 表单校验 uf = SendRegCodeForm(data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) # 拿到用户名和密码 username = uf.cleaned_data['username'] email = uf.cleaned_data['email'] if request.META.get('HTTP_X_FORWARDED_FOR'): ip = request.META.get('HTTP_X_FORWARDED_FOR') else: ip = request.META.get('REMOTE_ADDR') # 1. 账号、邮箱已使用,则不能继续注册 # 2. 检查推送频率 # 3. 推送验证码邮件 # 先查重(已注册显然不能继续推送) search_info = is_can_reg(username=username, email=email) if search_info is not None: return get_res_json(code=0, msg=search_info) # 检查是否可以推送邮件 is_can_send = mail_utils.can_send_regcode_email(email=email, ip=ip) if is_can_send is not None: return get_res_json(code=0, msg=is_can_send) # 创建一条邮件记录 new_mail_info = RegVerifyMailModel.objects.create(email=email, ip=ip) # 推送邮件 send_result = mail_utils.send_regcode_email( email=email, regcode=new_mail_info.verify_code) if send_result.code == 200: return get_res_json(code=send_result.code, msg='邮件发送成功,请访问邮箱查看验证码') else: return get_res_json(code=send_result.code, msg='邮件发送失败,请重试或联系管理员。\n失败原因:%s' % send_result.msg)
def register(request): if request.method != 'POST': return get_res_json(code=0, msg="请通过POST请求来进行查询") rm = RegisterManager(request) data = rm.load_data() if data['is_pass'] is False: return data['res'] result = rm.register(data['res']) return result
def vote_add_option(request): # 加载数据 post_data = json.loads(request.body) # 表单校验 uf = AddVoteOptionForm(post_data) # 数据是否合法 if uf.is_valid() is False: # 返回错误信息 return get_res_json(code=0, msg=uf.get_form_error_msg()) option = uf.data['option'] vote_id = uf.data['vote_id'] # 先查有没有option重复的 if len(VoteOptions.objects.filter(option=option, vote_id=vote_id)) > 0: return get_res_json(code=0, msg='选项重复') data = VoteOptions.objects.create(option=option, vote_id=vote_id) data.save() return get_res_json(code=200, msg='添加成功')
def get_userinfo(request): if request.method != 'GET': return get_res_json(code=0, msg="请通过GET请求来进行查询") # 先拿 token token = request.session.get('token') # 根据token反查用户id userinfo = SM.get(token) id = userinfo['data']['id'] um = UserInfoManager() # 直接返回用户信息 return um.get_userinfo(id)
def _verify(self, data): uf = LoginForm(data) # 验证不通过,返回错误信息 if not uf.is_valid(): msg = uf.get_form_error_msg() return { 'is_pass': False, 'res': get_res_json(code=0, msg=msg) } return { 'is_pass': True }
def update_userinfo(request): if request.method != 'POST': return get_res_json(code=0, msg="请通过POST请求来进行查询") token = request.session.get('token') userinfo = SM.get(token) id = userinfo['data']['id'] um = UserInfoManager() load_result = um.load_data(request, id) if load_result['is_pass'] is False: return load_result['res'] data = load_result['data'] return um.update(data)
def user_subscribe_list(request): """ 流程: 1. 拿到当前查的订阅类型,是QQ订阅还是邮件订阅,记录下来; 2. 先查 SubscribeFeeds 表,拿到所有订阅信息(包括当前生效和取消订阅的); 3. 查到订阅时间、是否生效,再拿字段 upid 去查 MsgPuber 表,拿到up主的详细信息; 4. 再去拿到up主的最近一条消息; 5. 组装数据,每条信息是:订阅时间+类型 + up主信息 + up主最近推送消息的信息 """ # 当前登录的用户id owner = request.session.get('id', None) # 拉取当前用户的所有订阅记录 sf_list = SubscribeFeeds.objects.filter( user_id=owner).order_by('-sub_time') if len(sf_list) == 0: return get_res_json(code=200, data={'list': []}) # 先做出订阅列表 my_sub_list = [ { 'uploader_id': item.uploader_id, # 被订阅者id 'sub_type': item.sub_type, # 订阅类型 'sub_type_cn': get_sub_type_cn(item.sub_type), # 订阅类型 'sub_time': item.sub_time.strftime('%Y-%m-%d %H:%M:%S'), # 订阅时间 'is_active': item.is_active, # 是否生效中 'puber_allow_rec': item.puber_allow_rec, # up主是否允许用户收取邮件 'uploader': None } for item in sf_list ] # 再反查 MsgPuber 表 for sub_info in my_sub_list: uploader_id = sub_info['uploader_id'] mp_info = MsgPuber.objects.filter(id=uploader_id)[0] # 获取当前up主的信息 sub_info['uploader_info'] = get_msgpub_info(mp_info) return get_res_json(code=200, data={'list': my_sub_list})
def send(self, mtool, email): vcode = self._get_vcode() # 获取当前时间 nowtime = get_date_time() # 先将之前的数据设置为失效(无论之前有没有数据) u_result = mtool.update_row( 'UPDATE reset_pw_list SET is_invalid=1 WHERE email=%s', [email]) if u_result is False: # 回滚数据库操作 mtool.set_uncommit() return get_res_json(code=0, msg='服务器错误(0),请重试') # 数据库插入一行记录(用于之后重置密码时校验使用) row_id = mtool.insert_row( 'INSERT reset_pw_list' '(id, email, verify_key, ctime, last_vtime, is_pass, is_invalid) VALUES' '(%s, %s, %s, %s, %s, 0, 0)', [None, email, vcode, nowtime, nowtime]) if row_id is False: # 回滚数据库操作 mtool.set_uncommit() return get_res_json(code=0, msg='服务器错误(1),请重试') # 【5】生成连接 url = self._get_reset_url(email, vcode) # 此时跳转到邮件发送提示页面,提示用户点击邮箱里的链接进行验证 send_result = self._send_resetpw_email(email, url) # 发送失败——》返回错误信息 if send_result.code is not 200: # 回滚数据库操作 mtool.set_uncommit() return get_res_json(code=0, data={'msg': send_result.msg}) # 此时跳转到邮件发送提示页面,提示用户点击邮箱里的链接进行验证 return get_res_json(code=200, data={'msg': '已发送密码重置邮件,请访问邮箱,打开邮件中的链接地址'})