Tinger 1 年之前
父节点
当前提交
5082904c78

+ 1 - 0
config.json

@@ -1,6 +1,7 @@
 {
   "release": false,
   "server_addr": "0.0.0.0:3080",
+  "server_prefix": "http://192.168.1.6:3080",
   "time_format": "2006-01-02 15:04:05",
 
   "mysql_host": "122.112.224.199",

+ 13 - 0
handlers/manager/admin/charts/handler.go

@@ -0,0 +1,13 @@
+package charts
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 13 - 0
handlers/manager/admin/dashboard/handler.go

@@ -0,0 +1,13 @@
+package dashboard
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 13 - 0
handlers/manager/admin/trade/handler.go

@@ -0,0 +1,13 @@
+package trade
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 13 - 0
handlers/manager/admin/wine/handler.go

@@ -0,0 +1,13 @@
+package wine
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 13 - 0
handlers/manager/admin/worker/handler.go

@@ -0,0 +1,13 @@
+package worker
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 0 - 27
handlers/manager/params.go

@@ -4,30 +4,3 @@ type loginParam struct {
 	Account  string `json:"account"`
 	Password string `json:"password"`
 }
-
-type superQueryDeviceParam struct {
-	Cond    string `json:"cond"`
-	Manager string `json:"manager"`
-	Page    int    `json:"page"`
-	Limit   int    `json:"limit"`
-}
-
-type superUpdateDeviceParam struct {
-	Did  string `json:"Did"`
-	Mid  string `json:"mid"`
-	Addr string `json:"addr"`
-	Mark string `json:"mark"`
-}
-
-type superBatchAssignParam struct {
-	Devices []string `json:"devices"`
-	Manager string   `json:"manager"`
-}
-
-type superQueryWineParam struct {
-	Cond  string `json:"cond"`
-	Page  int    `json:"page"`
-	Limit int    `json:"limit"`
-}
-
-type superDeleteWineParam []uint16

+ 38 - 27
handlers/manager/spliter.go

@@ -1,10 +1,22 @@
 package manager
 
 import (
+	adminCharts "Wine-Server/handlers/manager/admin/charts"
+	adminDashboard "Wine-Server/handlers/manager/admin/dashboard"
+	adminTrade "Wine-Server/handlers/manager/admin/trade"
+	adminWine "Wine-Server/handlers/manager/admin/wine"
+	adminWorker "Wine-Server/handlers/manager/admin/worker"
+	superCharts "Wine-Server/handlers/manager/super/charts"
+	superConfig "Wine-Server/handlers/manager/super/config"
+	superDashboard "Wine-Server/handlers/manager/super/dashboard"
+	superOrder "Wine-Server/handlers/manager/super/order"
+	superRecord "Wine-Server/handlers/manager/super/record"
+	superRole "Wine-Server/handlers/manager/super/role"
 	"Wine-Server/utils"
 	"Wine-Server/utils/tables"
 	"github.com/gin-gonic/gin"
 	"github.com/gorilla/websocket"
+	"strings"
 )
 
 func managerConnected(mid string, conn *websocket.Conn) *tables.ManagerTable {
@@ -109,37 +121,36 @@ func SocketHandler(ctx *gin.Context) {
 		if err != nil {
 			return
 		}
-		switch msg.Event {
-		case "pin":
+		if msg.Event == "pin" {
 			keepAlive(conn)
-			break
-		case "getUserInfo":
+		} else if msg.Event == "getUserInfo" {
 			getUserInfo(conn, manager)
-			break
-		case "logout":
+		} else if msg.Event == "logout" {
 			userLogout(conn, msg.Data)
-			return
-		case "superQueryManager":
-			superQueryManager(conn, manager, msg.Data)
-			break
-		case "superQueryDevice":
-			superQueryDevice(conn, manager, msg.Data)
-			break
-		case "superUpdateDevice":
-			superUpdateDevice(conn, manager, msg.Data)
-			break
-		case "superBatchAssign":
-			superBatchAssign(conn, manager, msg.Data)
-			break
-		case "superQueryWine":
-			superQueryWine(conn, manager, msg.Data)
-			break
-		case "superDeleteWine":
-			superDeleteWine(conn, manager, msg.Data)
-			break
-		default:
+		} else if strings.HasPrefix(msg.Event, "superDashboard") { // super:
+			superDashboard.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "superRole") {
+			superRole.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "superOrder") {
+			superOrder.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "superConfig") {
+			superConfig.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "superRecord") {
+			superRecord.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "superCharts") {
+			superCharts.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "adminDashboard") { // admin:
+			adminDashboard.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "adminWorker") {
+			adminWorker.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "adminTrade") {
+			adminTrade.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "adminWine") {
+			adminWine.Handle(msg, conn, manager)
+		} else if strings.HasPrefix(msg.Event, "adminCharts") {
+			adminCharts.Handle(msg, conn, manager)
+		} else {
 			_ = conn.WriteJSON(utils.WsError("unrecognized event"))
-			break
 		}
 	}
 }

+ 13 - 0
handlers/manager/super/charts/handler.go

@@ -0,0 +1,13 @@
+package charts
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 27 - 0
handlers/manager/super/config/advertise/params.go

@@ -0,0 +1,27 @@
+package advertise
+
+type queryParam struct {
+	Desc  string `json:"desc"`
+	Type  int    `json:"type"`
+	Page  int    `json:"page"`
+	Limit int    `json:"limit"`
+}
+
+type addParam struct {
+	Name     string
+	Price    uint16
+	Degree   uint16
+	Density  uint16
+	Image    string
+	Describe string
+}
+
+type updateParam struct {
+	Id       uint16
+	Name     string
+	Price    uint16
+	Degree   uint16
+	Density  uint16
+	Image    string
+	Describe string
+}

+ 150 - 0
handlers/manager/super/config/advertise/worker.go

@@ -0,0 +1,150 @@
+package advertise
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"errors"
+	"github.com/gorilla/websocket"
+	"os"
+	"strings"
+)
+
+func Query(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param queryParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	total, ads, err := tables.AdvertisesQuery(param.Desc, param.Type, param.Limit, param.Page)
+	if err != nil {
+		utils.Logger.Println(err)
+		_ = conn.WriteJSON(utils.WsError("query advertises failed"))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigAdvertiseQueryRes", utils.JsonType{"total": total, "ads": ads}))
+}
+
+func removeAdvFile(src string) error {
+	index := strings.Index(src, "static/adv")
+	if index == -1 {
+		return errors.New("error src")
+	}
+	return os.Remove(src[index:])
+}
+
+func Delete(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var ids []uint32
+	err := utils.AnyTrans(data, &ids)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	Err := false
+	for _, aid := range ids {
+		adv := tables.AdvertiseTable{Id: aid}
+		err = adv.Get()
+		if err != nil {
+			utils.Logger.Println(err)
+			Err = true
+		} else {
+			err = removeAdvFile(adv.Src)
+			if err != nil {
+				utils.Logger.Println(err)
+				Err = true
+			} else {
+				_ = adv.Delete()
+			}
+		}
+	}
+	if Err {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigAdvertiseDeleteRes", utils.Fail("删除失败")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigAdvertiseDeleteRes", utils.Success(nil)))
+}
+
+// Add TODO: below
+func Add(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param addParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	if param.Image == "" {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail("图片数据不可为空")))
+		return
+	}
+	var id uint16
+	id, err = tables.WineQueryMaxId()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail("添加失败 01")))
+		return
+	}
+	var reason string
+	reason, err = utils.SaveBase64(param.Image, utils.Format("static/images/wine/%d.png", id))
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail(reason)))
+		return
+	}
+	wine := tables.WineTable{
+		Id: id + 1, Name: param.Name, Price: param.Price, Degree: param.Degree,
+		Density: param.Density, Describe: param.Describe,
+		Picture: utils.Format("%s/static/images/wine/%d.png", utils.ServerPrefix, id),
+	}
+	err = wine.Insert()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail("添加失败 02")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Success(nil)))
+}
+
+func Update(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param updateParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	wine := tables.WineTable{Id: param.Id}
+	err = wine.Get()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Fail("no such wine")))
+		return
+	}
+	if param.Image != "" {
+		var reason string
+		reason, err = utils.SaveBase64(param.Image, utils.Format("static/images/wine/%d.png", param.Id))
+		if err != nil {
+			_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Fail(reason)))
+			return
+		}
+		wine.Picture = utils.Format("%s/static/images/wine/%d.png", utils.ServerPrefix, param.Id)
+	}
+	wine.Name, wine.Price, wine.Degree = param.Name, param.Price, param.Degree
+	wine.Density, wine.Describe = param.Density, param.Describe
+	err = wine.UpdateSelf()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Fail("更新失败")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Success(nil)))
+}

+ 20 - 0
handlers/manager/super/config/device/params.go

@@ -0,0 +1,20 @@
+package device
+
+type queryParam struct {
+	Cond    string `json:"cond"`
+	Manager string `json:"manager"`
+	Page    int    `json:"page"`
+	Limit   int    `json:"limit"`
+}
+
+type updateParam struct {
+	Did  string `json:"Did"`
+	Mid  string `json:"mid"`
+	Addr string `json:"addr"`
+	Mark string `json:"mark"`
+}
+
+type assignParam struct {
+	Devices []string `json:"devices"`
+	Manager string   `json:"manager"`
+}

+ 91 - 0
handlers/manager/super/config/device/worker.go

@@ -0,0 +1,91 @@
+package device
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func QueryManager(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	name, _ := data.(string)
+	res, err := tables.QueryManager(name)
+	if err != nil {
+		utils.Logger.Println(err)
+		_ = conn.WriteJSON(utils.WsError("query manager failed"))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigDeviceQueryManagerRes", res))
+}
+
+func Query(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param queryParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	total, devices, err := tables.DevicesQuery(param.Manager, param.Cond, param.Limit, param.Page)
+	if err != nil {
+		utils.Logger.Println(err)
+		_ = conn.WriteJSON(utils.WsError("query devices failed"))
+		return
+	}
+	_ = conn.WriteJSON(
+		utils.WsEvent("superConfigDeviceQueryRes", utils.JsonType{"total": total, "devices": devices}),
+	)
+}
+
+func Update(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param updateParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	device := tables.DeviceTable{Id: param.Did}
+	err = device.Get()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigDeviceUpdateRes", utils.Fail("no such device")))
+		return
+	}
+	device.Manager, device.Addr, device.Mark = param.Mid, param.Addr, param.Mark
+	err = device.UpdateSelf()
+	if err != nil {
+		utils.Logger.Println(err)
+		_ = conn.WriteJSON(utils.WsEvent("superConfigDeviceUpdateRes", utils.Fail("更新失败")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigDeviceUpdateRes", utils.Success(nil)))
+}
+
+func Assign(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param assignParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	err = tables.DevicesAssignManager(param.Devices, param.Manager)
+	if err != nil {
+		utils.Logger.Println(err)
+		_ = conn.WriteJSON(utils.WsEvent("superConfigDeviceAssignRes", utils.Fail("分配失败")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigDeviceAssignRes", utils.Success(nil)))
+}

+ 57 - 0
handlers/manager/super/config/handler.go

@@ -0,0 +1,57 @@
+package config
+
+import (
+	"Wine-Server/handlers/manager/super/config/advertise"
+	"Wine-Server/handlers/manager/super/config/device"
+	"Wine-Server/handlers/manager/super/config/wine"
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+	// device:
+	case "superConfigDeviceQueryManager":
+		device.QueryManager(conn, manager, msg.Data)
+		break
+	case "superConfigDeviceQuery":
+		device.Query(conn, manager, msg.Data)
+		break
+	case "superConfigDeviceUpdate":
+		device.Update(conn, manager, msg.Data)
+		break
+	case "superConfigDeviceAssign":
+		device.Assign(conn, manager, msg.Data)
+		break
+	// wine:
+	case "superConfigWineQuery":
+		wine.Query(conn, manager, msg.Data)
+		break
+	case "superConfigWineDelete":
+		wine.Delete(conn, manager, msg.Data)
+		break
+	case "superConfigWineAdd":
+		wine.Add(conn, manager, msg.Data)
+		break
+	case "superConfigWineUpdate":
+		wine.Update(conn, manager, msg.Data)
+		break
+	// advertise:
+	case "superConfigAdvertiseQuery":
+		advertise.Query(conn, manager, msg.Data)
+		break
+	case "superConfigAdvertiseDelete":
+		advertise.Delete(conn, manager, msg.Data)
+		break
+	case "superConfigAdvertiseUpdate":
+		advertise.Update(conn, manager, msg.Data)
+		break
+	case "superConfigAdvertiseAdd":
+		advertise.Add(conn, manager, msg.Data)
+		break
+	default:
+		_ = conn.WriteJSON(utils.WsError("unrecognized event"))
+		break
+	}
+}

+ 26 - 0
handlers/manager/super/config/wine/params.go

@@ -0,0 +1,26 @@
+package wine
+
+type queryParam struct {
+	Cond  string `json:"cond"`
+	Page  int    `json:"page"`
+	Limit int    `json:"limit"`
+}
+
+type addParam struct {
+	Name     string
+	Price    uint16
+	Degree   uint16
+	Density  uint16
+	Image    string
+	Describe string
+}
+
+type updateParam struct {
+	Id       uint16
+	Name     string
+	Price    uint16
+	Degree   uint16
+	Density  uint16
+	Image    string
+	Describe string
+}

+ 140 - 0
handlers/manager/super/config/wine/worker.go

@@ -0,0 +1,140 @@
+package wine
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Query(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param queryParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	total, wines, err := tables.WinesQuery(param.Cond, param.Limit, param.Page)
+	if err != nil {
+		utils.Logger.Println(err)
+		_ = conn.WriteJSON(utils.WsError("query wines failed"))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigWineQueryRes", utils.JsonType{"total": total, "wines": wines}))
+}
+
+func Delete(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var ids []uint16
+	err := utils.AnyTrans(data, &ids)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	err = tables.WinesDelete(ids)
+	if err != nil {
+		utils.Logger.Println(err)
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineDeleteRes", utils.Fail("删除失败")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigWineDeleteRes", utils.Success(nil)))
+}
+
+func Add(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param addParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	if param.Image == "" {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail("图片数据不可为空")))
+		return
+	}
+	var id uint16
+	id, err = tables.WineQueryMaxId()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail("添加失败 01")))
+		return
+	}
+	var reason string
+	reason, err = utils.SaveBase64(param.Image, utils.Format("static/images/wine/%d.png", id))
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail(reason)))
+		return
+	}
+	wine := tables.WineTable{
+		Id: id + 1, Name: param.Name, Price: param.Price, Degree: param.Degree,
+		Density: param.Density, Describe: param.Describe,
+		Picture: utils.Format("%s/static/images/wine/%d.png", utils.ServerPrefix, id),
+	}
+	err = wine.Insert()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Fail("添加失败 02")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigWineAddRes", utils.Success(nil)))
+}
+
+func Update(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
+	if !manager.Super {
+		_ = conn.WriteJSON(utils.WsError("auth failed."))
+		return
+	}
+	var param updateParam
+	err := utils.AnyTrans(data, &param)
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsError("param error"))
+		return
+	}
+	wine := &tables.WineTable{Id: param.Id}
+	err = wine.Get()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Fail("no such wine")))
+		return
+	}
+	if param.Image != "" {
+		var reason string
+		reason, err = utils.SaveBase64(param.Image, utils.Format("static/images/wine/%d.png", param.Id))
+		if err != nil {
+			_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Fail(reason)))
+			return
+		}
+		wine.Picture = utils.Format("%s/static/images/wine/%d.png", utils.ServerPrefix, param.Id)
+	}
+	wine.Name, wine.Describe = param.Name, param.Describe
+	wine.Price, wine.Degree, wine.Density = param.Price, param.Degree, param.Density
+	err = wine.UpdateSelf()
+	if err != nil {
+		_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Fail("更新失败")))
+		return
+	}
+	_ = conn.WriteJSON(utils.WsEvent("superConfigWineUpdateRes", utils.Success(nil)))
+	go informDevices(wine)
+}
+
+func informDevices(wine *tables.WineTable) {
+	list, err := tables.DevicesWithTheWine(wine.Id)
+	if err != nil {
+		utils.Logger.Println(err)
+		return
+	}
+	for _, id := range list {
+		if item, din := utils.SellerDevices[id]; din && item.Online {
+			_ = item.Conn.WriteJSON(utils.WsEvent("wineUpdate", utils.JsonType{
+				"id": wine.Id, "name": wine.Name, "price": wine.Price, "degree": wine.Degree,
+				"density": wine.Density, "describe": wine.Describe,
+			}))
+		}
+	}
+}

+ 13 - 0
handlers/manager/super/dashboard/handler.go

@@ -0,0 +1,13 @@
+package dashboard
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 13 - 0
handlers/manager/super/order/handler.go

@@ -0,0 +1,13 @@
+package order
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 13 - 0
handlers/manager/super/record/handler.go

@@ -0,0 +1,13 @@
+package record
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 13 - 0
handlers/manager/super/role/handler.go

@@ -0,0 +1,13 @@
+package role
+
+import (
+	"Wine-Server/utils"
+	"Wine-Server/utils/tables"
+	"github.com/gorilla/websocket"
+)
+
+func Handle(msg utils.WsMsg, conn *websocket.Conn, manager *tables.ManagerTable) {
+	switch msg.Event {
+
+	}
+}

+ 0 - 116
handlers/manager/worker.go

@@ -69,119 +69,3 @@ func userLogout(conn *websocket.Conn, data any) {
 	utils.Redis.Del(utils.WxPayCli, data.(string))
 	_ = conn.WriteJSON(utils.WsEvent("logoutResult", nil))
 }
-
-func superQueryManager(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
-	if !manager.Super {
-		_ = conn.WriteJSON(utils.WsError("auth failed."))
-		return
-	}
-	name, _ := data.(string)
-	res, err := tables.QueryManager(name)
-	if err != nil {
-		utils.Logger.Println(err)
-		_ = conn.WriteJSON(utils.WsError("query manager failed"))
-		return
-	}
-	_ = conn.WriteJSON(utils.WsEvent("superQueryManagerRes", res))
-}
-
-func superQueryDevice(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
-	if !manager.Super {
-		_ = conn.WriteJSON(utils.WsError("auth failed."))
-		return
-	}
-	var param superQueryDeviceParam
-	err := utils.AnyTrans(data, &param)
-	if err != nil {
-		_ = conn.WriteJSON(utils.WsError("param error"))
-		return
-	}
-	total, devices, err := tables.QueryDevices(param.Manager, param.Cond, param.Limit, param.Page)
-	if err != nil {
-		utils.Logger.Println(err)
-		_ = conn.WriteJSON(utils.WsError("query devices failed"))
-		return
-	}
-	_ = conn.WriteJSON(utils.WsEvent("superQueryDeviceRes", utils.JsonType{"total": total, "devices": devices}))
-}
-
-func superUpdateDevice(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
-	if !manager.Super {
-		_ = conn.WriteJSON(utils.WsError("auth failed."))
-		return
-	}
-	var param superUpdateDeviceParam
-	err := utils.AnyTrans(data, &param)
-	if err != nil {
-		_ = conn.WriteJSON(utils.WsError("param error"))
-		return
-	}
-	device := tables.DeviceTable{Id: param.Did}
-	err = device.Update(utils.JsonType{"manager": param.Mid, "addr": param.Addr, "mark": param.Mark})
-	if err != nil {
-		utils.Logger.Println(err)
-		_ = conn.WriteJSON(utils.WsEvent("superUpdateDeviceRes", utils.Fail("更新失败")))
-		return
-	}
-	_ = conn.WriteJSON(utils.WsEvent("superUpdateDeviceRes", utils.Success(nil)))
-}
-
-func superBatchAssign(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
-	if !manager.Super {
-		_ = conn.WriteJSON(utils.WsError("auth failed."))
-		return
-	}
-	var param superBatchAssignParam
-	err := utils.AnyTrans(data, &param)
-	if err != nil {
-		_ = conn.WriteJSON(utils.WsError("param error"))
-		return
-	}
-	err = tables.BatchAssignDeviceManager(param.Devices, param.Manager)
-	if err != nil {
-		utils.Logger.Println(err)
-		_ = conn.WriteJSON(utils.WsEvent("superBatchAssignRes", utils.Fail("分配失败")))
-		return
-	}
-	_ = conn.WriteJSON(utils.WsEvent("superBatchAssignRes", utils.Success(nil)))
-}
-
-func superQueryWine(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
-	if !manager.Super {
-		_ = conn.WriteJSON(utils.WsError("auth failed."))
-		return
-	}
-	var param superQueryWineParam
-	err := utils.AnyTrans(data, &param)
-	if err != nil {
-		_ = conn.WriteJSON(utils.WsError("param error"))
-		return
-	}
-	total, wines, err := tables.QueryWines(param.Cond, param.Limit, param.Page)
-	if err != nil {
-		utils.Logger.Println(err)
-		_ = conn.WriteJSON(utils.WsError("query wines failed"))
-		return
-	}
-	_ = conn.WriteJSON(utils.WsEvent("superQueryWineRes", utils.JsonType{"total": total, "wines": wines}))
-}
-
-func superDeleteWine(conn *websocket.Conn, manager *tables.ManagerTable, data any) {
-	if !manager.Super {
-		_ = conn.WriteJSON(utils.WsError("auth failed."))
-		return
-	}
-	var ids []uint16
-	err := utils.AnyTrans(data, &ids)
-	if err != nil {
-		_ = conn.WriteJSON(utils.WsError("param error"))
-		return
-	}
-	err = tables.BatchDeleteWine(ids)
-	if err != nil {
-		utils.Logger.Println(err)
-		_ = conn.WriteJSON(utils.WsEvent("superDeleteWineRes", utils.Fail("删除失败")))
-		return
-	}
-	_ = conn.WriteJSON(utils.WsEvent("superDeleteWineRes", utils.Success(nil)))
-}

+ 1 - 1
handlers/seller/worker.go

@@ -142,7 +142,7 @@ func infoOfDevice(device *tables.DeviceTable, conn *websocket.Conn) {
 	_ = conn.WriteJSON(utils.WsEvent("wineResult", device.Wines))
 
 	var advList []tables.AdvertiseTable
-	advList, err = tables.AdvListAll()
+	advList, err = tables.AdvertiseListAll()
 	if err != nil {
 		utils.Logger.Println("Query advertise failed:", err)
 		_ = conn.WriteJSON(utils.WsError("Query advertise failed"))

+ 1 - 0
handlers/setup.go

@@ -51,6 +51,7 @@ func CreateApp(config *utils.Config) *App {
 		gin.SetMode(gin.DebugMode)
 	}
 
+	utils.ServerPrefix = config.ServerPrefix
 	utils.Logger = log.New(os.Stderr, "[wine] ", log.Ldate|log.Ltime|log.Lshortfile|log.Lmsgprefix)
 
 	initWxPay(config)

+ 22 - 0
test/trim.go

@@ -0,0 +1,22 @@
+package main
+
+import (
+	"errors"
+	"fmt"
+	"os"
+	"strings"
+)
+
+func removeAdvFile(src string) error {
+	index := strings.Index(src, "static/adv")
+	if index == -1 {
+		return errors.New("error src")
+	}
+	path := src[index:]
+	return os.Remove(path)
+}
+
+func main() {
+	err := removeAdvFile("https://wine.ifarmcloud.com/api/static/adv/20230925-test.jpg")
+	fmt.Println(err)
+}

+ 5 - 3
utils/com.go

@@ -43,9 +43,10 @@ type Response struct {
 type JsonType = map[string]any
 
 type Config struct {
-	Release    bool   `json:"release"`
-	ServerAddr string `json:"server_addr"`
-	TimeFormat string `json:"time_format"`
+	Release      bool   `json:"release"`
+	ServerAddr   string `json:"server_addr"`
+	ServerPrefix string `json:"server_prefix"`
+	TimeFormat   string `json:"time_format"`
 
 	MysqlHost     string `json:"mysql_host"`
 	MysqlPort     int    `json:"mysql_port"`
@@ -71,6 +72,7 @@ type Config struct {
 	ClientPublic  string `json:"client_public"`
 }
 
+var ServerPrefix string
 var Logger *log.Logger
 
 // database

+ 15 - 1
utils/lib.go

@@ -14,6 +14,7 @@ import (
 	"github.com/wechatpay-apiv3/wechatpay-go/core"
 	"github.com/wechatpay-apiv3/wechatpay-go/services/payments/native"
 	"os"
+	"strings"
 )
 
 func RandomString(size int, patten string) string {
@@ -42,7 +43,7 @@ func Fail(msg string) Response {
 
 func ReadConfig(filepath string) Config {
 	config := Config{
-		Release: false, ServerAddr: "127.0.0.1:3080", TimeFormat: "15:04:05",
+		Release: false, ServerAddr: "localhost:3080", ServerPrefix: "http://localhost:3080", TimeFormat: "15:04:05",
 		MysqlHost: "127.0.0.1", MysqlPort: 3306, MysqlUser: "wine", MysqlPass: "Wine-Mysql.1000", MysqlDatabase: "wine",
 		RedisHost: "127.0.0.1", RedisPort: 6379, RedisPass: "Wine-Redis.1000", RedisDatabase: 0, WxPayTitle: "贵州醴泉古酿酒业",
 		ServerPrivate: "./server-private.pem", ServerPublic: "./server-public.pem",
@@ -285,3 +286,16 @@ func Query(SQL string) ([]JsonType, error) {
 
 	return ret, nil
 }
+
+func SaveBase64(image, filepath string) (string, error) {
+	encoded := strings.Split(image, ",")[1]
+	decoded, err := base64.StdEncoding.DecodeString(encoded)
+	if err != nil {
+		return "Base64 格式错误", err
+	}
+	err = os.WriteFile(filepath, decoded, 0644)
+	if err != nil {
+		return "图片存储失败", err
+	}
+	return "", nil
+}

+ 64 - 17
utils/tables/advertise.go

@@ -2,6 +2,7 @@ package tables
 
 import (
 	"Wine-Server/utils"
+	"database/sql"
 )
 
 type AdvertiseTable struct {
@@ -11,17 +12,19 @@ type AdvertiseTable struct {
 	Src      string         `json:"src"`
 	Type     bool           `json:"type"`     // true: pic, false: video
 	Duration uint16         `json:"duration"` // ms
+	Describe string         `json:"describe"`
 }
 
 func CreateAdvertiseTable() error {
-	sql := "CREATE TABLE IF NOT EXISTS `advertise`(" +
+	SQL := "CREATE TABLE IF NOT EXISTS `advertise`(" +
 		"`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY," +
 		"`order` TINYINT UNSIGNED NOT NULL," +
 		"`time` DATETIME DEFAULT CURRENT_TIMESTAMP," +
 		"`type` BOOL DEFAULT TRUE," +
 		"`src` VARCHAR(128) NOT NULL," +
-		"`duration` SMALLINT UNSIGNED DEFAULT 3000);"
-	_, err := utils.Mysql.Exec(sql)
+		"`duration` SMALLINT UNSIGNED DEFAULT 3000," +
+		"`describe` VARCHAR(64) DEFAULT '');"
+	_, err := utils.Mysql.Exec(SQL)
 	if err != nil {
 		return err
 	}
@@ -29,12 +32,12 @@ func CreateAdvertiseTable() error {
 }
 
 func (row *AdvertiseTable) Insert() error {
-	sql := "INSERT INTO `advertise`(`order`,`type`,`src`,`duration`) VALUES(?,?,?,?);"
-	pre, err := utils.Mysql.Prepare(sql)
+	SQL := "INSERT INTO `advertise`(`order`,`type`,`src`,`duration`,`describe`) VALUES(?,?,?,?,?);"
+	pre, err := utils.Mysql.Prepare(SQL)
 	if err != nil {
 		return err
 	}
-	_, err = pre.Exec(row.Order, row.Type, row.Src, row.Duration)
+	_, err = pre.Exec(row.Order, row.Type, row.Src, row.Duration, row.Describe)
 	if err != nil {
 		return err
 	}
@@ -55,8 +58,8 @@ func (row *AdvertiseTable) Delete() error {
 
 func (row *AdvertiseTable) Update(args utils.JsonType) error {
 	keys, values := utils.UnZip(args)
-	sql := utils.Format("UPDATE `advertise` SET %s WHERE `id`=%d;", utils.SqlFields(keys), row.Id)
-	pre, err := utils.Mysql.Prepare(sql)
+	SQL := utils.Format("UPDATE `advertise` SET %s WHERE `id`=%d;", utils.SqlFields(keys), row.Id)
+	pre, err := utils.Mysql.Prepare(SQL)
 	if err != nil {
 		return err
 	}
@@ -68,12 +71,12 @@ func (row *AdvertiseTable) Update(args utils.JsonType) error {
 }
 
 func (row *AdvertiseTable) UpdateSelf() error {
-	sql := "UPDATE `advertise` SET `order`=?,`src`=?,`type`=?,`duration`=? WHERE `id`=?;"
-	pre, err := utils.Mysql.Prepare(sql)
+	SQL := "UPDATE `advertise` SET `order`=?,`src`=?,`type`=?,`duration`=?,`describe`=? WHERE `id`=?;"
+	pre, err := utils.Mysql.Prepare(SQL)
 	if err != nil {
 		return err
 	}
-	_, err = pre.Exec(row.Order, row.Src, row.Type, row.Duration, row.Id)
+	_, err = pre.Exec(row.Order, row.Src, row.Type, row.Duration, row.Describe, row.Id)
 	if err != nil {
 		return err
 	}
@@ -81,27 +84,28 @@ func (row *AdvertiseTable) UpdateSelf() error {
 }
 
 func (row *AdvertiseTable) Get() error {
-	sql := "SELECT `order`,`time`,`src`,`type`,`duration` FROM `advertise` WHERE `id`=?;"
-	pre, err := utils.Mysql.Prepare(sql)
+	SQL := "SELECT `order`,`time`,`src`,`type`,`duration`,`describe` FROM `advertise` WHERE `id`=?;"
+	pre, err := utils.Mysql.Prepare(SQL)
 	if err != nil {
 		return err
 	}
-	err = pre.QueryRow(row.Id).Scan(&row.Order, &row.Time, &row.Src, &row.Type, &row.Duration)
+	err = pre.QueryRow(row.Id).Scan(&row.Order, &row.Time, &row.Src, &row.Type, &row.Duration, &row.Describe)
 	if err != nil {
 		return err
 	}
 	return nil
 }
 
-func AdvListAll() ([]AdvertiseTable, error) {
+func AdvertiseListAll() ([]AdvertiseTable, error) {
 	var res []AdvertiseTable
-	query, err := utils.Mysql.Query("SELECT `id`,`order`,`time`,`src`,`type`,`duration` FROM `advertise` ORDER BY `order`;")
+	SQL := "SELECT `id`,`order`,`time`,`src`,`type`,`duration`,`describe` FROM `advertise` ORDER BY `order`;"
+	query, err := utils.Mysql.Query(SQL)
 	if err != nil {
 		return nil, err
 	}
 	for query.Next() {
 		var one AdvertiseTable
-		err = query.Scan(&one.Id, &one.Order, &one.Time, &one.Src, &one.Type, &one.Duration)
+		err = query.Scan(&one.Id, &one.Order, &one.Time, &one.Src, &one.Type, &one.Duration, &one.Describe)
 		if err != nil {
 			return nil, err
 		}
@@ -109,3 +113,46 @@ func AdvListAll() ([]AdvertiseTable, error) {
 	}
 	return res, nil
 }
+
+func AdvertisesQuery(cond string, kind, limit, page int) (int, []AdvertiseTable, error) {
+	SQL := "none"
+	if kind == -1 {
+		SQL = utils.Format("SELECT COUNT(`id`) AS `total` FROM `advertise` WHERE `describe` LIKE '%%%s%%';", cond)
+	} else {
+		SQL = utils.Format(
+			"SELECT COUNT(`id`) AS `total` FROM `advertise` WHERE `type`=%d AND `describe` LIKE '%%%s%%';", kind, cond,
+		)
+	}
+	total := 0
+	err := utils.Mysql.QueryRow(SQL).Scan(&total)
+	if err != nil {
+		return 0, nil, err
+	}
+	if total == 0 {
+		return 0, []AdvertiseTable{}, err
+	}
+	if kind == -1 {
+		SQL = utils.Format(
+			"SELECT `id`,`order`,`time`,`type`,`src`,`duration`,`describe` FROM `advertise` "+
+				"WHERE `describe` LIKE '%%%s%%' LIMIT %d OFFSET %d;", cond, limit, (page-1)*limit,
+		)
+	} else {
+		SQL = utils.Format(
+			"SELECT `id`,`order`,`time`,`type`,`src`,`duration`,`describe` FROM `advertise` "+
+				"WHERE `type`=%d AND `describe` LIKE '%%%s%%' LIMIT %d OFFSET %d;", kind, cond, limit, (page-1)*limit,
+		)
+	}
+	var rows *sql.Rows
+	res := make([]AdvertiseTable, 0)
+	rows, err = utils.Mysql.Query(SQL)
+	if err != nil {
+		return 0, nil, err
+	}
+	for rows.Next() {
+		tmp := AdvertiseTable{}
+		_ = rows.Scan(&tmp.Id, &tmp.Order, &tmp.Time, &tmp.Type, &tmp.Src, &tmp.Duration, &tmp.Describe)
+		res = append(res, tmp)
+	}
+	_ = rows.Close()
+	return total, res, nil
+}

+ 22 - 6
utils/tables/device.go

@@ -150,7 +150,7 @@ func (row *DeviceTable) Get() error {
 	return nil
 }
 
-func QueryDevices(manager, cond string, limit, page int) (int, []utils.JsonType, error) {
+func DevicesQuery(manager, cond string, limit, page int) (int, []utils.JsonType, error) {
 	SQL, like := "none", utils.Format("%%%s%%", cond)
 	if manager == "" { // not assigned
 		SQL = "SELECT COUNT(`id`) AS `total` FROM `device` WHERE `manager`='' AND (`id` LIKE ? OR `addr` LIKE ? OR `mark` LIKE ?);"
@@ -208,15 +208,31 @@ func QueryDevices(manager, cond string, limit, page int) (int, []utils.JsonType,
 			"manager": utils.JsonType{"id": tMid, "name": tManager},
 		})
 	}
-	err = rows.Close()
-	if err != nil {
-		return 0, nil, err
-	}
+	_ = rows.Close()
 	return total, res, nil
 }
 
-func BatchAssignDeviceManager(ids []string, manager string) error {
+func DevicesAssignManager(ids []string, manager string) error {
 	SQL := utils.Format("UPDATE `device` SET `manager`='%s' WHERE `id` IN (%s);", manager, utils.SqlStringListJoin(ids))
 	_, err := utils.Mysql.Exec(SQL)
 	return err
 }
+
+func DevicesWithTheWine(wid uint16) ([]string, error) {
+	SQL := utils.Format(
+		"SELECT `id` FROM `device` WHERE `wine1`=%d OR `wine2`=%d OR `wine3`=%d OR `wine4`=%d;",
+		wid, wid, wid, wid,
+	)
+	rows, err := utils.Mysql.Query(SQL)
+	if err != nil {
+		return nil, err
+	}
+	res := make([]string, 0)
+	for rows.Next() {
+		var id string
+		_ = rows.Scan(&id)
+		res = append(res, id)
+	}
+	_ = rows.Close()
+	return res, nil
+}

+ 1 - 4
utils/tables/manager.go

@@ -138,9 +138,6 @@ func QueryManager(name string) ([]utils.JsonType, error) {
 		_ = rows.Scan(&tid, &tna)
 		res = append(res, utils.JsonType{"id": tid, "name": tna})
 	}
-	err = rows.Close()
-	if err != nil {
-		return nil, err
-	}
+	_ = rows.Close()
 	return res, nil
 }

+ 14 - 12
utils/tables/params.go

@@ -5,16 +5,18 @@ import (
 )
 
 type ParamsTable struct {
-	Id    uint32 `json:"id"`
-	Key   string `json:"key"`
-	Value uint32 `json:"value"`
+	Id       uint32 `json:"id"`
+	Key      string `json:"key"`
+	Value    uint32 `json:"value"`
+	Describe string `json:"describe"`
 }
 
 func CreateParamsTable() error {
 	sql := "CREATE TABLE IF NOT EXISTS `params`(" +
 		"`id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY," +
 		"`key` VARCHAR(32) NOT NULL," +
-		"`value` INT UNSIGNED NOT NULL);"
+		"`value` INT UNSIGNED NOT NULL," +
+		"`describe` VARCHAR(32) DEFAULT '');"
 	_, err := utils.Mysql.Exec(sql)
 	if err != nil {
 		return err
@@ -23,12 +25,12 @@ func CreateParamsTable() error {
 }
 
 func (row *ParamsTable) Insert() error {
-	sql := "INSERT INTO `params`(`key`,`value`) VALUES(?,?);"
+	sql := "INSERT INTO `params`(`key`,`value`,``) VALUES(?,?,?);"
 	pre, err := utils.Mysql.Prepare(sql)
 	if err != nil {
 		return err
 	}
-	_, err = pre.Exec(row.Key, row.Value)
+	_, err = pre.Exec(row.Key, row.Value, row.Describe)
 	if err != nil {
 		return err
 	}
@@ -62,12 +64,12 @@ func (row *ParamsTable) Update(args utils.JsonType) error {
 }
 
 func (row *ParamsTable) UpdateSelf() error {
-	sql := "UPDATE `params` SET `key`=?,`value`=? WHERE `id`=?;"
+	sql := "UPDATE `params` SET `key`=?,`value`=?,`describe`=? WHERE `id`=?;"
 	pre, err := utils.Mysql.Prepare(sql)
 	if err != nil {
 		return err
 	}
-	_, err = pre.Exec(row.Key, row.Value, row.Id)
+	_, err = pre.Exec(row.Key, row.Value, row.Describe, row.Id)
 	if err != nil {
 		return err
 	}
@@ -75,12 +77,12 @@ func (row *ParamsTable) UpdateSelf() error {
 }
 
 func (row *ParamsTable) Get() error {
-	sql := "SELECT `key`,`value` FROM `params` WHERE `id`=?;"
+	sql := "SELECT `key`,`value`,`describe` FROM `params` WHERE `id`=?;"
 	pre, err := utils.Mysql.Prepare(sql)
 	if err != nil {
 		return err
 	}
-	err = pre.QueryRow(row.Id).Scan(&row.Key, &row.Value)
+	err = pre.QueryRow(row.Id).Scan(&row.Key, &row.Value, &row.Describe)
 	if err != nil {
 		return err
 	}
@@ -89,13 +91,13 @@ func (row *ParamsTable) Get() error {
 
 func ParamsListAll() ([]ParamsTable, error) {
 	var res []ParamsTable
-	query, err := utils.Mysql.Query("SELECT `id`,`key`,`value` FROM `params`;")
+	query, err := utils.Mysql.Query("SELECT `id`,`key`,`value`,`describe` FROM `params`;")
 	if err != nil {
 		return nil, err
 	}
 	for query.Next() {
 		var one ParamsTable
-		err = query.Scan(&one.Id, &one.Key, &one.Value)
+		err = query.Scan(&one.Id, &one.Key, &one.Value, &one.Describe)
 		if err != nil {
 			return nil, err
 		}

+ 15 - 8
utils/tables/wine.go

@@ -41,12 +41,12 @@ func CreateWineTable() error {
 }
 
 func (row *WineTable) Insert() error {
-	SQL := "INSERT INTO `wine` (`name`,`price`,`degree`,`picture`,`describe`) VALUES (?,?,?,?,?);"
+	SQL := "INSERT INTO `wine` (`id`,`name`,`price`,`degree`,`density`,`picture`,`describe`) VALUES (?,?,?,?,?,?,?);"
 	pre, err := utils.Mysql.Prepare(SQL)
 	if err != nil {
 		return err
 	}
-	_, err = pre.Exec(row.Name, row.Price, row.Degree, row.Picture, row.Describe)
+	_, err = pre.Exec(row.Id, row.Name, row.Price, row.Degree, row.Density, row.Picture, row.Describe)
 	if err != nil {
 		return err
 	}
@@ -108,7 +108,7 @@ func extractJson(wine WineTable) utils.JsonType {
 	}
 }
 
-func QueryWines(cond string, limit, page int) (int, []utils.JsonType, error) {
+func WinesQuery(cond string, limit, page int) (int, []utils.JsonType, error) {
 	SQL, like := "none", utils.Format("%%%s%%", cond)
 	if page == 1 {
 		SQL = "SELECT COUNT(`id`) AS `total` FROM `wine` " +
@@ -147,15 +147,22 @@ func QueryWines(cond string, limit, page int) (int, []utils.JsonType, error) {
 		_ = rows.Scan(&tmp.Id, &tmp.Name, &tmp.Time, &tmp.Price, &tmp.Degree, &tmp.Density, &tmp.Picture, &tmp.Describe)
 		res = append(res, extractJson(tmp))
 	}
-	err = rows.Close()
-	if err != nil {
-		return 0, nil, err
-	}
+	_ = rows.Close()
 	return total, res, nil
 }
 
-func BatchDeleteWine(ids []uint16) error {
+func WinesDelete(ids []uint16) error {
 	SQL := utils.Format("UPDATE `wine` SET `deleted`=TRUE WHERE `id` IN (%s);", utils.SqlUint16ListJoin(ids))
 	_, err := utils.Mysql.Exec(SQL)
 	return err
 }
+
+func WineQueryMaxId() (uint16, error) {
+	SQL := "SELECT MAX(`id`) FROM `wine`;"
+	var max uint16
+	err := utils.Mysql.QueryRow(SQL).Scan(&max)
+	if err != nil {
+		return 0, err
+	}
+	return max, nil
+}