From 52d9bb16f89394df2f13aefa4b38de1e143c8688 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Thu, 16 Jul 2026 11:36:00 +0800 Subject: [PATCH] =?UTF-8?q?=E5=BF=98=E8=AE=B0=E5=AF=86=E7=A0=81=E5=92=8C?= =?UTF-8?q?=E5=8F=91=E9=80=81=E7=9F=AD=E4=BF=A1=E6=94=B9=E9=80=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- b/customer/forgotPassword.dspy | 32 ++++++++++++++++++++++++++++---- b/user/mobilecode.dspy | 34 +++++++++++++++++++++++++++++----- b/user/retrievecode.dspy | 29 ++++++++++++++++++++++++++--- 3 files changed, 83 insertions(+), 12 deletions(-) diff --git a/b/customer/forgotPassword.dspy b/b/customer/forgotPassword.dspy index b12e8b5..d59b248 100644 --- a/b/customer/forgotPassword.dspy +++ b/b/customer/forgotPassword.dspy @@ -1,3 +1,19 @@ +async def get_password_tenant_orgid(sor, ns): + domain_name = ns.get('domain_name') + if (not domain_name) and ns.get('url_link'): + domain_name = ns.get('url_link').split("//")[1].split("/")[0] + if domain_name: + domain_name = domain_name.strip().replace('https://', '').replace('http://', '').replace('/', '') + if 'localhost' in domain_name: + domain_name = 'dev.opencomputing.cn' + reseller = await sor.R('reseller', {'domain_name': domain_name, 'del_flg': '0'}) + if len(reseller) >= 1: + return reseller[0]['orgid'] + org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'}) + if len(org) >= 1: + return org[0]['id'] + return None + async def forgotPassword(ns): """ 忘记密码:校验短信验证码后重置密码。 @@ -25,6 +41,10 @@ async def forgotPassword(ns): db = DBPools() async with db.sqlorContext('kboss') as sor: try: + tenant_orgid = await get_password_tenant_orgid(sor, ns) + if not tenant_orgid: + return {'status': False, 'msg': '未找到当前域名所属租户'} + code = await sor.R('validatecode', {'id': ns.get('codeid'), 'vcode': ns.get('vcode')}) if code: create_at = code[0]['create_at'] @@ -37,17 +57,21 @@ async def forgotPassword(ns): user = None if ns.get('id'): - users = await sor.R('users', {'id': ns.get('id'), 'del_flg': '0'}) + user_sql = """select * from users where id = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('id'), tenant_orgid) + users = await sor.sqlExe(user_sql, {}) if users: user = users[0] elif ns.get('mobile'): - users = await sor.R('users', {'mobile': ns.get('mobile'), 'del_flg': '0'}) + user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('mobile'), tenant_orgid) + users = await sor.sqlExe(user_sql, {}) if users: user = users[0] elif ns.get('username'): - users = await sor.R('users', {'username': ns.get('username'), 'del_flg': '0'}) + user_sql = """select * from users where username = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), tenant_orgid) + users = await sor.sqlExe(user_sql, {}) if not users: - users = await sor.R('users', {'mobile': ns.get('username'), 'del_flg': '0'}) + user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (ns.get('username'), tenant_orgid) + users = await sor.sqlExe(user_sql, {}) if users: user = users[0] else: diff --git a/b/user/mobilecode.dspy b/b/user/mobilecode.dspy index 3bb2a31..5b79bc5 100644 --- a/b/user/mobilecode.dspy +++ b/b/user/mobilecode.dspy @@ -65,10 +65,30 @@ async def handle_login_failed(mobile: str) -> bool: return True +async def get_mobilecode_tenant_orgid(sor, ns): + domain_name = ns.get('domain_name') + if (not domain_name) and ns.get('url_link'): + domain_name = ns.get('url_link').split("//")[1].split("/")[0] + if domain_name: + domain_name = domain_name.strip().replace('https://', '').replace('http://', '').replace('/', '') + if 'localhost' in domain_name: + domain_name = 'dev.opencomputing.cn' + reseller = await sor.R('reseller', {'domain_name': domain_name, 'del_flg': '0'}) + if len(reseller) >= 1: + return reseller[0]['orgid'] + org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'}) + if len(org) >= 1: + return org[0]['id'] + return None + async def mobilecode(ns): """发送短信验证码,支持注册和登录筛选""" db = DBPools() async with db.sqlorContext('kboss') as sor: + tenant_orgid = await get_mobilecode_tenant_orgid(sor, ns) + if not tenant_orgid: + return {'status': False, 'msg': '未找到当前域名所属租户'} + # 获取操作类型:register 或 login action_type = ns.get('action_type') # register 或 login @@ -81,11 +101,13 @@ async def mobilecode(ns): return {'status': False, 'msg': '手机号不能为空'} # 检查短信发送限制 - can_send = await handle_login_failed(mobile) + sms_limit_key = '%s:%s' % (tenant_orgid[:8], mobile) + can_send = await handle_login_failed(sms_limit_key) if not can_send: return {'status': False, 'msg': '发送过于频繁,请10分钟后再试'} - userreacs = await sor.R('users', {'mobile': mobile, 'del_flg': '0'}) + user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (mobile, tenant_orgid) + userreacs = await sor.sqlExe(user_sql, {}) # 注册逻辑:检查手机号是否已存在 if action_type == 'register': @@ -128,12 +150,14 @@ async def mobilecode(ns): # 原有逻辑:如果没有指定action_type,保持原有逻辑 else: type = 0 - ns['del_flg'] = '0' - userreacs = await sor.R('users', ns) + username = ns.get('username') + user_sql = """select * from users where username = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (username, tenant_orgid) + userreacs = await sor.sqlExe(user_sql, {}) if len(userreacs) >= 1: type += 1 else: - userreacs = await sor.R('users', {'mobile': ns['username'], 'del_flg': '0'}) + user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (username, tenant_orgid) + userreacs = await sor.sqlExe(user_sql, {}) if len(userreacs) >= 1: type += 1 if type >= 1: diff --git a/b/user/retrievecode.dspy b/b/user/retrievecode.dspy index 5ef7985..2453fef 100644 --- a/b/user/retrievecode.dspy +++ b/b/user/retrievecode.dspy @@ -1,14 +1,37 @@ +async def get_retrieve_tenant_orgid(sor, ns): + domain_name = ns.get('domain_name') + if (not domain_name) and ns.get('url_link'): + domain_name = ns.get('url_link').split("//")[1].split("/")[0] + if domain_name: + domain_name = domain_name.strip().replace('https://', '').replace('http://', '').replace('/', '') + if 'localhost' in domain_name: + domain_name = 'dev.opencomputing.cn' + reseller = await sor.R('reseller', {'domain_name': domain_name, 'del_flg': '0'}) + if len(reseller) >= 1: + return reseller[0]['orgid'] + org = await sor.R('organization', {'org_type': '0', 'del_flg': '0'}) + if len(org) >= 1: + return org[0]['id'] + return None + async def retrievecode(ns): """找回密码发送短信验证码""" db = DBPools() async with db.sqlorContext('kboss') as sor: + tenant_orgid = await get_retrieve_tenant_orgid(sor, ns) + if not tenant_orgid: + return {'status': False, 'msg': '未找到当前域名所属租户'} type = 0 - ns['del_flg'] = '0' - userreacs = await sor.R('users', ns) + username = ns.get('username') or ns.get('mobile') + if not username: + return {'status': False, 'msg': '用户标识不能为空'} + user_sql = """select * from users where username = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (username, tenant_orgid) + userreacs = await sor.sqlExe(user_sql, {}) if len(userreacs) >= 1: type += 1 else: - userreacs = await sor.R('users', {'mobile': ns['username'], 'del_flg': '0'}) + user_sql = """select * from users where mobile = '%s' and tenant_orgid = '%s' and del_flg = '0' limit 1;""" % (username, tenant_orgid) + userreacs = await sor.sqlExe(user_sql, {}) if len(userreacs) >= 1: type += 1 if type >= 1: