From ad601403cf499889606eab139f7a3c6cd3cd7bb2 Mon Sep 17 00:00:00 2001 From: yumoqing Date: Mon, 29 Jun 2026 15:12:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20users=20CRUD=20=E5=AE=9A=E5=88=B6=20api?= =?UTF-8?q?=20=E2=80=94=20=E6=96=B0=E5=A2=9E/=E7=BC=96=E8=BE=91=E5=AE=A2?= =?UTF-8?q?=E5=88=B6=E5=8C=96=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 不修改生成文件,改为 json/users.json 指定 custom URLs: - new_data_url → /rbac/api/add_user.dspy - update_data_url → /rbac/api/update_user.dspy 客制化修复: 1. 新增用户: created_at 默认当天日期 2. 新增/编辑: 清除 Tabular 发送的 _text 后缀字段 3. 编辑: 密码为空时不覆盖原密码 --- json/users.json | 2 + wwwroot/api/add_user.dspy | 58 +++++++++++++++++++++++++++ wwwroot/api/update_user.dspy | 78 ++++++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+) create mode 100644 wwwroot/api/add_user.dspy create mode 100644 wwwroot/api/update_user.dspy diff --git a/json/users.json b/json/users.json index c0f9a3f..987f277 100644 --- a/json/users.json +++ b/json/users.json @@ -2,6 +2,8 @@ "tblname": "users", "title":"用户", "params": { + "new_data_url": "{{entire_url('/rbac/api/add_user.dspy')}}", + "update_data_url": "{{entire_url('/rbac/api/update_user.dspy')}}", "sortby":"username", "confidential_fields":["password"], "logined_userorgid":"orgid", diff --git a/wwwroot/api/add_user.dspy b/wwwroot/api/add_user.dspy new file mode 100644 index 0000000..27e91e5 --- /dev/null +++ b/wwwroot/api/add_user.dspy @@ -0,0 +1,58 @@ + +ns = params_kw.copy() +for k,v in ns.items(): + if v == 'NaN' or v == 'null': + ns[k] = None +# remove _text suffix fields sent by Tabular (not real DB columns) +for k in list(ns.keys()): + if k.endswith('_text'): + ns.pop(k, None) +id = params_kw.id +if not id or len(id) > 32: + id = uuid() +ns['id'] = id + +if params_kw.get('password'): + ns['password'] = password_encode(params_kw.get('password')) + +ns['created_at'] = curDateString() + +userorgid = await get_userorgid() +if not userorgid: + return { + "widgettype":"Error", + "options":{ + "title":"Authorization Error", + "timeout":3, + "cwidth":16, + "cheight":9, + "message":"Please login" + } + } +ns['orgid'] = userorgid + +db = DBPools() +dbname = get_module_dbname('rbac') +async with db.sqlorContext(dbname) as sor: + r = await sor.C('users', ns.copy()) + return { + "widgettype":"Message", + "options":{ + "cwidth":16, + "cheight":9, + "title":"Add Success", + "timeout":3, + "message":"ok" + } + } + +return { + "widgettype":"Error", + "options":{ + "title":"Add Error", + "cwidth":16, + "cheight":9, + "timeout":3, + "message":"failed" + } +} diff --git a/wwwroot/api/update_user.dspy b/wwwroot/api/update_user.dspy new file mode 100644 index 0000000..51e49e5 --- /dev/null +++ b/wwwroot/api/update_user.dspy @@ -0,0 +1,78 @@ + +ns = params_kw.copy() +for k,v in ns.items(): + if v == 'NaN' or v == 'null': + ns[k] = None +# remove _text suffix fields sent by Tabular (not real DB columns) +for k in list(ns.keys()): + if k.endswith('_text'): + ns.pop(k, None) + +userorgid = await get_userorgid() +if not userorgid: + return { + "widgettype":"Error", + "options":{ + "title":"Authorization Error", + "timeout":3, + "cwidth":16, + "cheight":9, + "message":"Please login" + } + } +ns['orgid'] = userorgid + + +if params_kw.get('password'): + ns['password'] = password_encode(params_kw.get('password')) +else: + ns.pop('password', None) + + +db = DBPools() +dbname = get_module_dbname('rbac') +async with db.sqlorContext(dbname) as sor: + + ns1 = { + + "orgid": userorgid, + + + "id": params_kw.id + } + recs = await sor.R('users', ns1) + if len(recs) < 1: + return { + "widgettype":"Error", + "options":{ + "title":"Update Error", + "cwidth":16, + "cheight":9, + "timeout":3, + "message":"Record no exist or with wrong ownership" + } + } + + r = await sor.U('users', ns) + debug('update success'); + return { + "widgettype":"Message", + "options":{ + "title":"Update Success", + "cwidth":16, + "cheight":9, + "timeout":3, + "message":"ok" + } + } + +return { + "widgettype":"Error", + "options":{ + "title":"Update Error", + "cwidth":16, + "cheight":9, + "timeout":3, + "message":"failed" + } +}