完善聊天功能 初步构建十子棋功能
This commit is contained in:
@@ -0,0 +1,7 @@
|
|||||||
|
db_path=data/data.db
|
||||||
|
card_dir=data
|
||||||
|
card_info=package.json
|
||||||
|
avatar=data/avatar
|
||||||
|
zeroconf_key=work_cations_service
|
||||||
|
zeroconf_port=16800
|
||||||
|
server_addr=:16805
|
||||||
@@ -22,6 +22,7 @@ func InitDB() {
|
|||||||
&models.Users{},
|
&models.Users{},
|
||||||
&models.UserFollows{},
|
&models.UserFollows{},
|
||||||
&models.BaseCard{},
|
&models.BaseCard{},
|
||||||
|
&models.ChatMessage{},
|
||||||
)
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
|
|||||||
+23
-5
@@ -41,14 +41,14 @@ func TestP2(t *testing.T) {
|
|||||||
)
|
)
|
||||||
|
|
||||||
f := func(tx *gorm.DB) *gorm.DB {
|
f := func(tx *gorm.DB) *gorm.DB {
|
||||||
// Find SELECT `id`,`value` FROM `test_models` WHERE id = 1 AND `test_models`.`deleted_at` IS NULL ORDER BY ID desc
|
// Find SELECT `id`,`value` FROM `test_models` WHERE id = 1 AND `test_models`.`deleted_at` IS NULL ORDER BY UserID desc
|
||||||
// First SELECT `id`,`value` FROM `test_models` WHERE id = 1 AND `test_models`.`deleted_at` IS NULL ORDER BY ID desc,`test_models`.`id` LIMIT 1
|
// First SELECT `id`,`value` FROM `test_models` WHERE id = 1 AND `test_models`.`deleted_at` IS NULL ORDER BY UserID desc,`test_models`.`id` LIMIT 1
|
||||||
// row value misused 滥用
|
// row value misused 滥用
|
||||||
return tx.
|
return tx.
|
||||||
Where("id in ?", id).
|
Where("id in ?", id).
|
||||||
//Or("id = ? ", id+1).
|
//Or("id = ? ", id+1).
|
||||||
Select("value").
|
Select("value").
|
||||||
Order("ID desc").Find(&row)
|
Order("UserID desc").Find(&row)
|
||||||
}
|
}
|
||||||
|
|
||||||
testSql(db, f)
|
testSql(db, f)
|
||||||
@@ -65,7 +65,7 @@ func TestP3(t *testing.T) {
|
|||||||
|
|
||||||
f := func(tx *gorm.DB) *gorm.DB {
|
f := func(tx *gorm.DB) *gorm.DB {
|
||||||
// Update `test_models` SET `value`="[1 2]",`updated_at`="2024-10-05 13:21:47.253" WHERE id in (1,2) AND `test_models`.`deleted_at` IS NULL 返回个数:2 err: <nil>
|
// Update `test_models` SET `value`="[1 2]",`updated_at`="2024-10-05 13:21:47.253" WHERE id in (1,2) AND `test_models`.`deleted_at` IS NULL 返回个数:2 err: <nil>
|
||||||
// Save SELECT `id`,`value` FROM `test_models` WHERE id = 1 AND `test_models`.`deleted_at` IS NULL ORDER BY ID desc,`test_models`.`id` LIMIT 1
|
// Save SELECT `id`,`value` FROM `test_models` WHERE id = 1 AND `test_models`.`deleted_at` IS NULL ORDER BY UserID desc,`test_models`.`id` LIMIT 1
|
||||||
// row value misused 滥用
|
// row value misused 滥用
|
||||||
return tx.Model(&TestModel{}).
|
return tx.Model(&TestModel{}).
|
||||||
Where("id in ?", 5).
|
Where("id in ?", 5).
|
||||||
@@ -75,7 +75,7 @@ func TestP3(t *testing.T) {
|
|||||||
//Update("value", []byte(fmt.Sprintf("%d", id)))
|
//Update("value", []byte(fmt.Sprintf("%d", id)))
|
||||||
//Or("id = ? ", id+1).
|
//Or("id = ? ", id+1).
|
||||||
//Select("value").
|
//Select("value").
|
||||||
//Order("ID desc").Find(&row)
|
//Order("UserID desc").Find(&row)
|
||||||
}
|
}
|
||||||
|
|
||||||
testSql(db, f)
|
testSql(db, f)
|
||||||
@@ -177,3 +177,21 @@ func convertToUTF8(input string) (string, error) {
|
|||||||
|
|
||||||
return utf8Str, nil
|
return utf8Str, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TestMode2 struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Level int
|
||||||
|
}
|
||||||
|
type TestMode3 struct {
|
||||||
|
T TestMode2
|
||||||
|
Name string `json:"name1"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestP11(t *testing.T) {
|
||||||
|
var t1 = TestMode3{
|
||||||
|
T: TestMode2{Name: "测试1", Level: 1},
|
||||||
|
Name: "测试2",
|
||||||
|
}
|
||||||
|
fmt.Println(t1)
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
+43
-4
@@ -1,14 +1,53 @@
|
|||||||
package models
|
package models
|
||||||
|
|
||||||
import "time"
|
import (
|
||||||
|
"time"
|
||||||
|
)
|
||||||
|
|
||||||
type ChatMessage struct {
|
type ChatMessage struct {
|
||||||
User Users
|
UserID string
|
||||||
Time time.Time
|
UserName string
|
||||||
Text string
|
CreateTx time.Time
|
||||||
|
Type string
|
||||||
|
Text string
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const (
|
||||||
|
ChatTypeText = "TEXT" // 对话
|
||||||
|
ChatTypeCard = "CARD" // 工具卡片分享
|
||||||
|
)
|
||||||
|
|
||||||
|
func NewTextChatMsg(user *Users, text string) *ChatMessage {
|
||||||
|
return &ChatMessage{
|
||||||
|
UserID: user.ID,
|
||||||
|
UserName: user.Name,
|
||||||
|
CreateTx: time.Now(),
|
||||||
|
Type: ChatTypeText,
|
||||||
|
Text: text,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type Message struct {
|
type Message struct {
|
||||||
Cmd string
|
Cmd string
|
||||||
User UserFollows
|
User UserFollows
|
||||||
ChatMessage ChatMessage
|
ChatMessage ChatMessage
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
//// Value 接口,Value 返回 json value any -> string
|
||||||
|
//func (j *Users) Value() (driver.Value, error) {
|
||||||
|
// return json.Marshal(j)
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//// Scan 接口,Scan 将 value 扫描至 Jsonb
|
||||||
|
//func (j *Users) Scan(value interface{}) error {
|
||||||
|
// bytes, ok := value.([]byte)
|
||||||
|
// if !ok {
|
||||||
|
// return errors.New(fmt.Sprint("Failed to unmarshal JSONB value:", value))
|
||||||
|
// }
|
||||||
|
// err := json.Unmarshal(bytes, j)
|
||||||
|
// if err != nil {
|
||||||
|
// return err
|
||||||
|
// }
|
||||||
|
// return nil
|
||||||
|
//}
|
||||||
|
|||||||
@@ -0,0 +1,21 @@
|
|||||||
|
package repo
|
||||||
|
|
||||||
|
import (
|
||||||
|
"gorm.io/gorm"
|
||||||
|
"work_cation/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type chatMessageRepo struct{}
|
||||||
|
|
||||||
|
var ChatMsg = &chatMessageRepo{}
|
||||||
|
|
||||||
|
func (*chatMessageRepo) GetUserMsgs(db *gorm.DB, uuid string, limit int) []models.ChatMessage {
|
||||||
|
var msgs []models.ChatMessage
|
||||||
|
// ASC:升序(默认),DESC:降序。
|
||||||
|
db.Order("create_tx ASC").Limit(limit).Where("user_id = ?", uuid).Find(&msgs)
|
||||||
|
return msgs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (*chatMessageRepo) Create(db *gorm.DB, msg *models.ChatMessage) error {
|
||||||
|
return db.Create(msg).Error
|
||||||
|
}
|
||||||
+1
-1
@@ -45,5 +45,5 @@ func (u *userRepo) GetUserInfo(db *gorm.DB) *models.Users {
|
|||||||
|
|
||||||
func (u *userRepo) Update(db *gorm.DB, newUser *models.Users) error {
|
func (u *userRepo) Update(db *gorm.DB, newUser *models.Users) error {
|
||||||
u.isNew = false
|
u.isNew = false
|
||||||
return db.Model(&models.Users{}).Where("ID = ?", newUser.ID).Updates(newUser).Error
|
return db.Model(&models.Users{}).Where("UserID = ?", newUser.ID).Updates(newUser).Error
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -10,7 +10,7 @@ type userFollowRepo struct{}
|
|||||||
var UserFollow = &userFollowRepo{}
|
var UserFollow = &userFollowRepo{}
|
||||||
|
|
||||||
func (u *userFollowRepo) Follow(db *gorm.DB, user *models.UserFollows) error {
|
func (u *userFollowRepo) Follow(db *gorm.DB, user *models.UserFollows) error {
|
||||||
return db.Create(user).Error
|
return db.Model(&models.UserFollows{}).Create(user).Error
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *userFollowRepo) GetUser(db *gorm.DB, uuid string) *models.UserFollows {
|
func (u *userFollowRepo) GetUser(db *gorm.DB, uuid string) *models.UserFollows {
|
||||||
@@ -25,7 +25,7 @@ func (u *userFollowRepo) GetUser(db *gorm.DB, uuid string) *models.UserFollows {
|
|||||||
return &user
|
return &user
|
||||||
}
|
}
|
||||||
func (u *userFollowRepo) UnFollow(db *gorm.DB, user *models.UserFollows) error {
|
func (u *userFollowRepo) UnFollow(db *gorm.DB, user *models.UserFollows) error {
|
||||||
return db.Where("id = ?", user.ID).Delete(user).Error
|
return db.Model(&models.UserFollows{}).Where("id = ?", user.ID).Delete(user).Error
|
||||||
}
|
}
|
||||||
func (u *userFollowRepo) All(db *gorm.DB) ([]models.UserFollows, error) {
|
func (u *userFollowRepo) All(db *gorm.DB) ([]models.UserFollows, error) {
|
||||||
var users []models.UserFollows
|
var users []models.UserFollows
|
||||||
|
|||||||
@@ -1,10 +1,15 @@
|
|||||||
package service
|
package service
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fyne.io/fyne/v2"
|
||||||
|
"fyne.io/fyne/v2/data/binding"
|
||||||
|
"fyne.io/fyne/v2/dialog"
|
||||||
|
"fyne.io/fyne/v2/widget"
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"work_cation/cfg"
|
"work_cation/cfg"
|
||||||
|
"work_cation/global"
|
||||||
"work_cation/models"
|
"work_cation/models"
|
||||||
"work_cation/repo"
|
"work_cation/repo"
|
||||||
)
|
)
|
||||||
@@ -30,3 +35,26 @@ func (*BaseCardService) Delete(db *gorm.DB, deleteCard models.BaseCard) error {
|
|||||||
err = db.Model(&models.BaseCard{}).Where("uuid = ?", deleteCard.UUID).Delete(&deleteCard).Error
|
err = db.Model(&models.BaseCard{}).Where("uuid = ?", deleteCard.UUID).Delete(&deleteCard).Error
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (*BaseCardService) DownloadCard(w fyne.Window, baseCardCopy models.BaseCard, online *models.Online) {
|
||||||
|
progress := binding.NewFloat()
|
||||||
|
progress.Set(0)
|
||||||
|
progressBar := widget.NewProgressBarWithData(progress)
|
||||||
|
progressBar.Max = 120
|
||||||
|
smaillWin := dialog.NewCustom("下载中", "关闭", progressBar, w)
|
||||||
|
smaillWin.Show()
|
||||||
|
err := Client.Download(online, baseCardCopy.UUID, progress)
|
||||||
|
if err != nil {
|
||||||
|
smaillWin.SetDismissText("失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
// 修改数据
|
||||||
|
progress.Set(110)
|
||||||
|
err = repo.BaseCard.CreateOrSave(global.DB, &baseCardCopy)
|
||||||
|
if err != nil {
|
||||||
|
smaillWin.SetDismissText("失败")
|
||||||
|
return
|
||||||
|
}
|
||||||
|
progress.Set(120)
|
||||||
|
smaillWin.SetDismissText("完成 请去[我的]查看")
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -127,7 +127,7 @@ func (c *ClientService) Chat(online *models.Online, text string) (string, error)
|
|||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
res.Header.Set("Content-Type", "application/json")
|
res.Header.Set("Content-Type", "application/json")
|
||||||
res.Header.Set("User-ID", user.ID)
|
res.Header.Set("User-UserID", user.ID)
|
||||||
resp, err := http.DefaultClient.Do(res)
|
resp, err := http.DefaultClient.Do(res)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
|
|||||||
+4
-9
@@ -10,7 +10,6 @@ import (
|
|||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"time"
|
|
||||||
"work_cation/cfg"
|
"work_cation/cfg"
|
||||||
"work_cation/global"
|
"work_cation/global"
|
||||||
"work_cation/models"
|
"work_cation/models"
|
||||||
@@ -86,7 +85,7 @@ func (s *serverService) StartListenServer() error {
|
|||||||
})
|
})
|
||||||
|
|
||||||
router.POST("/chat", func(c *gin.Context) {
|
router.POST("/chat", func(c *gin.Context) {
|
||||||
uuid := c.GetHeader("User-ID")
|
uuid := c.GetHeader("User-UserID")
|
||||||
user := repo.UserFollow.GetUser(global.DB, uuid)
|
user := repo.UserFollow.GetUser(global.DB, uuid)
|
||||||
if user.Ip != c.ClientIP() {
|
if user.Ip != c.ClientIP() {
|
||||||
c.JSON(200, gin.H{"message": "对方未关注你"})
|
c.JSON(200, gin.H{"message": "对方未关注你"})
|
||||||
@@ -98,13 +97,9 @@ func (s *serverService) StartListenServer() error {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
message := &models.Message{
|
message := &models.Message{
|
||||||
Cmd: "chat",
|
Cmd: "chat",
|
||||||
User: *user,
|
User: *user,
|
||||||
ChatMessage: models.ChatMessage{
|
ChatMessage: *models.NewTextChatMsg(&user.Users, msg["text"].(string)),
|
||||||
User: user.Users,
|
|
||||||
Time: time.Now(),
|
|
||||||
Text: msg["text"].(string),
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
global.Send.SendChan <- message
|
global.Send.SendChan <- message
|
||||||
c.JSON(200, gin.H{"message": "ok"})
|
c.JSON(200, gin.H{"message": "ok"})
|
||||||
|
|||||||
+61
-36
@@ -5,6 +5,7 @@ import (
|
|||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/dialog"
|
"fyne.io/fyne/v2/dialog"
|
||||||
|
"fyne.io/fyne/v2/theme"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
"time"
|
"time"
|
||||||
"work_cation/cfg"
|
"work_cation/cfg"
|
||||||
@@ -23,6 +24,7 @@ type ChatUserInfo struct {
|
|||||||
messages []models.ChatMessage
|
messages []models.ChatMessage
|
||||||
shows *fyne.Container
|
shows *fyne.Container
|
||||||
scroll *container.Scroll
|
scroll *container.Scroll
|
||||||
|
w fyne.Window
|
||||||
}
|
}
|
||||||
|
|
||||||
var chat = &ChatView{usersChat: make(map[string]*ChatUserInfo)}
|
var chat = &ChatView{usersChat: make(map[string]*ChatUserInfo)}
|
||||||
@@ -35,13 +37,16 @@ func ListenChat() {
|
|||||||
if userInfo == nil {
|
if userInfo == nil {
|
||||||
userInfo = &ChatUserInfo{}
|
userInfo = &ChatUserInfo{}
|
||||||
chat.usersChat[message.User.ID] = userInfo
|
chat.usersChat[message.User.ID] = userInfo
|
||||||
|
userInfo.messages = repo.ChatMsg.GetUserMsgs(global.DB, message.User.ID, -1)
|
||||||
}
|
}
|
||||||
userInfo.messages = append(userInfo.messages, message.ChatMessage)
|
userInfo.messages = append(userInfo.messages, message.ChatMessage)
|
||||||
|
_ = repo.ChatMsg.Create(global.DB, &message.ChatMessage)
|
||||||
userInfo.Users = message.User.Users
|
userInfo.Users = message.User.Users
|
||||||
if userInfo.shows == nil {
|
if userInfo.shows == nil {
|
||||||
OpenChat(message.User.Users)
|
OpenChat(message.User.Users)
|
||||||
} else {
|
} else {
|
||||||
userInfo.shows.Add(itemMessage(message.ChatMessage))
|
userInfo.shows.Add(itemMessage(message.ChatMessage))
|
||||||
|
userInfo.w.RequestFocus()
|
||||||
userInfo.scroll.ScrollToBottom()
|
userInfo.scroll.ScrollToBottom()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -53,11 +58,12 @@ func OpenChat(user models.Users) {
|
|||||||
if userInfo == nil {
|
if userInfo == nil {
|
||||||
userInfo = &ChatUserInfo{}
|
userInfo = &ChatUserInfo{}
|
||||||
chat.usersChat[user.ID] = userInfo
|
chat.usersChat[user.ID] = userInfo
|
||||||
|
userInfo.messages = repo.ChatMsg.GetUserMsgs(global.DB, user.ID, -1)
|
||||||
}
|
}
|
||||||
if userInfo.shows == nil {
|
if userInfo.shows == nil {
|
||||||
w := fyne.CurrentApp().NewWindow(user.Name)
|
w := fyne.CurrentApp().NewWindow(fmt.Sprintf("%s %s", user.Name, user.Ip))
|
||||||
w.CenterOnScreen()
|
w.CenterOnScreen()
|
||||||
w.Resize(fyne.NewSize(500, 300))
|
w.Resize(fyne.NewSize(500, 420))
|
||||||
list := container.NewVBox()
|
list := container.NewVBox()
|
||||||
for _, item := range userInfo.messages {
|
for _, item := range userInfo.messages {
|
||||||
list.Add(itemMessage(item))
|
list.Add(itemMessage(item))
|
||||||
@@ -67,59 +73,78 @@ func OpenChat(user models.Users) {
|
|||||||
scroll.ScrollToBottom()
|
scroll.ScrollToBottom()
|
||||||
// 发送表单
|
// 发送表单
|
||||||
en := widget.NewEntry()
|
en := widget.NewEntry()
|
||||||
formBase := &widget.Form{
|
submit := func() {
|
||||||
SubmitText: "发送",
|
if en.Text == "" {
|
||||||
OnSubmit: func() {
|
return
|
||||||
if en.Text == "" {
|
}
|
||||||
return
|
online := service.Zeroconf.GetOnline(user.ID)
|
||||||
}
|
if online == nil {
|
||||||
online := service.Zeroconf.GetOnline(user.ID)
|
online = &models.Online{ID: user.ID, Ip: user.Ip, Port: cfg.T.ServerAddr}
|
||||||
if online == nil {
|
}
|
||||||
online = &models.Online{ID: user.ID, Ip: user.Ip, Port: cfg.T.ServerAddr}
|
msg, err := service.Client.Chat(online, en.Text)
|
||||||
}
|
if err != nil || msg != "ok" {
|
||||||
msg, err := service.Client.Chat(online, en.Text)
|
dialog.ShowInformation("发送失败", err.Error(), w)
|
||||||
if err != nil || msg != "ok" {
|
return
|
||||||
dialog.ShowInformation("发送失败", err.Error(), w)
|
}
|
||||||
return
|
my := repo.User.GetUserInfo(global.DB)
|
||||||
}
|
chatItem := models.NewTextChatMsg(my, en.Text)
|
||||||
chatItem := models.ChatMessage{
|
userInfo.messages = append(userInfo.messages, *chatItem)
|
||||||
User: *repo.User.GetUserInfo(global.DB),
|
_ = repo.ChatMsg.Create(global.DB, chatItem)
|
||||||
Time: time.Now(),
|
list.Add(itemMessage(*chatItem))
|
||||||
Text: en.Text,
|
en.SetText("")
|
||||||
}
|
scroll.ScrollToBottom()
|
||||||
userInfo.messages = append(userInfo.messages, chatItem)
|
}
|
||||||
list.Add(itemMessage(chatItem))
|
|
||||||
en.SetText("")
|
// 分享
|
||||||
scroll.ScrollToBottom()
|
toolBar := widget.NewToolbar(
|
||||||
}}
|
widget.NewToolbarAction(theme.ContentAddIcon(), func() {
|
||||||
|
dialog.ShowInformation("未开发", "分享脚本功能 尽请期待", w)
|
||||||
|
}),
|
||||||
|
widget.NewToolbarAction(theme.CancelIcon(), func() { w.Close() }),
|
||||||
|
)
|
||||||
|
button := widget.NewButton("", submit)
|
||||||
|
button.SetIcon(theme.ConfirmIcon())
|
||||||
|
en.OnSubmitted = func(_ string) { submit() }
|
||||||
|
w.SetContent(container.NewBorder(nil,
|
||||||
|
container.NewBorder(nil, toolBar, nil, button, en),
|
||||||
|
nil, nil, scroll))
|
||||||
|
|
||||||
formBase.AppendItem(&widget.FormItem{Text: "", Widget: en})
|
|
||||||
w.SetContent(container.NewBorder(nil, formBase, nil, nil, scroll))
|
|
||||||
userInfo.shows = list
|
userInfo.shows = list
|
||||||
|
userInfo.w = w
|
||||||
|
|
||||||
w.SetOnClosed(func() {
|
w.SetOnClosed(func() {
|
||||||
userInfo.shows = nil
|
userInfo.shows = nil
|
||||||
userInfo.scroll = nil
|
userInfo.scroll = nil
|
||||||
|
userInfo.w = nil
|
||||||
})
|
})
|
||||||
w.Show()
|
w.Show()
|
||||||
}
|
}
|
||||||
|
userInfo.w.RequestFocus()
|
||||||
userInfo.scroll.ScrollToBottom()
|
userInfo.scroll.ScrollToBottom()
|
||||||
}
|
}
|
||||||
|
|
||||||
func itemMessage(msg models.ChatMessage) fyne.CanvasObject {
|
func itemMessage(msg models.ChatMessage) fyne.CanvasObject {
|
||||||
my := repo.User.GetUserInfo(global.DB)
|
my := repo.User.GetUserInfo(global.DB)
|
||||||
var card *widget.Card
|
var card *widget.Card
|
||||||
if msg.User.ID != my.ID {
|
if msg.UserID != my.ID {
|
||||||
card = widget.NewCard("",
|
title := fmt.Sprintf("%s %s", msg.CreateTx.Format(time.DateTime), msg.UserName)
|
||||||
fmt.Sprintf("%s %s", msg.Time.Format(time.DateTime),
|
card = widget.NewCard("", "",
|
||||||
msg.User.Name), widget.NewLabel(msg.Text))
|
container.NewVBox(
|
||||||
|
widget.NewLabel(title),
|
||||||
|
newLabel(msg.Text, fyne.TextAlignLeading)))
|
||||||
} else {
|
} else {
|
||||||
|
title := fmt.Sprintf("%s %s", msg.CreateTx.Format(time.DateTime), "我")
|
||||||
title := fmt.Sprintf("%s %s", msg.Time.Format(time.DateTime), "我")
|
|
||||||
card = widget.NewCard("", "",
|
card = widget.NewCard("", "",
|
||||||
container.NewVBox(
|
container.NewVBox(
|
||||||
widget.NewLabelWithStyle(title, fyne.TextAlignTrailing, fyne.TextStyle{}),
|
widget.NewLabelWithStyle(title, fyne.TextAlignTrailing, fyne.TextStyle{}),
|
||||||
widget.NewLabelWithStyle(msg.Text, fyne.TextAlignTrailing, fyne.TextStyle{})))
|
newLabel(msg.Text, fyne.TextAlignTrailing)))
|
||||||
|
|
||||||
}
|
}
|
||||||
return card
|
return card
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func newLabel(title string, ali fyne.TextAlign) *widget.Label {
|
||||||
|
text := widget.NewLabelWithStyle(title, ali, fyne.TextStyle{})
|
||||||
|
text.Wrapping = fyne.TextWrapBreak
|
||||||
|
return text
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package views
|
package views
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/dialog"
|
"fyne.io/fyne/v2/dialog"
|
||||||
@@ -72,6 +73,7 @@ func itemFollowUserView(w fyne.Window, data *models.Online, user *models.UserFol
|
|||||||
}
|
}
|
||||||
if err == nil && newUser.Name != user.Name {
|
if err == nil && newUser.Name != user.Name {
|
||||||
// 更新用户信息
|
// 更新用户信息
|
||||||
|
fmt.Println("更新用户信息:", user, newUser)
|
||||||
repo.UserFollow.UnFollow(global.DB, user)
|
repo.UserFollow.UnFollow(global.DB, user)
|
||||||
repo.UserFollow.Follow(global.DB, &models.UserFollows{Users: *newUser})
|
repo.UserFollow.Follow(global.DB, &models.UserFollows{Users: *newUser})
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,106 @@
|
|||||||
|
package views
|
||||||
|
|
||||||
|
import (
|
||||||
|
"errors"
|
||||||
|
"fyne.io/fyne/v2"
|
||||||
|
"fyne.io/fyne/v2/container"
|
||||||
|
"fyne.io/fyne/v2/theme"
|
||||||
|
"fyne.io/fyne/v2/widget"
|
||||||
|
"slices"
|
||||||
|
"sync"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TenChinaGameView() {
|
||||||
|
myApp := fyne.CurrentApp()
|
||||||
|
myWindow := myApp.NewWindow("Cross Flag Game")
|
||||||
|
|
||||||
|
gridWrap := container.NewGridWrap(fyne.NewSize(100, 100))
|
||||||
|
|
||||||
|
for i := 0; i < 9; i++ {
|
||||||
|
//var itemIndex = i
|
||||||
|
var item = widget.NewButton("", func() {})
|
||||||
|
if i > 6 {
|
||||||
|
item.SetIcon(theme.ConfirmIcon())
|
||||||
|
} else {
|
||||||
|
item.SetIcon(theme.CancelIcon())
|
||||||
|
}
|
||||||
|
gridWrap.Add(container.NewBorder(nil, nil, nil, nil, item))
|
||||||
|
}
|
||||||
|
myWindow.SetContent(container.NewScroll(gridWrap))
|
||||||
|
|
||||||
|
myWindow.Resize(fyne.NewSize(320, 318))
|
||||||
|
myWindow.CenterOnScreen()
|
||||||
|
myWindow.Show()
|
||||||
|
}
|
||||||
|
|
||||||
|
type TenGame struct {
|
||||||
|
lock sync.Mutex
|
||||||
|
playerMax int
|
||||||
|
CurrentRoundPlayer int
|
||||||
|
players [][]int
|
||||||
|
items []*widget.Button
|
||||||
|
winCallback func(int)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TenGame) Play(userIndex int, pos int) error {
|
||||||
|
t.lock.Lock()
|
||||||
|
defer t.lock.Unlock()
|
||||||
|
if t.CurrentRoundPlayer != userIndex {
|
||||||
|
return errors.New("not your turn")
|
||||||
|
}
|
||||||
|
t.play(pos)
|
||||||
|
|
||||||
|
t.CurrentRoundPlayer++
|
||||||
|
if t.CurrentRoundPlayer+1 > t.playerMax {
|
||||||
|
t.CurrentRoundPlayer = 0
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
1, 2, 3
|
||||||
|
4, 5, 6
|
||||||
|
7, 8, 9
|
||||||
|
*/
|
||||||
|
func (t *TenGame) play(pos int) {
|
||||||
|
// TODO
|
||||||
|
playerIntList := t.players[t.CurrentRoundPlayer]
|
||||||
|
playerIntList = append(playerIntList, pos)
|
||||||
|
// 刷新数据
|
||||||
|
if t.CurrentRoundPlayer == 1 {
|
||||||
|
t.items[pos].SetIcon(theme.ConfirmIcon())
|
||||||
|
} else {
|
||||||
|
t.items[pos].SetIcon(theme.CancelIcon())
|
||||||
|
}
|
||||||
|
|
||||||
|
// check 胜利 判断
|
||||||
|
slices.Sort(playerIntList)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TenGame) winCheck(playerIntList []int) bool {
|
||||||
|
for _, i := range playerIntList {
|
||||||
|
var iI = i
|
||||||
|
if t.checkLine(playerIntList, iI, 1) ||
|
||||||
|
t.checkLine(playerIntList, iI, 2) ||
|
||||||
|
t.checkLine(playerIntList, iI, 4) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
// todo slices.Delete()
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (t *TenGame) checkLine(playerIntList []int, iI, add int) bool {
|
||||||
|
for {
|
||||||
|
iI += add
|
||||||
|
if iI > 9 {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if !slices.Contains(playerIntList, iI) {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
+2
-26
@@ -4,7 +4,6 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"fyne.io/fyne/v2"
|
"fyne.io/fyne/v2"
|
||||||
"fyne.io/fyne/v2/container"
|
"fyne.io/fyne/v2/container"
|
||||||
"fyne.io/fyne/v2/data/binding"
|
|
||||||
"fyne.io/fyne/v2/dialog"
|
"fyne.io/fyne/v2/dialog"
|
||||||
"fyne.io/fyne/v2/theme"
|
"fyne.io/fyne/v2/theme"
|
||||||
"fyne.io/fyne/v2/widget"
|
"fyne.io/fyne/v2/widget"
|
||||||
@@ -114,35 +113,12 @@ func baseOtherCardView(w fyne.Window, baseCardCopy models.BaseCard, online *mode
|
|||||||
baseCardV := widget.NewCard(baseCardCopy.Title, baseCardCopy.Text, container.NewBorder(nil, widget.NewToolbar(
|
baseCardV := widget.NewCard(baseCardCopy.Title, baseCardCopy.Text, container.NewBorder(nil, widget.NewToolbar(
|
||||||
widget.NewToolbarAction(theme.DownloadIcon(), func() {
|
widget.NewToolbarAction(theme.DownloadIcon(), func() {
|
||||||
b := saveCard.UpdateTx.Unix() == baseCardCopy.UpdateTx.Unix()
|
b := saveCard.UpdateTx.Unix() == baseCardCopy.UpdateTx.Unix()
|
||||||
fmt.Println(saveCard.UpdateTx, baseCardCopy.UpdateTx)
|
|
||||||
if b {
|
if b {
|
||||||
dialog.ShowInformation("结果", "已下载本地", w)
|
dialog.ShowInformation("结果", "已下载本地", w)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
// 下载到本地 若没关注自动关注
|
// 下载到本地 TODO 若没关注自动关注
|
||||||
|
service.BaseCard.DownloadCard(w, baseCardCopy, online)
|
||||||
progress := binding.NewFloat()
|
|
||||||
progress.Set(0)
|
|
||||||
progressBar := widget.NewProgressBarWithData(progress)
|
|
||||||
progressBar.Max = 100
|
|
||||||
smaillWin := dialog.NewCustom("下载中", "关闭", progressBar, w)
|
|
||||||
smaillWin.Show()
|
|
||||||
err := service.Client.Download(online, baseCardCopy.UUID, progress)
|
|
||||||
if err != nil {
|
|
||||||
smaillWin.SetDismissText("失败")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
// 修改数据
|
|
||||||
progress.Set(99)
|
|
||||||
saveCard.UpdateTx = baseCardCopy.UpdateTx
|
|
||||||
err = repo.BaseCard.CreateOrSave(global.DB, &baseCardCopy)
|
|
||||||
if err != nil {
|
|
||||||
smaillWin.SetDismissText("失败")
|
|
||||||
return
|
|
||||||
}
|
|
||||||
progress.Set(100)
|
|
||||||
smaillWin.SetDismissText("完成 请去[我的]查看")
|
|
||||||
|
|
||||||
}),
|
}),
|
||||||
), nil, nil, infoWid))
|
), nil, nil, infoWid))
|
||||||
return baseCardV
|
return baseCardV
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func mainUserViews(w fyne.Window) fyne.CanvasObject {
|
func mainUserViews(w fyne.Window) fyne.CanvasObject {
|
||||||
|
//TenChinaGameView()
|
||||||
var userCard = widget.NewCard("", "", nil)
|
var userCard = widget.NewCard("", "", nil)
|
||||||
user1 := repo.User.GetUserInfo(global.DB)
|
user1 := repo.User.GetUserInfo(global.DB)
|
||||||
refresh := func(user *models.Users) {
|
refresh := func(user *models.Users) {
|
||||||
|
|||||||
Reference in New Issue
Block a user