update gui

This commit is contained in:
wh_zcy 2022-08-25 19:21:59 +08:00
parent 749faa1b65
commit 3b50014bc4
21 changed files with 392 additions and 65 deletions

View File

@ -23,5 +23,6 @@ const (
const ( const (
BOLTDB_NAME = "my.db" BOLTDB_NAME = "my.db"
BOLTDB_BUCKETNAME = "robotBucket" BOLTDB_BUCKETNAME = "robotBucket"
BUCKET_CONF = "gen" BUCKET_LUBANCONF = "lubanConf"
BUCKET_SSHCONF = "sshConf"
) )

View File

@ -92,6 +92,7 @@ const (
TOOLBAR_GEN = "生成代码" TOOLBAR_GEN = "生成代码"
TOOLBAR_SEC = "密码器" TOOLBAR_SEC = "密码器"
TOOLBAR_WEL = "欢迎" TOOLBAR_WEL = "欢迎"
TOOLBAR_TERM = "终端"
//monitor //monitor
APP_MONITOR_TITLE_ID = "编号" APP_MONITOR_TITLE_ID = "编号"

View File

@ -17,8 +17,8 @@ func NewItemModelList() *ItemModelList {
func (s *ItemModelList) AsInterfaceArray() []interface{} { func (s *ItemModelList) AsInterfaceArray() []interface{} {
rs := make([]interface{}, len(s.DataList)) rs := make([]interface{}, len(s.DataList))
for i := range s.DataList { for i, v := range s.DataList {
rs[i] = s.DataList[i] rs[i] = v
} }
return rs return rs
} }

7
cmd/v2/model/ssh.go Normal file
View File

@ -0,0 +1,7 @@
package model
type SSHModel struct {
Ip string
UserName string
Password string
}

View File

@ -6,7 +6,6 @@ import (
"go_dreamfactory/cmd/v2/lib/common" "go_dreamfactory/cmd/v2/lib/common"
"go_dreamfactory/cmd/v2/model" "go_dreamfactory/cmd/v2/model"
"log" "log"
"sync"
"time" "time"
"github.com/boltdb/bolt" "github.com/boltdb/bolt"
@ -14,9 +13,12 @@ import (
) )
type DbService interface { type DbService interface {
Save(conf *model.GenTool) error // 保存鲁班工具配置
Update() error SaveLubanConf(conf *model.GenTool) error
Get(key string) *model.GenTool // 获取鲁班工具配置
GetLubanConf(key string) *model.GenTool
// 保存SSH连接信息
SaveSSHConf(conf *model.SSHModel) error
} }
type DbServiceImpl struct { type DbServiceImpl struct {
@ -33,11 +35,11 @@ func GetDbService() DbService {
return dbservice return dbservice
} }
func (this *DbServiceImpl) Save(conf *model.GenTool) error { func (this *DbServiceImpl) save(key string, model interface{}) error {
boltDb = GetBoltDb() boltDb = GetBoltDb()
defer boltDb.Close() defer boltDb.Close()
if err := boltDb.Update(func(tx *bolt.Tx) error { if err := boltDb.Update(func(tx *bolt.Tx) error {
b, err2 := json.Marshal(conf) b, err2 := json.Marshal(model)
if err2 != nil { if err2 != nil {
return err return err
} }
@ -45,7 +47,7 @@ func (this *DbServiceImpl) Save(conf *model.GenTool) error {
if c == nil { if c == nil {
return fmt.Errorf("Bucket %s not found!", common.BOLTDB_BUCKETNAME) return fmt.Errorf("Bucket %s not found!", common.BOLTDB_BUCKETNAME)
} }
return c.Put([]byte(common.BUCKET_CONF), b) return c.Put([]byte(key), b)
}); err != nil { }); err != nil {
logrus.Errorf("save err: %v", err) logrus.Errorf("save err: %v", err)
return err return err
@ -53,42 +55,66 @@ func (this *DbServiceImpl) Save(conf *model.GenTool) error {
return nil return nil
} }
func (this *DbServiceImpl) Get(key string) *model.GenTool { func (this *DbServiceImpl) get(key string, model interface{}) (b *bolt.Bucket, err error) {
boltDb = GetBoltDb() boltDb = GetBoltDb()
defer boltDb.Close() if err = boltDb.View(func(tx *bolt.Tx) error {
conf := &model.GenTool{} b = tx.Bucket([]byte(common.BOLTDB_BUCKETNAME))
if err := boltDb.View(func(tx *bolt.Tx) error { if b == nil {
c := tx.Bucket([]byte(common.BOLTDB_BUCKETNAME))
if c == nil {
return fmt.Errorf("Bucket %s not found!", common.BOLTDB_BUCKETNAME) return fmt.Errorf("Bucket %s not found!", common.BOLTDB_BUCKETNAME)
} }
val := c.Get([]byte(key))
if err := json.Unmarshal(val, conf); err != nil {
logrus.Errorf("get gen conf err:%v", err)
return err
}
return nil return nil
}); err != nil { }); err != nil {
logrus.Errorf("get db conf err: %v", err) logrus.Errorf("get db conf err: %v", err)
return nil return nil, err
} }
return conf return b, nil
} }
func (this *DbServiceImpl) Update() error { func (this *DbServiceImpl) SaveLubanConf(conf *model.GenTool) error {
return nil return this.save(common.BUCKET_LUBANCONF, conf)
}
func (this *DbServiceImpl) GetLubanConf(key string) *model.GenTool {
defer boltDb.Close()
model := &model.GenTool{}
if b, err := this.get(key, model); err != nil {
return nil
} else {
val := b.Get([]byte(key))
if err = json.Unmarshal(val, model); err != nil {
logrus.Errorf("get gen conf err:%v", err)
return nil
}
}
return model
}
func (this *DbServiceImpl) SaveSSHConf(conf *model.SSHModel) error {
return this.save(common.BUCKET_SSHCONF, conf)
}
func (this *DbServiceImpl) GetSSHConf(key string) *model.SSHModel {
defer boltDb.Close()
model := &model.SSHModel{}
if b, err := this.get(key, model); err != nil {
return nil
} else {
val := b.Get([]byte(key))
if err = json.Unmarshal(val, model); err != nil {
logrus.Errorf("get gen conf err:%v", err)
return nil
}
}
return model
} }
var ( var (
boltDb *bolt.DB boltDb *bolt.DB
bucket *bolt.Bucket bucket *bolt.Bucket
once sync.Once
err error err error
) )
func GetBoltDb() *bolt.DB { func GetBoltDb() *bolt.DB {
// once.Do(func() {
boltDb, err = bolt.Open(common.BOLTDB_NAME, 0600, &bolt.Options{Timeout: 5 * time.Second}) boltDb, err = bolt.Open(common.BOLTDB_NAME, 0600, &bolt.Options{Timeout: 5 * time.Second})
if err != nil { if err != nil {
log.Fatal(err) log.Fatal(err)
@ -106,6 +132,5 @@ func GetBoltDb() *bolt.DB {
} }
return nil return nil
}) })
// })
return boltDb return boltDb
} }

View File

@ -61,6 +61,7 @@ func (p *PttServiceImpl) SendToClient(mainType, subType string, rsp proto.Messag
now := time.Now() now := time.Now()
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)
return err
} }
p.obs.Notify(observer.EVENT_RST, now) p.obs.Notify(observer.EVENT_RST, now)
return return

View File

@ -0,0 +1,98 @@
package service
import (
"fmt"
"io/ioutil"
"net"
"time"
"golang.org/x/crypto/ssh"
)
type SSHService struct {
}
func NewSSHService() *SSHService {
return &SSHService{}
}
func (ss *SSHService) Connect(user, password, host, key string, port int, cipherList []string) (*ssh.Session, error) {
var (
auth []ssh.AuthMethod //认证方式
addr string
clientConfig *ssh.ClientConfig
client *ssh.Client
config ssh.Config
session *ssh.Session
err error
)
auth = make([]ssh.AuthMethod, 0)
if key == "" {
// 密码认证
auth = append(auth, ssh.Password(password))
} else {
// 秘钥认证
pemBytes, err := ioutil.ReadFile(key)
if err != nil {
return nil, err
}
var signer ssh.Signer
if password == "" {
signer, err = ssh.ParsePrivateKey(pemBytes)
} else {
signer, err = ssh.ParsePrivateKeyWithPassphrase(pemBytes, []byte(password))
}
if err != nil {
return nil, err
}
// 加载秘钥
auth = append(auth, ssh.PublicKeys(signer))
}
// 设置ssh 的配置参数
if len(cipherList) == 0 {
config = ssh.Config{
// 连接所允许的加密算法, go的SSH包允许的算法
Ciphers: []string{"aes128-ctr", "aes192-ctr", "aes256-ctr", "aes128-gcm@openssh.com", "arcfour256", "arcfour128", "aes128-cbc", "3des-cbc", "aes192-cbc", "aes256-cbc"},
}
} else {
config = ssh.Config{
Ciphers: cipherList,
}
}
clientConfig = &ssh.ClientConfig{
User: user,
Auth: auth,
Timeout: time.Second * 30,
Config: config,
// 默认密钥不受信任时Go 的 ssh 包会在 HostKeyCallback 里把连接干掉1.8 之后加的应该)。但是我们使用用户名密码连接的时候,这个太正常了,所以让他 return nil 就好了
HostKeyCallback: func(hostname string, remote net.Addr, key ssh.PublicKey) error {
return nil
},
}
addr = fmt.Sprintf("%s:%d", host, port)
if client, err = ssh.Dial("tcp", addr, clientConfig); err != nil {
return nil, err
}
if session, err = client.NewSession(); err != nil {
return nil, err
}
// 使用 session.Shell() 模拟终端时,所建立的终端参数
modes := ssh.TerminalModes{
ssh.ECHO: 0, //disable echoing
ssh.TTY_OP_ISPEED: 14400, //input speed=14.4kbaud
ssh.TTY_OP_OSPEED: 14400,
}
if err := session.RequestPty("xterm", 80, 40, modes); err != nil {
return nil, err
}
return session, nil
}

View File

@ -0,0 +1,53 @@
package service
import (
"bytes"
"strings"
"testing"
)
const (
username = "root"
password = "Legu.cc()123"
ip = "10.0.0.9"
port = 22
cmd = "ls"
cmds = "cd /home/liwei/go_dreamfactory&&git pull&&exit" //exit结尾,否则程序不会退出
)
func TestSSHConnect(t *testing.T) {
ciphers := []string{}
ssh := &SSHService{}
session, err := ssh.Connect(username, password, ip, "", port, ciphers)
if err != nil {
t.Fatal(err)
}
defer session.Close()
cmdlist := strings.Split(cmds, "&&")
stdinBuf, err := session.StdinPipe()
if err != nil {
t.Fatal(err)
}
var stdoutBuf, errBuf bytes.Buffer
session.Stdout = &stdoutBuf
session.Stderr = &errBuf
if err := session.Shell(); err != nil {
t.Error(err)
}
for _, c := range cmdlist {
c = c + "\n"
stdinBuf.Write([]byte(c))
}
session.Wait()
t.Logf(stdoutBuf.String() + errBuf.String())
// if err := session.Run(cmd); err != nil {
// t.Logf("run err: %v", err)
// }
// t.Logf("res: %v", session.Stdout)
}

View File

@ -24,6 +24,7 @@ var (
&appWelcome{}, &appWelcome{},
&appGen{}, &appGen{},
&appLock{}, &appLock{},
&appTerm{},
} }
) )

View File

@ -291,6 +291,19 @@ var (
Req: &pb.TaskListReq{}, Req: &pb.TaskListReq{},
Rsp: &pb.TaskListResp{}, Rsp: &pb.TaskListResp{},
Enabled: true, Enabled: true,
Print: func(rsp proto.Message) string {
in := rsp.(*pb.UserMessage)
out := &pb.TaskListResp{}
if !comm.ProtoUnmarshal(in, out) {
return errors.New("unmarshal err").Error()
}
var formatStr strings.Builder
for i, v := range out.List {
formatStr.WriteString(fmt.Sprintf("%d- %v\n", (i + 1), v))
}
return formatStr.String()
},
}, },
ff(comm.ModuleTask, task.TaskSubTypeActiveList): { ff(comm.ModuleTask, task.TaskSubTypeActiveList): {
NavLabel: "活跃度列表", NavLabel: "活跃度列表",
@ -321,8 +334,6 @@ var (
Desc: "英雄列表", Desc: "英雄列表",
MainType: string(comm.ModuleHero), MainType: string(comm.ModuleHero),
SubType: hero.HeroSubTypeList, SubType: hero.HeroSubTypeList,
Req: &pb.HeroListReq{},
Rsp: &pb.HeroListResp{},
Print: func(rsp proto.Message) string { Print: func(rsp proto.Message) string {
in := rsp.(*pb.UserMessage) in := rsp.(*pb.UserMessage)
out := &pb.HeroListResp{} out := &pb.HeroListResp{}

View File

@ -30,7 +30,7 @@ func (this *appGen) LazyInit(obs observer.Observer) error {
this.tabItem = container.NewTabItemWithIcon(common.TOOLBAR_GEN, theme.ContentCopyIcon(), nil) this.tabItem = container.NewTabItemWithIcon(common.TOOLBAR_GEN, theme.ContentCopyIcon(), nil)
// load // load
gt := service.GetDbService().Get(common.BUCKET_CONF) gt := service.GetDbService().GetLubanConf(common.BUCKET_LUBANCONF)
logrus.Debugf("%v", gt) logrus.Debugf("%v", gt)
content := container.NewMax() content := container.NewMax()
@ -40,29 +40,29 @@ func (this *appGen) LazyInit(obs observer.Observer) error {
serverAddr.PlaceHolder = "服务器地址 例如: 10.0.1.11" serverAddr.PlaceHolder = "服务器地址 例如: 10.0.1.11"
projectDir := widget.NewEntry() projectDir := widget.NewEntry()
projectDir.PlaceHolder = "项目目录 例如: E:\\projects\\workspace\\go_dreamfactory" projectDir.PlaceHolder = "项目目录 例如: E:\\projects\\workspace\\go_dreamfactory\\"
workDir := widget.NewEntry() workDir := widget.NewEntry()
workDir.PlaceHolder = "LuBan目录 例如: E:\\svn\\dreamworks\\client\\dreamworks\\ExcelFile" workDir.PlaceHolder = "LuBan目录 例如: E:\\svn\\dreamworks\\client\\dreamworks\\ExcelFile\\"
// client // client
client := widget.NewEntry() client := widget.NewEntry()
client.PlaceHolder = "配置Luban Client.exe路径 例如: \\Luban.Client\\Luban.Client.exe" client.PlaceHolder = "配置Luban Client.exe路径 例如: Luban.Client\\Luban.Client.exe"
//define //define
define := widget.NewEntry() define := widget.NewEntry()
define.PlaceHolder = "定义文件" define.PlaceHolder = "定义文件"
define.Text = "\\Defines\\__root__.xml" define.Text = "Defines\\__root__.xml"
// output // output
outputCodeDir := widget.NewEntry() outputCodeDir := widget.NewEntry()
outputCodeDir.Text = "\\sys\\configure\\structs" outputCodeDir.Text = "sys\\configure\\structs"
outputJsonDir := widget.NewEntry() outputJsonDir := widget.NewEntry()
outputJsonDir.Text = "\\bin\\json" outputJsonDir.Text = "bin\\json"
//input //input
inputDir := widget.NewEntry() inputDir := widget.NewEntry()
inputDir.Text = "\\Datas" inputDir.Text = "Datas"
//genType //genType
var genTypeText string var genTypeText string
@ -75,7 +75,7 @@ func (this *appGen) LazyInit(obs observer.Observer) error {
serverAddr.Text = gt.ServerAddr serverAddr.Text = gt.ServerAddr
projectDir.Text = gt.ProjectDir //"E:\\projects\\workspace\\go_dreamfactory" projectDir.Text = gt.ProjectDir //"E:\\projects\\workspace\\go_dreamfactory"
workDir.Text = gt.WorkDir // "E:\\svn\\dreamworks\\client\\dreamworks\\ExcelFile" workDir.Text = gt.WorkDir // "E:\\svn\\dreamworks\\client\\dreamworks\\ExcelFile"
client.Text = gt.Client //"\\Luban.Client\\Luban.Client.exe" client.Text = gt.Client //"Luban.Client\\Luban.Client.exe"
genType.Selected = gt.GenType genType.Selected = gt.GenType
genTypeText = gt.GenType genTypeText = gt.GenType
} }
@ -107,7 +107,7 @@ func (this *appGen) LazyInit(obs observer.Observer) error {
} }
saveBtn := widget.NewButtonWithIcon("保存配置", theme.DocumentSaveIcon(), func() { saveBtn := widget.NewButtonWithIcon("保存配置", theme.DocumentSaveIcon(), func() {
if err := service.GetDbService().Save(&model.GenTool{ if err := service.GetDbService().SaveLubanConf(&model.GenTool{
ServerAddr: serverAddr.Text, ServerAddr: serverAddr.Text,
ProjectDir: projectDir.Text, ProjectDir: projectDir.Text,
Client: client.Text, Client: client.Text,
@ -139,12 +139,12 @@ func (this *appGen) LazyInit(obs observer.Observer) error {
commandStr := `%s -h %s -j cfg -- -d %s --input_data_dir %s --output_code_dir %s --output_data_dir %s --gen_types %s --go:bright_module_name bright -s server` commandStr := `%s -h %s -j cfg -- -d %s --input_data_dir %s --output_code_dir %s --output_data_dir %s --gen_types %s --go:bright_module_name bright -s server`
arg := fmt.Sprintf(commandStr, arg := fmt.Sprintf(commandStr,
fmt.Sprintf("%s\\%s", workDir.Text, client.Text), fmt.Sprintf("%s%s", workDir.Text, client.Text),
serverAddr.Text, serverAddr.Text,
fmt.Sprintf("%s\\%s", workDir.Text, define.Text), fmt.Sprintf("%s%s", workDir.Text, define.Text),
fmt.Sprintf("%s\\%s", workDir.Text, inputDir.Text), fmt.Sprintf("%s%s", workDir.Text, inputDir.Text),
fmt.Sprintf("%s\\%s", projectDir.Text, outputCodeDir.Text), fmt.Sprintf("%s%s", projectDir.Text, outputCodeDir.Text),
fmt.Sprintf("%s\\%s", projectDir.Text, outputJsonDir.Text), fmt.Sprintf("%s%s", projectDir.Text, outputJsonDir.Text),
getType(), getType(),
) )

76
cmd/v2/ui/tool_ssh.go Normal file
View File

@ -0,0 +1,76 @@
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"
"golang.org/x/crypto/ssh"
"golang.org/x/crypto/ssh/terminal"
)
type appTerm struct {
appAdapter
obs observer.Observer
}
type termResizer struct {
widget.Icon
term *terminal.Terminal
debug bool
sess *ssh.Session
win fyne.Window
}
func (this *appTerm) LazyInit(obs observer.Observer) error {
this.obs = obs
this.tabItem = container.NewTabItemWithIcon(common.TOOLBAR_TERM, theme.ContentCopyIcon(), nil)
content := container.NewMax()
content.Objects = []fyne.CanvasObject{}
//cmd input
multiEntry := widget.NewMultiLineEntry()
multiEntry.PlaceHolder = "命令输入,使用;分隔"
//config
ip := widget.NewEntry()
userName := widget.NewEntry()
password := widget.NewPasswordEntry()
configForm := widget.NewForm(
&widget.FormItem{Text: "IP:", Widget: ip},
&widget.FormItem{Text: "用户名:", Widget: userName},
&widget.FormItem{Text: "密码:", Widget: password},
)
saveBtn := widget.NewButtonWithIcon("保存配置", theme.DocumentSaveIcon(), func() {
})
connBtn := widget.NewButtonWithIcon("连接", theme.ConfirmIcon(), func() {
})
btns := container.NewGridWithColumns(2, saveBtn, connBtn)
//term
t := &termResizer{win: toolWin.w}
t.ExtendBaseWidget(t)
split := container.NewVSplit(container.NewGridWithColumns(2,
multiEntry,
container.NewBorder(configForm, btns, widget.NewSeparator(), nil)), t)
split.Offset = 0.3
content.Objects = append(content.Objects, split)
this.tabItem.Content = content
return nil
}
func (a *appTerm) GetAppName() string {
return common.TOOLBAR_TERM
}

View File

@ -40,6 +40,10 @@ func NewToolWindow(ui *UIImpl) ToolWindow {
openApp1(common.TOOLBAR_SEC) openApp1(common.TOOLBAR_SEC)
}), }),
widget.NewToolbarAction(theme.ContentUndoIcon(), func() {
openApp1(common.TOOLBAR_TERM)
}),
widget.NewToolbarSpacer(), widget.NewToolbarSpacer(),
widget.NewToolbarAction(theme.HelpIcon(), func() { widget.NewToolbarAction(theme.HelpIcon(), func() {
showAbout() showAbout()

View File

@ -122,6 +122,7 @@ func (this *toyUserInfo) dataListener() {
rsp := &pb.UserModifynameResp{} rsp := &pb.UserModifynameResp{}
if !comm.ProtoUnmarshal(data, rsp) { if !comm.ProtoUnmarshal(data, rsp) {
logrus.Error("unmarshal err") logrus.Error("unmarshal err")
return
} }
// updatename // updatename
this.setProp(2, common.USERINFO_NAME, rsp.Name) this.setProp(2, common.USERINFO_NAME, rsp.Name)
@ -162,6 +163,7 @@ func (this *toyUserInfo) dataListener() {
rsp := &pb.UserResChangePush{} rsp := &pb.UserResChangePush{}
if !comm.ProtoUnmarshal(data.Msg, rsp) { if !comm.ProtoUnmarshal(data.Msg, rsp) {
logrus.Error("unmarshal err") logrus.Error("unmarshal err")
return
} }
this.setProp(5, common.USERINFO_GOLD, rsp.Gold) this.setProp(5, common.USERINFO_GOLD, rsp.Gold)
} }

View File

@ -80,7 +80,6 @@ func (this *HeroListView) CreateView(t *model.TestCase) fyne.CanvasObject {
this.subWindows.itemListData.DataList = append(this.subWindows.itemListData.DataList, fm) this.subWindows.itemListData.DataList = append(this.subWindows.itemListData.DataList, fm)
} }
} }
this.subWindows.reloadListData()
split := container.NewHSplit(this.subWindows.dataListWidget, container.NewVBox(starBtn, lvBtn)) split := container.NewHSplit(this.subWindows.dataListWidget, container.NewVBox(starBtn, lvBtn))
split.Offset = 1 split.Offset = 1
@ -118,7 +117,8 @@ func (this *HeroListView) dataListener() {
rsp := &pb.HeroListResp{} rsp := &pb.HeroListResp{}
if !comm.ProtoUnmarshal(data, rsp) { if !comm.ProtoUnmarshal(data, rsp) {
logrus.Error("unmarshal err") logrus.Error("hero_list unmarshal err")
return
} }
this.heroList = rsp.List this.heroList = rsp.List

View File

@ -10,6 +10,7 @@ import (
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/modules/task" "go_dreamfactory/modules/task"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"time"
"fyne.io/fyne/v2" "fyne.io/fyne/v2"
"fyne.io/fyne/v2/container" "fyne.io/fyne/v2/container"
@ -71,7 +72,9 @@ func (this *TaskListView) CreateView(t *model.TestCase) fyne.CanvasObject {
func (this *TaskListView) dataListener() { func (this *TaskListView) dataListener() {
this.obs.AddListener(observer.EVENT_REQ_RSP, observer.Listener{ this.obs.AddListener(observer.EVENT_REQ_RSP, observer.Listener{
OnNotify: func(d interface{}, args ...interface{}) { OnNotify: func(d interface{}, args ...interface{}) {
time.Sleep(time.Millisecond * 20)
data := d.(*pb.UserMessage) data := d.(*pb.UserMessage)
logrus.Debugf("%s %s ...", data.MainType, data.SubType)
if !(data.MainType == string(comm.ModuleTask) && if !(data.MainType == string(comm.ModuleTask) &&
data.SubType == task.TaskSubTypeList) { data.SubType == task.TaskSubTypeList) {
return return
@ -79,7 +82,8 @@ func (this *TaskListView) dataListener() {
rsp := &pb.TaskListResp{} rsp := &pb.TaskListResp{}
if !comm.ProtoUnmarshal(data, rsp) { if !comm.ProtoUnmarshal(data, rsp) {
logrus.Error("unmarshal err") logrus.Error("task_list unmarshal err")
return
} }
this.itemListData = model.NewItemModelList() this.itemListData = model.NewItemModelList()

5
go.mod
View File

@ -41,9 +41,12 @@ require (
gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v2 v2.4.0
) )
require golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 // indirect
require ( require (
fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93 // indirect fyne.io/systray v1.10.1-0.20220621085403-9a2652634e93 // indirect
github.com/PuerkitoBio/goquery v1.8.0 // indirect github.com/PuerkitoBio/goquery v1.8.0 // indirect
github.com/agiledragon/gomonkey/v2 v2.8.0
github.com/akutz/memconn v0.1.0 // indirect github.com/akutz/memconn v0.1.0 // indirect
github.com/andybalholm/cascadia v1.3.1 // indirect github.com/andybalholm/cascadia v1.3.1 // indirect
github.com/apache/thrift v0.16.0 // indirect github.com/apache/thrift v0.16.0 // indirect
@ -163,7 +166,7 @@ require (
go.opentelemetry.io/otel/trace v1.6.3 // indirect go.opentelemetry.io/otel/trace v1.6.3 // indirect
go.uber.org/atomic v1.7.0 // indirect go.uber.org/atomic v1.7.0 // indirect
go.uber.org/zap v1.17.0 // indirect go.uber.org/zap v1.17.0 // indirect
golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 // indirect golang.org/x/crypto v0.0.0-20220824171710-5757bc0c5503 // indirect
golang.org/x/image v0.0.0-20220601225756-64ec528b34cd // indirect golang.org/x/image v0.0.0-20220601225756-64ec528b34cd // indirect
golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee // indirect golang.org/x/mobile v0.0.0-20211207041440-4e6c2922fdee // indirect
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4 // indirect

5
go.sum
View File

@ -60,6 +60,8 @@ github.com/Pallinder/go-randomdata v1.2.0 h1:DZ41wBchNRb/0GfsePLiSwb0PHZmT67XY00
github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y= github.com/Pallinder/go-randomdata v1.2.0/go.mod h1:yHmJgulpD2Nfrm0cR9tI/+oAgRqCQQixsA8HyRZfV9Y=
github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U= github.com/PuerkitoBio/goquery v1.8.0 h1:PJTF7AmFCFKk1N6V6jmKfrNH9tV5pNE6lZMkG0gta/U=
github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI= github.com/PuerkitoBio/goquery v1.8.0/go.mod h1:ypIiRMtY7COPGk+I/YbZLbxsxn9g5ejnI2HSMtkjZvI=
github.com/agiledragon/gomonkey/v2 v2.8.0 h1:u2K2nNGyk0ippzklz1CWalllEB9ptD+DtSXeCX5O000=
github.com/agiledragon/gomonkey/v2 v2.8.0/go.mod h1:ap1AmDzcVOAz1YpeJ3TCzIgstoaWLA6jbbgxfB4w2iY=
github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/akavel/rsrc v0.10.2/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c=
github.com/akutz/memconn v0.1.0 h1:NawI0TORU4hcOMsMr11g7vwlCdkYeLKXBcxWu2W/P8A= github.com/akutz/memconn v0.1.0 h1:NawI0TORU4hcOMsMr11g7vwlCdkYeLKXBcxWu2W/P8A=
github.com/akutz/memconn v0.1.0/go.mod h1:Jo8rI7m0NieZyLI5e2CDlRdRqRRB4S7Xp77ukDjH+Fw= github.com/akutz/memconn v0.1.0/go.mod h1:Jo8rI7m0NieZyLI5e2CDlRdRqRRB4S7Xp77ukDjH+Fw=
@ -828,6 +830,8 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y
golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20211215153901-e495a2d5b3d3/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM= golang.org/x/crypto v0.0.0-20220408190544-5352b0902921 h1:iU7T1X1J6yxDr0rda54sWGkHgOp5XJrqm79gcNlC2VM=
golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.0.0-20220408190544-5352b0902921/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/crypto v0.0.0-20220824171710-5757bc0c5503 h1:vJ2V3lFLg+bBhgroYuRfyN583UzVveQmIXjc8T/y3to=
golang.org/x/crypto v0.0.0-20220824171710-5757bc0c5503/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@ -1039,6 +1043,7 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f h1:v4INt8xihDGvnrfjMDVXGxw9wrfxYyCjk0KbXjhR55s=
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211 h1:JGgROgKl9N8DuW20oFS5gxc+lE67/N3FcwmBPMe7ArY=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=

View File

@ -3,6 +3,7 @@ package rtask
import ( import (
"go_dreamfactory/comm" "go_dreamfactory/comm"
"go_dreamfactory/pb" "go_dreamfactory/pb"
"go_dreamfactory/utils"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )
@ -54,6 +55,12 @@ func (this *apiComp) Choose(session comm.IUserSession, req *pb.RtaskChooseReq) (
} }
// 更新完成的任务 // 更新完成的任务
//验证该任务是否已完成
if _, ok := utils.Findx(frtaskArr.RtaskIds, req.RtaskId); ok {
code = pb.ErrorCode_RtaskFinished
return
}
frtaskArr.RtaskIds = append(frtaskArr.RtaskIds, req.RtaskId) frtaskArr.RtaskIds = append(frtaskArr.RtaskIds, req.RtaskId)
if rtask.FrtaskIds == nil { if rtask.FrtaskIds == nil {
rtask.FrtaskIds = make(map[int32]*pb.FrtaskIds) rtask.FrtaskIds = make(map[int32]*pb.FrtaskIds)
@ -69,7 +76,10 @@ func (this *apiComp) Choose(session comm.IUserSession, req *pb.RtaskChooseReq) (
//发奖励 //发奖励
code = this.moduleRtask.DispenseRes(session, conf.Reward, true) code = this.moduleRtask.DispenseRes(session, conf.Reward, true)
rsp := &pb.RtaskChooseResp{} rsp := &pb.RtaskChooseResp{
RtaskId: req.RtaskId,
ChooseId: req.ChooseId,
}
if err := session.SendMsg(string(this.moduleRtask.GetType()), RtaskSubTypeChoose, rsp); err != nil { if err := session.SendMsg(string(this.moduleRtask.GetType()), RtaskSubTypeChoose, rsp); err != nil {
code = pb.ErrorCode_SystemError code = pb.ErrorCode_SystemError

View File

@ -73,7 +73,7 @@ func (this *ModelRtask) checkCondi(uid string, condiId int32) (ok bool) {
//验证限定条件 //验证限定条件
if condi, ok := this.moduleRtask.rtaskHandleMap[condiId]; ok { if condi, ok := this.moduleRtask.rtaskHandleMap[condiId]; ok {
if ok = condi.fn(uid, condi.cfg); !ok { if ok = condi.fn(uid, condi.cfg); !ok {
log.Infof("uid: %v do rtask %v condition not reach", uid, condiId) log.Debugf("uid: %v do rtask %v condition not reach", uid, condiId)
return false return false
} }
return true return true
@ -105,8 +105,10 @@ func (this *ModelRtask) HeroLvTarget(uid string, cfg *cfg.GameRdtaskCondiData) (
h := heroModule.(comm.IHero) h := heroModule.(comm.IHero)
var hero *pb.DBHero var hero *pb.DBHero
for _, v := range h.GetHeroList(uid) { for _, v := range h.GetHeroList(uid) {
// 查找指定英雄
if cast.ToString(cfg.Data1) == v.HeroID { if cast.ToString(cfg.Data1) == v.HeroID {
hero = v hero = v
break
} }
} }
if hero != nil { if hero != nil {
@ -127,6 +129,7 @@ func (this *ModelRtask) EquipNum(uid string, cfg *cfg.GameRdtaskCondiData) (ok b
for _, v := range h.GetHeroList(uid) { for _, v := range h.GetHeroList(uid) {
if cast.ToString(cfg.Data1) == v.HeroID { if cast.ToString(cfg.Data1) == v.HeroID {
hero = v hero = v
break
} }
} }
@ -167,8 +170,8 @@ func (this *ModelRtask) TaskDay(uid string, cfg *cfg.GameRdtaskCondiData) (ok bo
} }
itask := taskModule.(comm.ITask) itask := taskModule.(comm.ITask)
var task *pb.DBTask
if task := itask.GetTaskById(uid, cfg.Data1); task == nil { if task = itask.GetTaskById(uid, cfg.Data1); task == nil {
return false return false
} else { } else {
//任务完成 //任务完成
@ -192,6 +195,7 @@ func (this *ModelRtask) HeroStarTarget(uid string, cfg *cfg.GameRdtaskCondiData)
for _, v := range h.GetHeroList(uid) { for _, v := range h.GetHeroList(uid) {
if cast.ToString(cfg.Data1) == v.HeroID { if cast.ToString(cfg.Data1) == v.HeroID {
hero = v hero = v
break
} }
} }

View File

@ -270,6 +270,9 @@ type RtaskChooseResp struct {
state protoimpl.MessageState state protoimpl.MessageState
sizeCache protoimpl.SizeCache sizeCache protoimpl.SizeCache
unknownFields protoimpl.UnknownFields unknownFields protoimpl.UnknownFields
RtaskId int32 `protobuf:"varint,1,opt,name=rtaskId,proto3" json:"rtaskId"` //任务ID
ChooseId int32 `protobuf:"varint,2,opt,name=chooseId,proto3" json:"chooseId"` //选项配置ID
} }
func (x *RtaskChooseResp) Reset() { func (x *RtaskChooseResp) Reset() {
@ -304,6 +307,20 @@ func (*RtaskChooseResp) Descriptor() ([]byte, []int) {
return file_rtask_rtask_msg_proto_rawDescGZIP(), []int{5} return file_rtask_rtask_msg_proto_rawDescGZIP(), []int{5}
} }
func (x *RtaskChooseResp) GetRtaskId() int32 {
if x != nil {
return x.RtaskId
}
return 0
}
func (x *RtaskChooseResp) GetChooseId() int32 {
if x != nil {
return x.ChooseId
}
return 0
}
// 任务完成推送 // 任务完成推送
type RtaskFinishPush struct { type RtaskFinishPush struct {
state protoimpl.MessageState state protoimpl.MessageState
@ -466,18 +483,22 @@ var file_rtask_rtask_msg_proto_rawDesc = []byte{
0x6f, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x6f, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b,
0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49,
0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20,
0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x49, 0x64, 0x22, 0x11, 0x0a, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x49, 0x64, 0x22, 0x47, 0x0a,
0x0f, 0x52, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70, 0x0f, 0x52, 0x74, 0x61, 0x73, 0x6b, 0x43, 0x68, 0x6f, 0x6f, 0x73, 0x65, 0x52, 0x65, 0x73, 0x70,
0x22, 0x2b, 0x0a, 0x0f, 0x52, 0x74, 0x61, 0x73, 0x6b, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x50, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
0x75, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x68,
0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x6f, 0x6f, 0x73, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x68,
0x11, 0x52, 0x74, 0x61, 0x73, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, 0x6f, 0x6f, 0x73, 0x65, 0x49, 0x64, 0x22, 0x2b, 0x0a, 0x0f, 0x52, 0x74, 0x61, 0x73, 0x6b, 0x46,
0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x50, 0x75, 0x73, 0x68, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61,
0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x12, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73,
0x52, 0x74, 0x61, 0x73, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, 0x65, 0x6b, 0x49, 0x64, 0x22, 0x2d, 0x0a, 0x11, 0x52, 0x74, 0x61, 0x73, 0x6b, 0x47, 0x65, 0x74, 0x52,
0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x65, 0x77, 0x61, 0x72, 0x64, 0x52, 0x65, 0x71, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73,
0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x42, 0x06, 0x5a, 0x04, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b,
0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, 0x49, 0x64, 0x22, 0x2e, 0x0a, 0x12, 0x52, 0x74, 0x61, 0x73, 0x6b, 0x47, 0x65, 0x74, 0x52, 0x65,
0x77, 0x61, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x74, 0x61, 0x73,
0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x72, 0x74, 0x61, 0x73, 0x6b,
0x49, 0x64, 0x42, 0x06, 0x5a, 0x04, 0x2e, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74,
0x6f, 0x33,
} }
var ( var (