From eaf75a1b7a897f00f9a707a9031609bb8678d674 Mon Sep 17 00:00:00 2001 From: shy Date: Tue, 17 Jun 2025 14:54:43 +0800 Subject: [PATCH] add some --- src/gonganxitong/common.go | 2 + src/gonganxitong/portal.css | 9 ++- src/gonganxitong/portal.go | 1 + src/gonganxitong/template/common.go | 3 + src/renzhengshouquan/account.go | 12 ++- src/renzhengshouquan/common.go | 10 +++ src/renzhengshouquan/model/model.go | 112 ++++++++++++++-------------- src/renzhengshouquan/portal.json | 3 + src/renzhengshouquan/profile.go | 1 + src/renzhengshouquan/transition.go | 66 +++++++++++----- src/renzhengshouquan/transition.js | 12 ++- 11 files changed, 148 insertions(+), 83 deletions(-) diff --git a/src/gonganxitong/common.go b/src/gonganxitong/common.go index 8efb135..c5f74db 100644 --- a/src/gonganxitong/common.go +++ b/src/gonganxitong/common.go @@ -427,11 +427,13 @@ func (s Table) Link(m *ice.Message, arg ...string) string { return m.Cmdx(s.PrefixPortal(m), s.Link, arg) } func (s Table) WaitWorkerCreate(m *ice.Message, help string) { + kit.If(help == "", func() { help = m.GetCommand().Help }) kit.If(!s.IsWorker(m), func() { kit.If(m.Action().Length() == 0, func() { m.SetResult("请等待「工作人员」创建" + help) }) }) } func (s Table) WaitLeaderCreate(m *ice.Message, help string) { + kit.If(help == "", func() { help = m.GetCommand().Help }) kit.If(!s.IsLeader(m), func() { kit.If(m.Action().Length() == 0, func() { m.SetResult("请等待「管理人员」创建" + help) }) }) diff --git a/src/gonganxitong/portal.css b/src/gonganxitong/portal.css index 19d44a6..39743b0 100644 --- a/src/gonganxitong/portal.css +++ b/src/gonganxitong/portal.css @@ -15,6 +15,11 @@ $action div.item.text.filter i { padding-left:10px; } $action div.item.text.filter span { right:5px; } $action div.item.text.filter input { border-radius:20px; border:none; padding-left:32px; padding-right:32px; width:100%; } $action div.item.text.filter input:focus { border:var(--box-border); } +$action div.item.user_info img { height:32px; border-radius:20px; margin-left:10px; } +$action div.item.user_info { padding:10px; } +$action div.item.user_info>div.name { display:flex; flex-direction:column; align-items:end; } +$action div.item.user_info>div.name>span.time { font-size:10px; color:var(--disable-fg-color); } +$action div.item.space { flex-grow:1; } fieldset>div.output>div.tabs { display:flex; } fieldset.input.key>div.output>div.tabs { display:none; } fieldset>div.output>div.tabs>div.item { padding:5px; line-height:20px; } @@ -48,6 +53,7 @@ $output>div>div.list>div.output>div.item.index span { font-size:12px; white-spac $output>div>div.list div.code { text-align:center; } $output>div>div.list div.code input { background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:18px; margin:auto; margin-top:10px; min-width:200px; display:block; } $output>div>div.list fieldset.story>div.output { background-color:var(--plugin-bg-color); } +$output.public>div>div.list.myplace { position:sticky; top:0; z-index:3; } $output>div>div.list.myplace>div.output { max-height:320px; } $output>div>div.list.myplace>div.output>div.item>div.output div.title { margin-bottom:5px; } $output:not(.public)>div>div.list.myplace>div.output>div.item { padding:0 10px; } @@ -154,6 +160,7 @@ $output fieldset.story>form.option { display:none; } $output fieldset.story>div.action { display:none; } $output fieldset.story>div.status { display:none; } $output fieldset.story>div.output { background-color:var(--plugin-bg-color); } +$output fieldset.story>div.output>div.place_info { position:sticky; top:0; z-index:3; } $output fieldset.story>div.output table.content td { box-shadow:none; } $output fieldset.story>div.output table.content.detail td:last-child { text-align:left; } $output fieldset.story>div.output table.content td img { max-width:100%; } @@ -168,7 +175,7 @@ $output fieldset.story>div.output>div.code div.item.button input[type=button] { $output fieldset.story>div.output>div.code div.item.button input[type=button][name=cancel] { border:var(--box-border); background-color:var(--danger-bg-color); color:var(--danger-fg-color); } $output fieldset.story>div.output>div.code div.item.button.danger input[type=button] { background-color:var(--danger-bg-color); color:var(--danger-fg-color); } $output fieldset.story>div.output>div.info>input[type=button] { box-shadow:var(--box-shadow); border:none; background-color:var(--notice-bg-color); color:var(--notice-fg-color); font-size:20px; height:48px; width:100%; max-width:320px; } -$output fieldset.story>div.output>div.info { padding:10px 20px; text-align:center; } +$output fieldset.story>div.output>div.info { padding:10px 20px; text-align:center; white-space:pre; } $output>fieldset.story>div.output div.item.card>div.output { padding:10px; width:100%; } $output>fieldset.story>div.output div.item.card>div.output div.output { padding:5px 0; white-space:pre-line; } $output>fieldset.story>div.output div.item.card.loaded>div.output { background-color:var(--plugin-bg-color); } diff --git a/src/gonganxitong/portal.go b/src/gonganxitong/portal.go index d3fec31..c82fb22 100644 --- a/src/gonganxitong/portal.go +++ b/src/gonganxitong/portal.go @@ -93,6 +93,7 @@ func (s Portal) Run(m *ice.Message, arg ...string) { }() m.OptionDefault(model.FROM_USER_UID, m.Option(ice.MSG_USERUID)) m.OptionDefault(model.TO_USER_UID, m.Option(model.USER_UID)) + m.OptionDefault(model.TO_USER_UID, m.Option(ice.MSG_USERUID)) m.Option(model.USER_UID, m.Option(ice.MSG_USERUID)) m.Option(model.PLACE_UID, m.Option(s.Keys(s.Place, model.UID))) m.Option(model.COMMAND_UID, CommandUID(m, arg[0])) diff --git a/src/gonganxitong/template/common.go b/src/gonganxitong/template/common.go index d3e517d..942da6a 100644 --- a/src/gonganxitong/template/common.go +++ b/src/gonganxitong/template/common.go @@ -25,6 +25,9 @@ func (s Table) Inputs(m *ice.Message, arg ...string) { } func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message { m.RewriteAppend(func(value, key string, index int) string { + if _, e := strconv.ParseInt(value, 10, 64); e != nil { + return value + } switch key { case model.USER_{{.Option "CLASS"}}_ROLE: value = User{{.Option "Class"}}Role(kit.Int(value)).String() diff --git a/src/renzhengshouquan/account.go b/src/renzhengshouquan/account.go index 73145ab..d3f7528 100644 --- a/src/renzhengshouquan/account.go +++ b/src/renzhengshouquan/account.go @@ -14,11 +14,17 @@ type account struct { create string `name:"create account_type*" role:"leader"` createDefault string `name:"createDefault" role:"leader" help:"开通默认账户"` remove string `name:"remove" role:"leader"` - recharge string `name:"recharge amount*" role:"leader" help:"充值"` - transfer string `name:"transfer amount* to_account_uid*:select" role:"leader" help:"转账"` - withdraw string `name:"withdraw amount*" role:"leader" help:"提现"` + recharge string `name:"recharge amount* title content" role:"leader" help:"充值"` + transfer string `name:"transfer amount* to_account_uid*:select title content" role:"leader" help:"转账"` + withdraw string `name:"withdraw amount* title content" role:"leader" help:"提现"` } +func (s account) SelectDefault(m *ice.Message, arg ...string) { + s.Tables(m, Auth{}, "LEFT JOIN user_auths ON auths.uid = user_auths.auth_uid") + s.Fields(m, s.Key(s, model.UID), s.Key(Auth{}, model.NAME), s.Key(Auth{}, model.AVATAR), model.AUTH_STATUS, model.AUTH_TYPE) + s.Select(m, "user_auths.user_uid = ? AND (role = 1 OR role = 2)", arg[0]) + s.authSort(m) +} func (s account) CreateDefault(m *ice.Message, arg ...string) { s.ValueCreate(m, arg...) } diff --git a/src/renzhengshouquan/common.go b/src/renzhengshouquan/common.go index 19cb304..bb16635 100644 --- a/src/renzhengshouquan/common.go +++ b/src/renzhengshouquan/common.go @@ -27,10 +27,18 @@ func (s Table) Inputs(m *ice.Message, arg ...string) { s.InputsList(m, AuthStatusList, arg...) case model.ACCOUNT_TYPE: s.InputsList(m, AccountTypeList, arg...) + case model.TRANSITION_TYPE: + s.InputsList(m, TransitionTypeList, arg...) case model.FROM_UID: if AuthType(kit.Int(m.Option(model.AUTH_TYPE))) == AuthRoot { m.Push(arg[0], aaa.ROOT) } + case model.FROM_ACCOUNT_UID: + m.Cmdy(account{}, "selectDefault", m.Option(model.FROM_USER_UID)) + m.Display("account_inputs.js").Option("_input_args", model.UID, model.NAME, model.AVATAR) + case model.TO_ACCOUNT_UID: + m.Cmdy(account{}, "selectDefault", m.Option(model.TO_USER_UID)) + m.Display("account_inputs.js").Option("_input_args", model.UID, model.NAME, model.AVATAR) default: s.Table.Inputs(m, arg...) } @@ -51,6 +59,8 @@ func (s Table) RewriteAppend(m *ice.Message, arg ...string) *ice.Message { value = CertStatus(kit.Int(value)).String() case model.TRANSITION_TYPE: value = TransitionType(kit.Int(value)).String() + case model.TRANSITION_AMOUNT: + value = kit.Format("%.2f", kit.Float(value)/100) } return value }) diff --git a/src/renzhengshouquan/model/model.go b/src/renzhengshouquan/model/model.go index 7100a26..9d6065a 100644 --- a/src/renzhengshouquan/model/model.go +++ b/src/renzhengshouquan/model/model.go @@ -3,59 +3,61 @@ package model import "shylinux.com/x/mysql-story/src/db" const ( - UID = "uid" - NAME = "name" - INFO = "info" - TYPE = "type" - ROLE = "role" - STATUS = "status" - AMOUNT = "amount" - SCORE = "score" - TITLE = "title" - CONTENT = "content" - AVATAR = "avatar" - BACKGROUND = "background" - USER_UID = "user_uid" - USER_AUTH_ROLE = "user_auth_role" - AUTH_UID = "auth_uid" - AUTH_NAME = "auth_name" - AUTH_INFO = "auth_info" - AUTH_TYPE = "auth_type" - AUTH_STATUS = "auth_status" - AUTH_AVATAR = "auth_avatar" - CERT_UID = "cert_uid" - CERT_STATUS = "cert_status" - ACCOUNT_TYPE = "account_type" - FROM_ACCOUNT_UID = "from_account_uid" - TO_ACCOUNT_UID = "to_account_uid" - TRANSITION_TYPE = "transition_type" - PLACE_NAME = "place_name" - STREET_NAME = "street_name" - COMPANY_UID = "company_uid" - COMPANY_NAME = "company_name" - CITY_UID = "city_uid" - CITY_NAME = "city_name" - FROM_UID = "from_uid" - FROM_USER_UID = "from_user_uid" - TO_USER_UID = "to_user_uid" - PLACE_UID = "place_uid" - VALUE_UID = "value_uid" - SERVICE_UID = "service_uid" - DASHBOARD_UID = "dashboard_uid" - STORAGE_UID = "storage_uid" - SPACE = "space" - INDEX = "index" - VALUE = "value" - PATH = "path" - NUMBER = "number" - BIRTH = "birth" - PERIOD = "period" - PERSON = "person" - AUTHOR = "author" - ADDRESS = "address" - MOBILE = "mobile" - VERIFY = "verify" - VENDOR = "vendor" + UID = "uid" + ICON = "icon" + NAME = "name" + INFO = "info" + TYPE = "type" + ROLE = "role" + STATUS = "status" + AMOUNT = "amount" + SCORE = "score" + TITLE = "title" + CONTENT = "content" + AVATAR = "avatar" + BACKGROUND = "background" + USER_UID = "user_uid" + USER_AUTH_ROLE = "user_auth_role" + AUTH_UID = "auth_uid" + AUTH_NAME = "auth_name" + AUTH_INFO = "auth_info" + AUTH_TYPE = "auth_type" + AUTH_STATUS = "auth_status" + AUTH_AVATAR = "auth_avatar" + CERT_UID = "cert_uid" + CERT_STATUS = "cert_status" + ACCOUNT_TYPE = "account_type" + FROM_ACCOUNT_UID = "from_account_uid" + TO_ACCOUNT_UID = "to_account_uid" + TRANSITION_TYPE = "transition_type" + TRANSITION_AMOUNT = "transition_amount" + PLACE_NAME = "place_name" + STREET_NAME = "street_name" + COMPANY_UID = "company_uid" + COMPANY_NAME = "company_name" + CITY_UID = "city_uid" + CITY_NAME = "city_name" + FROM_UID = "from_uid" + FROM_USER_UID = "from_user_uid" + TO_USER_UID = "to_user_uid" + PLACE_UID = "place_uid" + VALUE_UID = "value_uid" + SERVICE_UID = "service_uid" + DASHBOARD_UID = "dashboard_uid" + STORAGE_UID = "storage_uid" + SPACE = "space" + INDEX = "index" + VALUE = "value" + PATH = "path" + NUMBER = "number" + BIRTH = "birth" + PERIOD = "period" + PERSON = "person" + AUTHOR = "author" + ADDRESS = "address" + MOBILE = "mobile" + VERIFY = "verify" + VENDOR = "vendor" ) type UserAuth struct { @@ -93,7 +95,7 @@ type Cert struct { Verify string `gorm:"type:varchar(16)"` } type Account struct { - db.ModelWithUID + db.ModelContent AuthUID string `gorm:"type:char(32);index"` UserUID string `gorm:"type:char(32);index"` Type uint8 `gorm:"default:0"` @@ -101,7 +103,7 @@ type Account struct { Amount int `gorm:"default:0"` } type Transition struct { - db.ModelWithUID + db.ModelContent AuthUID string `gorm:"type:char(32);index"` UserUID string `gorm:"type:char(32);index"` FromAccountUID string `gorm:"type:char(32);index"` diff --git a/src/renzhengshouquan/portal.json b/src/renzhengshouquan/portal.json index e2c21e4..173642b 100644 --- a/src/renzhengshouquan/portal.json +++ b/src/renzhengshouquan/portal.json @@ -26,6 +26,9 @@ "auth_name": "认证主体", "auth_type": "认证类型", "auth_status": "认证状态", + "transition_type": "流水类型", + "from_account_uid": "来自", + "to_account_uid": "转给", "mobile": "手机号", "verify": "验证码", "from_uid": "认证机构", diff --git a/src/renzhengshouquan/profile.go b/src/renzhengshouquan/profile.go index 969c5d4..c3f5d79 100644 --- a/src/renzhengshouquan/profile.go +++ b/src/renzhengshouquan/profile.go @@ -11,6 +11,7 @@ import ( type profile struct { Auth order string `data:"3"` + role string `data:""` modify string `name:"modify info" role:"leader"` upload string `name:"upload" role:"leader"` authList string `name:"authList" role:"void"` diff --git a/src/renzhengshouquan/transition.go b/src/renzhengshouquan/transition.go index 0f02913..e54bc93 100644 --- a/src/renzhengshouquan/transition.go +++ b/src/renzhengshouquan/transition.go @@ -2,35 +2,61 @@ package renzhengshouquan import ( "shylinux.com/x/ice" + kit "shylinux.com/x/toolkits" "shylinux.com/x/community/src/renzhengshouquan/model" ) type transition struct { Table - order string `data:"5"` - auth string `data:"issued"` - role string `data:"leader,worker"` - fields string `data:"transition_type,status,amount,from_account_uid,to_account_uid"` - create string `name:"create transition_type* amount* from_account_uid to_account_uid" role:"leader"` - remove string `name:"remove" role:"leader"` - testMarket string `name:"testMarket domain_uid*:select title* content price" style:"notice" role:"leader"` - testMessage string `name:"testMessage from_user_uid*:select to_user_uid*:select title* content price" style:"notice" role:"worker"` - testTemplate string `name:"testMessage from_user_uid*:select to_user_uid*:select title*" style:"notice" role:"worker"` + order string `data:"5"` + auth string `data:"issued"` + role string `data:"leader,worker"` + create string `name:"create transition_type* amount* title content from_account_uid to_account_uid" role:"leader"` + remove string `name:"remove" role:"leader"` } func (s transition) List(m *ice.Message, arg ...string) { - s.ValueList(m, arg).Display("") - m.PushAction(s.TestMessage, s.TestMarket, s.TestTemplate) -} -func (s transition) TestMarket(m *ice.Message, arg ...string) { - s.MarketInsert(m, arg...) -} -func (s transition) TestMessage(m *ice.Message, arg ...string) { - s.SendMessage(m, m.Option(model.FROM_USER_UID), m.Option(model.TO_USER_UID), arg...) -} -func (s transition) TestTemplate(m *ice.Message, arg ...string) { - s.SendTemplate(m, "", m.Option(model.TO_USER_UID), m.Option(model.TITLE)) + s.Tables(m, + "LEFT JOIN accounts AS to_accounts ON to_account_uid = to_accounts.uid", + "LEFT JOIN auths AS to_auths ON to_accounts.auth_uid = to_auths.uid", + "LEFT JOIN accounts AS from_accounts ON from_account_uid = from_accounts.uid", + "LEFT JOIN auths AS from_auths ON from_accounts.auth_uid = from_auths.uid", + ).FieldsWithCreatedAT(m, s, + "transition_type", "transition_status", s.Key(s, model.AMOUNT), s.Key(s, model.USER_UID), + "from_account_uid", "from_auths.uid AS from_auth_uid", "from_auth_name", "from_auth_type", "from_auth_avatar", + "to_account_uid", "to_auths.uid AS to_auth_uid", "to_auth_name", "to_auth_type", "to_auth_avatar", + ) + if len(arg) == 1 { + if !s.IsWorker(m) { + return + } + s.Select(m, "to_auths.uid = ? OR from_auths.uid = ?", arg[0], arg[0]) + } else { + s.Select(m, "transitions.uid = ? AND (to_auths.uid = ? OR from_auths.uid = ?)", arg[1], arg[0], arg[0]) + } + m.Table(func(value ice.Maps) { + switch TransitionType(kit.Int(value["transition_type"])) { + case TransitionRecharge: + m.Push(model.NAME, value["to_auth_name"]) + m.Push(model.AUTH_TYPE, value["to_auth_type"]) + m.Push(model.ICON, value["to_auth_avatar"]) + case TransitionTransfer: + if value["from_auth_uid"] == arg[0] { + m.Push(model.NAME, value["to_auth_name"]) + m.Push(model.AUTH_TYPE, value["to_auth_type"]) + m.Push(model.ICON, value["to_auth_avatar"]) + } else { + m.Push(model.NAME, value["from_auth_name"]) + m.Push(model.AUTH_TYPE, value["from_auth_type"]) + m.Push(model.ICON, value["from_auth_avatar"]) + } + case TransitionWithdraw: + m.Push(model.NAME, value["from_auth_name"]) + m.Push(model.AUTH_TYPE, value["from_auth_type"]) + m.Push(model.ICON, value["from_auth_avatar"]) + } + }).Action().Display("").DisplayCSS("") } func init() { ice.TeamCtxCmd(transition{}) } diff --git a/src/renzhengshouquan/transition.js b/src/renzhengshouquan/transition.js index e9bb097..e24a864 100644 --- a/src/renzhengshouquan/transition.js +++ b/src/renzhengshouquan/transition.js @@ -1,9 +1,13 @@ Volcanos(chat.ONIMPORT, { _init: function(can, msg) { - can.onimport.myView(can, msg, function(value) { return [ - {view: html.TITLE, list: [value.title||value.name||value.user_name, value.transition_type, value.amount, can.onimport.titleAction(can, value)]}, - {view: html.STATUS, list: [value.uid.slice(0, 6), can.onimport.timeView(can, value), value.user_name]}, - {view: html.OUTPUT, list: [value.content||value.info]}, + can.onimport.myView(can, msg, function(value) { value._style = [value.transition_type, value.transition_type == "转账"? value.from_auth_uid == can.Option("auth_uid")? "转给": "来自": ""]; return [ + {view: html.TITLE, list: [value.title, value.transition_type, + value.transition_type == "转账"? value.from_auth_uid == can.Option("auth_uid")? "转给": "来自": "", + can.onimport.textView(can, value, "auth_type"), + value.transition_type == "转账"? value.name: "", + can.onimport.moneyView(can, value), + ]}, can.onimport.metaView(can, value), + {view: html.OUTPUT, list: [value.content]}, can.onimport.titleAction(can, value), ] }) }, }) \ No newline at end of file