From f59c4a8ea75d300385ddb7349d35923c1e58c65d Mon Sep 17 00:00:00 2001 From: yumoqing Date: Fri, 3 Jan 2025 17:42:22 +0800 Subject: [PATCH 1/3] bugfix --- www/user/login.ui | 121 ++++++++++++++++++++ www/user/register.dspy | 9 ++ www/user/register.ui | 80 +++++++++++++ www/user/reset_password/reset_password.dspy | 3 +- www/user/up_login.dspy | 59 ++++++++++ www/user/user_panel.ui | 15 +++ www/user/wechat_login.ui | 5 + 7 files changed, 291 insertions(+), 1 deletion(-) create mode 100644 www/user/login.ui create mode 100644 www/user/register.dspy create mode 100644 www/user/register.ui create mode 100644 www/user/up_login.dspy create mode 100644 www/user/user_panel.ui create mode 100644 www/user/wechat_login.ui diff --git a/www/user/login.ui b/www/user/login.ui new file mode 100644 index 0000000..1ce2ddc --- /dev/null +++ b/www/user/login.ui @@ -0,0 +1,121 @@ +{ + "id":"login_window", + "widgettype":"PopupWindow", + "options":{ + "auto_open":true, + "anthor":"cc", + "cwidth":22, + "cheight":19 + }, + "subwidgets":[ +{ + "widgettype":"TabPanel", + "options":{ + "tab_wide":"auto", + "height":"100%", + "width":"100%", + "tab_pos":"top", + "items":[ + { + "name":"userpasswd", + "label":"用户密码", + "content":{ + "widgettype":"Form", + "options":{ + "cols":1, + "fields":[ + { + "name":"username", + "label":"用户名", + "uitype":"str" + }, + { + "name":"password", + "label":"密码", + "uitype":"password" + } + ] + }, + "binds":[ + { + "wid":"self", + "event":"submit", + "actiontype":"urlwidget", + "target":"self", + "options":{ + "method":"POST", + "url":"{{entire_url('up_login.dspy')}}" + } + } + ] + } + }, + { + "name":"checkcode", + "label":"手机验证码", + "content":{ + "widgettype":"Form", + "options":{ + "toolbar":{ + "tools":[ + { + "name":"gen_code", + "label":"发送验证码" + } + ] + }, + "description":"限中国国内手机", + "fields":[ + { + "name":"cell_no", + "label":"手机号", + "uitype":"str" + },{ + "name":"codeid", + "uitype":"hide", + "value":"{{uuid()}}" + },{ + "name":"check_code", + "uitype":"str" + } + ] + }, + "binds":[ + { + "wid":"self", + "event":"gen_code", + "actiontype":"urlwidget", + "datawidget":"self", + "datamethod":"getValue", + "target":"self", + "options":{ + "url":"{{entire_url('gen_code.dspy')}}" + } + }, + { + "wid":"self", + "event":"submit", + "actiontype":"urlwidget", + "target":"self", + "options":{ + "url":"{{entire_url('code_login.dspy')}}" + } + } + ] + } + }, + { + "name":"wechat", + "label":"微信", + "content":{ + "widgettype":"urlwidget", + "options":{ + "url":"{{entire_url('wechat_login.ui')}}" + } + } + } + ] + } +} + ] +} diff --git a/www/user/register.dspy b/www/user/register.dspy new file mode 100644 index 0000000..20232c3 --- /dev/null +++ b/www/user/register.dspy @@ -0,0 +1,9 @@ +debug(f'{params_kw=}') +db = DBPools() +dbname = await rfexe('get_module_dbname', 'sage') +async with db.sqlorContext(dbname) as sor: + orgid = await register_user(sor, params_kw) + # ownerid = await get_owner_orgid(sor) + # await openCustomerAccounts(sor, ownerid, orgid) + return UiMessage(title="Success", message="register success") +return UiError(title='Error', message="register failed") diff --git a/www/user/register.ui b/www/user/register.ui new file mode 100644 index 0000000..3a25c1d --- /dev/null +++ b/www/user/register.ui @@ -0,0 +1,80 @@ +{ + "widgettype":"PopupWindow", + "options":{ + "cwidth":22, + "height":"75%", + "archor":"cc", + "auto_open":true + }, + "subwidgets":[ + { + "widgettype":"Form", + "options":{ + "title":"user register", + "description":"base info we need is username, password and a cell phone number", + + "fields":[ + { + "name": "username", + "title": "\u7528\u6237\u540d", + "type": "str", + "length": 255, + "uitype": "str", + "datatype": "str", + "required":true, + "label": "\u7528\u6237\u540d" + }, + { + "name": "password", + "type": "str", + "length": 255, + "uitype": "password", + "datatype": "str", + "required":true, + "label": "\u5bc6\u7801" + }, + { + "name": "cfm_password", + "type": "str", + "length": 255, + "uitype": "password", + "datatype": "str", + "required":true, + "label": "\u5bc6\u7801" + }, + { + "name": "email", + "title": "\u90ae\u4ef6\u5730\u5740", + "type": "str", + "length": 255, + "uitype": "str", + "datatype": "str", + "required":true, + "label": "\u90ae\u4ef6\u5730\u5740" + }, + { + "name": "mobile", + "title": "\u624b\u673a", + "type": "str", + "length": 255, + "uitype": "str", + "datatype": "str", + "required":true, + "label": "\u624b\u673a" + } + ] + }, + "binds":[ + { + "wid":"self", + "event":"submit", + "actiontype":"urlwidget", + "target":"self", + "options":{ + "url":"{{entire_url('register.dspy')}}" + } + } + ] + } + ] +} diff --git a/www/user/reset_password/reset_password.dspy b/www/user/reset_password/reset_password.dspy index 1ce256e..367b902 100644 --- a/www/user/reset_password/reset_password.dspy +++ b/www/user/reset_password/reset_password.dspy @@ -10,7 +10,8 @@ ns = { 'password':params_kw.password } db = DBPools() -async with db.sqlorContext('sage') as sor: +dbname = await rfexe('get_module_dbname', 'rbac') +async with db.sqlorContext(dbname) as sor: await sor.U('users', ns) return UiMessage(title='Success', message='Password reset success') return UiError(title='Error', message='Reset password failed') diff --git a/www/user/up_login.dspy b/www/user/up_login.dspy new file mode 100644 index 0000000..2b27374 --- /dev/null +++ b/www/user/up_login.dspy @@ -0,0 +1,59 @@ + +debug(f'{params_kw=}, {password=}') +await rfexe('password', params_kw) +ns = { + "username":params_kw.username, + "password":params_kw.password +} + +info(f'{ns=}') +db = DBPools() +dbname = await rfexe('get_module_dbname', 'rbac') +async with db.sqlorContext(dbname) as sor: + r = await sor.sqlExe('select * from users where username=${username}$ and password=${password}$', ns.copy()) + if len(r) == 0: + return { + "widgettype":"Error", + "options":{ + "timeout":3, + "title":"Login Error", + "message":"user name or password error" + } + } + await remember_user(r[0].id, username=r[0].username, userorgid=r[0].orgid) + return { + "widgettype":"Message", + "options":{ + "timeout":3, + "auto_open":true, + "title":"Login", + "message":"Welcome back" + }, + "binds":[ + { + "wid":"self", + "event":"dismissed", + "actiontype":"urlwidget", + "target":"window", + "options":{ + "url":entire_url('/index.ui') + } + }, + { + "wid":"self", + "event":"opened", + "actiontype":"script", + "target":"window.login_window", + "script":"this.destroy()" + } + ] + } +return { + "widgettype":"Error", + "options":{ + "timeout":3, + "title":"Login Error", + "message":"system error" + } +} + diff --git a/www/user/user_panel.ui b/www/user/user_panel.ui new file mode 100644 index 0000000..361c407 --- /dev/null +++ b/www/user/user_panel.ui @@ -0,0 +1,15 @@ +{ + "id":"user_panel", + "widgettype":"VBox", + "options":{ + "width":"100px" + }, + "subwidgets":[ + { + "widgettype":"urlwidget", + "options":{ + "url":"{{entire_url('user.ui')}}" + } + } + ] +} diff --git a/www/user/wechat_login.ui b/www/user/wechat_login.ui new file mode 100644 index 0000000..9f65d1d --- /dev/null +++ b/www/user/wechat_login.ui @@ -0,0 +1,5 @@ +{ + "widgettype":"VBox", + "options":{ + } +} From 22b08435161dfad74437ac3b5451f45a33888d15 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Sat, 4 Jan 2025 15:19:32 +0800 Subject: [PATCH 2/3] bugfix --- models/userroles.xlsx | Bin 16359 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 models/userroles.xlsx diff --git a/models/userroles.xlsx b/models/userroles.xlsx deleted file mode 100644 index 8f26279d4c979320c52359b57d19d56c6240c30d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16359 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 to8 Date: Sat, 4 Jan 2025 15:23:33 +0800 Subject: [PATCH 3/3] bugfix --- models/userrole.xlsx | Bin 0 -> 16363 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 models/userrole.xlsx diff --git a/models/userrole.xlsx b/models/userrole.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..5104e7f0cb7aca46a6ffdf87434f8166fe6f5e38 GIT binary patch literal 16363 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 literal 0 HcmV?d00001