chore: commit pending local changes (2026-09-17 github sync)

This commit is contained in:
yumoqing 2026-09-17 13:46:06 +08:00
parent 5c92b202dd
commit ac7f0d5267
8 changed files with 31 additions and 31 deletions

View File

@ -4,7 +4,7 @@
"subwidgets": [ "subwidgets": [
{ {
"widgettype": "Text", "widgettype": "Text",
"options": {"text": "产品类别管理", "fontSize": "20px", "fontWeight": "bold", "marginBottom": "16px"} "options": {"otext": "产品类别管理", "text": "产品类别管理", "i18n": true, "fontSize": "20px", "fontWeight": "bold", "marginBottom": "16px"}
}, },
{ {
"widgettype": "Html", "widgettype": "Html",

View File

@ -18,7 +18,7 @@
{ {
"widgettype": "Title2", "widgettype": "Title2",
"options": { "options": {
"text": "产品管理", "otext": "产品管理", "text": "产品管理", "i18n": true,
"fontWeight": "700" "fontWeight": "700"
} }
}, },
@ -28,7 +28,7 @@
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "产品类别与产品信息管理", "otext": "产品类别与产品信息管理", "text": "产品类别与产品信息管理", "i18n": true,
"fontSize": "14px" "fontSize": "14px"
} }
} }
@ -65,14 +65,14 @@
{ {
"widgettype": "Title5", "widgettype": "Title5",
"options": { "options": {
"text": "产品类别管理", "otext": "产品类别管理", "text": "产品类别管理", "i18n": true,
"fontWeight": "600" "fontWeight": "600"
} }
}, },
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "管理产品类别树结构,配置类别属性", "otext": "管理产品类别树结构,配置类别属性", "text": "管理产品类别树结构,配置类别属性", "i18n": true,
"fontSize": "12px" "fontSize": "12px"
} }
} }
@ -101,14 +101,14 @@
{ {
"widgettype": "Title5", "widgettype": "Title5",
"options": { "options": {
"text": "产品管理", "otext": "产品管理", "text": "产品管理", "i18n": true,
"fontWeight": "600" "fontWeight": "600"
} }
}, },
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "添加和管理产品,配置产品信息", "otext": "添加和管理产品,配置产品信息", "text": "添加和管理产品,配置产品信息", "i18n": true,
"fontSize": "12px" "fontSize": "12px"
} }
} }

View File

@ -4,7 +4,7 @@
"subwidgets": [ "subwidgets": [
{ {
"widgettype": "Text", "widgettype": "Text",
"options": {"text": "产品管理", "fontSize": "20px", "fontWeight": "bold", "marginBottom": "16px"} "options": {"otext": "产品管理", "text": "产品管理", "i18n": true, "fontSize": "20px", "fontWeight": "bold", "marginBottom": "16px"}
}, },
{ {
"widgettype": "Html", "widgettype": "Html",

View File

@ -3,7 +3,7 @@ userid = await get_user()
dbname = get_module_dbname('product_management') dbname = get_module_dbname('product_management')
if not product_id: if not product_id:
result = {'widgettype': 'Text', 'options': {'text': '请选择一个产品'}} result = {'widgettype': 'Text', 'options': {'otext': '请选择一个产品', 'text': '请选择一个产品', 'i18n': True}}
else: else:
async with DBPools().sqlorContext(dbname) as sor: async with DBPools().sqlorContext(dbname) as sor:
sql = """SELECT p.*, pc.name as category_name, pc.description as category_description sql = """SELECT p.*, pc.name as category_name, pc.description as category_description
@ -13,7 +13,7 @@ else:
recs = await sor.sqlExe(sql, {'id': product_id}) recs = await sor.sqlExe(sql, {'id': product_id})
if not recs: if not recs:
result = {'widgettype': 'Text', 'options': {'text': '产品不存在或已下架'}} result = {'widgettype': 'Text', 'options': {'otext': '产品不存在或已下架', 'text': '产品不存在或已下架', 'i18n': True}}
else: else:
p = recs[0] p = recs[0]
price_text = f"¥{float(p.price or 0):.2f}" if p.price else '按量计费' price_text = f"¥{float(p.price or 0):.2f}" if p.price else '按量计费'
@ -94,7 +94,7 @@ else:
buttons.append({ buttons.append({
'widgettype': 'Text', 'widgettype': 'Text',
'options': { 'options': {
'text': '登录后即可购买', 'otext': '登录后即可购买', 'text': '登录后即可购买', 'i18n': True,
'fontSize': '13px', 'fontSize': '13px',
'color': '#999' 'color': '#999'
} }

View File

@ -3,7 +3,7 @@ org_id = (await get_userorgid()) or '0'
dbname = get_module_dbname('product_management') dbname = get_module_dbname('product_management')
if not category_id: if not category_id:
result = {'widgettype': 'Text', 'options': {'text': '请从左侧选择一个产品分类'}} result = {'widgettype': 'Text', 'options': {'otext': '请从左侧选择一个产品分类', 'text': '请从左侧选择一个产品分类', 'i18n': True}}
else: else:
async with DBPools().sqlorContext(dbname) as sor: async with DBPools().sqlorContext(dbname) as sor:
# Get all sub-category IDs recursively # Get all sub-category IDs recursively
@ -43,7 +43,7 @@ else:
products = await sor.sqlExe(sql, params) products = await sor.sqlExe(sql, params)
if not products: if not products:
result = {'widgettype': 'Text', 'options': {'text': '该分类下暂无产品'}} result = {'widgettype': 'Text', 'options': {'otext': '该分类下暂无产品', 'text': '该分类下暂无产品', 'i18n': True}}
else: else:
cards = [] cards = []
for p in products: for p in products:

View File

@ -1,10 +1,10 @@
# 我的权益:订阅列表 + 到期状态 + 续费入口 # 我的权益:订阅列表 + 到期状态 + 续费入口
from ahserver.serverenv import ServerEnv from ahserver.serverenv import ServerEnv
userid = await get_user() userid = await get_user()
result = {'widgettype': 'Text', 'options': {'text': '加载中...'}} result = {'widgettype': 'Text', 'options': {'otext': '加载中...', 'text': '加载中...', 'i18n': True}}
if not userid: if not userid:
result = {'widgettype': 'Text', 'options': {'text': '请先登录', 'color': '#999'}} result = {'widgettype': 'Text', 'options': {'otext': '请先登录', 'text': '请先登录', 'i18n': True, 'color': '#999'}}
else: else:
try: try:
env = ServerEnv() env = ServerEnv()
@ -16,7 +16,7 @@ else:
'options': {'width': '100%', 'padding': '24px', 'alignItems': 'center'}, 'options': {'width': '100%', 'padding': '24px', 'alignItems': 'center'},
'subwidgets': [ 'subwidgets': [
{'widgettype': 'Text', 'options': { {'widgettype': 'Text', 'options': {
'text': '暂无已购权益,请先前往产品商城购买', 'otext': '暂无已购权益,请先前往产品商城购买', 'text': '暂无已购权益,请先前往产品商城购买', 'i18n': True,
'fontSize': '14px', 'color': '#999'}} 'fontSize': '14px', 'color': '#999'}}
] ]
} }
@ -107,7 +107,7 @@ else:
'options': {'width': '100%', 'padding': '16px', 'overflowY': 'auto'}, 'options': {'width': '100%', 'padding': '16px', 'overflowY': 'auto'},
'subwidgets': [ 'subwidgets': [
{'widgettype': 'Title4', 'options': { {'widgettype': 'Title4', 'options': {
'text': '我的权益 (%d 项)' % len(subs), 'fontWeight': '700', 'otext': "我的权益 (${p0} 项)", 'text': "我的权益 (${p0} 项)", 'i18n': True, 'i18n_params': {"p0": str('%d' % (len(subs),))}, 'fontWeight': '700',
'marginBottom': '16px'}}, 'marginBottom': '16px'}},
{'widgettype': 'VBox', 'options': {'width': '100%'}, 'subwidgets': cards} {'widgettype': 'VBox', 'options': {'width': '100%'}, 'subwidgets': cards}
] ]

View File

@ -2,12 +2,12 @@
from ahserver.serverenv import ServerEnv from ahserver.serverenv import ServerEnv
product_id = params_kw.get('product_id', '') product_id = params_kw.get('product_id', '')
userid = await get_user() userid = await get_user()
result = {'widgettype': 'Text', 'options': {'text': '加载中...'}} result = {'widgettype': 'Text', 'options': {'otext': '加载中...', 'text': '加载中...', 'i18n': True}}
if not product_id: if not product_id:
result = {'widgettype': 'Text', 'options': {'text': '缺少产品ID', 'color': '#e74c3c'}} result = {'widgettype': 'Text', 'options': {'otext': '缺少产品ID', 'text': '缺少产品ID', 'i18n': True, 'color': '#e74c3c'}}
elif not userid: elif not userid:
result = {'widgettype': 'Text', 'options': {'text': '请先登录后购买', 'color': '#e74c3c'}} result = {'widgettype': 'Text', 'options': {'otext': '请先登录后购买', 'text': '请先登录后购买', 'i18n': True, 'color': '#e74c3c'}}
else: else:
userorgid = await get_userorgid() userorgid = await get_userorgid()
dbname = get_module_dbname('product_management') dbname = get_module_dbname('product_management')
@ -138,7 +138,7 @@ else:
'options': {'padding': '8px 0', 'gap': '8px', 'alignItems': 'center'}, 'options': {'padding': '8px 0', 'gap': '8px', 'alignItems': 'center'},
'subwidgets': [ 'subwidgets': [
{'widgettype': 'Text', 'options': { {'widgettype': 'Text', 'options': {
'text': '购买容量(GB)', 'width': '90px', 'fontSize': '13px', 'color': '#666'}}, 'otext': '购买容量(GB)', 'text': '购买容量(GB)', 'i18n': True, 'width': '90px', 'fontSize': '13px', 'color': '#666'}},
{'widgettype': 'UiInt', 'id': 'buy_storage_gb', {'widgettype': 'UiInt', 'id': 'buy_storage_gb',
'options': {'name': 'buy_storage_gb', 'value': 100, 'width': '120px'}, 'options': {'name': 'buy_storage_gb', 'value': 100, 'width': '120px'},
'binds': _price_bind} 'binds': _price_bind}
@ -149,7 +149,7 @@ else:
'options': {'padding': '8px 0', 'gap': '8px', 'alignItems': 'center'}, 'options': {'padding': '8px 0', 'gap': '8px', 'alignItems': 'center'},
'subwidgets': [ 'subwidgets': [
{'widgettype': 'Text', 'options': { {'widgettype': 'Text', 'options': {
'text': '购买月数', 'width': '90px', 'fontSize': '13px', 'color': '#666'}}, 'otext': '购买月数', 'text': '购买月数', 'i18n': True, 'width': '90px', 'fontSize': '13px', 'color': '#666'}},
{'widgettype': 'UiInt', 'id': 'buy_valid_months', {'widgettype': 'UiInt', 'id': 'buy_valid_months',
'options': {'name': 'buy_valid_months', 'value': 1, 'width': '120px'}, 'options': {'name': 'buy_valid_months', 'value': 1, 'width': '120px'},
'binds': _price_bind} 'binds': _price_bind}
@ -163,11 +163,11 @@ else:
'options': {'padding': '8px 0', 'gap': '8px', 'alignItems': 'center'}, 'options': {'padding': '8px 0', 'gap': '8px', 'alignItems': 'center'},
'subwidgets': [ 'subwidgets': [
{'widgettype': 'Text', 'options': { {'widgettype': 'Text', 'options': {
'text': '订阅周期', 'width': '90px', 'fontSize': '13px', 'color': '#666'}}, 'otext': '订阅周期', 'text': '订阅周期', 'i18n': True, 'width': '90px', 'fontSize': '13px', 'color': '#666'}},
{'widgettype': 'UiCode', 'id': 'buy_charge_mode', {'widgettype': 'UiCode', 'id': 'buy_charge_mode',
'options': {'name': 'buy_charge_mode', 'value': 'month', 'width': '200px', 'options': {'name': 'buy_charge_mode', 'value': 'month', 'width': '200px',
'data': [{'value': 'month', 'text': '包月(30天)'}, 'data': [{'value': 'month', 'otext': '包月(30天)', 'text': '包月(30天)', 'i18n': True},
{'value': 'year', 'text': '包年(365天,付10个月)'}]}, {'value': 'year', 'otext': '包年(365天,付10个月)', 'text': '包年(365天,付10个月)', 'i18n': True}]},
'binds': _price_bind} 'binds': _price_bind}
] ]
}) })
@ -264,14 +264,14 @@ else:
'widgettype': 'VBox', 'widgettype': 'VBox',
'options': {'width': '100%', 'padding': '16px'}, 'options': {'width': '100%', 'padding': '16px'},
'subwidgets': [ 'subwidgets': [
{'widgettype': 'Title4', 'options': {'text': '确认购买', 'fontWeight': '700', 'marginBottom': '12px'}}, {'widgettype': 'Title4', 'options': {'otext': '确认购买', 'text': '确认购买', 'i18n': True, 'fontWeight': '700', 'marginBottom': '12px'}},
{'widgettype': 'VBox', 'options': {'gap': '0', 'marginBottom': '8px'}, 'subwidgets': rows}, {'widgettype': 'VBox', 'options': {'gap': '0', 'marginBottom': '8px'}, 'subwidgets': rows},
{'widgettype': 'VBox', 'options': {'gap': '0', 'marginBottom': '8px'}, 'subwidgets': param_widgets}, {'widgettype': 'VBox', 'options': {'gap': '0', 'marginBottom': '8px'}, 'subwidgets': param_widgets},
price_text_widget, price_text_widget,
{ {
'widgettype': 'Text', 'widgettype': 'Text',
'options': { 'options': {
'text': '支付将从账户余额实时扣款并完成记账,购买成功后权益立即生效。', 'otext': '支付将从账户余额实时扣款并完成记账,购买成功后权益立即生效。', 'text': '支付将从账户余额实时扣款并完成记账,购买成功后权益立即生效。', 'i18n': True,
'fontSize': '12px', 'color': '#999', 'marginTop': '8px'} 'fontSize': '12px', 'color': '#999', 'marginTop': '8px'}
}, },
{'widgettype': 'HBox', 'options': {'gap': '12px', 'marginTop': '8px'}, {'widgettype': 'HBox', 'options': {'gap': '12px', 'marginTop': '8px'},

View File

@ -154,7 +154,7 @@
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "规划中", "otext": "规划中", "text": "规划中", "i18n": true,
"fontSize": "14px", "fontSize": "14px",
"color": "#94a3b8", "color": "#94a3b8",
"fontWeight": "600" "fontWeight": "600"
@ -212,7 +212,7 @@
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "敬请期待", "otext": "敬请期待", "text": "敬请期待", "i18n": true,
"fontSize": "13px", "fontSize": "13px",
"color": "#94a3b8" "color": "#94a3b8"
} }
@ -241,7 +241,7 @@
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "按量付费", "otext": "按量付费", "text": "按量付费", "i18n": true,
"fontSize": "13px", "fontSize": "13px",
"color": "#e74c3c", "color": "#e74c3c",
"fontWeight": "600" "fontWeight": "600"
@ -282,7 +282,7 @@
{ {
"widgettype": "Text", "widgettype": "Text",
"options": { "options": {
"text": "登录后购买", "otext": "登录后购买", "text": "登录后购买", "i18n": true,
"fontSize": "13px", "fontSize": "13px",
"color": "#94a3b8" "color": "#94a3b8"
} }