From af954dc59a2fd92754ebe84a21eb5e8e70384723 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Thu, 19 Mar 2026 16:39:07 +0800 Subject: [PATCH] update --- conf/config.json | 10 +++--- models/table_create.txt | 37 ++++++++++++++++++++ requirements.txt | Bin 0 -> 46 bytes smssend/__pycache__/smssend.cpython-310.pyc | Bin 6518 -> 6548 bytes smssend/smssend.py | 35 +++++++++--------- test/pwd_encry.py | 7 ++++ test/test_done.py | 0 test/test_smssend.py | 37 +++++++++++--------- 8 files changed, 86 insertions(+), 40 deletions(-) create mode 100644 models/table_create.txt create mode 100644 requirements.txt create mode 100644 test/pwd_encry.py create mode 100644 test/test_done.py diff --git a/conf/config.json b/conf/config.json index 9554370..1634353 100644 --- a/conf/config.json +++ b/conf/config.json @@ -1,6 +1,8 @@ { - "baidu_sms_access_key": "您的AK", - "baidu_sms_access_key_secret": "您的SK", - "baidu_sms_host": "sms.bj.baidubce.com", - "baidu_sms_signature_id": "您的短信签名ID" + "smsConfig": { + "baidu_sms_access_key": "ALTAKPk92fX9cgGDax83yNL8mP", + "baidu_sms_access_key_secret": "9b16b8efd4dc463d8bbd5462db1db8a5", + "baidu_sms_host": "sms.bj.baidubce.com", + "baidu_sms_signature_id": "sms-sign-xQYUwp42637" + } } \ No newline at end of file diff --git a/models/table_create.txt b/models/table_create.txt new file mode 100644 index 0000000..7c9f38f --- /dev/null +++ b/models/table_create.txt @@ -0,0 +1,37 @@ + CREATE TABLE `sms_template` ( + `id` varchar(32) NOT NULL COMMENT 'id', + `name` varchar(32) DEFAULT NULL COMMENT '模板名称', + `template_type` varchar(32) DEFAULT NULL COMMENT '模板类型', + `code` varchar(32) DEFAULT NULL COMMENT '模板编码', + `content` varchar(200) DEFAULT NULL COMMENT '模板内容', + `description` varchar(100) DEFAULT NULL COMMENT '场景说明', + `provider` varchar(100) DEFAULT NULL COMMENT '短信供应商名称', + `del_flg` varchar(1) DEFAULT '0' COMMENT '删除标志', + `create_at` timestamp NULL DEFAULT current_timestamp() COMMENT '创建时间戳', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='短信模板表'; + +CREATE TABLE `validatecode` ( + `id` varchar(32) NOT NULL COMMENT 'id', + `vcode` varchar(32) DEFAULT NULL COMMENT '验证码', + `expire_time` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '有效期', + `del_flg` varchar(1) DEFAULT '0' COMMENT '删除标志', + `create_at` timestamp NOT NULL DEFAULT current_timestamp() COMMENT '创建时间戳', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='验证码表'; + +CREATE TABLE `sms_record` ( + `id` varchar(32) NOT NULL COMMENT 'id', + `customerid` varchar(32) DEFAULT NULL COMMENT '客户id', + `send_type` varchar(32) DEFAULT NULL COMMENT '发送类型', + `mobile` varchar(15) DEFAULT NULL COMMENT '手机号', + `email` varchar(32) DEFAULT NULL COMMENT '邮箱', + `message` varchar(510) DEFAULT NULL COMMENT '发送内容', + `send_time` varchar(32) DEFAULT NULL COMMENT '发送时间', + `send_status` varchar(1) DEFAULT NULL COMMENT '发送状态', + `task_status` varchar(2) DEFAULT NULL COMMENT '任务状态 1:待发送,2:待定时发送,11:发送MQ成功,12:MQ消费成功,21:请求成功,22:请求失败,31:取消发送', + `remark` varchar(200) DEFAULT NULL COMMENT '发送失败备注信息', + `del_flg` varchar(1) DEFAULT NULL COMMENT '删除标志', + `create_at` timestamp NULL DEFAULT current_timestamp() COMMENT '创建时间戳', + PRIMARY KEY (`id`) USING BTREE +) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_general_ci ROW_FORMAT=DYNAMIC COMMENT='短信邮箱记录表'; diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..66e4e9f1338b8442d82347fc947c0d3a35599a97 GIT binary patch literal 46 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 dict: - db = DBPools() - async with db.sqlorContext('kboss') as sor: + env = ServerEnv() + async with get_sor_context(env, 'kboss') as sor: template_info = await sor.R('sms_template', {'name': stype, 'del_flg': '0'}) if template_info: template_id = template_info[0]['code'] @@ -126,8 +123,8 @@ class SMSEngine: return await self.send(stype, template_id, phone, vcode) async def __validation(self, stype, template_id, params, phone, resp) -> dict: - db = DBPools() - async with db.sqlorContext('kboss') as sor: + env = ServerEnv() + async with get_sor_context(env, 'kboss') as sor: send_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") log = { 'id': uuid(), @@ -153,10 +150,6 @@ class SMSEngine: code = ''.join(random.choices(string.digits, k=length)) code_id = uuid() expire_time = datetime.datetime.now() + datetime.timedelta(minutes=expire_minutes) - - # db = DBPools(config.databases) - # async with db.sqlorContext('kboss') as sor: - from sqlor.dbpools import get_sor_context env = ServerEnv() async with get_sor_context(env, 'kboss') as sor: await sor.C('validatecode', { @@ -166,11 +159,11 @@ class SMSEngine: 'del_flg': '0', 'create_at': datetime.datetime.now() }) - return code_id + return code_id, code async def check_sms_code(self, code_id: str, vcode: str) -> bool: - db = DBPools() - async with db.sqlorContext('kboss') as sor: + env = ServerEnv() + async with get_sor_context(env, 'kboss') as sor: code_info = await sor.R('validatecode', {'id': code_id, 'del_flg': '0'}) if not code_info: return False @@ -180,14 +173,18 @@ class SMSEngine: return False now = datetime.datetime.now() + # 处理 code_info['expire_time'] 为 datetime 对象 + if isinstance(code_info['expire_time'], str): + code_info['expire_time'] = datetime.datetime.fromisoformat(code_info['expire_time']) + if now > code_info['expire_time']: return False - await sor.U('validatecode', {'id': code_id}, {'del_flg': '1'}) + await sor.U('validatecode', {'id': code_id, 'del_flg': '1'}) return True - async def send_sms(self, phone: str, stype: str, params: dict) -> dict: - code_id = await self.generate_sms_code() + async def send_sms(self, phone: str, stype: str) -> dict: + code_id, code = await self.generate_sms_code() if code_id is None: return { 'status': 'error', @@ -196,7 +193,7 @@ class SMSEngine: } } - vcode = {'SMSvCode': params.get('vcode', '')} + vcode = {'SMSvCode': code} result = await self.send_vcode(phone, stype, vcode) if result.get('status'): diff --git a/test/pwd_encry.py b/test/pwd_encry.py new file mode 100644 index 0000000..30e4592 --- /dev/null +++ b/test/pwd_encry.py @@ -0,0 +1,7 @@ +from appPublic.aes import aes_encode_b64 +import sys + +encry_key = '!@#$%^&*(*&^%$QWERTYUIqwertyui234567' +pwd = 'lima2018' +code = aes_encode_b64(encry_key, pwd) +print(code) diff --git a/test/test_done.py b/test/test_done.py new file mode 100644 index 0000000..e69de29 diff --git a/test/test_smssend.py b/test/test_smssend.py index 375a413..ec57a54 100644 --- a/test/test_smssend.py +++ b/test/test_smssend.py @@ -30,7 +30,7 @@ async def get_vcode_from_db(codeid: str) -> dict: from sqlor.dbpools import DBPools db = DBPools() async with db.sqlorContext('kboss') as sor: - result = await sor.R('validatecode', {'id': codeid}) + result = await sor.R('validatecode', {'id': codeid, 'del_flg': '0'}) if result: return result[0] return None @@ -200,8 +200,8 @@ async def test_send_vcode(): print("测试8: send_vcode() - 发送验证码短信") print("=" * 50) - phone = "13800138000" - stype = "注册登录验证" + phone = "18053191417" + stype = "用户注册登录验证" vcode = {"SMSvCode": "123456"} result = await send_vcode(phone, stype, vcode) @@ -226,11 +226,10 @@ async def test_send_sms(): print("测试9: send_sms() - 发送短信(整合生成和发送)") print("=" * 50) - phone = "13800138000" - stype = "注册登录验证" - params = {"vcode": "666666"} + phone = "18053191417" + stype = "用户注册登录验证" - result = await send_sms(phone, stype, params) + result = await send_sms(phone, stype) print(f"发送结果: {result}") if result.get('status') == 'error': @@ -278,22 +277,22 @@ async def main(): results = [] - results.append(("get_sms_engine", await test_get_sms_engine())) + # results.append(("get_sms_engine", await test_get_sms_engine())) - r, codeid = await test_generate_sms_code() - results.append(("generate_sms_code", r)) + # r, codeid = await test_generate_sms_code() + # results.append(("generate_sms_code", r)) - r, codeid2 = await test_generate_sms_code_with_params() - results.append(("generate_sms_code(自定义参数)", r)) + # r, codeid2 = await test_generate_sms_code_with_params() + # results.append(("generate_sms_code(自定义参数)", r)) - results.append(("check_sms_code(错误验证码)", await test_check_sms_code_wrong())) + # results.append(("check_sms_code(错误验证码)", await test_check_sms_code_wrong())) results.append(("check_sms_code(正确验证码)", await test_check_sms_code_correct())) - results.append(("check_sms_code(无效codeid)", await test_check_sms_code_invalid_codeid())) - results.append(("check_sms_code(已过期)", await test_check_sms_code_expired())) + # results.append(("check_sms_code(无效codeid)", await test_check_sms_code_invalid_codeid())) + # results.append(("check_sms_code(已过期)", await test_check_sms_code_expired())) - results.append(("send_vcode", await test_send_vcode())) + # results.append(("send_vcode", await test_send_vcode())) results.append(("send_sms", await test_send_sms())) - results.append(("SMSEngine属性", await test_sms_engine_attributes())) + # results.append(("SMSEngine属性", await test_sms_engine_attributes())) print("\n" + "=" * 50) print("测试结果汇总") @@ -312,6 +311,10 @@ async def main(): print("-" * 50) print(f"总计: {passed} 通过, {failed} 失败") +from ahserver.serverenv import ServerEnv +env = ServerEnv() +def get_db_name(s=None): return 'kboss' +env.get_module_dbname = get_db_name if __name__ == '__main__': from sqlor.dbpools import DBPools