This commit is contained in:
zhaocy 2022-08-05 19:41:52 +08:00
parent 6eb86a4028
commit b1c58e2744
27 changed files with 464 additions and 181 deletions

View File

@ -28,7 +28,7 @@ var res string
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
if err := cache.OnInit(nil, cache.Set_Redis_Addr([]string{ if err := cache.OnInit(nil, cache.Set_Redis_Addr([]string{
// "10.0.0.9:6986", // "10.0.0.9:6986",
"10.0.0.9:9001", "10.0.0.9:9002", "10.0.0.9:9001","10.0.0.9:9002","10.0.0.9:9003","10.0.0.9:9004","10.0.0.9:9005","10.0.0.9:9006",
}), }),
cache.Set_Redis_Password(""), cache.Set_Redis_Password(""),
// cache.Set_Redis_Password("li13451234"), // cache.Set_Redis_Password("li13451234"),
@ -47,7 +47,7 @@ func TestMain(m *testing.M) {
} }
func BenchmarkRedis(b *testing.B) { func BenchmarkRedis(b *testing.B) {
uid := "0_62b18fce6d57b34781846f64" uid := "2_62ec8ab8828fb7bf67b220b6"
heroRedisKey := fmt.Sprintf("hero_%s%s", uid, "{herotest}") heroRedisKey := fmt.Sprintf("hero_%s%s", uid, "{herotest}")
var ( var (
// ncpu = runtime.NumCPU() // ncpu = runtime.NumCPU()

View File

@ -73,12 +73,27 @@ const (
// app // app
APP_NAME = "机器人" APP_NAME = "机器人"
//about
APP_ABOUT_TITLE = "关于"
APP_ABOUT_CONFIRM = "好的"
APP_ABOUT_INFO = `GUI 梦工厂工具`
// app_testcase // app_testcase
APP_TESTCASE_TITLE = "接口测试" APP_TESTCASE_TITLE = "接口测试"
APP_TESTCASE_LABEL_PATH = "路径" APP_TESTCASE_LABEL_PATH = "路径"
APP_TESTCASE_BTN_CLEARLOG = "清除" APP_TESTCASE_BTN_CLEARLOG = "清除"
APP_TESTCASE_INTRO = "选择左侧的测试接口" APP_TESTCASE_INTRO = "选择左侧的测试接口"
// toolbar
TOOLBAR_MONITOR = "监控"
TOOLBAR_TESTER = "接口测试"
//monitor
APP_MONITOR_TITLE_ID = "编号"
APP_MONITOR_TITLE_DATE = "时间"
APP_MONITOR_TITLE_DATA = "数据"
APP_MONITOR_BTN_VIEW = "查看"
//form //form
APP_TESTCASE_FORM_LABEL_HEROOBJID = "卡片OID" APP_TESTCASE_FORM_LABEL_HEROOBJID = "卡片OID"
APP_TESTCASE_FORM_LABEL_RACECARD = "种族卡片" APP_TESTCASE_FORM_LABEL_RACECARD = "种族卡片"
@ -91,12 +106,10 @@ const (
APP_TESTCASE_FORM_NICKNAME = "昵称" APP_TESTCASE_FORM_NICKNAME = "昵称"
APP_TESTCASE_OPTIONS = "选填" APP_TESTCASE_OPTIONS = "选填"
AAP_TESTCASE_FORM_TASK_DAY = "日常任务" AAP_TESTCASE_FORM_TASK_DAY = "日常任务"
AAP_TESTCASE_FORM_TASK_WEEK = "周常任务" APP_TESTCASE_FORM_TASK_WEEK = "周常任务"
AAP_TESTCASE_FORM_TASK_ACHIEVE = "成就" APP_TESTCASE_FORM_TASK_ACHIEVE = "成就"
APP_TESTCASE_FORM_BINGO = "命令"
// toolbar APP_TESTCASE_BTN_PUSH = "推送"
TOOLBAR_WELCOME = "欢迎"
TOOLBAR_TESTER = "tester"
//button //button
BUTTON_LOGIN = "登录" BUTTON_LOGIN = "登录"
@ -106,7 +119,7 @@ const (
BUTTON_CANCEL = "取消" BUTTON_CANCEL = "取消"
//label //label
LABEL_CHOOSE = "欢迎,您登录的服务是" LABEL_CHOOSE = "欢迎,你即将登录的服务是[%s]%s"
LABEL_NICKNAME = "昵称" LABEL_NICKNAME = "昵称"
LABEL_ACCOUNT = "账号" LABEL_ACCOUNT = "账号"
LABEL_WELCOME = "欢迎 " LABEL_WELCOME = "欢迎 "

View File

@ -10,3 +10,34 @@ func FormatJson(data string) (string, error) {
err := json.Indent(&out, []byte(data), "", " ") err := json.Indent(&out, []byte(data), "", " ")
return out.String(), err return out.String(), err
} }
func SubStr(str string, start int, length int) (result string) {
s := []rune(str)
total := len(s)
if total == 0 {
return
}
// 允许从尾部开始计算
if start < 0 {
start = total + start
if start < 0 {
return
}
}
if start > total {
return
}
// 到末尾
if length < 0 {
length = total
}
end := start + length
if end > total {
result = string(s[start:])
} else {
result = string(s[start:end])
}
return
}

View File

@ -0,0 +1,12 @@
package common
import (
"fmt"
"testing"
)
func TestSubStr(t *testing.T) {
str := "type.googleapis.com/UserResChangePush"
r := SubStr(str, 20, len(str))
fmt.Println(r)
}

31
cmd/v2/model/push.go Normal file
View File

@ -0,0 +1,31 @@
package model
import (
"google.golang.org/protobuf/types/known/anypb"
)
type PushModel struct {
MainType string
SubType string
MethodName string
DataTime string
Rsp *anypb.Any
}
type PushModelList struct {
DataList []*PushModel
}
func NewPushModelList() *PushModelList {
return &PushModelList{
DataList: make([]*PushModel, 0),
}
}
func (s *PushModelList) AsInterfaceArray() []interface{} {
rs := make([]interface{}, len(s.DataList), len(s.DataList))
for i := range s.DataList {
rs[i] = s.DataList[i]
}
return rs
}

View File

@ -1,10 +1,12 @@
package service package service
import ( import (
"go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/model" "go_dreamfactory/cmd/v2/model"
"go_dreamfactory/cmd/v2/service/observer" "go_dreamfactory/cmd/v2/service/observer"
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"strings"
"time" "time"
"github.com/golang/protobuf/ptypes" "github.com/golang/protobuf/ptypes"
@ -22,6 +24,7 @@ type ConnService interface {
Connect(wsUrl string) error Connect(wsUrl string) error
SendMsg(msg *pb.UserMessage, rsp proto.Message) (err error) SendMsg(msg *pb.UserMessage, rsp proto.Message) (err error)
ReceiveMsg() (code pb.ErrorCode, msg *pb.UserMessage) ReceiveMsg() (code pb.ErrorCode, msg *pb.UserMessage)
ListenerPush()
} }
type ConnServiceImpl struct { type ConnServiceImpl struct {
@ -52,6 +55,46 @@ func (c *ConnServiceImpl) Connect(wsUrl string) error {
return nil return nil
} }
// listener push
func (c *ConnServiceImpl) ListenerPush() {
go func() {
for {
time.Sleep(time.Millisecond * 200)
msg := &pb.UserMessage{}
_, data, err := c.ws.ReadMessage()
if err != nil {
logrus.Errorf("readMessage err:%v", err)
return
}
if err = proto.Unmarshal(data, msg); err != nil {
return
}
// logrus.WithFields(
// logrus.Fields{"MainType": msg.MainType, "SubType": msg.SubType},
// ).Debug(msg.Data.TypeUrl)
methodStr := msg.Data.TypeUrl
methodName := common.SubStr(methodStr, 20, len(methodStr))
if strings.HasSuffix(methodName, "Push") {
p := &model.PushModel{
MainType: msg.MainType,
SubType: msg.SubType,
MethodName: methodName,
DataTime: time.Now().Format(time.RFC3339),
Rsp: msg.Data,
}
c.obs.Notify(observer.EVENT_APP_PUSH, p)
logrus.WithFields(
logrus.Fields{"MainType": msg.MainType, "SubType": msg.SubType},
).Debug(methodName)
}
}
}()
}
// SendMsg .... // SendMsg ....
func (c *ConnServiceImpl) SendMsg(msg *pb.UserMessage, rsp proto.Message) (err error) { func (c *ConnServiceImpl) SendMsg(msg *pb.UserMessage, rsp proto.Message) (err error) {
// msg.Sec = r.BuildSecStr() // msg.Sec = r.BuildSecStr()

View File

@ -3,4 +3,5 @@ package observer
const ( const (
EVENT_USERINFO Event = "userinfo" EVENT_USERINFO Event = "userinfo"
EVENT_APP_LOG Event = "app_log" EVENT_APP_LOG Event = "app_log"
EVENT_APP_PUSH Event = "push"
) )

View File

@ -19,7 +19,7 @@ type PttService interface {
CreateRole(nickName string) (code pb.ErrorCode, rsp *pb.UserCreateResp) CreateRole(nickName string) (code pb.ErrorCode, rsp *pb.UserCreateResp)
GetUser() *UserInfo GetUser() *UserInfo
SetUser(dbUser *pb.DBUser, dbUserExpand *pb.DBUserExpand) SetUser(dbUser *pb.DBUser, dbUserExpand *pb.DBUserExpand)
SendToClient(msg *pb.UserMessage, rsp proto.Message) error SendToClient(mainType, subType string, rsp proto.Message) error
} }
type PttServiceImpl struct { type PttServiceImpl struct {
@ -51,7 +51,8 @@ func (p *PttServiceImpl) SetUser(dbUser *pb.DBUser, dbUserExpand *pb.DBUserExpan
p.user = &UserInfo{DbUser: dbUser, DbUserExpand: dbUserExpand} p.user = &UserInfo{DbUser: dbUser, DbUserExpand: dbUserExpand}
} }
func (p *PttServiceImpl) SendToClient(msg *pb.UserMessage, rsp proto.Message) (err error) { func (p *PttServiceImpl) SendToClient(mainType, subType string, rsp proto.Message) (err error) {
msg := &pb.UserMessage{MainType: mainType, SubType: subType}
msg.Sec = common.BuildSecStr(p.user.DbUser.Sid, p.user.DbUser.Binduid) msg.Sec = common.BuildSecStr(p.user.DbUser.Sid, p.user.DbUser.Binduid)
if err = p.connService.SendMsg(msg, rsp); err != nil { if err = p.connService.SendMsg(msg, rsp); err != nil {
logrus.WithField("err", err).Error(err) logrus.WithField("err", err).Error(err)
@ -105,24 +106,24 @@ func (p *PttServiceImpl) CreateRole(nickName string) (code pb.ErrorCode, rsp *pb
} }
//response //response
for { // for {
if cd, msg := p.connService.ReceiveMsg(); cd != pb.ErrorCode_Success { // if cd, msg := p.connService.ReceiveMsg(); cd != pb.ErrorCode_Success {
code = cd // code = cd
break // break
} else { // } else {
rsp = &pb.UserCreateResp{} // rsp = &pb.UserCreateResp{}
if msg.MainType == string(comm.ModuleUser) && msg.SubType == user.UserSubTypeCreate { // if msg.MainType == string(comm.ModuleUser) && msg.SubType == user.UserSubTypeCreate {
if !comm.ProtoUnmarshal(msg, rsp) { // if !comm.ProtoUnmarshal(msg, rsp) {
code = pb.ErrorCode_PbError // code = pb.ErrorCode_PbError
return // return
} // }
logrus. // logrus.
WithFields(logrus.Fields{"nickname": nickName}). // WithFields(logrus.Fields{"nickname": nickName}).
WithFields(logrus.Fields{"rsp": rsp.IsSucc}). // WithFields(logrus.Fields{"rsp": rsp.IsSucc}).
Debug("response create role") // Debug("response create role")
break // break
} // }
} // }
} // }
return return
} }

24
cmd/v2/ui/about.go Normal file
View File

@ -0,0 +1,24 @@
package ui
import (
"go_dreamfactory/cmd/v2/lib/common"
"fyne.io/fyne/v2/dialog"
"fyne.io/fyne/v2/widget"
)
type about struct {
aboutDialog dialog.Dialog
}
func newAbout() *about {
var a about
content := widget.NewCard("", "", widget.NewRichTextFromMarkdown(common.APP_ABOUT_INFO))
a.aboutDialog = dialog.NewCustom(common.APP_ABOUT_TITLE, common.APP_ABOUT_CONFIRM, content, globalWin.w)
return &a
}
func showAbout() {
newAbout().aboutDialog.Show()
}

View File

@ -16,10 +16,9 @@ type appInterface interface {
var ( var (
appRegister = []appInterface{ appRegister = []appInterface{
&appWelcome{}, &appMonitor{},
&appTester{}, &appTester{},
} }
) )
type appAdapter struct { type appAdapter struct {

139
cmd/v2/ui/app_monitor.go Normal file
View File

@ -0,0 +1,139 @@
package ui
import (
"fmt"
"go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/model"
"go_dreamfactory/cmd/v2/service/observer"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/data/binding"
"fyne.io/fyne/v2/layout"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
"github.com/sirupsen/logrus"
"google.golang.org/protobuf/types/known/anypb"
)
type appMonitor struct {
appAdapter
obs observer.Observer
logPanel *widget.Entry
monitorHeader *widget.List
monitorList *widget.List
monitorBinding binding.UntypedList
monitorData *model.PushModelList
}
func (this *appMonitor) LazyInit(obs observer.Observer) error {
this.obs = obs
this.tabItem = container.NewTabItemWithIcon(common.TOOLBAR_MONITOR, theme.ComputerIcon(), nil)
content := container.NewMax()
content.Objects = []fyne.CanvasObject{}
// panel for output log
this.logPanel = widget.NewMultiLineEntry()
this.logPanel.Wrapping = fyne.TextWrapWord
clearBtn := widget.NewButtonWithIcon(common.APP_TESTCASE_BTN_CLEARLOG, theme.DeleteIcon(), func() {
this.logPanel.SetText("")
})
resPanel := container.NewBorder(container.NewHBox(clearBtn, layout.NewSpacer()), nil, nil, nil, this.logPanel)
this.monitorBinding = binding.NewUntypedList()
this.monitorData = model.NewPushModelList()
this.createMonitorList()
// layout
panel := container.NewVSplit(container.NewBorder(this.monitorHeader, nil, nil, nil, this.monitorList), resPanel)
content.Objects = append(content.Objects, panel)
this.tabItem.Content = content
this.Run()
return nil
}
func (a *appMonitor) OpenDefault() bool {
return true
}
func (a *appMonitor) GetAppName() string {
return common.TOOLBAR_MONITOR
}
func (a appMonitor) OnClose() bool {
return false
}
// monitor list data
func (this *appMonitor) Run() {
this.obs.AddListener(observer.EVENT_APP_PUSH, observer.Listener{
OnNotify: func(d interface{}, args ...interface{}) {
data := d.(*model.PushModel)
this.monitorData.DataList = append(this.monitorData.DataList, data)
this.reloadMonitorData()
},
})
}
func (this *appMonitor) reloadMonitorData() {
if this.monitorData != nil {
d := this.monitorData.AsInterfaceArray()
this.monitorBinding.Set(d)
}
}
func (this *appMonitor) createMonitorList() {
// header
this.monitorHeader = widget.NewList(
func() int {
return 1
},
func() fyne.CanvasObject {
return container.NewGridWithColumns(3,
widget.NewLabelWithStyle("", fyne.TextAlignLeading, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}))
},
func(id widget.ListItemID, item fyne.CanvasObject) {
item.(*fyne.Container).Objects[0].(*widget.Label).SetText(common.APP_MONITOR_TITLE_ID)
item.(*fyne.Container).Objects[1].(*widget.Label).SetText(common.APP_MONITOR_TITLE_DATA)
item.(*fyne.Container).Objects[2].(*widget.Label).SetText(common.APP_MONITOR_TITLE_DATE)
},
)
// data
this.monitorList = widget.NewListWithData(this.monitorBinding,
func() fyne.CanvasObject {
return container.NewGridWithColumns(3,
widget.NewLabelWithStyle("", fyne.TextAlignLeading, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}),
widget.NewLabelWithStyle("", fyne.TextAlignCenter, fyne.TextStyle{}),
)
},
func(data binding.DataItem, item fyne.CanvasObject) {
o, _ := data.(binding.Untyped).Get()
pd := o.(*model.PushModel)
item.(*fyne.Container).Objects[0].(*widget.Label).SetText(fmt.Sprintf("%s.%s", pd.MainType, pd.SubType))
item.(*fyne.Container).Objects[1].(*widget.Label).SetText(pd.MethodName)
item.(*fyne.Container).Objects[2].(*widget.Label).SetText(pd.DataTime)
},
)
this.monitorList.OnSelected = func(id widget.ListItemID) {
if di, err := this.monitorBinding.GetItem(id); err != nil {
logrus.Error(err)
} else {
o, _ := di.(binding.Untyped).Get()
pd := o.(*model.PushModel)
if res, err := anypb.New(pd.Rsp); err == nil {
this.logPanel.Text = res.String()
this.logPanel.Refresh()
} else {
logrus.WithField("err", err).Error("view detail")
}
}
}
}

View File

@ -5,11 +5,6 @@ import (
"go_dreamfactory/cmd/v2/lib/common" "go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/model" "go_dreamfactory/cmd/v2/model"
"go_dreamfactory/cmd/v2/service/observer" "go_dreamfactory/cmd/v2/service/observer"
"go_dreamfactory/cmd/v2/ui/formview"
"go_dreamfactory/comm"
"go_dreamfactory/modules/hero"
"go_dreamfactory/modules/task"
"go_dreamfactory/modules/user"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
@ -19,23 +14,6 @@ import (
"github.com/sirupsen/logrus" "github.com/sirupsen/logrus"
) )
// register views
var (
viewRegister = map[string]MyCaseView{
//user
ff(comm.ModuleUser, user.UserSubTypeModifyName): &formview.UserModifynameView{},
//task
ff(comm.ModuleTask, task.TaskSubTypeList): &formview.TaskListView{},
ff(comm.ModuleTask, task.TaskSubTypeReceive): &formview.TaskReceiveView{},
ff(comm.ModuleTask, task.TaskSubTypeActiveList): &formview.TaskActiveListView{},
ff(comm.ModuleTask, task.TaskSubTypeActiveReceive): &formview.TaskActiveReceiveView{},
// hero
ff(comm.ModuleHero, hero.HeroSubTypeList): &formview.HeroListView{},
ff(comm.ModuleHero, hero.StrengthenUplv): &formview.HeroStrengthenUplvView{},
ff(comm.ModuleHero, hero.StrengthenUpStar): &formview.HeroStrengthenUpStarView{},
}
)
type appTester struct { type appTester struct {
appAdapter appAdapter
} }
@ -81,11 +59,11 @@ func (a *appTester) LazyInit(obs observer.Observer) error {
// required! Refresh updates the widget // required! Refresh updates the widget
formReq.Refresh() formReq.Refresh()
formCard := widget.NewCard("", "", formReq) formCard := widget.NewCard("", "", formReq)
pos := widget.NewLabel("")
clearBtn := widget.NewButtonWithIcon(common.APP_TESTCASE_BTN_CLEARLOG, theme.DeleteIcon(), func() { clearBtn := widget.NewButtonWithIcon(common.APP_TESTCASE_BTN_CLEARLOG, theme.DeleteIcon(), func() {
resLog.SetText("") resLog.SetText("")
}) })
resPanel := container.NewBorder(container.NewHBox(clearBtn, layout.NewSpacer(), pos), nil, nil, nil, resLog) resPanel := container.NewBorder(container.NewHBox(clearBtn, layout.NewSpacer()), nil, nil, nil, resLog)
panel := container.NewVSplit( panel := container.NewVSplit(
formCard, formCard,

View File

@ -1,40 +0,0 @@
package ui
import (
"go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/service/observer"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/container"
"fyne.io/fyne/v2/theme"
"fyne.io/fyne/v2/widget"
)
type appWelcome struct {
appAdapter
}
func (a *appWelcome) LazyInit(obs observer.Observer) error {
a.tabItem = container.NewTabItemWithIcon(common.TOOLBAR_WELCOME, theme.ComputerIcon(), nil)
a.tabItem.Content = container.NewCenter(
container.NewVBox(
widget.NewLabelWithStyle(common.TOOLBAR_WELCOME,
fyne.TextAlignCenter,
fyne.TextStyle{Bold: true})),
)
return nil
}
func (a *appWelcome) OpenDefault() bool {
return true
}
func (a *appWelcome) GetAppName() string {
return common.TOOLBAR_WELCOME
}
func (a appWelcome) OnClose() bool {
return false
}

View File

@ -0,0 +1,35 @@
package formview
import (
"go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/model"
"go_dreamfactory/cmd/v2/service"
"go_dreamfactory/pb"
"fyne.io/fyne/v2"
"fyne.io/fyne/v2/widget"
"github.com/sirupsen/logrus"
)
type BingoView struct {
BaseformView
}
func (this *BingoView) CreateForm(t *model.TestCase) fyne.CanvasObject {
bingo := widget.NewEntry()
bingo.PlaceHolder = "eg. bingo:item,10001,1"
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_BINGO, bingo))
this.form.OnSubmit = func() {
if err := service.GetPttService().SendToClient(
t.MainType,
t.SubType,
&pb.GMCmdReq{Cmod: bingo.Text},
); err != nil {
logrus.Error(err)
return
}
go service.GetConnService().RespHandle(t)
}
return this.form
}

View File

@ -10,14 +10,14 @@ func getTaskTagSelect() *widget.Select {
var tagSelect *widget.Select var tagSelect *widget.Select
tagSelect = widget.NewSelect([]string{ tagSelect = widget.NewSelect([]string{
common.AAP_TESTCASE_FORM_TASK_DAY, common.AAP_TESTCASE_FORM_TASK_DAY,
common.AAP_TESTCASE_FORM_TASK_WEEK, common.APP_TESTCASE_FORM_TASK_WEEK,
common.AAP_TESTCASE_FORM_TASK_ACHIEVE}, func(s string) { common.APP_TESTCASE_FORM_TASK_ACHIEVE}, func(s string) {
switch s { switch s {
case common.AAP_TESTCASE_FORM_TASK_DAY: case common.AAP_TESTCASE_FORM_TASK_DAY:
tagSelect.Selected = "1" tagSelect.Selected = "1"
case common.AAP_TESTCASE_FORM_TASK_WEEK: case common.APP_TESTCASE_FORM_TASK_WEEK:
tagSelect.Selected = "2" tagSelect.Selected = "2"
case common.AAP_TESTCASE_FORM_TASK_ACHIEVE: case common.APP_TESTCASE_FORM_TASK_ACHIEVE:
tagSelect.Selected = "3" tagSelect.Selected = "3"
default: default:
tagSelect.Selected = "0" tagSelect.Selected = "0"

View File

@ -15,8 +15,7 @@ type HeroListView struct {
func (this *HeroListView) CreateForm(t *model.TestCase) fyne.CanvasObject { func (this *HeroListView) CreateForm(t *model.TestCase) fyne.CanvasObject {
this.form.OnSubmit = func() { this.form.OnSubmit = func() {
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(t.MainType, t.SubType, &pb.HeroListReq{}); err != nil {
if err := service.GetPttService().SendToClient(head, &pb.HeroListReq{}); err != nil {
logrus.Error(err) logrus.Error(err)
} }

View File

@ -81,8 +81,7 @@ func (this *HeroStrengthenUpStarView) CreateForm(t *model.TestCase) fyne.CanvasO
}) })
} }
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(t.MainType, t.SubType,
if err := service.GetPttService().SendToClient(head,
&pb.HeroStrengthenUpStarReq{ &pb.HeroStrengthenUpStarReq{
HeroObjID: heroObjID.Text, HeroObjID: heroObjID.Text,
HeroRace: heroRace, HeroRace: heroRace,

View File

@ -35,7 +35,7 @@ func (this *HeroStrengthenUplvView) CreateForm(t *model.TestCase) fyne.CanvasObj
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_LABEL_HEROOBJID, heroObjID)) this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_LABEL_HEROOBJID, heroObjID))
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_LABEL_EXPCARDS, expCards)) this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_LABEL_EXPCARDS, expCards))
this.form.OnSubmit = func() { this.form.OnSubmit = func() {
var cards []*pb.MapStringInt32 var cards []*pb.MapStringInt32
@ -53,8 +53,7 @@ func (this *HeroStrengthenUplvView) CreateForm(t *model.TestCase) fyne.CanvasObj
}) })
} }
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(t.MainType, t.SubType,
if err := service.GetPttService().SendToClient(head,
&pb.HeroStrengthenUplvReq{ &pb.HeroStrengthenUplvReq{
HeroObjID: heroObjID.Text, HeroObjID: heroObjID.Text,
ExpCards: cards}); err != nil { ExpCards: cards}); err != nil {

View File

@ -19,10 +19,9 @@ type TaskActiveListView struct {
func (this *TaskActiveListView) CreateForm(t *model.TestCase) fyne.CanvasObject { func (this *TaskActiveListView) CreateForm(t *model.TestCase) fyne.CanvasObject {
tagSelect := getTaskTagSelect() tagSelect := getTaskTagSelect()
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect)) this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect))
this.form.OnSubmit = func() { this.form.OnSubmit = func() {
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(t.MainType, t.SubType, &pb.TaskActiveListReq{
if err := service.GetPttService().SendToClient(head, &pb.TaskActiveListReq{
TaskTag: cast.ToInt32(tagSelect.Selected), TaskTag: cast.ToInt32(tagSelect.Selected),
}); err != nil { }); err != nil {

View File

@ -24,8 +24,7 @@ func (this *TaskActiveReceiveView) CreateForm(t *model.TestCase) fyne.CanvasObje
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect)) this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect))
this.form.OnSubmit = func() { this.form.OnSubmit = func() {
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(t.MainType, t.SubType, &pb.TaskActiveReceiveReq{
if err := service.GetPttService().SendToClient(head, &pb.TaskActiveReceiveReq{
Id: id.Text, Id: id.Text,
TaskTag: cast.ToInt32(tagSelect.Selected), TaskTag: cast.ToInt32(tagSelect.Selected),
}); err != nil { }); err != nil {

View File

@ -21,8 +21,7 @@ func (this *TaskListView) CreateForm(t *model.TestCase) fyne.CanvasObject {
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect)) this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect))
this.form.OnSubmit = func() { this.form.OnSubmit = func() {
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(t.MainType, t.SubType, &pb.TaskListReq{
if err := service.GetPttService().SendToClient(head, &pb.TaskListReq{
TaskTag: cast.ToInt32(tagSelect.Selected), TaskTag: cast.ToInt32(tagSelect.Selected),
}); err != nil { }); err != nil {
logrus.Error(err) logrus.Error(err)

View File

@ -27,8 +27,7 @@ func (this *TaskReceiveView) CreateForm(t *model.TestCase) fyne.CanvasObject {
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect)) this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_TASKTAG, tagSelect))
this.form.OnSubmit = func() { this.form.OnSubmit = func() {
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(t.MainType, t.SubType,
if err := service.GetPttService().SendToClient(head,
&pb.TaskReceiveReq{Id: id.Text, TaskTag: cast.ToInt32(tagSelect.Selected)}); err != nil { &pb.TaskReceiveReq{Id: id.Text, TaskTag: cast.ToInt32(tagSelect.Selected)}); err != nil {
logrus.Error(err) logrus.Error(err)
return return

View File

@ -20,14 +20,17 @@ func (this *UserModifynameView) CreateForm(t *model.TestCase) fyne.CanvasObject
this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_NICKNAME, name)) this.form.AppendItem(widget.NewFormItem(common.APP_TESTCASE_FORM_NICKNAME, name))
this.form.OnSubmit = func() { this.form.OnSubmit = func() {
head := &pb.UserMessage{MainType: t.MainType, SubType: t.SubType} if err := service.GetPttService().SendToClient(
if err := service.GetPttService().SendToClient(head, &pb.UserModifynameReq{Name: name.Text}); err != nil { t.MainType,
t.SubType,
&pb.UserModifynameReq{Name: name.Text},
); err != nil {
logrus.Error(err) logrus.Error(err)
return return
} }
go service.GetConnService().RespHandle(t) go service.GetConnService().RespHandle(t)
} }
return this.form return this.form
} }

View File

@ -6,6 +6,7 @@ import (
"go_dreamfactory/cmd/v2/service" "go_dreamfactory/cmd/v2/service"
"go_dreamfactory/cmd/v2/service/observer" "go_dreamfactory/cmd/v2/service/observer"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"strings"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
@ -53,9 +54,6 @@ func NewMainWindow(ui *UIImpl) MainWindow {
// tool bar // tool bar
mw.tb = newToolBar() mw.tb = newToolBar()
// Fun Toys
mw.toys = newToys(ui.obs)
// main app tabs // main app tabs
mw.at = newAppContainer(ui.obs) mw.at = newAppContainer(ui.obs)
@ -119,13 +117,13 @@ func (ui *MainWindowImpl) CreateWindow(title string, width, height float32, _ bo
// createChooseServerPopUp // createChooseServerPopUp
func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error { func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error {
ch := make(chan int32) ch := make(chan string)
selServerWin := ui.createChooseServerWindow("选服", ch) selServerWin := ui.createChooseServerWindow("选服", ch)
go func() { go func() {
sid := <-ch data := <-ch
selServerWin.Hide() selServerWin.Hide()
ui.NewWelcomeLabel(sid) ui.NewWelcomeLabel(data)
ui.w.Show() ui.w.Show()
}() }()
return nil return nil
@ -134,13 +132,13 @@ func (ui *MainWindowImpl) createChooseServerPopUp(w fyne.Window) error {
// createChooseServerWindow // createChooseServerWindow
func (ui *MainWindowImpl) createChooseServerWindow( func (ui *MainWindowImpl) createChooseServerWindow(
title string, title string,
ch chan int32) fyne.Window { ch chan string) fyne.Window {
makeButton := func(s *service.ServiceConf, parent fyne.Window) *widget.Button { makeButton := func(s *service.ServiceConf, parent fyne.Window) *widget.Button {
btn := widget.NewButton(s.Name, func() { btn := widget.NewButton(s.Name, func() {
d := dialog.NewInformation("", common.INFO_WAIT, parent) d := dialog.NewInformation("", common.INFO_WAIT, parent)
d.SetDismissText(common.BUTTON_CANCEL) d.SetDismissText(common.BUTTON_CANCEL)
d.Show() d.Show()
logrus.WithField("server", s.Name).Debug("choose server") logrus.WithField("server", s.Name).Debug("choose server")
//conn server //conn server
@ -148,10 +146,9 @@ func (ui *MainWindowImpl) createChooseServerWindow(
d.Hide() d.Hide()
dialog.ShowError(err, parent) dialog.ShowError(err, parent)
} else { } else {
ch <- s.SId ch <- fmt.Sprintf("%d:%s", s.SId, s.Name)
} }
}) })
//other btn setting
return btn return btn
} }
w := fyne.CurrentApp().NewWindow(title) w := fyne.CurrentApp().NewWindow(title)
@ -195,10 +192,10 @@ func (ui *MainWindowImpl) createLoginWin(sid int32) {
dialog.ShowError(err, ui.w) dialog.ShowError(err, ui.w)
} else { } else {
ui.connService.ListenerPush()
//show mainwindow //show mainwindow
logrus.Debug(rsp) // logrus.Debug(rsp)
ui.pttService.SetUser(rsp.Data, rsp.Ex) ui.pttService.SetUser(rsp.Data, rsp.Ex)
ui.obs.Notify(observer.EVENT_USERINFO, ui.pttService.GetUser())
// isCreateRole // isCreateRole
if rsp.Data.Created { if rsp.Data.Created {
// ui.renderUserContainer() // ui.renderUserContainer()
@ -208,6 +205,7 @@ func (ui *MainWindowImpl) createLoginWin(sid int32) {
if err != nil { if err != nil {
logrus.WithField("appName", appName).Error(err) logrus.WithField("appName", appName).Error(err)
} }
ui.obs.Notify(observer.EVENT_USERINFO, ui.pttService.GetUser())
} else { } else {
ui.createRoleWindowPopUp() ui.createRoleWindowPopUp()
} }
@ -251,60 +249,42 @@ func (ui *MainWindowImpl) createRoleWindowPopUp() {
} else { } else {
if nickname.Text != "" { if nickname.Text != "" {
logrus.WithField("nickname", nickname.Text).Debug("submit crete role") logrus.WithField("nickname", nickname.Text).Debug("submit crete role")
if code, rsp := ui.pttService.CreateRole(nickname.Text); code != pb.ErrorCode_Success { if code, _ := ui.pttService.CreateRole(nickname.Text); code != pb.ErrorCode_Success {
err := fmt.Errorf("login err: %v[%d]", code, int32(code)) err := fmt.Errorf("login err: %v[%d]", code, int32(code))
dialog.ShowError(err, ui.w) dialog.ShowError(err, ui.w)
} else { } else {
if rsp.IsSucc { // if rsp.IsSucc {
user := ui.pttService.GetUser() user := ui.pttService.GetUser()
logrus.WithField("uid", user.DbUser.Uid).Debug("create role succ") logrus.WithField("uid", user.DbUser.Uid).Debug("create role succ")
ui.createWindowContainer() ui.createWindowContainer()
} else { appName, err := ui.at.openDefaultApp()
logrus.Error("create role failure") if err != nil {
logrus.WithField("appName", appName).Error(err)
} }
ui.obs.Notify(observer.EVENT_USERINFO, ui.pttService.GetUser())
// }
} }
} }
} }
}, ui.w) }, ui.w)
} }
// renderUserContainer fill userinfo in container
func (ui *MainWindowImpl) renderUserContainer() {
userInfo := ui.pttService.GetUser()
var (
nickname string
)
if userInfo != nil && userInfo.DbUser != nil {
nickname = userInfo.DbUser.Name
}
c := container.NewCenter(container.NewHBox(
widget.NewLabelWithStyle(common.LABEL_NICKNAME+nickname,
fyne.TextAlignCenter,
fyne.TextStyle{Bold: true}),
))
ui.w.SetContent(c)
}
// NewWelcomeLabel // NewWelcomeLabel
func (ui *MainWindowImpl) NewWelcomeLabel(sid int32) { func (ui *MainWindowImpl) NewWelcomeLabel(data string) {
p := strings.Split(data, ":")
if len(p) != 2 {
logrus.WithField("param", p).Error("choose service")
return
}
c := container.NewCenter(container.NewVBox( c := container.NewCenter(container.NewVBox(
widget.NewLabelWithStyle(common.LABEL_CHOOSE+cast.ToString(sid), widget.NewLabelWithStyle(fmt.Sprintf(common.LABEL_CHOOSE, p[0], p[1]),
fyne.TextAlignCenter, fyne.TextAlignCenter,
fyne.TextStyle{Bold: true}), fyne.TextStyle{Bold: true}),
container.NewCenter(container.NewHBox( container.NewCenter(container.NewHBox(
widget.NewButton(common.BUTTON_LOGIN, func() { widget.NewButton(common.BUTTON_LOGIN, func() {
ui.createLoginWin(sid) ui.createLoginWin(cast.ToInt32(p[0]))
}), }),
// widget.NewButton(common.BUTTON_REGISTE, func() {
// logrus.Debug("registe")
// }),
)), )),
)) ))
ui.w.SetContent(c) ui.w.SetContent(c)
} }
// show userInfo
func (ui *MainWindowImpl) showUserInfoWin() {
}

View File

@ -3,10 +3,12 @@ package ui
import ( import (
"fmt" "fmt"
"go_dreamfactory/cmd/v2/model" "go_dreamfactory/cmd/v2/model"
"go_dreamfactory/cmd/v2/ui/formview"
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/lego/core" "go_dreamfactory/lego/core"
"go_dreamfactory/modules/hero" "go_dreamfactory/modules/hero"
"go_dreamfactory/modules/task" "go_dreamfactory/modules/task"
"go_dreamfactory/modules/user"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
@ -18,9 +20,52 @@ type MyCaseView interface {
CreateForm(t *model.TestCase) fyne.CanvasObject CreateForm(t *model.TestCase) fyne.CanvasObject
} }
// nav // 1 注册接口测试的表单试图
var (
viewRegister = map[string]MyCaseView{
// gm
ff(comm.ModuleGM, "cmd"): &formview.BingoView{},
//user
ff(comm.ModuleUser, user.UserSubTypeModifyName): &formview.UserModifynameView{},
//task
ff(comm.ModuleTask, task.TaskSubTypeList): &formview.TaskListView{},
ff(comm.ModuleTask, task.TaskSubTypeReceive): &formview.TaskReceiveView{},
ff(comm.ModuleTask, task.TaskSubTypeActiveList): &formview.TaskActiveListView{},
ff(comm.ModuleTask, task.TaskSubTypeActiveReceive): &formview.TaskActiveReceiveView{},
// hero
ff(comm.ModuleHero, hero.HeroSubTypeList): &formview.HeroListView{},
ff(comm.ModuleHero, hero.StrengthenUplv): &formview.HeroStrengthenUplvView{},
ff(comm.ModuleHero, hero.StrengthenUpStar): &formview.HeroStrengthenUpStarView{},
}
)
// 2 添加导航菜单
var (
CaseIndex = map[string][]string{
"": {"gm", "user", "hero", "task"},
"gm": {"gm.cmd"},
"user": {"user.modifyname"},
"hero": {"hero.list", "hero.strengthenuplv", "hero.strengthenupstar"},
"task": {"task.list", "task.receive", "task.activelist", "task.activereceive"},
}
)
// 3 注册测试用例
var ( var (
CaseNav = map[string]*model.TestCase{ CaseNav = map[string]*model.TestCase{
// gm
"gm": {
MainType: string(comm.ModuleGM),
Enabled: true,
},
ff(comm.ModuleGM, "cmd"): {
Desc: "eg. bingo:item,10001,1 bingo:attr,gold,1000000",
MainType: string(comm.ModuleGM),
SubType: "cmd",
Req: &pb.GMCmdReq{},
Rsp: &pb.GMCmdResp{},
Enabled: true,
},
// user // user
"user": { "user": {
MainType: "user", MainType: "user",
@ -111,15 +156,6 @@ var (
} }
) )
var (
CaseIndex = map[string][]string{
"": {"user", "hero", "task"},
"user": {"user.modifyname"},
"hero": {"hero.list", "hero.strengthenuplv", "hero.strengthenupstar"},
"task": {"task.list", "task.receive", "task.activelist", "task.activereceive"},
}
)
func ff(s1 core.M_Modules, s2 string) string { func ff(s1 core.M_Modules, s2 string) string {
return fmt.Sprintf("%s.%s", s1, s2) return fmt.Sprintf("%s.%s", s1, s2)
} }

View File

@ -16,15 +16,18 @@ type toolBar struct {
func newToolBar() *toolBar { func newToolBar() *toolBar {
var tb toolBar var tb toolBar
// mainwindow toolbar
tb.toolbar = widget.NewToolbar( tb.toolbar = widget.NewToolbar(
widget.NewToolbarAction(theme.ComputerIcon(), func() { widget.NewToolbarAction(theme.ComputerIcon(), func() {
openApp(common.TOOLBAR_WELCOME) openApp(common.TOOLBAR_MONITOR)
}), }),
widget.NewToolbarAction(theme.AccountIcon(), func() { widget.NewToolbarAction(theme.AccountIcon(), func() {
openApp(common.TOOLBAR_TESTER) openApp(common.TOOLBAR_TESTER)
}), }),
widget.NewToolbarSeparator(), widget.NewToolbarSpacer(),
widget.NewToolbarAction(theme.DocumentIcon(), func() {}), widget.NewToolbarAction(theme.HelpIcon(), func() {
showAbout()
}),
) )
return &tb return &tb
} }

View File

@ -63,6 +63,7 @@ func (this *toyUserInfo) Run() {
this.obs.AddListener(observer.EVENT_USERINFO, observer.Listener{ this.obs.AddListener(observer.EVENT_USERINFO, observer.Listener{
OnNotify: func(d interface{}, args ...interface{}) { OnNotify: func(d interface{}, args ...interface{}) {
time.Sleep(time.Millisecond * 50) time.Sleep(time.Millisecond * 50)
_ = this.data.Set([]string{})
if this.copyBtn.Disabled() { if this.copyBtn.Disabled() {
this.copyBtn.Enable() this.copyBtn.Enable()
} }