Переглянути джерело

添加了大量生成的代码

gujiheimao 2 роки тому
батько
коміт
abc2a12573
72 змінених файлів з 3751 додано та 183 видалено
  1. 1 0
      .gitignore
  2. 8 0
      .idea/.gitignore
  3. 12 0
      .idea/dataSources.xml
  4. 11 0
      .idea/kkc-go.iml
  5. 8 0
      .idea/modules.xml
  6. 6 0
      .idea/vcs.xml
  7. 13 0
      .idea/virtual-mall-backend.iml
  8. 10 0
      .test/req.http
  9. 46 0
      configs/config.go
  10. 145 0
      data/dao/DetailDao.go
  11. 0 1
      data/dao/GoodsAttributeKeyDao.go
  12. 0 1
      data/dao/GoodsAttributeValueDao.go
  13. 0 1
      data/dao/GoodsCategoryDao.go
  14. 0 23
      data/dao/GoodsDao.go
  15. 0 1
      data/dao/GoodsSpecsDao.go
  16. 31 0
      data/dao/Login.go
  17. 146 0
      data/dao/OrderDao.go
  18. 75 0
      data/dao/manage/ArticleDao.go
  19. 75 0
      data/dao/manage/ArticleTagDao.go
  20. 58 0
      data/dao/manage/ArticleTopicDao.go
  21. 75 0
      data/dao/manage/AuthorityDao.go
  22. 75 0
      data/dao/manage/GoodsCommodityAreaDao.go
  23. 75 0
      data/dao/manage/GoodsCouponDao.go
  24. 75 0
      data/dao/manage/GoodsCouponUserDao.go
  25. 75 0
      data/dao/manage/GoodsDao.go
  26. 75 0
      data/dao/manage/GoodsIntroductionDao.go
  27. 75 0
      data/dao/manage/GoodsOrderDao.go
  28. 75 0
      data/dao/manage/GoodsSkuCardDao.go
  29. 75 0
      data/dao/manage/GoodsSkuDao.go
  30. 75 0
      data/dao/manage/GoodsTagDao.go
  31. 75 0
      data/dao/manage/GoodsTopicDao.go
  32. 75 0
      data/dao/manage/GoodsTypeDao.go
  33. 75 0
      data/dao/manage/ManageUserDao.go
  34. 58 0
      data/dao/manage/RoleAuthorityDao.go
  35. 75 0
      data/dao/manage/RoleDao.go
  36. 75 0
      data/dao/manage/UserDao.go
  37. 75 0
      data/dao/manage/UserWalletDao.go
  38. 303 0
      data/domain/DoMain.go
  39. 0 20
      data/domain/Goods.go
  40. 0 16
      data/domain/GoodsAttributeKey.go
  41. 0 16
      data/domain/GoodsAttributeValue.go
  42. 0 16
      data/domain/GoodsCategory.go
  43. 0 17
      data/domain/GoodsSpecs.go
  44. 6 0
      data/domain/JoinDoMain.go
  45. 0 5
      data/domain/domain.go
  46. 8 0
      data/domain/vo/BaseListVo.go
  47. 31 0
      data/domain/vo/DetailVo.go
  48. 28 0
      data/domain/vo/IndexData.go
  49. 8 0
      data/domain/vo/OrderListVo.go
  50. 12 0
      data/domain/vo/UserVos.go
  51. BIN
      file/resources/20240423094145微信图片_20240416170543.jpg
  52. BIN
      file/resources/202404231412462.jpg
  53. BIN
      file/resources/202404231441402 - 副本.jpg
  54. BIN
      file/resources/202404231442072 - 副本.jpg
  55. 26 0
      file/saveSql.bat
  56. 265 0
      file/virtual_mall.sql
  57. 261 0
      go.sum
  58. 9 2
      main.go
  59. 148 0
      router/BackRouter.go
  60. 29 0
      router/DetailRouter.go
  61. 52 0
      router/FileRouter.go
  62. 0 24
      router/GoodsRouter.go
  63. 16 0
      router/HomeRouter.go
  64. 107 0
      router/OrderRouter.go
  65. 44 0
      router/ResultData.go
  66. 14 0
      router/Router.go
  67. 43 0
      router/TestRouter.go
  68. 99 0
      router/UserRouter.go
  69. 0 7
      test/test.http
  70. 250 24
      user/user.go
  71. 69 9
      user/userdao.go
  72. 20 0
      util/RandomUtil.go

+ 1 - 0
.gitignore

@@ -0,0 +1 @@
+/.test/

+ 8 - 0
.idea/.gitignore

@@ -0,0 +1,8 @@
+# 默认忽略的文件
+/shelf/
+/workspace.xml
+# 基于编辑器的 HTTP 客户端请求
+/httpRequests/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml

+ 12 - 0
.idea/dataSources.xml

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="DataSourceManagerImpl" format="xml" multifile-model="true">
+    <data-source source="LOCAL" name="virtual_mall@localhost" uuid="01c8d27c-323c-4038-a75d-8133a792322a">
+      <driver-ref>mysql.8</driver-ref>
+      <synchronize>true</synchronize>
+      <jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
+      <jdbc-url>jdbc:mysql://localhost:3306/virtual_mall</jdbc-url>
+      <working-dir>$ProjectFileDir$</working-dir>
+    </data-source>
+  </component>
+</project>

+ 11 - 0
.idea/kkc-go.iml

@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="Go" enabled="true" />
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.test" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 8 - 0
.idea/modules.xml

@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="ProjectModuleManager">
+    <modules>
+      <module fileurl="file://$PROJECT_DIR$/.idea/virtual-mall-backend.iml" filepath="$PROJECT_DIR$/.idea/virtual-mall-backend.iml" />
+    </modules>
+  </component>
+</project>

+ 6 - 0
.idea/vcs.xml

@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="Git" />
+  </component>
+</project>

+ 13 - 0
.idea/virtual-mall-backend.iml

@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="WEB_MODULE" version="4">
+  <component name="Go" enabled="true" />
+  <component name="NewModuleRootManager">
+    <content url="file://$MODULE_DIR$">
+      <excludeFolder url="file://$MODULE_DIR$/.idea" />
+      <excludeFolder url="file://$MODULE_DIR$/test" />
+      <excludeFolder url="file://$MODULE_DIR$/.test" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>

+ 10 - 0
.test/req.http

@@ -0,0 +1,10 @@
+#GET http://localhost:8080/api/goods/all
+#Accept: application/json
+
+###
+PUT http://localhost:8080/api/user/name?name=666
+Content-Type: application/json
+Auth-Sign:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE3MTQ5Nzc1MDcsImlzcyI6IjEifQ.Ez8HbEJICdLBy_rDep7dA-CB1k77hTTfwx_7LOFACZc
+
+
+###

+ 46 - 0
configs/config.go

@@ -24,7 +24,16 @@ type User struct {
 	Status        int    `xorm:"'status'" json:"status"`
 	Role_id       int    `xorm:"'role_id'" json:"role_id"`
 	Phone         string `xorm:"'phone'" json:"phone"`
+	Email         string `xorm:"'email'" json:"email"`
+	Name          string `xorm:"'name'" json:"name"`
+	Avatar        string `xorm:"'avatar'" json:"avatar"`
+	RecommendCode string `xorm:"'recommend_code'" json:"recommend_code"`
 }
+
+func (receiver User) String() string {
+	return fmt.Sprintf("User{Id:%d, Username:%s, Password:%s, Creation_time:%d, Login_time:%d, Status:%d, Role_id:%d, Phone:%s, Email:%s, Name:%s, Avatar:%s, RecommendCode:%s}", receiver.Id, receiver.Username, receiver.Password, receiver.Creation_time, receiver.Login_time, receiver.Status, receiver.Role_id, receiver.Phone, receiver.Email, receiver.Name, receiver.Avatar, receiver.RecommendCode)
+}
+
 type Role struct {
 	Id        int    `xorm:"'id'" json:"id"`
 	Role_name string `xorm:"'role_name'" json:"role_Name"`
@@ -63,10 +72,47 @@ func ConfigInit() {
 	fmt.Println(fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8", config.Get("mysql.user"), config.Get("mysql.password"), config.Get("mysql.host"), config.Get("mysql.port"), config.Get("mysql.database")))
 	Engine, err = xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8", config.Get("mysql.user"), config.Get("mysql.password"), config.Get("mysql.host"), config.Get("mysql.port"), config.Get("mysql.database")))
 	Engine.Ping() //连接测试
+	//TODO  显示sql
+	Engine.ShowSQL(true)
+	Engine.Logger().ShowSQL(true)
+	RedisDb = redis.NewClient(&redis.Options{
+		Addr:     fmt.Sprintf("%s:%s", config.Get("redis.host"), config.Get("redis.port")), // Redis地址
+		Password: "",                                                                       // Redis密码,如果没有则为空字符串
+		DB:       0,                                                                        // 使用默认DB
+	})
+	//开启debug模式
+
+	Config = config
+	fmt.Println("xorm 数据库orm框架初始化成功")
+}
+func ConfigInitByUrl(configUrl string) {
+	//获取项目的执行路径
+
+	config := viper.New()
+
+	config.AddConfigPath(configUrl + "\\configs") //设置读取的文件路径
+	config.SetConfigName("config")                //设置读取的文件名
+	config.SetConfigType("yaml")                  //设置文件的类型
+	//尝试进行配置读取
+	if err := config.ReadInConfig(); err != nil {
+		panic(err)
+	}
+	fmt.Println(fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8", config.Get("mysql.user"), config.Get("mysql.password"), config.Get("mysql.host"), config.Get("mysql.port"), config.Get("mysql.database")))
+	Engine, _ := xorm.NewEngine("mysql", fmt.Sprintf("%s:%s@(%s:%s)/%s?charset=utf8", config.Get("mysql.user"), config.Get("mysql.password"), config.Get("mysql.host"), config.Get("mysql.port"), config.Get("mysql.database")))
+	Engine.Ping() //连接测试
+	//TODO  显示sql
+	Engine.ShowSQL(true)
+	Engine.Logger().ShowSQL(true)
 	RedisDb = redis.NewClient(&redis.Options{
 		Addr:     fmt.Sprintf("%s:%s", config.Get("redis.host"), config.Get("redis.port")), // Redis地址
 		Password: "",                                                                       // Redis密码,如果没有则为空字符串
 		DB:       0,                                                                        // 使用默认DB
 	})
+	//开启debug模式
+
 	Config = config
+	fmt.Println("xorm 数据库orm框架初始化成功")
+}
+func GoGormConfigInit() {
+
 }

+ 145 - 0
data/dao/DetailDao.go

@@ -0,0 +1,145 @@
+package dao
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+	"fmt"
+)
+
+// SelectGoodsDetailById 获取相同的商品详情
+func SelectGoodsDetailById(skuId int) (vo.DetailVo, error) {
+	detailVo := vo.DetailVo{}
+	var caId = -1
+	//================查询sku========================
+	var sku domain.GoodsSku
+	//查询 sku
+	rows, err := configs.Engine.Table("goods_sku").
+		Where("goods_id = (select a.goods_id as goods_id from goods_sku as a where a.id = ? )", skuId).
+		Desc("create_time").Rows(&sku)
+	if err != nil {
+		println("查询sku失败", err)
+		return vo.DetailVo{}, err
+	}
+	var skus []domain.GoodsSku
+	var commodityAreaIds = make([]int, 0)
+	commodityAreaIdsString := ""
+A:
+	for rows.Next() {
+		rows.Scan(&sku)
+		skus = append(skus, sku)
+		if sku.Id == skuId {
+			caId = sku.CommodityAreaId
+		}
+		//去重
+		for i := range commodityAreaIds {
+			if sku.CommodityAreaId == commodityAreaIds[i] {
+				continue A
+			}
+		}
+
+		commodityAreaIds = append(commodityAreaIds, sku.CommodityAreaId)
+		commodityAreaIdsString = fmt.Sprint(commodityAreaIdsString, ",", sku.CommodityAreaId)
+	}
+	commodityAreaIdsString = commodityAreaIdsString[1:]
+	fmt.Println("=============================>", commodityAreaIdsString)
+	//================查询goods========================
+	var goods domain.Goods
+	_, err = configs.Engine.Table("goods").Where("id = ?", sku.GoodsId).Get(&goods)
+	if err != nil {
+		println("查询goods失败", err)
+		return vo.DetailVo{}, err
+	}
+	//=================查询goods_tag========================
+	var goodsTag domain.GoodsTag
+	rows, err = configs.Engine.Table("goods_tag").
+		Where(" FIND_IN_SET(goods_tag.id,?)", goods.TagIds).
+		Rows(&goodsTag)
+	if err != nil {
+		println("查询goods_tag失败", err)
+		return vo.DetailVo{}, err
+	}
+	var goodsTags []domain.GoodsTag
+	for rows.Next() {
+		rows.Scan(&goodsTag)
+		goodsTags = append(goodsTags, goodsTag)
+	}
+	//=================查询goods_type========================
+	var goodsType domain.GoodsType
+	_, err = configs.Engine.Table("goods_type").Where("id = ?", goods.TypeId).Get(&goodsType)
+	if err != nil {
+		println("查询goods_type失败", err)
+		return vo.DetailVo{}, err
+	}
+	//=================查询goods_CommodityArea========================
+	var goodsCommodityArea domain.GoodsCommodityArea
+	rows, err = configs.Engine.Table("goods_commodity_area").
+		Where(" FIND_IN_SET(goods_commodity_area.id,?) and goods_id = ?", commodityAreaIdsString, goods.Id).
+		Rows(&goodsCommodityArea)
+	if err != nil {
+		println("查询goods_CommodityArea失败", err)
+		return vo.DetailVo{}, err
+	}
+	var goodsCommodityAreas []domain.GoodsCommodityArea
+
+	var introductionIds = make([]int, 0)
+	var introductionIdString = ""
+B:
+	for rows.Next() {
+		rows.Scan(&goodsCommodityArea)
+		goodsCommodityAreas = append(goodsCommodityAreas, goodsCommodityArea)
+		for i := range introductionIds {
+			if goodsCommodityArea.DetailIntroductionId == introductionIds[i] {
+				continue B
+			}
+		}
+		introductionIds = append(introductionIds, goodsCommodityArea.DetailIntroductionId)
+		introductionIdString = fmt.Sprint(introductionIdString, ",", goodsCommodityArea.DetailIntroductionId)
+	}
+	introductionIdString = introductionIdString[1:]
+	fmt.Println("=============================>", introductionIdString)
+	//=================查询goods_introduction========================
+	var goodsIntroduction domain.GoodsIntroduction
+	rows, err = configs.Engine.Table("goods_introduction").
+		Where("FIND_IN_SET(id,?)", introductionIdString).
+		Rows(&goodsIntroduction)
+	if err != nil {
+		println("查询goods_introduction失败", err)
+		return vo.DetailVo{}, err
+	}
+
+	var goodsIntroductions []domain.GoodsIntroduction
+	for rows.Next() {
+		rows.Scan(&goodsIntroduction)
+		goodsIntroductions = append(goodsIntroductions, goodsIntroduction)
+	}
+
+	detailVo.DetailGoodsVo = vo.DetailGoodsVo{
+		Tags:        goodsTags,
+		GoodsId:     goods.Id,
+		Name:        goods.GoodsName,
+		SalesVolume: goods.SalesVolume,
+		Type:        goodsType,
+	}
+
+	detailVo.DetailSkuVo = vo.DetailSkuVo{
+		SkuList:  skus,
+		NowSkuId: skuId,
+	}
+
+	detailVo.DetailCommodityAreaVo = vo.DetailCommodityAreaVo{
+		CommodityAreaList:  goodsCommodityAreas,
+		NowCommodityAreaId: caId,
+	}
+
+	//=================相关推荐========================
+	//复制sku 8个数据
+	if len(skus) >= 8 {
+		detailVo.RecommendedGoods = skus[0:8]
+	} else {
+		detailVo.RecommendedGoods = skus
+	}
+	detailVo.Introduction = goodsIntroductions
+
+	return detailVo, nil
+}

+ 0 - 1
data/dao/GoodsAttributeKeyDao.go

@@ -1 +0,0 @@
-package domain

+ 0 - 1
data/dao/GoodsAttributeValueDao.go

@@ -1 +0,0 @@
-package domain

+ 0 - 1
data/dao/GoodsCategoryDao.go

@@ -1 +0,0 @@
-package domain

+ 0 - 23
data/dao/GoodsDao.go

@@ -1,23 +0,0 @@
-package domain
-
-import (
-	"demo/configs"
-	"demo/data/domain"
-)
-
-func SelectAll() []domain.Goods {
-	var goods domain.Goods
-
-	rows, err := configs.Engine.Table(domain.GetGoodsTableName()).Rows(&goods)
-	if err != nil {
-		print(err)
-	}
-	defer rows.Close()
-	var goodsDatas []domain.Goods = make([]domain.Goods, 0)
-	for rows.Next() {
-		rows.Scan(&goods)
-		goodsDatas = append(goodsDatas, goods)
-	}
-	println("获取goods表,全部数据,运行结果:", rows)
-	return goodsDatas
-}

+ 0 - 1
data/dao/GoodsSpecsDao.go

@@ -1 +0,0 @@
-package domain

+ 31 - 0
data/dao/Login.go

@@ -0,0 +1,31 @@
+package dao
+
+import (
+	"crypto/md5"
+	"demo/configs"
+	"demo/data/domain"
+	"fmt"
+)
+
+func Logins(username, password string) (domain.ManageUser, error) {
+	user := domain.ManageUser{}
+	var err error
+	fmt.Println("username", username, "password", password)
+	hash := md5.New()
+	hash.Write([]byte("kkc-" + password))
+	pwd := Md5_KKC(password)
+	fmt.Println(configs.Engine)
+	//md5摘要
+	_, err = configs.Engine.Table("manage_user").Where("username = ?", username).Where("password = ?", pwd).Get(&user)
+
+	if err == nil {
+		return user, err
+	}
+	return domain.ManageUser{}, err
+}
+
+func Md5_KKC(str string) string {
+	hash := md5.New()
+	hash.Write([]byte("kkc-" + str))
+	return fmt.Sprintf("%x", hash.Sum(nil))
+}

+ 146 - 0
data/dao/OrderDao.go

@@ -0,0 +1,146 @@
+package dao
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+	"fmt"
+)
+
+func SelectSkuBySkuId(skuId int) (domain.GoodsSku, error) {
+	var sku domain.GoodsSku
+	_, err := configs.Engine.Table("goods_sku").Where("id = ?", skuId).Get(&sku)
+	if err != nil {
+		return sku, err
+	}
+
+	return sku, nil
+}
+
+func CreateOrder(order *domain.GoodsOrder) (*domain.GoodsOrder, error) {
+	id, err := configs.Engine.Table("goods_order").Insert(&order)
+	fmt.Println("is id? ", id)
+	if err != nil {
+		return order, err
+	}
+	//configs.Engine.Table("goods_order").Where("create_by = ?", order.CreateBy).Desc("create_time").Get(&order)
+	fmt.Println("order is ", order)
+	return order, err
+}
+
+// OrderPaySuccess 订单支付成功
+func OrderPaySuccess(orderId int) {
+	configs.Engine.ID(orderId).Cols("state").Update(map[string]any{"state": 1})
+}
+
+// 获取订单集合
+func GetOrderByUserId(userId int) ([]domain.GoodsOrder, error) {
+	order := domain.GoodsOrder{}
+	rows, err := configs.Engine.Table("goods_order").Where("create_by = ?", userId).Desc("create_time").Rows(&order)
+	if err != nil {
+		return nil, err
+	}
+	defer rows.Close()
+	var orders []domain.GoodsOrder
+	for rows.Next() {
+		var order domain.GoodsOrder
+		err := rows.Scan(&order)
+		if err != nil {
+			return nil, err
+		}
+		orders = append(orders, order)
+	}
+	return orders, nil
+}
+
+// GetUserWalletByUserId 获取用户的钱包信息
+func GetUserWalletByUserId(userId int) (domain.UserWallet, error) {
+	var wallet domain.UserWallet
+	_, err := configs.Engine.Where("user_id = ?", userId).Get(&wallet)
+	if err != nil {
+		return wallet, err
+	}
+	return wallet, nil
+
+}
+
+// GetUserCouponByUserId  获取用户的优惠券信息
+func GetUserCouponByUserId(userId int) ([]domain.CouponUserJDM, error) {
+
+	var couponUserJDMs []domain.CouponUserJDM
+	err := configs.Engine.Table("goods_coupon_user").
+		Join("INNER", "goods_coupon", "goods_coupon_user.coupon_id = goods_coupon.id").
+		Where("goods_coupon_user.user_id = ?", userId).Find(&couponUserJDMs)
+	if err != nil {
+		return couponUserJDMs, err
+	}
+
+	return couponUserJDMs, nil
+}
+
+func GetListGoodsOrder(state string, userId, pageNum, pageSize int) (vo.BaseListVo, error) {
+	var goodsOrder domain.GoodsOrder
+	Session := configs.Engine.Table("goods_order")
+	if state != "" {
+		Session.Where("state = ?", state)
+	}
+	rows, err := Session.Where("create_by = ?", userId).Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsOrder)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsOrder
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	fmt.Println("996-------", vo.List)
+	CountSess := configs.Engine.Table("goods_order")
+	if state != "" {
+		CountSess.Where("state = ?", state)
+	}
+	//查询数量
+	count, err := CountSess.Where("create_by = ?", userId).Count(&goodsOrder)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+// 领取优惠券
+//func pickUpTheCoupon(couponId int, userId int) (bool, error) {
+//	gcu := domain.GoodsCouponUser{
+//		UserId:         userId,
+//		CouponId:       couponId,
+//		CollectionTime: time.Now(),
+//		State:          "1",
+//	}
+//	//判断优惠券数量是否充足
+//	coupon, err := manage.GetByIdGoodsCoupon(couponId)
+//	if err != nil {
+//		return false, err
+//	}
+//	//判断条件
+//	if coupon.Count > 0 {
+//		if coupon.Count == 1 {
+//			//优惠券数量为1时,直接领取
+//			_, err := manage.PostGoodsCouponUser(&gcu)
+//			if err != nil {
+//				return false, err
+//			}
+//			manage.PutGoodsCoupon(map[string]any{"count": coupon.Count - 1}, couponId)
+//			return true, nil
+//		} else {
+//			//优惠券数量大于1时,判断是否满足领取条件
+//			if coupon.Condition == 1 {
+//				//满足领取条件
+//				_, err := manage.PostGoodsCouponUser(&gcu)
+//				if err != nil {
+//				}
+//			}
+//		}
+//
+//	}
+//
+//}

+ 75 - 0
data/dao/manage/ArticleDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdArticle(id int) (domain.Article, error) {
+	var article domain.Article
+	_, err := configs.Engine.Where("id = ?", id).Get(&article)
+	if err != nil {
+		return article, err
+	}
+	return article, nil
+}
+
+func GetInIdListArticle(ids []int) ([]domain.Article, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.Article{})
+	if err != nil {
+		return make([]domain.Article, 0), err
+	}
+	defer rows.Close()
+	var list []domain.Article
+	for rows.Next() {
+		var u domain.Article
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListArticle(article domain.Article, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&article)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.Article
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&article)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveArticle(article *domain.Article) (domain.Article, error) {
+	_, err := configs.Engine.Insert(&article)
+	if err != nil {
+		return *article, err
+	}
+	return *article, nil
+}
+
+func SetArticle(articleMap map[string]interface{}, id int) (domain.Article, bool, error) {
+	var article domain.Article
+	_, err := configs.Engine.Table("article").Where("id = ?", id).Update(articleMap)
+	if err != nil {
+		return article, false, err
+	}
+	return article, true, nil
+}
+
+func DeleteArticle(article domain.Article) bool {
+	i, err := configs.Engine.Where("id = ?", article.Id).Delete(&article)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/ArticleTagDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdArticleTag(id int) (domain.ArticleTag, error) {
+	var articleTag domain.ArticleTag
+	_, err := configs.Engine.Where("id = ?", id).Get(&articleTag)
+	if err != nil {
+		return articleTag, err
+	}
+	return articleTag, nil
+}
+
+func GetInIdListArticleTag(ids []int) ([]domain.ArticleTag, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.ArticleTag{})
+	if err != nil {
+		return make([]domain.ArticleTag, 0), err
+	}
+	defer rows.Close()
+	var list []domain.ArticleTag
+	for rows.Next() {
+		var u domain.ArticleTag
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListArticleTag(articleTag domain.ArticleTag, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&articleTag)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.ArticleTag
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&articleTag)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveArticleTag(articleTag *domain.ArticleTag) (domain.ArticleTag, error) {
+	_, err := configs.Engine.Insert(&articleTag)
+	if err != nil {
+		return *articleTag, err
+	}
+	return *articleTag, nil
+}
+
+func SetArticleTag(articleTagMap map[string]interface{}, id int) (domain.ArticleTag, bool, error) {
+	var articleTag domain.ArticleTag
+	_, err := configs.Engine.Table("article_tag").Where("id = ?", id).Update(articleTagMap)
+	if err != nil {
+		return articleTag, false, err
+	}
+	return articleTag, true, nil
+}
+
+func DeleteArticleTag(articleTag domain.ArticleTag) bool {
+	i, err := configs.Engine.Where("id = ?", articleTag.Id).Delete(&articleTag)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 58 - 0
data/dao/manage/ArticleTopicDao.go

@@ -0,0 +1,58 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetInIdListArticleTopic(ids []int) ([]domain.ArticleTopic, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.ArticleTopic{})
+	if err != nil {
+		return make([]domain.ArticleTopic, 0), err
+	}
+	defer rows.Close()
+	var list []domain.ArticleTopic
+	for rows.Next() {
+		var u domain.ArticleTopic
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListArticleTopic(articleTopic domain.ArticleTopic, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&articleTopic)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.ArticleTopic
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&articleTopic)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveArticleTopic(articleTopic *domain.ArticleTopic) (domain.ArticleTopic, error) {
+	_, err := configs.Engine.Insert(&articleTopic)
+	if err != nil {
+		return *articleTopic, err
+	}
+	return *articleTopic, nil
+}
+
+func SetArticleTopic(articleTopicMap map[string]interface{}, id int) (domain.ArticleTopic, bool, error) {
+	var articleTopic domain.ArticleTopic
+	_, err := configs.Engine.Table("article_topic").Where("id = ?", id).Update(articleTopicMap)
+	if err != nil {
+		return articleTopic, false, err
+	}
+	return articleTopic, true, nil
+}

+ 75 - 0
data/dao/manage/AuthorityDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdAuthority(id int) (domain.Authority, error) {
+	var authority domain.Authority
+	_, err := configs.Engine.Where("id = ?", id).Get(&authority)
+	if err != nil {
+		return authority, err
+	}
+	return authority, nil
+}
+
+func GetInIdListAuthority(ids []int) ([]domain.Authority, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.Authority{})
+	if err != nil {
+		return make([]domain.Authority, 0), err
+	}
+	defer rows.Close()
+	var list []domain.Authority
+	for rows.Next() {
+		var u domain.Authority
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListAuthority(authority domain.Authority, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&authority)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.Authority
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&authority)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveAuthority(authority *domain.Authority) (domain.Authority, error) {
+	_, err := configs.Engine.Insert(&authority)
+	if err != nil {
+		return *authority, err
+	}
+	return *authority, nil
+}
+
+func SetAuthority(authorityMap map[string]interface{}, id int) (domain.Authority, bool, error) {
+	var authority domain.Authority
+	_, err := configs.Engine.Table("authority").Where("id = ?", id).Update(authorityMap)
+	if err != nil {
+		return authority, false, err
+	}
+	return authority, true, nil
+}
+
+func DeleteAuthority(authority domain.Authority) bool {
+	i, err := configs.Engine.Where("id = ?", authority.Id).Delete(&authority)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsCommodityAreaDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsCommodityArea(id int) (domain.GoodsCommodityArea, error) {
+	var goodsCommodityArea domain.GoodsCommodityArea
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsCommodityArea)
+	if err != nil {
+		return goodsCommodityArea, err
+	}
+	return goodsCommodityArea, nil
+}
+
+func GetInIdListGoodsCommodityArea(ids []int) ([]domain.GoodsCommodityArea, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsCommodityArea{})
+	if err != nil {
+		return make([]domain.GoodsCommodityArea, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsCommodityArea
+	for rows.Next() {
+		var u domain.GoodsCommodityArea
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsCommodityArea(goodsCommodityArea domain.GoodsCommodityArea, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsCommodityArea)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsCommodityArea
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsCommodityArea)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsCommodityArea(goodsCommodityArea *domain.GoodsCommodityArea) (domain.GoodsCommodityArea, error) {
+	_, err := configs.Engine.Insert(&goodsCommodityArea)
+	if err != nil {
+		return *goodsCommodityArea, err
+	}
+	return *goodsCommodityArea, nil
+}
+
+func SetGoodsCommodityArea(goodsCommodityAreaMap map[string]interface{}, id int) (domain.GoodsCommodityArea, bool, error) {
+	var goodsCommodityArea domain.GoodsCommodityArea
+	_, err := configs.Engine.Table("goods_commodity_area").Where("id = ?", id).Update(goodsCommodityAreaMap)
+	if err != nil {
+		return goodsCommodityArea, false, err
+	}
+	return goodsCommodityArea, true, nil
+}
+
+func DeleteGoodsCommodityArea(goodsCommodityArea domain.GoodsCommodityArea) bool {
+	i, err := configs.Engine.Where("id = ?", goodsCommodityArea.Id).Delete(&goodsCommodityArea)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsCouponDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsCoupon(id int) (domain.GoodsCoupon, error) {
+	var goodsCoupon domain.GoodsCoupon
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsCoupon)
+	if err != nil {
+		return goodsCoupon, err
+	}
+	return goodsCoupon, nil
+}
+
+func GetInIdListGoodsCoupon(ids []int) ([]domain.GoodsCoupon, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsCoupon{})
+	if err != nil {
+		return make([]domain.GoodsCoupon, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsCoupon
+	for rows.Next() {
+		var u domain.GoodsCoupon
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsCoupon(goodsCoupon domain.GoodsCoupon, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsCoupon)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsCoupon
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsCoupon)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsCoupon(goodsCoupon *domain.GoodsCoupon) (domain.GoodsCoupon, error) {
+	_, err := configs.Engine.Insert(&goodsCoupon)
+	if err != nil {
+		return *goodsCoupon, err
+	}
+	return *goodsCoupon, nil
+}
+
+func SetGoodsCoupon(goodsCouponMap map[string]interface{}, id int) (domain.GoodsCoupon, bool, error) {
+	var goodsCoupon domain.GoodsCoupon
+	_, err := configs.Engine.Table("goods_coupon").Where("id = ?", id).Update(goodsCouponMap)
+	if err != nil {
+		return goodsCoupon, false, err
+	}
+	return goodsCoupon, true, nil
+}
+
+func DeleteGoodsCoupon(goodsCoupon domain.GoodsCoupon) bool {
+	i, err := configs.Engine.Where("id = ?", goodsCoupon.Id).Delete(&goodsCoupon)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsCouponUserDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsCouponUser(id int) (domain.GoodsCouponUser, error) {
+	var goodsCouponUser domain.GoodsCouponUser
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsCouponUser)
+	if err != nil {
+		return goodsCouponUser, err
+	}
+	return goodsCouponUser, nil
+}
+
+func GetInIdListGoodsCouponUser(ids []int) ([]domain.GoodsCouponUser, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsCouponUser{})
+	if err != nil {
+		return make([]domain.GoodsCouponUser, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsCouponUser
+	for rows.Next() {
+		var u domain.GoodsCouponUser
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsCouponUser(goodsCouponUser domain.GoodsCouponUser, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsCouponUser)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsCouponUser
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsCouponUser)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsCouponUser(goodsCouponUser *domain.GoodsCouponUser) (domain.GoodsCouponUser, error) {
+	_, err := configs.Engine.Insert(&goodsCouponUser)
+	if err != nil {
+		return *goodsCouponUser, err
+	}
+	return *goodsCouponUser, nil
+}
+
+func SetGoodsCouponUser(goodsCouponUserMap map[string]interface{}, id int) (domain.GoodsCouponUser, bool, error) {
+	var goodsCouponUser domain.GoodsCouponUser
+	_, err := configs.Engine.Table("goods_coupon_user").Where("id = ?", id).Update(goodsCouponUserMap)
+	if err != nil {
+		return goodsCouponUser, false, err
+	}
+	return goodsCouponUser, true, nil
+}
+
+func DeleteGoodsCouponUser(goodsCouponUser domain.GoodsCouponUser) bool {
+	i, err := configs.Engine.Where("id = ?", goodsCouponUser.Id).Delete(&goodsCouponUser)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoods(id int) (domain.Goods, error) {
+	var goods domain.Goods
+	_, err := configs.Engine.Where("id = ?", id).Get(&goods)
+	if err != nil {
+		return goods, err
+	}
+	return goods, nil
+}
+
+func GetInIdListGoods(ids []int) ([]domain.Goods, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.Goods{})
+	if err != nil {
+		return make([]domain.Goods, 0), err
+	}
+	defer rows.Close()
+	var list []domain.Goods
+	for rows.Next() {
+		var u domain.Goods
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoods(goods domain.Goods, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goods)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.Goods
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goods)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoods(goods *domain.Goods) (domain.Goods, error) {
+	_, err := configs.Engine.Insert(&goods)
+	if err != nil {
+		return *goods, err
+	}
+	return *goods, nil
+}
+
+func SetGoods(goodsMap map[string]interface{}, id int) (domain.Goods, bool, error) {
+	var goods domain.Goods
+	_, err := configs.Engine.Table("goods").Where("id = ?", id).Update(goodsMap)
+	if err != nil {
+		return goods, false, err
+	}
+	return goods, true, nil
+}
+
+func DeleteGoods(goods domain.Goods) bool {
+	i, err := configs.Engine.Where("id = ?", goods.Id).Delete(&goods)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsIntroductionDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsIntroduction(id int) (domain.GoodsIntroduction, error) {
+	var goodsIntroduction domain.GoodsIntroduction
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsIntroduction)
+	if err != nil {
+		return goodsIntroduction, err
+	}
+	return goodsIntroduction, nil
+}
+
+func GetInIdListGoodsIntroduction(ids []int) ([]domain.GoodsIntroduction, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsIntroduction{})
+	if err != nil {
+		return make([]domain.GoodsIntroduction, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsIntroduction
+	for rows.Next() {
+		var u domain.GoodsIntroduction
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsIntroduction(goodsIntroduction domain.GoodsIntroduction, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsIntroduction)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsIntroduction
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsIntroduction)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsIntroduction(goodsIntroduction *domain.GoodsIntroduction) (domain.GoodsIntroduction, error) {
+	_, err := configs.Engine.Insert(&goodsIntroduction)
+	if err != nil {
+		return *goodsIntroduction, err
+	}
+	return *goodsIntroduction, nil
+}
+
+func SetGoodsIntroduction(goodsIntroductionMap map[string]interface{}, id int) (domain.GoodsIntroduction, bool, error) {
+	var goodsIntroduction domain.GoodsIntroduction
+	_, err := configs.Engine.Table("goods_introduction").Where("id = ?", id).Update(goodsIntroductionMap)
+	if err != nil {
+		return goodsIntroduction, false, err
+	}
+	return goodsIntroduction, true, nil
+}
+
+func DeleteGoodsIntroduction(goodsIntroduction domain.GoodsIntroduction) bool {
+	i, err := configs.Engine.Where("id = ?", goodsIntroduction.Id).Delete(&goodsIntroduction)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsOrderDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsOrder(id int) (domain.GoodsOrder, error) {
+	var goodsOrder domain.GoodsOrder
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsOrder)
+	if err != nil {
+		return goodsOrder, err
+	}
+	return goodsOrder, nil
+}
+
+func GetInIdListGoodsOrder(ids []int) ([]domain.GoodsOrder, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsOrder{})
+	if err != nil {
+		return make([]domain.GoodsOrder, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsOrder
+	for rows.Next() {
+		var u domain.GoodsOrder
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsOrder(goodsOrder domain.GoodsOrder, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsOrder)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsOrder
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsOrder)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsOrder(goodsOrder *domain.GoodsOrder) (domain.GoodsOrder, error) {
+	_, err := configs.Engine.Insert(&goodsOrder)
+	if err != nil {
+		return *goodsOrder, err
+	}
+	return *goodsOrder, nil
+}
+
+func SetGoodsOrder(goodsOrderMap map[string]interface{}, id int) (domain.GoodsOrder, bool, error) {
+	var goodsOrder domain.GoodsOrder
+	_, err := configs.Engine.Table("goods_order").Where("id = ?", id).Update(goodsOrderMap)
+	if err != nil {
+		return goodsOrder, false, err
+	}
+	return goodsOrder, true, nil
+}
+
+func DeleteGoodsOrder(goodsOrder domain.GoodsOrder) bool {
+	i, err := configs.Engine.Where("id = ?", goodsOrder.Id).Delete(&goodsOrder)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsSkuCardDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsSkuCard(id int) (domain.GoodsSkuCard, error) {
+	var goodsSkuCard domain.GoodsSkuCard
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsSkuCard)
+	if err != nil {
+		return goodsSkuCard, err
+	}
+	return goodsSkuCard, nil
+}
+
+func GetInIdListGoodsSkuCard(ids []int) ([]domain.GoodsSkuCard, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsSkuCard{})
+	if err != nil {
+		return make([]domain.GoodsSkuCard, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsSkuCard
+	for rows.Next() {
+		var u domain.GoodsSkuCard
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsSkuCard(goodsSkuCard domain.GoodsSkuCard, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsSkuCard)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsSkuCard
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsSkuCard)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsSkuCard(goodsSkuCard *domain.GoodsSkuCard) (domain.GoodsSkuCard, error) {
+	_, err := configs.Engine.Insert(&goodsSkuCard)
+	if err != nil {
+		return *goodsSkuCard, err
+	}
+	return *goodsSkuCard, nil
+}
+
+func SetGoodsSkuCard(goodsSkuCardMap map[string]interface{}, id int) (domain.GoodsSkuCard, bool, error) {
+	var goodsSkuCard domain.GoodsSkuCard
+	_, err := configs.Engine.Table("goods_sku_card").Where("id = ?", id).Update(goodsSkuCardMap)
+	if err != nil {
+		return goodsSkuCard, false, err
+	}
+	return goodsSkuCard, true, nil
+}
+
+func DeleteGoodsSkuCard(goodsSkuCard domain.GoodsSkuCard) bool {
+	i, err := configs.Engine.Where("id = ?", goodsSkuCard.Id).Delete(&goodsSkuCard)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsSkuDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsSku(id int) (domain.GoodsSku, error) {
+	var goodsSku domain.GoodsSku
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsSku)
+	if err != nil {
+		return goodsSku, err
+	}
+	return goodsSku, nil
+}
+
+func GetInIdListGoodsSku(ids []int) ([]domain.GoodsSku, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsSku{})
+	if err != nil {
+		return make([]domain.GoodsSku, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsSku
+	for rows.Next() {
+		var u domain.GoodsSku
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsSku(goodsSku domain.GoodsSku, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsSku)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsSku
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsSku)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsSku(goodsSku *domain.GoodsSku) (domain.GoodsSku, error) {
+	_, err := configs.Engine.Insert(&goodsSku)
+	if err != nil {
+		return *goodsSku, err
+	}
+	return *goodsSku, nil
+}
+
+func SetGoodsSku(goodsSkuMap map[string]interface{}, id int) (domain.GoodsSku, bool, error) {
+	var goodsSku domain.GoodsSku
+	_, err := configs.Engine.Table("goods_sku").Where("id = ?", id).Update(goodsSkuMap)
+	if err != nil {
+		return goodsSku, false, err
+	}
+	return goodsSku, true, nil
+}
+
+func DeleteGoodsSku(goodsSku domain.GoodsSku) bool {
+	i, err := configs.Engine.Where("id = ?", goodsSku.Id).Delete(&goodsSku)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsTagDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsTag(id int) (domain.GoodsTag, error) {
+	var goodsTag domain.GoodsTag
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsTag)
+	if err != nil {
+		return goodsTag, err
+	}
+	return goodsTag, nil
+}
+
+func GetInIdListGoodsTag(ids []int) ([]domain.GoodsTag, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsTag{})
+	if err != nil {
+		return make([]domain.GoodsTag, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsTag
+	for rows.Next() {
+		var u domain.GoodsTag
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsTag(goodsTag domain.GoodsTag, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsTag)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsTag
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsTag)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsTag(goodsTag *domain.GoodsTag) (domain.GoodsTag, error) {
+	_, err := configs.Engine.Insert(&goodsTag)
+	if err != nil {
+		return *goodsTag, err
+	}
+	return *goodsTag, nil
+}
+
+func SetGoodsTag(goodsTagMap map[string]interface{}, id int) (domain.GoodsTag, bool, error) {
+	var goodsTag domain.GoodsTag
+	_, err := configs.Engine.Table("goods_tag").Where("id = ?", id).Update(goodsTagMap)
+	if err != nil {
+		return goodsTag, false, err
+	}
+	return goodsTag, true, nil
+}
+
+func DeleteGoodsTag(goodsTag domain.GoodsTag) bool {
+	i, err := configs.Engine.Where("id = ?", goodsTag.Id).Delete(&goodsTag)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsTopicDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsTopic(id int) (domain.GoodsTopic, error) {
+	var goodsTopic domain.GoodsTopic
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsTopic)
+	if err != nil {
+		return goodsTopic, err
+	}
+	return goodsTopic, nil
+}
+
+func GetInIdListGoodsTopic(ids []int) ([]domain.GoodsTopic, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsTopic{})
+	if err != nil {
+		return make([]domain.GoodsTopic, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsTopic
+	for rows.Next() {
+		var u domain.GoodsTopic
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsTopic(goodsTopic domain.GoodsTopic, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsTopic)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsTopic
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsTopic)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsTopic(goodsTopic *domain.GoodsTopic) (domain.GoodsTopic, error) {
+	_, err := configs.Engine.Insert(&goodsTopic)
+	if err != nil {
+		return *goodsTopic, err
+	}
+	return *goodsTopic, nil
+}
+
+func SetGoodsTopic(goodsTopicMap map[string]interface{}, id int) (domain.GoodsTopic, bool, error) {
+	var goodsTopic domain.GoodsTopic
+	_, err := configs.Engine.Table("goods_topic").Where("id = ?", id).Update(goodsTopicMap)
+	if err != nil {
+		return goodsTopic, false, err
+	}
+	return goodsTopic, true, nil
+}
+
+func DeleteGoodsTopic(goodsTopic domain.GoodsTopic) bool {
+	i, err := configs.Engine.Where("id = ?", goodsTopic.Id).Delete(&goodsTopic)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/GoodsTypeDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdGoodsType(id int) (domain.GoodsType, error) {
+	var goodsType domain.GoodsType
+	_, err := configs.Engine.Where("id = ?", id).Get(&goodsType)
+	if err != nil {
+		return goodsType, err
+	}
+	return goodsType, nil
+}
+
+func GetInIdListGoodsType(ids []int) ([]domain.GoodsType, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.GoodsType{})
+	if err != nil {
+		return make([]domain.GoodsType, 0), err
+	}
+	defer rows.Close()
+	var list []domain.GoodsType
+	for rows.Next() {
+		var u domain.GoodsType
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListGoodsType(goodsType domain.GoodsType, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&goodsType)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.GoodsType
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&goodsType)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveGoodsType(goodsType *domain.GoodsType) (domain.GoodsType, error) {
+	_, err := configs.Engine.Insert(&goodsType)
+	if err != nil {
+		return *goodsType, err
+	}
+	return *goodsType, nil
+}
+
+func SetGoodsType(goodsTypeMap map[string]interface{}, id int) (domain.GoodsType, bool, error) {
+	var goodsType domain.GoodsType
+	_, err := configs.Engine.Table("goods_type").Where("id = ?", id).Update(goodsTypeMap)
+	if err != nil {
+		return goodsType, false, err
+	}
+	return goodsType, true, nil
+}
+
+func DeleteGoodsType(goodsType domain.GoodsType) bool {
+	i, err := configs.Engine.Where("id = ?", goodsType.Id).Delete(&goodsType)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/ManageUserDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdManageUser(id int) (domain.ManageUser, error) {
+	var manageUser domain.ManageUser
+	_, err := configs.Engine.Where("id = ?", id).Get(&manageUser)
+	if err != nil {
+		return manageUser, err
+	}
+	return manageUser, nil
+}
+
+func GetInIdListManageUser(ids []int) ([]domain.ManageUser, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.ManageUser{})
+	if err != nil {
+		return make([]domain.ManageUser, 0), err
+	}
+	defer rows.Close()
+	var list []domain.ManageUser
+	for rows.Next() {
+		var u domain.ManageUser
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListManageUser(manageUser domain.ManageUser, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&manageUser)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.ManageUser
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&manageUser)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveManageUser(manageUser *domain.ManageUser) (domain.ManageUser, error) {
+	_, err := configs.Engine.Insert(&manageUser)
+	if err != nil {
+		return *manageUser, err
+	}
+	return *manageUser, nil
+}
+
+func SetManageUser(manageUserMap map[string]interface{}, id int) (domain.ManageUser, bool, error) {
+	var manageUser domain.ManageUser
+	_, err := configs.Engine.Table("manage_user").Where("id = ?", id).Update(manageUserMap)
+	if err != nil {
+		return manageUser, false, err
+	}
+	return manageUser, true, nil
+}
+
+func DeleteManageUser(manageUser domain.ManageUser) bool {
+	i, err := configs.Engine.Where("id = ?", manageUser.Id).Delete(&manageUser)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 58 - 0
data/dao/manage/RoleAuthorityDao.go

@@ -0,0 +1,58 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetInIdListRoleAuthority(ids []int) ([]domain.RoleAuthority, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.RoleAuthority{})
+	if err != nil {
+		return make([]domain.RoleAuthority, 0), err
+	}
+	defer rows.Close()
+	var list []domain.RoleAuthority
+	for rows.Next() {
+		var u domain.RoleAuthority
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListRoleAuthority(roleAuthority domain.RoleAuthority, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&roleAuthority)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.RoleAuthority
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&roleAuthority)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveRoleAuthority(roleAuthority *domain.RoleAuthority) (domain.RoleAuthority, error) {
+	_, err := configs.Engine.Insert(&roleAuthority)
+	if err != nil {
+		return *roleAuthority, err
+	}
+	return *roleAuthority, nil
+}
+
+func SetRoleAuthority(roleAuthorityMap map[string]interface{}, id int) (domain.RoleAuthority, bool, error) {
+	var roleAuthority domain.RoleAuthority
+	_, err := configs.Engine.Table("role_authority").Where("authority_id = ?", id).Update(roleAuthorityMap)
+	if err != nil {
+		return roleAuthority, false, err
+	}
+	return roleAuthority, true, nil
+}

+ 75 - 0
data/dao/manage/RoleDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdRole(id int) (domain.Role, error) {
+	var role domain.Role
+	_, err := configs.Engine.Where("id = ?", id).Get(&role)
+	if err != nil {
+		return role, err
+	}
+	return role, nil
+}
+
+func GetInIdListRole(ids []int) ([]domain.Role, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.Role{})
+	if err != nil {
+		return make([]domain.Role, 0), err
+	}
+	defer rows.Close()
+	var list []domain.Role
+	for rows.Next() {
+		var u domain.Role
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListRole(role domain.Role, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&role)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.Role
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&role)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveRole(role *domain.Role) (domain.Role, error) {
+	_, err := configs.Engine.Insert(&role)
+	if err != nil {
+		return *role, err
+	}
+	return *role, nil
+}
+
+func SetRole(roleMap map[string]interface{}, id int) (domain.Role, bool, error) {
+	var role domain.Role
+	_, err := configs.Engine.Table("role").Where("id = ?", id).Update(roleMap)
+	if err != nil {
+		return role, false, err
+	}
+	return role, true, nil
+}
+
+func DeleteRole(role domain.Role) bool {
+	i, err := configs.Engine.Where("id = ?", role.Id).Delete(&role)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/UserDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdUser(id int) (domain.User, error) {
+	var user domain.User
+	_, err := configs.Engine.Where("id = ?", id).Get(&user)
+	if err != nil {
+		return user, err
+	}
+	return user, nil
+}
+
+func GetInIdListUser(ids []int) ([]domain.User, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.User{})
+	if err != nil {
+		return make([]domain.User, 0), err
+	}
+	defer rows.Close()
+	var list []domain.User
+	for rows.Next() {
+		var u domain.User
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListUser(user domain.User, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&user)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.User
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&user)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveUser(user *domain.User) (domain.User, error) {
+	_, err := configs.Engine.Insert(&user)
+	if err != nil {
+		return *user, err
+	}
+	return *user, nil
+}
+
+func SetUser(userMap map[string]interface{}, id int) (domain.User, bool, error) {
+	var user domain.User
+	_, err := configs.Engine.Table("user").Where("id = ?", id).Update(userMap)
+	if err != nil {
+		return user, false, err
+	}
+	return user, true, nil
+}
+
+func DeleteUser(user domain.User) bool {
+	i, err := configs.Engine.Where("id = ?", user.Id).Delete(&user)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 75 - 0
data/dao/manage/UserWalletDao.go

@@ -0,0 +1,75 @@
+package manage
+
+import (
+	"demo/configs"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+)
+
+func GetByIdUserWallet(id int) (domain.UserWallet, error) {
+	var userWallet domain.UserWallet
+	_, err := configs.Engine.Where("id = ?", id).Get(&userWallet)
+	if err != nil {
+		return userWallet, err
+	}
+	return userWallet, nil
+}
+
+func GetInIdListUserWallet(ids []int) ([]domain.UserWallet, error) {
+	rows, err := configs.Engine.In("id", ids).Rows(&domain.UserWallet{})
+	if err != nil {
+		return make([]domain.UserWallet, 0), err
+	}
+	defer rows.Close()
+	var list []domain.UserWallet
+	for rows.Next() {
+		var u domain.UserWallet
+		list = append(list, u)
+	}
+	return list, nil
+}
+
+func GetListUserWallet(userWallet domain.UserWallet, pageNum, pageSize int) (vo.BaseListVo, error) {
+	rows, err := configs.Engine.Limit(pageSize, (pageNum-1)*pageSize).Desc("id").Rows(&userWallet)
+	var vo vo.BaseListVo
+	if err != nil {
+		return vo, err
+	}
+	vo.PageNum = pageNum
+	vo.PageSize = pageSize
+	vo.List = make([]any, 0)
+	for rows.Next() {
+		var u domain.UserWallet
+		rows.Scan(&u)
+		vo.List = append(vo.List, u)
+	}
+	//查询数量
+	count, err := configs.Engine.Count(&userWallet)
+	vo.Total = int(count)
+	return vo, nil
+}
+
+func SaveUserWallet(userWallet *domain.UserWallet) (domain.UserWallet, error) {
+	_, err := configs.Engine.Insert(&userWallet)
+	if err != nil {
+		return *userWallet, err
+	}
+	return *userWallet, nil
+}
+
+func SetUserWallet(userWalletMap map[string]interface{}, id int) (domain.UserWallet, bool, error) {
+	var userWallet domain.UserWallet
+	_, err := configs.Engine.Table("user_wallet").Where("id = ?", id).Update(userWalletMap)
+	if err != nil {
+		return userWallet, false, err
+	}
+	return userWallet, true, nil
+}
+
+func DeleteUserWallet(userWallet domain.UserWallet) bool {
+	i, err := configs.Engine.Where("id = ?", userWallet.Id).Delete(&userWallet)
+	if err != nil {
+		return false
+	}
+	return i > 0
+}

+ 303 - 0
data/domain/DoMain.go

@@ -0,0 +1,303 @@
+package domain
+
+import (
+    "fmt"
+    "time"
+)
+
+//Article 
+type Article struct {
+    Id int `json:"id"`// 11 0 注释:id
+    ArticleTitle string `xorm:"article_title"  json:"articleTitle"`// 255 0 注释:文章名称
+    ArticeContent string `xorm:"artice_content"  json:"articeContent"`// 0 0 注释:文章内容
+    State string `xorm:"state"  json:"state"`// 255 0 注释:状态
+    ArticeTagIds string `xorm:"artice_tag_ids"  json:"articeTagIds"`// 255 0 注释:文章标签
+    ArticeTopicId int `xorm:"artice_topic_id"  json:"articeTopicId"`// 11 0 注释:文章主题id
+    Image string `xorm:"image"  json:"image"`// 255 0 注释:图片
+    PublishTime time.Time `xorm:"publish_time"  json:"publishTime"`// 0 0 注释:发表时间
+    EyeFill int `xorm:"eye_fill"  json:"eyeFill"`// 11 0 注释:浏览量
+    LikeCount int `xorm:"like_count"  json:"likeCount"`// 255 0 注释:点赞量
+    CreateBy string `xorm:"create_by"  json:"createBy"`// 255 0 注释:创建人
+    CreateTime time.Time `xorm:"create_time"  json:"createTime"`// 0 0 注释:创建时间
+    UpdateBy string `xorm:"update_by"  json:"updateBy"`// 255 0 注释:更新人
+    UpdateTime time.Time `xorm:"update_time"  json:"updateTime"`// 0 0 注释:更新时间
+}
+
+func (receiver Article) String() string {
+    return fmt.Sprint("Article{Id:", receiver.Id, ",ArticleTitle:", receiver.ArticleTitle, ",ArticeContent:", receiver.ArticeContent, ",State:", receiver.State, ",ArticeTagIds:", receiver.ArticeTagIds, ",ArticeTopicId:", receiver.ArticeTopicId, ",Image:", receiver.Image, ",PublishTime:", receiver.PublishTime, ",EyeFill:", receiver.EyeFill, ",LikeCount:", receiver.LikeCount, ",CreateBy:", receiver.CreateBy, ",CreateTime:", receiver.CreateTime, ",UpdateBy:", receiver.UpdateBy, ",UpdateTime:", receiver.UpdateTime, "}")
+}
+
+//ArticleTag 
+type ArticleTag struct {
+    Id int `json:"id"`// 11 0 注释:
+    TagName string `xorm:"tag_name"  json:"tagName"`// 255 0 注释:标签名
+    TagDesc string `xorm:"tag_desc"  json:"tagDesc"`// 255 0 注释:标签描述
+}
+
+func (receiver ArticleTag) String() string {
+    return fmt.Sprint("ArticleTag{Id:", receiver.Id, ",TagName:", receiver.TagName, ",TagDesc:", receiver.TagDesc, "}")
+}
+
+//ArticleTopic 
+type ArticleTopic struct {
+    Id int `json:"id"`// 11 0 注释:
+    Image string `xorm:"image"  json:"image"`// 255 0 注释:图片
+    TopicName string `xorm:"topic_name"  json:"topicName"`// 255 0 注释:主题名称
+    TopicDesc string `xorm:"topic_desc"  json:"topicDesc"`// 255 0 注释:主题描述
+}
+
+func (receiver ArticleTopic) String() string {
+    return fmt.Sprint("ArticleTopic{Id:", receiver.Id, ",Image:", receiver.Image, ",TopicName:", receiver.TopicName, ",TopicDesc:", receiver.TopicDesc, "}")
+}
+
+//Authority 
+type Authority struct {
+    Id int `json:"id"`// 11 0 注释:
+    AuthorityName string `xorm:"authority_name"  json:"authorityName"`// 255 0 注释:
+    AuthorityPath string `xorm:"authority_path"  json:"authorityPath"`// 255 0 注释:
+}
+
+func (receiver Authority) String() string {
+    return fmt.Sprint("Authority{Id:", receiver.Id, ",AuthorityName:", receiver.AuthorityName, ",AuthorityPath:", receiver.AuthorityPath, "}")
+}
+
+//Goods 
+type Goods struct {
+    Id int `json:"id"`// 11 0 注释:id
+    TypeId int `xorm:"type_id"  json:"typeId"`// 11 0 注释:分类id
+    GoodsName string `xorm:"goods_name"  json:"goodsName"`// 255 0 注释:商品名字
+    IntroductionId int `xorm:"introduction_id"  json:"introductionId"`// 11 0 注释:商品介绍id
+    SalesVolume int `xorm:"sales_volume"  json:"salesVolume"`// 255 0 注释:近30天销量
+    TagIds string `xorm:"tag_ids"  json:"tagIds"`// 255 0 注释:商品标签
+}
+
+func (receiver Goods) String() string {
+    return fmt.Sprint("Goods{Id:", receiver.Id, ",TypeId:", receiver.TypeId, ",GoodsName:", receiver.GoodsName, ",IntroductionId:", receiver.IntroductionId, ",SalesVolume:", receiver.SalesVolume, ",TagIds:", receiver.TagIds, "}")
+}
+
+//GoodsCommodityArea 
+type GoodsCommodityArea struct {
+    Id int `json:"id"`// 11 0 注释:id
+    GoodsId int `xorm:"goods_id"  json:"goodsId"`// 11 0 注释:商品id
+    CommodityAreaName string `xorm:"commodity_area_name"  json:"commodityAreaName"`// 255 0 注释:商品属地名称
+    DetailImage string `xorm:"detail_image"  json:"detailImage"`// 255 0 注释:详情图片
+    DetailIntroductionId int `xorm:"detail_introduction_id"  json:"detailIntroductionId"`// 11 0 注释:相关文本详情id
+}
+
+func (receiver GoodsCommodityArea) String() string {
+    return fmt.Sprint("GoodsCommodityArea{Id:", receiver.Id, ",GoodsId:", receiver.GoodsId, ",CommodityAreaName:", receiver.CommodityAreaName, ",DetailImage:", receiver.DetailImage, ",DetailIntroductionId:", receiver.DetailIntroductionId, "}")
+}
+
+//GoodsCoupon 优惠券
+type GoodsCoupon struct {
+    Id int `json:"id"`// 11 0 注释:id
+    CouponName string `xorm:"coupon_name"  json:"couponName"`// 255 0 注释:优惠券名称
+    CouponDesc string `xorm:"coupon_desc"  json:"couponDesc"`// 255 0 注释:优惠券描述
+    CashBackPoint float64 `xorm:"cash_back_point"  json:"cashBackPoint"`// 11 0 注释:满x
+    CashBackPrice float64 `xorm:"cash_back_price"  json:"cashBackPrice"`// 10 2 注释:减x
+    ConditionByTopic string `xorm:"condition_by_topic"  json:"conditionByTopic"`// 255 0 注释:主题可用,id
+    ConditionByType string `xorm:"condition_by_type"  json:"conditionByType"`// 255 0 注释:类型可用,id
+    ConditionByGoods string `xorm:"condition_by_goods"  json:"conditionByGoods"`// 255 0 注释:商品可用,id
+    Count int `xorm:"count"  json:"count"`// 255 0 注释:优惠券数量
+    ReceiveType string `xorm:"receive_type"  json:"receiveType"`// 255 0 注释:领取条件
+    Validity string `xorm:"validity"  json:"validity"`// 255 0 注释:有效性,领取开始计时(ClaimTiming),固定时间(FixedTime)
+    ValidityPeriod time.Time `xorm:"validity_period"  json:"validityPeriod"`// 0 0 注释:有效期
+}
+
+func (receiver GoodsCoupon) String() string {
+    return fmt.Sprint("GoodsCoupon{Id:", receiver.Id, ",CouponName:", receiver.CouponName, ",CouponDesc:", receiver.CouponDesc, ",CashBackPoint:", receiver.CashBackPoint, ",CashBackPrice:", receiver.CashBackPrice, ",ConditionByTopic:", receiver.ConditionByTopic, ",ConditionByType:", receiver.ConditionByType, ",ConditionByGoods:", receiver.ConditionByGoods, ",Count:", receiver.Count, ",ReceiveType:", receiver.ReceiveType, ",Validity:", receiver.Validity, ",ValidityPeriod:", receiver.ValidityPeriod, "}")
+}
+
+//GoodsCouponUser 优惠券领取
+type GoodsCouponUser struct {
+    Id int `json:"id"`// 11 0 注释:id
+    UserId int `xorm:"user_id"  json:"userId"`// 11 0 注释:用户id
+    CouponId int `xorm:"coupon_id"  json:"couponId"`// 11 0 注释:优惠券id
+    CollectionTime time.Time `xorm:"collection_time"  json:"collectionTime"`// 0 0 注释:领取时间
+    State string `xorm:"state"  json:"state"`// 255 0 注释:状态,已使用2,未使用1,已过期0
+}
+
+func (receiver GoodsCouponUser) String() string {
+    return fmt.Sprint("GoodsCouponUser{Id:", receiver.Id, ",UserId:", receiver.UserId, ",CouponId:", receiver.CouponId, ",CollectionTime:", receiver.CollectionTime, ",State:", receiver.State, "}")
+}
+
+//GoodsIntroduction 商品介绍
+type GoodsIntroduction struct {
+    Id int `json:"id"`// 11 0 注释:文章id
+    GoodsArticleName string `xorm:"goods_article_name"  json:"goodsArticleName"`// 255 0 注释:商品文章名
+    GoodsArticle string `xorm:"goods_article"  json:"goodsArticle"`// 0 0 注释:商品文章
+    CreateBy string `xorm:"create_by"  json:"createBy"`// 0 0 注释:创建人
+    CreateTime time.Time `xorm:"create_time"  json:"createTime"`// 0 0 注释:创建时间
+    UpdateBy string `xorm:"update_by"  json:"updateBy"`// 255 0 注释:更新人
+    UpdateTime time.Time `xorm:"update_time"  json:"updateTime"`// 0 0 注释:更新时间
+}
+
+func (receiver GoodsIntroduction) String() string {
+    return fmt.Sprint("GoodsIntroduction{Id:", receiver.Id, ",GoodsArticleName:", receiver.GoodsArticleName, ",GoodsArticle:", receiver.GoodsArticle, ",CreateBy:", receiver.CreateBy, ",CreateTime:", receiver.CreateTime, ",UpdateBy:", receiver.UpdateBy, ",UpdateTime:", receiver.UpdateTime, "}")
+}
+
+//GoodsOrder 
+type GoodsOrder struct {
+    Id int `json:"id"`// 11 0 注释:id
+    OrderName string `xorm:"order_name"  json:"orderName"`// 255 0 注释:订单名
+    SkuId int `xorm:"sku_id"  json:"skuId"`// 11 0 注释:skuid
+    Count int `xorm:"count"  json:"count"`// 11 0 注释:购买数量
+    Price float64 `xorm:"price"  json:"price"`// 10 2 注释:单价
+    TotalPrice float64 `xorm:"total_price"  json:"totalPrice"`// 10 2 注释:总价
+    ContactInformation string `xorm:"contact_information"  json:"contactInformation"`// 255 0 注释:联系方式
+    CouponUserId int `xorm:"coupon_user_id"  json:"couponUserId"`// 11 0 注释:使用的优惠券
+    State string `xorm:"state"  json:"state"`// 10 0 注释:支付状态,0未支付,1已支付,2关闭订单,3订单异常
+    CreateBy int `xorm:"create_by"  json:"createBy"`// 255 0 注释:用户id
+    CreateTime time.Time `xorm:"create_time"  json:"createTime"`// 0 0 注释:订单创建时间
+}
+
+func (receiver GoodsOrder) String() string {
+    return fmt.Sprint("GoodsOrder{Id:", receiver.Id, ",OrderName:", receiver.OrderName, ",SkuId:", receiver.SkuId, ",Count:", receiver.Count, ",Price:", receiver.Price, ",TotalPrice:", receiver.TotalPrice, ",ContactInformation:", receiver.ContactInformation, ",CouponUserId:", receiver.CouponUserId, ",State:", receiver.State, ",CreateBy:", receiver.CreateBy, ",CreateTime:", receiver.CreateTime, "}")
+}
+
+//GoodsSku 
+type GoodsSku struct {
+    Id int `json:"id"`// 11 0 注释:
+    SkuImage string `xorm:"sku_image"  json:"skuImage"`// 255 0 注释:sku图片
+    SkuName string `xorm:"sku_name"  json:"skuName"`// 255 0 注释:商品sku名字
+    Price float64 `xorm:"price"  json:"price"`// 10 2 注释:现在价格
+    HistoricalPrices float64 `xorm:"historical_prices"  json:"historicalPrices"`// 10 2 注释:历史价格
+    InventoryNumber int `xorm:"inventory_number"  json:"inventoryNumber"`// 11 0 注释:库存
+    CommodityAreaId int `xorm:"commodity_area_id"  json:"commodityAreaId"`// 11 0 注释:属地id
+    GoodsId int `xorm:"goods_id"  json:"goodsId"`// 11 0 注释:商品id
+    CreateBy string `xorm:"create_by"  json:"createBy"`// 255 0 注释:创建人
+    CreateTime time.Time `xorm:"create_time"  json:"createTime"`// 0 0 注释:创建时间
+}
+
+func (receiver GoodsSku) String() string {
+    return fmt.Sprint("GoodsSku{Id:", receiver.Id, ",SkuImage:", receiver.SkuImage, ",SkuName:", receiver.SkuName, ",Price:", receiver.Price, ",HistoricalPrices:", receiver.HistoricalPrices, ",InventoryNumber:", receiver.InventoryNumber, ",CommodityAreaId:", receiver.CommodityAreaId, ",GoodsId:", receiver.GoodsId, ",CreateBy:", receiver.CreateBy, ",CreateTime:", receiver.CreateTime, "}")
+}
+
+//GoodsSkuCard 
+type GoodsSkuCard struct {
+    Id int `json:"id"`// 11 0 注释:id
+    CardName string `xorm:"card_name"  json:"cardName"`// 255 0 注释:卡种名称
+    State string `xorm:"state"  json:"state"`// 255 0 注释:状态,0未使用,1已用,2过期
+    Count int `xorm:"count"  json:"count"`// 11 0 注释:库存
+    TotalCount string `xorm:"total_count"  json:"totalCount"`// 255 0 注释:总数
+    CardKey string `xorm:"card_key"  json:"cardKey"`// 255 0 注释:卡密
+    Use string `xorm:"use"  json:"use"`// 5 0 注释:是否已用
+    UploadTime time.Time `xorm:"upload_time"  json:"uploadTime"`// 0 0 注释:入库时间
+    SkuId int `xorm:"sku_id"  json:"skuId"`// 11 0 注释:商品规格绑定
+    Sort string `xorm:"sort"  json:"sort"`// 255 0 注释:排序,出售优先级
+}
+
+func (receiver GoodsSkuCard) String() string {
+    return fmt.Sprint("GoodsSkuCard{Id:", receiver.Id, ",CardName:", receiver.CardName, ",State:", receiver.State, ",Count:", receiver.Count, ",TotalCount:", receiver.TotalCount, ",CardKey:", receiver.CardKey, ",Use:", receiver.Use, ",UploadTime:", receiver.UploadTime, ",SkuId:", receiver.SkuId, ",Sort:", receiver.Sort, "}")
+}
+
+//GoodsTag 
+type GoodsTag struct {
+    Id int `json:"id"`// 11 0 注释:id
+    Name string `xorm:"name"  json:"name"`// 255 0 注释:名字
+    IconUrl string `xorm:"icon_url"  json:"iconUrl"`// 255 0 注释:图标路径
+    Tag string `xorm:"tag"  json:"tag"`// 255 0 注释:标签
+}
+
+func (receiver GoodsTag) String() string {
+    return fmt.Sprint("GoodsTag{Id:", receiver.Id, ",Name:", receiver.Name, ",IconUrl:", receiver.IconUrl, ",Tag:", receiver.Tag, "}")
+}
+
+//GoodsTopic 
+type GoodsTopic struct {
+    Id int `json:"id"`// 11 0 注释:
+    TopicPageImage string `xorm:"topic_page_image"  json:"topicPageImage"`// 255 0 注释:主题首页图片
+    TopicName string `xorm:"topic_name"  json:"topicName"`// 255 0 注释:主题名称
+    TopicDesc string `xorm:"topic_desc"  json:"topicDesc"`// 255 0 注释:主题描述
+    TypeIds string `xorm:"type_ids"  json:"typeIds"`// 255 0 注释:商品类型id
+}
+
+func (receiver GoodsTopic) String() string {
+    return fmt.Sprint("GoodsTopic{Id:", receiver.Id, ",TopicPageImage:", receiver.TopicPageImage, ",TopicName:", receiver.TopicName, ",TopicDesc:", receiver.TopicDesc, ",TypeIds:", receiver.TypeIds, "}")
+}
+
+//GoodsType 商品分类
+type GoodsType struct {
+    Id int `json:"id"`// 11 0 注释:
+    Sort int `xorm:"sort"  json:"sort"`// 11 0 注释:排序
+    TypeImage string `xorm:"type_image"  json:"typeImage"`// 50 0 注释:类型图片
+    TypeName string `xorm:"type_name"  json:"typeName"`// 255 0 注释:商品类别名称
+    CreateTime time.Time `xorm:"create_time"  json:"createTime"`// 0 0 注释:创建时间
+}
+
+func (receiver GoodsType) String() string {
+    return fmt.Sprint("GoodsType{Id:", receiver.Id, ",Sort:", receiver.Sort, ",TypeImage:", receiver.TypeImage, ",TypeName:", receiver.TypeName, ",CreateTime:", receiver.CreateTime, "}")
+}
+
+//ManageUser 
+type ManageUser struct {
+    Id int `json:"id"`// 11 0 注释:
+    Name string `xorm:"name"  json:"name"`// 255 0 注释:名称
+    Username string `xorm:"username"  json:"username"`// 255 0 注释:账号
+    Password string `xorm:"password"  json:"password"`// 255 0 注释:密码
+    CreationTime int `xorm:"creation_time"  json:"creationTime"`// 11 0 注释:账号创建时间
+    LoginTime int `xorm:"login_time"  json:"loginTime"`// 11 0 注释:登录时间
+    Status string `xorm:"status"  json:"status"`// 255 0 注释:账号状态
+    RoleId int `xorm:"role_id"  json:"roleId"`// 11 0 注释:角色id
+    Phone string `xorm:"phone"  json:"phone"`// 255 0 注释:手机
+    Email string `xorm:"email"  json:"email"`// 255 0 注释:邮箱
+    Avatar string `xorm:"avatar"  json:"avatar"`// 255 0 注释:头像
+}
+
+func (receiver ManageUser) String() string {
+    return fmt.Sprint("ManageUser{Id:", receiver.Id, ",Name:", receiver.Name, ",Username:", receiver.Username, ",Password:", receiver.Password, ",CreationTime:", receiver.CreationTime, ",LoginTime:", receiver.LoginTime, ",Status:", receiver.Status, ",RoleId:", receiver.RoleId, ",Phone:", receiver.Phone, ",Email:", receiver.Email, ",Avatar:", receiver.Avatar, "}")
+}
+
+//Role 
+type Role struct {
+    Id int `json:"id"`// 11 0 注释:
+    RoleName string `xorm:"role_name"  json:"roleName"`// 255 0 注释:
+}
+
+func (receiver Role) String() string {
+    return fmt.Sprint("Role{Id:", receiver.Id, ",RoleName:", receiver.RoleName, "}")
+}
+
+//RoleAuthority 
+type RoleAuthority struct {
+    AuthorityId int `xorm:"authority_id"  json:"authorityId"`// 11 0 注释:
+    RoleId int `xorm:"role_id"  json:"roleId"`// 11 0 注释:
+}
+
+func (receiver RoleAuthority) String() string {
+    return fmt.Sprint("RoleAuthority{AuthorityId:", receiver.AuthorityId, ",RoleId:", receiver.RoleId, "}")
+}
+
+//User 
+type User struct {
+    Id int `json:"id"`// 11 0 注释:
+    Username string `xorm:"username"  json:"username"`// 255 0 注释:账号
+    Password string `xorm:"password"  json:"password"`// 255 0 注释:密码
+    CreationTime int `xorm:"creation_time"  json:"creationTime"`// 11 0 注释:账号创建时间
+    LoginTime int `xorm:"login_time"  json:"loginTime"`// 11 0 注释:登录时间
+    Status string `xorm:"status"  json:"status"`// 255 0 注释:账号状态
+    RoleId int `xorm:"role_id"  json:"roleId"`// 11 0 注释:角色id
+    Phone string `xorm:"phone"  json:"phone"`// 255 0 注释:手机
+    Email string `xorm:"email"  json:"email"`// 255 0 注释:邮箱
+    Name string `xorm:"name"  json:"name"`// 255 0 注释:用户名
+    Avatar string `xorm:"avatar"  json:"avatar"`// 255 0 注释:头像
+    RecommendCode string `xorm:"recommend_code"  json:"recommendCode"`// 255 0 注释:推荐码
+}
+
+func (receiver User) String() string {
+    return fmt.Sprint("User{Id:", receiver.Id, ",Username:", receiver.Username, ",Password:", receiver.Password, ",CreationTime:", receiver.CreationTime, ",LoginTime:", receiver.LoginTime, ",Status:", receiver.Status, ",RoleId:", receiver.RoleId, ",Phone:", receiver.Phone, ",Email:", receiver.Email, ",Name:", receiver.Name, ",Avatar:", receiver.Avatar, ",RecommendCode:", receiver.RecommendCode, "}")
+}
+
+//UserWallet 
+type UserWallet struct {
+    Id int `json:"id"`// 11 0 注释:id
+    UserId int `xorm:"user_id"  json:"userId"`// 11 0 注释:用户id
+    Balance float64 `xorm:"balance"  json:"balance"`// 65 0 注释:余额
+    PromotionAmount float64 `xorm:"promotion_amount"  json:"promotionAmount"`// 20 2 注释:推广获取总金额
+    RechargeAmount float64 `xorm:"recharge_amount"  json:"rechargeAmount"`// 20 2 注释:充值金额
+}
+
+func (receiver UserWallet) String() string {
+    return fmt.Sprint("UserWallet{Id:", receiver.Id, ",UserId:", receiver.UserId, ",Balance:", receiver.Balance, ",PromotionAmount:", receiver.PromotionAmount, ",RechargeAmount:", receiver.RechargeAmount, "}")
+}
+

+ 0 - 20
data/domain/Goods.go

@@ -1,20 +0,0 @@
-package domain
-
-type Goods struct {
-	Id            int64   `xorm:"id" json:"id"`
-	CategoryId    int64   `xorm:"category_id" json:"category_id"`
-	GoodsName     string  `xorm:"goods_name" json:"goods_name"`
-	GoodsDescribe string  `xorm:"goods_describe" json:"goods_describe"`
-	AttributeList string  `xorm:"attribute_list" json:"attribute_list"`
-	GoodsDetails  string  `xorm:"goods_details" json:"goods_details"`
-	GoodsPrice    float32 `xorm:"goods_price" json:"goods_price"`
-	GoodsCount    int32   `xorm:"goods_count" json:"goods_count"`
-}
-
-func (receiver Goods) GetTableName() string {
-	return "goods"
-}
-
-func GetGoodsTableName() string {
-	return "goods"
-}

+ 0 - 16
data/domain/GoodsAttributeKey.go

@@ -1,16 +0,0 @@
-package domain
-
-type GoodsAttributeKey struct {
-	Id            int64  `xorm:"id" json:"id"`
-	CategoryId    int64  `xorm:"category_id" json:"category_id"`
-	AttributeName string `xorm:"attribute_name" json:"attribute_name"`
-	CreateBy      string `xorm:"create_by" json:"create_by"`
-	CreateTime    int    `xorm:"create_time" json:"create_time"`
-}
-
-func (GoodsAttributeKey) TableName() string {
-	return "goods_attribute_key"
-}
-func GetGoodsAttributeTableName() string {
-	return "goods_attribute_key"
-}

+ 0 - 16
data/domain/GoodsAttributeValue.go

@@ -1,16 +0,0 @@
-package domain
-
-type GoodsAttributeValue struct {
-	Id             int64  `xorm:"id" json:"id"`
-	AttributeId    int64  `xorm:"attribute_id" json:"attribute_id"`
-	AttributeValue string `xorm:"attribute_value" json:"attribute_value"`
-	CreateBy       string `xorm:"create_by" json:"create_by"`
-	CreateTime     int    `xorm:"create_time" json:"create_time"`
-}
-
-func (GoodsAttributeValue) TableName() string {
-	return "goods_attribute_value"
-}
-func GetGoodsAttributeValueTableName() string {
-	return "goods_attribute_value"
-}

+ 0 - 16
data/domain/GoodsCategory.go

@@ -1,16 +0,0 @@
-package domain
-
-type GoodsCategory struct {
-	Id           int64  `xorm:"id" json:"id"`
-	ParentId     int64  `xorm:"parent_id" json:"parent_id"`
-	CategoryName string `xorm:"category_name" json:"category_name"`
-	CreateBy     string `xorm:"create_by" json:"create_by"`
-	CreateTime   int    `xorm:"create_time" json:"create_time"`
-}
-
-func (GoodsCategory) TableName() string {
-	return "goods_category"
-}
-func GetGoodsCategoryTableName() string {
-	return "goods_category"
-}

+ 0 - 17
data/domain/GoodsSpecs.go

@@ -1,17 +0,0 @@
-package domain
-
-type GoosSpecs struct {
-	Id         int64   `xorm:"id" json:"id"`
-	GoodsId    int64   `xorm:"goods_id" json:"goods_id"`
-	GoodsSpecs string  `xorm:"goods_specs" json:"goods_specs"`
-	GoodsStock int32   `xorm:"goods_stock" json:"goods_stock"`
-	GoodsPrice float32 `xorm:"goods_price" json:"goods_price"`
-}
-
-func (GoosSpecs) TableName() string {
-	return "goos_specs"
-}
-
-func GetGoodsSpecsTableName() string {
-	return "goos_specs"
-}

+ 6 - 0
data/domain/JoinDoMain.go

@@ -0,0 +1,6 @@
+package domain
+
+type CouponUserJDM struct {
+	Coupon     GoodsCoupon     `xorm:"extends" json:"goods_coupon"`
+	CouponUser GoodsCouponUser `xorm:"extends" json:"goods_coupon_user"`
+}

+ 0 - 5
data/domain/domain.go

@@ -1,5 +0,0 @@
-package domain
-
-type name interface {
-	GetTableName() string
-}

+ 8 - 0
data/domain/vo/BaseListVo.go

@@ -0,0 +1,8 @@
+package vo
+
+type BaseListVo struct {
+	PageNum  int   `json:"pageNum"`
+	PageSize int   `json:"pageSize"`
+	Total    int   `json:"total"`
+	List     []any `json:"list"`
+}

+ 31 - 0
data/domain/vo/DetailVo.go

@@ -0,0 +1,31 @@
+package vo
+
+import (
+	"demo/data/domain"
+)
+
+type DetailVo struct {
+	DetailGoodsVo         DetailGoodsVo              `json:"goods"`
+	DetailSkuVo           DetailSkuVo                `json:"sku"`
+	DetailCommodityAreaVo DetailCommodityAreaVo      `json:"commodityArea"`
+	Introduction          []domain.GoodsIntroduction `json:"introduction"`     //商品描述
+	RecommendedGoods      []domain.GoodsSku          `json:"recommendedGoods"` //推荐商品
+}
+
+type DetailGoodsVo struct {
+	GoodsId     int               `xorm:"'id'" json:"id"`
+	Name        string            `xorm:"'name'" json:"name"`
+	SalesVolume int               `xorm:"'sales_volume'" json:"sales_volume"`
+	Type        domain.GoodsType  `xorm:"'type'" json:"type"`
+	Tags        []domain.GoodsTag `xorm:"'tags'" json:"tags"`
+}
+
+type DetailSkuVo struct {
+	NowSkuId int               `json:"sku"`     //当前sku
+	SkuList  []domain.GoodsSku `json:"skuList"` //相同区的
+}
+
+type DetailCommodityAreaVo struct {
+	NowCommodityAreaId int                         `json:"commodityArea"`     //当前地区
+	CommodityAreaList  []domain.GoodsCommodityArea `json:"commodityAreaList"` //地区列表
+}

+ 28 - 0
data/domain/vo/IndexData.go

@@ -0,0 +1,28 @@
+package vo
+
+import "demo/data/domain"
+
+type IndexDataVo struct {
+	//广告位标签栏
+	AdviceTopics []domain.GoodsTopic
+	//广告位左侧商品列表
+	AdviceGoodsList struct {
+		Name    string `json:"name"`
+		GoodsId int    `json:"goodsId"`
+	}
+	//广告为商品图片展示位
+	AdviceGoodsShowList struct {
+		Name    string `json:"name"`
+		GoodsId int    `json:"goodsId"`
+		Image   string `json:"image"`
+	}
+	//优惠包列表
+	GiftPackage struct {
+		Name          string  `json:"name"`
+		Text          string  `json:"text"`
+		Price         float32 `json:"price"`
+		OriginalPrice float32 `json:"originalPrice"`
+	}
+	// 主题商品页面展示,及部分商品显示
+	GoodsList []domain.Goods
+}

+ 8 - 0
data/domain/vo/OrderListVo.go

@@ -0,0 +1,8 @@
+package vo
+
+import "demo/data/domain"
+
+type OrderVo struct {
+	Order domain.GoodsOrder `json:"order"`
+	Sku   domain.GoodsSku   `json:"sku"`
+}

+ 12 - 0
data/domain/vo/UserVos.go

@@ -0,0 +1,12 @@
+package vo
+
+import "demo/data/domain"
+
+func userWalletVo() {
+
+}
+
+type UserWalletVo struct {
+	Wallet        domain.UserWallet
+	CouponUserJDM []domain.CouponUserJDM
+}

BIN
file/resources/20240423094145微信图片_20240416170543.jpg


BIN
file/resources/202404231412462.jpg


BIN
file/resources/202404231441402 - 副本.jpg


BIN
file/resources/202404231442072 - 副本.jpg


+ 26 - 0
file/saveSql.bat

@@ -0,0 +1,26 @@
+@ECHO off
+chcp 65001
+echo 启动sql控制脚本
+echo "1| 保存sql   2| 运行sql覆盖数据库"
+
+set /p var="请输入控制指令 :"
+C:
+cd C:\Program Files\MySQL\MySQL Server 5.7\bin\
+SET dbhost=127.0.0.1
+SET dbuser=root
+SET dbpasswd=root
+SET dbName=virtual_mall
+
+echo 当前控制的mysql和数据库是 :[%dbhost%]%dbuser%@%dbpasswd%/%dbName%
+echo "code %var%"
+
+if %var% == 1 (
+echo [%time%] [保存sql]
+mysqldump -h%dbhost% -u%dbuser% -p%dbpasswd% %dbName% > E:\project\kkc\kkc-go\file\virtual_mall.sql
+) else if %var% == 2 (
+echo [%time%] [运行sql]
+mysql -h%dbhost% -u%dbuser% -p%dbpasswd% %dbName% < E:\project\kkc\kkc-go\file\virtual_mall.sql
+) else (
+echo "运行错误 未知代码:%var%"
+)
+@echo on

Різницю між файлами не показано, бо вона завелика
+ 265 - 0
file/virtual_mall.sql


+ 261 - 0
go.sum

@@ -0,0 +1,261 @@
+filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
+filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
+gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a h1:lSA0F4e9A2NcQSqGqTOXqu2aRi/XEQxDCBwM8yJtE6s=
+gitea.com/xorm/sqlfiddle v0.0.0-20180821085327-62ce714f951a/go.mod h1:EXuID2Zs0pAQhH8yz+DNjUbjppKQzKFAn28TMYPB6IU=
+github.com/bytedance/sonic v1.5.0/go.mod h1:ED5hyg4y6t3/9Ku1R6dU/4KyJ48DZ4jPhfY1O2AihPM=
+github.com/bytedance/sonic v1.10.0-rc/go.mod h1:ElCzW+ufi8qKqNW0FY314xriJhyJhuoJ3gFZdAHF7NM=
+github.com/bytedance/sonic v1.11.3 h1:jRN+yEjakWh8aK5FzrciUHG8OFXK+4/KrAX/ysEtHAA=
+github.com/bytedance/sonic v1.11.3/go.mod h1:iZcSUejdk5aukTND/Eu/ivjQuEL0Cu9/rf50Hi0u/g4=
+github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
+github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
+github.com/chenzhuoyu/base64x v0.0.0-20211019084208-fb5309c8db06/go.mod h1:DH46F32mSOjUmXrMHnKwZdA8wcEefY7UVqBKYGjpdQY=
+github.com/chenzhuoyu/base64x v0.0.0-20221115062448-fe3a3abad311/go.mod h1:b583jCggY9gE99b6G5LEC39OIiVsWj+R97kbl5odCEk=
+github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d h1:77cEq6EriyTZ0g/qfRdp61a3Uu/AWrgIq2s0ClJV1g0=
+github.com/chenzhuoyu/base64x v0.0.0-20230717121745-296ad89f973d/go.mod h1:8EPpVsBuRksnlj1mLy4AWzRNQYxauNi62uWcE3to6eA=
+github.com/chenzhuoyu/iasm v0.9.0/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
+github.com/chenzhuoyu/iasm v0.9.1 h1:tUHQJXo3NhBqw6s33wkGn9SP3bvrWLdlVIJ3hQBL7P0=
+github.com/chenzhuoyu/iasm v0.9.1/go.mod h1:Xjy2NpN3h7aUqeqM+woSuuvxmIe6+DDsiNLIrkAmYog=
+github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
+github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM=
+github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
+github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
+github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
+github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
+github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8=
+github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0=
+github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.7.0 h1:8JEhPFa5W2WU7YfeZzPNqzMP6Lwt7L2715Ggo0nosvA=
+github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyTJwOpGvigM=
+github.com/gabriel-vasile/mimetype v1.4.3 h1:in2uUcidCuFcDKtdcBxlR0rJ1+fsokWf+uqxgUFjbI0=
+github.com/gabriel-vasile/mimetype v1.4.3/go.mod h1:d8uq/6HKRL6CGdk+aubisF/M5GcPfT7nKyLpA0lbSSk=
+github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
+github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
+github.com/gin-gonic/gin v1.9.1 h1:4idEAncQnU5cB7BeOkPtxjfCSye0AAm1R0RVIqJ+Jmg=
+github.com/gin-gonic/gin v1.9.1/go.mod h1:hPrL7YrpYKXt5YId3A/Tnip5kqbEAP+KLuI3SUcPTeU=
+github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s=
+github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
+github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA=
+github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY=
+github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY=
+github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91TpwSH2VMlDf28Uj24BCp08ZFTUY=
+github.com/go-playground/validator/v10 v10.19.0 h1:ol+5Fu+cSq9JD7SoSqe04GMI92cbn0+wvQ3bZ8b/AU4=
+github.com/go-playground/validator/v10 v10.19.0/go.mod h1:dbuPbCMFw/DrkbEynArYaCwl3amGuJotoKCe95atGMM=
+github.com/go-redis/redis/v8 v8.11.5 h1:AcZZR7igkdvfVmQTPnu9WE37LRrO/YrBH5zWyjDC0oI=
+github.com/go-redis/redis/v8 v8.11.5/go.mod h1:gREzHqY1hg6oD9ngVRbLStwAWKhA0FEgq8Jd4h5lpwo=
+github.com/go-sql-driver/mysql v1.8.0 h1:UtktXaU2Nb64z/pLiGIxY4431SJ4/dR5cjMmlVHgnT4=
+github.com/go-sql-driver/mysql v1.8.0/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
+github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU=
+github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
+github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
+github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
+github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/uuid v1.4.0 h1:MtMxsa51/r9yyhkyLsVeVt0B+BGQZzpQiTQ4eHZ8bc4=
+github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
+github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
+github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
+github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
+github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
+github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
+github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 h1:Z9n2FFNUXsshfwJMBgNA0RU6/i7WVaAegv3PtuIHPMs=
+github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51/go.mod h1:CzGEWj7cYgsdH8dAjBGEr58BoE7ScuLd+fwFZ44+/x8=
+github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
+github.com/klauspost/cpuid/v2 v2.2.7 h1:ZWSB3igEs+d0qvnxR/ZBzXVmxkgt8DdzP6m9pfuVLDM=
+github.com/klauspost/cpuid/v2 v2.2.7/go.mod h1:Lcz8mBdAVJIBVzewtcLocK12l3Y+JytZYpaMropDUws=
+github.com/knz/go-libedit v1.10.1/go.mod h1:MZTVkCWyz0oBc7JOWP3wNAzd002ZbM/5hgShxwh4x8M=
+github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
+github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
+github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
+github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
+github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
+github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
+github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
+github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
+github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
+github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
+github.com/mattn/go-sqlite3 v1.14.16 h1:yOQRA0RpS5PFz/oikGwBEqvAWhWg5ufRz4ETLjwpU1Y=
+github.com/mattn/go-sqlite3 v1.14.16/go.mod h1:2eHXhiwb8IkHr+BDWZGa96P6+rkvnG63S2DGjv9HUNg=
+github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY=
+github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
+github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
+github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
+github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw=
+github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E=
+github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE=
+github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
+github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.7.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
+github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
+github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
+github.com/onsi/gomega v1.18.1/go.mod h1:0q+aL8jAiMXy9hbwj2mr5GziHiwhAIQpFmmtT5hitRs=
+github.com/pelletier/go-toml/v2 v2.2.0 h1:QLgLl2yMN7N+ruc31VynXs1vhMZa7CeHHejIeBAsoHo=
+github.com/pelletier/go-toml/v2 v2.2.0/go.mod h1:1t835xjRzz80PqgE6HHgN2JOsmgYu/h4qDAS4n929Rs=
+github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U=
+github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
+github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 h1:OdAsTTz6OkFY5QxjkYwrChwuRruF69c169dPK26NUlk=
+github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
+github.com/rogpeppe/go-internal v1.9.0 h1:73kH8U+JUqXU8lRuOHeVHaa/SZPifC7BkcraZVejAe8=
+github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs=
+github.com/sagikazarmark/locafero v0.4.0 h1:HApY1R9zGo4DBgr7dqsTH/JJxLTTsOt7u6keLGt6kNQ=
+github.com/sagikazarmark/locafero v0.4.0/go.mod h1:Pe1W6UlPYUk/+wc/6KFhbORCfqzgYEpgQ3O5fPuL3H4=
+github.com/sagikazarmark/slog-shim v0.1.0 h1:diDBnUNK9N/354PgrxMywXnAwEr1QZcOr6gto+ugjYE=
+github.com/sagikazarmark/slog-shim v0.1.0/go.mod h1:SrcSrq8aKtyuqEI1uvTDTK1arOWRIczQRv+GVI1AkeQ=
+github.com/sourcegraph/conc v0.3.0 h1:OQTbbt6P72L20UqAkXXuLOj79LfEanQ+YQFNpLA9ySo=
+github.com/sourcegraph/conc v0.3.0/go.mod h1:Sdozi7LEKbFPqYX2/J+iBAM6HpqSLTASQIKqDmF7Mt0=
+github.com/spf13/afero v1.11.0 h1:WJQKhtpdm3v2IzqG8VMqrr6Rf3UYpEF239Jy9wNepM8=
+github.com/spf13/afero v1.11.0/go.mod h1:GH9Y3pIexgf1MTIWtNGyogA5MwRIDXGUr+hbWNoBjkY=
+github.com/spf13/cast v1.6.0 h1:GEiTHELF+vaR5dhz3VqZfFSzZjYbgeKDpBxQVS4GYJ0=
+github.com/spf13/cast v1.6.0/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo=
+github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.18.2 h1:LUXCnvUvSM6FXAsj6nnfc8Q2tp1dIgUfY9Kc8GsSOiQ=
+github.com/spf13/viper v1.18.2/go.mod h1:EKmWIqdnk5lOcmR72yw6hS+8OPYcwD0jteitLMVB+yk=
+github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
+github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
+github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
+github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
+github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
+github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
+github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
+github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
+github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
+github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8=
+github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
+github.com/syndtr/goleveldb v1.0.0 h1:fBdIW9lB4Iz0n9khmH8w27SJ3QEJ7+IgjPEwGSZiFdE=
+github.com/syndtr/goleveldb v1.0.0/go.mod h1:ZVVdQEZoIme9iO1Ch2Jdy24qqXrMMOU6lpPAyBWyWuQ=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.885/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.887 h1:Py9MuRl/d97NxBb9opcNWMsxgrn83Aramk7X5sEUI4o=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.887/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.887 h1:pmctyK/3Aaxio9x1zf2aZYPmm9W+g6tigbEszl4b/LY=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/ses v1.0.887/go.mod h1:zuAn6JJ1sXlO4IH5qw4gwozNzpY8oecEsrBQ+9d4gZI=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.885 h1:d3aUU2pNw1aobq7PNldv0XsyZLiCekn/nB5/dRl35S0=
+github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.0.885/go.mod h1:e/SdLNcJRj3wZPGskBGC7jZZeAdrU/PXNgLATY/ahDc=
+github.com/twitchyliquid64/golang-asm v0.15.1 h1:SU5vSMR7hnwNxj24w34ZyCi/FmDZTkS4MhqMhdFk5YI=
+github.com/twitchyliquid64/golang-asm v0.15.1/go.mod h1:a1lVb/DtPvCB8fslRZhAngC2+aY1QWCk3Cedj/Gdt08=
+github.com/ugorji/go/codec v1.2.12 h1:9LC83zGrHhuUA9l16C9AHXAqEV/2wBQ4nkvumAE65EE=
+github.com/ugorji/go/codec v1.2.12/go.mod h1:UNopzCgEMSXjBc6AOMqYvWC1ktqTAfzJZUZgYf6w6lg=
+github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
+go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
+go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
+go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
+go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
+golang.org/x/arch v0.0.0-20210923205945-b76863e36670/go.mod h1:5om86z9Hs0C8fWVUuoMHwpExlXzs5Tkyp9hOrfG7pp8=
+golang.org/x/arch v0.7.0 h1:pskyeJh/3AmoQ8CPE95vxHLqp1G1GfGNXTmcl9NEKTc=
+golang.org/x/arch v0.7.0/go.mod h1:FEVrYAQjsQXMVJ1nsMoVVXPZg6p2JE2mx8psSWTDQys=
+golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
+golang.org/x/crypto v0.21.0 h1:X31++rzVUdKhX5sWmSOFZxx8UW/ldWx55cbf08iNAMA=
+golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
+golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
+golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
+golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8=
+golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
+golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
+golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
+golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
+golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
+golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
+golang.org/x/net v0.22.0 h1:9sGLhx7iRIHEiX0oAJ3MRZMUCElJgy7Br1nO+AMN3Tc=
+golang.org/x/net v0.22.0/go.mod h1:JKghWKKOSdJwpW2GEx0Ja7fmaKnMsbu+MWVZTokSYmg=
+golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.18.0 h1:DBdB3niSjOA/O0blCZBqDefyWNYveAYMNF1Wum0DYQ4=
+golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
+golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
+golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
+golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
+golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
+golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
+golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
+golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
+golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
+golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
+golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
+golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
+golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
+golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
+golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
+golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
+google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
+gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA=
+gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
+gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
+gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
+gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
+gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
+gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8=
+gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+lukechampine.com/uint128 v1.2.0 h1:mBi/5l91vocEN8otkC5bDLhi2KdCticRiwbdB0O+rjI=
+lukechampine.com/uint128 v1.2.0/go.mod h1:c4eWIwlEGaxC/+H1VguhU4PHXNWDCDMUlWdIWl2j1gk=
+modernc.org/cc/v3 v3.40.0 h1:P3g79IUS/93SYhtoeaHW+kRCIrYaxJ27MFPv+7kaTOw=
+modernc.org/cc/v3 v3.40.0/go.mod h1:/bTg4dnWkSXowUO6ssQKnOV0yMVxDYNIsIrzqTFDGH0=
+modernc.org/ccgo/v3 v3.16.13 h1:Mkgdzl46i5F/CNR/Kj80Ri59hC8TKAhZrYSaqvkwzUw=
+modernc.org/ccgo/v3 v3.16.13/go.mod h1:2Quk+5YgpImhPjv2Qsob1DnZ/4som1lJTodubIcoUkY=
+modernc.org/libc v1.22.2 h1:4U7v51GyhlWqQmwCHj28Rdq2Yzwk55ovjFrdPjs8Hb0=
+modernc.org/libc v1.22.2/go.mod h1:uvQavJ1pZ0hIoC/jfqNoMLURIMhKzINIWypNM17puug=
+modernc.org/mathutil v1.5.0 h1:rV0Ko/6SfM+8G+yKiyI830l3Wuz1zRutdslNoQ0kfiQ=
+modernc.org/mathutil v1.5.0/go.mod h1:mZW8CKdRPY1v87qxC/wUdX5O1qDzXMP5TH3wjfpga6E=
+modernc.org/memory v1.4.0 h1:crykUfNSnMAXaOJnnxcSzbUGMqkLWjklJKkBK2nwZwk=
+modernc.org/memory v1.4.0/go.mod h1:PkUhL0Mugw21sHPeskwZW4D6VscE/GQJOnIpCnW6pSU=
+modernc.org/opt v0.1.3 h1:3XOZf2yznlhC+ibLltsDGzABUGVx8J6pnFMS3E4dcq4=
+modernc.org/opt v0.1.3/go.mod h1:WdSiB5evDcignE70guQKxYUl14mgWtbClRi5wmkkTX0=
+modernc.org/sqlite v1.20.4 h1:J8+m2trkN+KKoE7jglyHYYYiaq5xmz2HoHJIiBlRzbE=
+modernc.org/sqlite v1.20.4/go.mod h1:zKcGyrICaxNTMEHSr1HQ2GUraP0j+845GYw37+EyT6A=
+modernc.org/strutil v1.1.3 h1:fNMm+oJklMGYfU9Ylcywl0CO5O6nTfaowNsh2wpPjzY=
+modernc.org/strutil v1.1.3/go.mod h1:MEHNA7PdEnEwLvspRMtWTNnp2nnyvMfkimT1NKNAGbw=
+modernc.org/token v1.0.1 h1:A3qvTqOwexpfZZeyI0FeGPDlSWX5pjZu9hF4lU+EKWg=
+modernc.org/token v1.0.1/go.mod h1:UGzOrNV1mAFSEB63lOFHIpNRUVMvYTc6yu1SMY/XTDM=
+nullprogram.com/x/optparse v1.0.0/go.mod h1:KdyPE+Igbe0jQUrVfMqDMeJQIJZEuyV7pjYmp6pbG50=
+rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4=
+xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978 h1:bvLlAPW1ZMTWA32LuZMBEGHAUOcATZjzHcotf3SWweM=
+xorm.io/builder v0.3.11-0.20220531020008-1bd24a7dc978/go.mod h1:aUW0S9eb9VCaPohFCH3j7czOx1PMW3i1HrSzbLYGBSE=
+xorm.io/xorm v1.3.9 h1:TUovzS0ko+IQ1XnNLfs5dqK1cJl1H5uHpWbWqAQ04nU=
+xorm.io/xorm v1.3.9/go.mod h1:LsCCffeeYp63ssk0pKumP6l96WZcHix7ChpurcLNuMw=

+ 9 - 2
main.go

@@ -8,13 +8,20 @@ import (
 	"github.com/gin-gonic/gin"
 )
 
-func main() {
+func init() {
 	configs.ConfigInit()
+}
+func main() {
+	runGin()
+}
+func runGin() {
 	Router := gin.Default()
 
 	apiGroup := Router.Group("/api")
+
 	user.UserRouth(apiGroup)
-	router.GoodsRouth(apiGroup)
+
+	router.InitRouter(apiGroup)
 	apiGroup.GET("/ping", share.JwtMiddleware(), func(context *gin.Context) {
 		context.String(200, "pong")
 	})

+ 148 - 0
router/BackRouter.go

@@ -0,0 +1,148 @@
+package router
+
+import (
+	"context"
+	"demo/configs"
+	"demo/data/dao"
+	"demo/data/domain"
+	"demo/share"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/mojocn/base64Captcha"
+	"github.com/spf13/cast"
+	"net/http"
+	"strings"
+	"time"
+)
+
+func BackRouter(engine *gin.RouterGroup) {
+	user := engine.Group("/back")
+	{
+		user.POST("/login", login)
+		user.GET("/code", VerificationCode)
+		user.GET("/state", GetBackUserState)
+		//获取用户信息
+
+	}
+}
+
+var ctx = context.Background()
+
+func login(c *gin.Context) {
+	data := share.GetJsonAnyParam(c)
+	username, _ := data("username")
+	password, _ := data("password")
+	code, _ := data("code")
+	codeMap := cast.ToStringMapString(code)
+	//判断验证码是否正确
+	redisCode := configs.RedisDb.Get(ctx, fmt.Sprint("VerificationBackCode_", codeMap["id"]))
+	if redisCode.Val() != codeMap["code"] {
+		c.JSON(http.StatusOK, CreateResultError(400, "验证码错误!!!"))
+		return
+	}
+	// 定义正则表达式
+	user, err := dao.Logins(cast.ToString(username), cast.ToString(password))
+
+	if err == nil && user.Id != 0 {
+		fmt.Println("用户登录成功!!!")
+		token, err := share.GenerateToken("back" + cast.ToString(user.Id))
+		if err == nil {
+			c.Header("auth-sign", token)
+			c.JSON(http.StatusOK, CreateResultData(map[string]string{"token": token}))
+		} else {
+			c.JSON(http.StatusOK, CreateResultError(400, "生成token失败!!!"))
+		}
+	} else {
+		fmt.Println("用户登录失败!!!")
+		c.JSON(http.StatusOK, CreateResultError(401, "用户密码错误!!!"))
+	}
+}
+func isLogin(c *gin.Context) {
+	data := share.GetJsonAnyParam(c)
+	username, _ := data("username")
+	password, _ := data("password")
+	code, _ := data("code")
+	codeMap := cast.ToStringMapString(code)
+	//判断验证码是否正确
+	redisCode := configs.RedisDb.Get(ctx, fmt.Sprint("VerificationCode_", codeMap["id"])).String()
+	if redisCode != codeMap["value"] {
+		c.JSON(http.StatusOK, CreateResultError(400, "验证码错误!!!"))
+		return
+	}
+	// 定义正则表达式
+	user, err := dao.Logins(cast.ToString(username), cast.ToString(password))
+	fmt.Println("user:", user)
+	if err == nil && user.Id != 0 {
+		fmt.Println("用户登录成功!!!")
+		token, err := share.GenerateToken("back_" + cast.ToString(user.Id))
+		if err == nil {
+			c.Header("auth-sign", token)
+			c.JSON(http.StatusOK, CreateResultData(map[string]string{"token": token}))
+		} else {
+			c.JSON(http.StatusOK, CreateResultError(400, "生成token失败!!!"))
+		}
+	} else {
+		fmt.Println("用户登录失败!!!")
+		c.JSON(http.StatusOK, CreateResultError(401, "用户密码错误!!!"))
+	}
+}
+
+func VerificationCode(c *gin.Context) {
+	// 配置
+	driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80)
+	store := base64Captcha.DefaultMemStore
+	captcha := base64Captcha.NewCaptcha(driver, store)
+
+	// 生成验证码
+	id, b64s, answer, err := captcha.Generate()
+	if err != nil {
+		c.JSON(500, gin.H{"error": err.Error()})
+		return
+	}
+	err = configs.RedisDb.Set(ctx, "VerificationBackCode_"+id, answer, 0).Err()
+	if err != nil {
+		fmt.Println(err)
+	}
+	err = configs.RedisDb.Expire(ctx, "VerificationBackCode_"+id, 60*time.Second).Err()
+	if err != nil {
+		panic(err)
+	}
+	// 返回验证码图片
+	c.JSON(200, gin.H{
+		"message": "获取成功!!!",
+		"expires": time.Now().Add(time.Minute * 5).Unix(),
+		"code":    200,
+		"data":    map[string]string{"id": id, "image": b64s},
+	})
+}
+
+func GetBackUserState(c *gin.Context) {
+	header := c.GetHeader("auth-sign")
+	if header == "" {
+		c.JSON(200, CreateResultError(406, "用户未登录"))
+		return
+	}
+	claims, err := share.ParseToken(header)
+	if err != nil {
+		c.JSON(200, CreateResultError(406, "用户未登录"))
+		return
+	}
+
+	var userInfo = domain.ManageUser{}
+	backUserId := claims["iss"].(string)
+	fmt.Println(backUserId, "backUserId")
+	if strings.Index(backUserId, "back_") == 0 {
+		backUserId = strings.Replace(backUserId, "back_", "", 1)
+	} else {
+		c.JSON(200, CreateResultError(406, "用户未登录"))
+	}
+
+	_, err = configs.Engine.Table("manage_user").Where("id = ?", claims["iss"]).Get(&userInfo)
+	if err != nil {
+		c.JSON(200, CreateResultError(406, "用户未登录"))
+		return
+	}
+	c.JSON(200, CreateResultData(map[string]any{
+		"info": userInfo,
+	}))
+}

+ 29 - 0
router/DetailRouter.go

@@ -0,0 +1,29 @@
+package router
+
+import (
+	"demo/data/dao"
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+func DetailRouter(engine *gin.RouterGroup) {
+	user := engine.Group("/detail")
+	{
+		user.GET("/:id", GetDetailData)
+	}
+}
+
+func GetDetailData(c *gin.Context) {
+	id, err2 := strconv.Atoi(c.Param("id"))
+	if err2 != nil {
+		c.JSON(200, CreateResultError(400, "param 参数错误"))
+		return
+	}
+
+	vo, err := dao.SelectGoodsDetailById(id)
+	if err != nil {
+		c.JSON(200, CreateResultError(400, "查询失败"))
+		return
+	}
+	c.JSON(200, CreateResultData(vo))
+}

+ 52 - 0
router/FileRouter.go

@@ -0,0 +1,52 @@
+package router
+
+import (
+	"errors"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"net/http"
+	"time"
+)
+
+var (
+	uploadFileKey = "upload-key"
+	filepath      = "./file/resources/"
+)
+
+func FileRouter(engine *gin.RouterGroup) {
+	//文件静态资源
+	engine.StaticFS("/static", http.Dir("file/resources"))
+	user := engine.Group("/file")
+	{
+		user.POST("/upload", uploadHandler)
+	}
+}
+
+// 文件上传
+func uploadHandler(c *gin.Context) {
+	header, err := c.FormFile("file")
+	fmt.Println("header", header.Size)
+	if err != nil {
+		c.JSON(200, CreateResultError(400, "上传错误"))
+		return
+	}
+	fmt.Println("header", header.Size)
+	//dst := header.Filename
+	// gin 简单做了封装,拷贝了文件流
+	//if err := c.SaveUploadedFile(header, dst); err != nil {
+	//	c.JSON(200, CreateResultError(400, "上传错误"))
+	//	return
+	//}
+	//上传到的路径
+	//path := 'resource/public/uploads/20060102150405test.xlsx'
+	header.Filename = fmt.Sprintf("%s%s", time.Now().Format("20060102150405"), header.Filename) // 文件名格式 自己可以改 建议保证唯一性
+	path := filepath + header.Filename                                                          //路径+文件名上传
+
+	// 上传文件到指定的目录
+	err = c.SaveUploadedFile(header, path)
+	if err != nil {
+		err = errors.New(fmt.Sprintf("上传失败,%v", err))
+		return
+	}
+	c.JSON(200, CreateResult())
+}

+ 0 - 24
router/GoodsRouter.go

@@ -1,24 +0,0 @@
-package router
-
-import (
-	domain "demo/data/dao"
-	"github.com/gin-gonic/gin"
-)
-
-func GoodsRouth(engine *gin.RouterGroup) {
-	user := engine.Group("/goods")
-	{
-		user.GET("/all", getAllGoods)
-		//user.POST("sendSms", SendVerificationCode)
-		//
-		//user.GET("/captcha", VerificationCode)
-	}
-}
-
-func getAllGoods(c *gin.Context) {
-	c.JSON(200, gin.H{
-		"code": 200,
-		"msg":  "success",
-		"data": domain.SelectAll(),
-	})
-}

+ 16 - 0
router/HomeRouter.go

@@ -0,0 +1,16 @@
+package router
+
+import (
+	"github.com/gin-gonic/gin"
+)
+
+func HomeRouter(engine *gin.RouterGroup) {
+	user := engine.Group("/home")
+	{
+		user.POST("/", uploadHandler)
+	}
+}
+func getHomeData(c *gin.Context) {
+
+	c.JSON(200, CreateResult())
+}

+ 107 - 0
router/OrderRouter.go

@@ -0,0 +1,107 @@
+package router
+
+import (
+	"demo/data/dao"
+	"demo/data/dao/manage"
+	"demo/data/domain"
+	"demo/data/domain/vo"
+	"demo/share"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/spf13/cast"
+	"time"
+)
+
+func OrderRouter(engine *gin.RouterGroup) {
+	order := engine.Group("/order")
+	{
+		order.POST("/submit", GetOrderData)
+	}
+}
+
+// GetOrderData 创建订单
+func GetOrderData(c *gin.Context) {
+	id := GetUserIdByToken(c)
+	if id == 0 {
+		return
+	}
+
+	data := share.GetJsonAnyParam(c)
+	skuId, _ := data("skuId")
+	count, _ := data("count")
+	couponUserId, _ := data("couponUserId")
+	contactInformation, _ := data("contactInformation")
+
+	sku, err := dao.SelectSkuBySkuId(cast.ToInt(skuId))
+	fmt.Println(sku)
+	if err != nil {
+		c.JSON(200, CreateResultError(1000, "商品规格不存在"))
+		return
+	}
+	//查询库存数量
+	if sku.InventoryNumber < cast.ToInt(count) {
+		c.JSON(200, CreateResultError(1000, "库存不足"))
+	}
+	order := &domain.GoodsOrder{}
+	order.SkuId = cast.ToInt(skuId)
+	order.Count = cast.ToInt(count)
+	order.CouponUserId = cast.ToInt(couponUserId)
+	order.ContactInformation = cast.ToString(contactInformation)
+
+	order.OrderName = fmt.Sprint(sku.SkuName, "【x", count, "】")
+	order.Price = sku.Price
+	order.TotalPrice = sku.Price * float64(cast.ToInt(count))
+	order.CreateBy = id
+	order.CreateTime = time.Now()
+	order, err = dao.CreateOrder(order)
+	if err != nil {
+		c.JSON(200, CreateResultError(1000, "创建订单失败"))
+		return
+	}
+	c.JSON(200, CreateResultData(*order))
+
+}
+
+// 支付回调模拟
+func PayBuyTest(c *gin.Context) {
+	id := GetUserIdByToken(c)
+	if id == 0 {
+		return
+	}
+	data := share.GetJsonAnyParam(c)
+	orderId, _ := data("orderId")
+	dao.OrderPaySuccess(cast.ToInt(orderId))
+}
+
+// 订单列表
+func GetOrderList(c *gin.Context) {
+	id := GetUserIdByToken(c)
+	if id == 0 {
+		return
+	}
+	orders, err := dao.GetOrderByUserId(id)
+	var ids = make([]int, 0)
+	for _, order := range orders {
+		ids = append(ids, order.CouponUserId)
+	}
+	skus, err := manage.GetInIdListGoodsSku(ids)
+	if err != nil {
+		c.JSON(200, CreateResultError(1000, "查询失败"))
+	}
+	var vos = make([]vo.OrderVo, 0)
+	for _, order := range orders {
+		var vo vo.OrderVo
+		vo.Order = order
+		for _, sku := range skus {
+			if order.CouponUserId == sku.Id {
+				vo.Sku = sku
+				break
+			}
+		}
+		vos = append(vos, vo)
+	}
+	c.JSON(200, CreateResultData(map[string]interface{}{
+		"vos": vos,
+		"len": len(vos),
+	}))
+}

+ 44 - 0
router/ResultData.go

@@ -0,0 +1,44 @@
+package router
+
+import (
+	"demo/share"
+	"github.com/gin-gonic/gin"
+	"strconv"
+)
+
+func CreateResult() gin.H {
+	return gin.H{
+		"code": 200,
+		"msg":  "success",
+	}
+}
+func CreateResultData(Data any) gin.H {
+	return gin.H{
+		"code": 200,
+		"msg":  "success",
+		"data": Data,
+	}
+}
+
+func CreateResultError(errCode int, errMsg string) gin.H {
+	return gin.H{
+		"code": errCode,
+		"msg":  errMsg,
+	}
+}
+
+func GetUserIdByToken(c *gin.Context) int {
+	header := c.GetHeader("auth-sign")
+	if header == "" {
+		c.JSON(200, CreateResultError(401, "用户未登录"))
+		return 0
+	}
+	claims, err := share.ParseToken(header)
+	if err != nil {
+		c.JSON(200, CreateResultError(401, "用户未登录"))
+		return 0
+	}
+	i, err := strconv.ParseInt(claims["iss"].(string), 10, 32)
+	return int(i)
+
+}

+ 14 - 0
router/Router.go

@@ -0,0 +1,14 @@
+package router
+
+import (
+	"github.com/gin-gonic/gin"
+)
+
+func InitRouter(apiGroup *gin.RouterGroup) {
+	DetailRouter(apiGroup)
+	FileRouter(apiGroup)
+	TestRouth(apiGroup)
+	UserRouth(apiGroup)
+	OrderRouter(apiGroup)
+	BackRouter(apiGroup)
+}

+ 43 - 0
router/TestRouter.go

@@ -0,0 +1,43 @@
+package router
+
+import "github.com/gin-gonic/gin"
+
+func TestRouth(engine *gin.RouterGroup) {
+	user := engine.Group("/test")
+	{
+		user.GET("/get", testGet)
+		user.POST("/post", testPost)
+		user.PUT("/put", testPut)
+		user.DELETE("/delete", testDelete)
+
+	}
+}
+
+func testGet(c *gin.Context) {
+	c.JSON(200, gin.H{
+		"message": "get",
+		"code":    200,
+		"data":    make(map[string]interface{}),
+	})
+}
+func testPost(c *gin.Context) {
+	c.JSON(200, gin.H{
+		"message": "post",
+		"code":    200,
+		"data":    make(map[string]interface{}),
+	})
+}
+func testPut(c *gin.Context) {
+	c.JSON(200, gin.H{
+		"message": "put",
+		"code":    200,
+		"data":    make(map[string]interface{}),
+	})
+}
+func testDelete(c *gin.Context) {
+	c.JSON(200, gin.H{
+		"message": "delete",
+		"code":    200,
+		"data":    make(map[string]interface{}),
+	})
+}

+ 99 - 0
router/UserRouter.go

@@ -0,0 +1,99 @@
+package router
+
+import (
+	"demo/configs"
+	"demo/data/dao"
+	"demo/data/dao/manage"
+	"demo/data/domain/vo"
+	"demo/share"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"github.com/spf13/cast"
+)
+
+func UserRouth(engine *gin.RouterGroup) {
+	user := engine.Group("/user")
+	{
+		user.GET("/info", GetUserInfo)
+		user.GET("/wallet", GetUserPurse)
+		user.PUT("/name", SetNameValue)
+		user.POST("/order", GetUserOrder)
+	}
+}
+
+// GetUserInfo 获取用户的个人信息
+func GetUserInfo(c *gin.Context) {
+	header := c.GetHeader("auth-sign")
+	if header == "" {
+		c.JSON(200, CreateResultError(401, "用户未登录"))
+		return
+	}
+	claims, err := share.ParseToken(header)
+	if err != nil {
+		c.JSON(200, CreateResultError(401, "用户未登录"))
+		return
+	}
+	var userInfo = configs.User{}
+	_, err = configs.Engine.Table("user").Where("id = ?", claims["iss"]).Get(&userInfo)
+	if err != nil {
+		c.JSON(200, CreateResultError(401, "用户未登录"))
+		return
+	}
+	c.JSON(200, CreateResultData(map[string]any{
+		"info": userInfo,
+	}))
+}
+
+func GetUserPurse(c *gin.Context) {
+	id := GetUserIdByToken(c)
+	if id == 0 {
+		return
+	}
+	var vo vo.UserWalletVo
+	userWallet, err := dao.GetUserWalletByUserId(id)
+	if err != nil {
+		c.JSON(200, CreateResultError(500, "获取钱包失败"))
+	}
+	vo.Wallet = userWallet
+	vo.CouponUserJDM, err = dao.GetUserCouponByUserId(id)
+	if err != nil {
+		c.JSON(200, CreateResultError(500, "获取优惠券失败"))
+	}
+	c.JSON(200, CreateResultData(vo))
+}
+func SetNameValue(c *gin.Context) {
+	id := GetUserIdByToken(c)
+	if id == 0 {
+		return
+	}
+	name := c.Query("name")
+	fmt.Println(name)
+	_, b, err := manage.SetUser(map[string]interface{}{"name": name}, id)
+	if err != nil {
+		println(err.Error())
+		c.JSON(200, CreateResultError(500, "修改失败"))
+		return
+	}
+	if b {
+		c.JSON(200, CreateResult())
+	} else {
+		c.JSON(200, CreateResultError(500, "修改失败"))
+	}
+}
+
+// GetUserOrder 获取用户订单信息
+func GetUserOrder(c *gin.Context) {
+	id := GetUserIdByToken(c)
+	if id == 0 {
+		return
+	}
+	data := share.GetJsonAnyParam(c)
+	pageNum, _ := data("pageNum")
+	pageSize, _ := data("pageSize")
+	state, _ := data("state")
+	vo, err := dao.GetListGoodsOrder(cast.ToString(state), id, cast.ToInt(pageNum), cast.ToInt(pageSize))
+	if err != nil {
+		c.JSON(200, CreateResultError(500, "获取订单失败"))
+	}
+	c.JSON(200, CreateResultData(vo))
+}

+ 0 - 7
test/test.http

@@ -1,7 +0,0 @@
-POST http://localhost:8080/api/user/login
-Content-Type: application/json
-
-{
-
-}
-###

+ 250 - 24
user/user.go

@@ -3,14 +3,20 @@ package user
 import (
 	"context"
 	"demo/configs"
+	"demo/data/dao/manage"
+	"demo/data/domain"
+	"demo/router"
 	"demo/share"
+	"demo/util"
 	"fmt"
 	"github.com/gin-gonic/gin"
 	"github.com/mojocn/base64Captcha"
 	"github.com/spf13/cast"
 	"log"
+	"math/big"
 	"net/http"
 	"regexp"
+	"strconv"
 	"time"
 )
 
@@ -20,13 +26,15 @@ func UserRouth(engine *gin.RouterGroup) {
 	user := engine.Group("/user")
 	{
 		user.POST("/login", login)
-		user.POST("sendSms", SendVerificationCode)
+		user.POST("/register", register)
+		user.POST("/registerCode", registerCode)
 
+		user.POST("/sendSms", SendVerificationCode)
 		user.GET("/captcha", VerificationCode)
 	}
 }
-func VerificationCode(c *gin.Context) {
 
+func VerificationCode(c *gin.Context) {
 	// 配置
 	driver := base64Captcha.NewDriverDigit(80, 240, 4, 0.5, 80)
 	store := base64Captcha.DefaultMemStore
@@ -56,48 +64,266 @@ func VerificationCode(c *gin.Context) {
 	})
 
 }
+
 func login(c *gin.Context) {
 	data := share.GetJsonAnyParam(c)
 	var user configs.User
 	var err error
 	username, _ := data("username")
 	password, _ := data("password")
+	t, _ := data("type")
 	// 定义正则表达式
-	regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
 
-	// 编译正则表达式
-	reg, err := regexp.Compile(regexPattern)
-	if err != nil {
-		fmt.Println("Error compiling regex:", err)
-		return
+	if cast.ToString(t) == "email" {
+		regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
+		// 编译正则表达式
+		reg, err := regexp.Compile(regexPattern)
+		if err != nil {
+			fmt.Println("编译正则表达式时出错:", err)
+			return
+		}
+		//判断是否为邮箱格式
+		matched := reg.MatchString(cast.ToString(username))
+
+		if !matched {
+			fmt.Println("无效的电子邮件格式.")
+			c.JSON(http.StatusOK, router.CreateResultError(400, "邮箱格式错误!!!"))
+			return
+		}
+	} else if cast.ToString(t) == "phone" {
+		regexPattern := `^1[3-9]\d{9}$`
+		// 编译正则表达式
+		reg, err := regexp.Compile(regexPattern)
+		if err != nil {
+			fmt.Println("编译正则表达式时出错:", err)
+			return
+		}
+		//判断是否为邮箱格式
+		matched := reg.MatchString(cast.ToString(username))
+
+		if !matched {
+			fmt.Println("无效的手机号格式.")
+			c.JSON(http.StatusOK, router.CreateResultError(400, "手机格式错误!!!"))
+			return
+		}
 	}
-	matched := reg.MatchString(cast.ToString(username))
 
-	user, err = logins(cast.ToString(username), cast.ToString(password), matched)
+	user, err = logins(cast.ToString(username), cast.ToString(password), cast.ToString(t))
 
-	if err == nil {
+	if err == nil && user.Id != 0 {
+		fmt.Println("用户登录成功!!!")
 		token, err := share.GenerateToken(cast.ToString(user.Id))
 		if err == nil {
 			c.Header("auth-sign", token)
-			c.JSON(http.StatusOK, gin.H{
-				"code":    200,
-				"message": "成功!!!",
-			})
+			c.JSON(http.StatusOK, router.CreateResultData(map[string]string{"token": token}))
 		} else {
-			c.JSON(http.StatusOK, gin.H{
-				"code":    400,
-				"message": "生成token失败!!!",
-			})
+			c.JSON(http.StatusOK, router.CreateResultError(400, "生成token失败!!!"))
 		}
 	} else {
-		c.JSON(http.StatusOK, gin.H{
-			"code":    401,
-			"message": "用户密码错误!!!",
-		})
+		fmt.Println("用户登录失败!!!")
+		c.JSON(http.StatusOK, router.CreateResultError(401, "用户密码错误!!!"))
+	}
+}
+
+func registerCode(c *gin.Context) {
+	data := share.GetJsonAnyParam(c)
+	phone, _ := data("phone")
+	//判断是否为手机格式
+	if !checkPhone(c, cast.ToString(phone)) {
+		return
+	}
+	//判断是否已经注册
+	b, err := existsPhone(cast.ToString(phone))
+	if err != nil {
+		fmt.Println(err)
+		c.JSON(http.StatusOK, router.CreateResultError(200, "数据库错误!!!"))
+		return
+	}
+	if b {
+		c.JSON(http.StatusOK, router.CreateResultError(200, "手机号已注册!!!"))
+		return
+	}
+	//判断是否重复注册
+	get := configs.RedisDb.Exists(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone))
+	if get.Val() == 1 {
+		c.JSON(http.StatusOK, router.CreateResultError(200, "验证码已经发送,请等待"))
+		return
+	}
+
+	//发送短信
+	//sms := sendSms(b, cast.ToString(phone))
+	//TODO 模拟发送短信
+	sms := testSendSms()
+	fmt.Println("发送成功!!!:验证码为:", sms)
+	configs.RedisDb.Set(ctx, "PhoneVerificationCode_"+cast.ToString(phone), sms, 60*5*time.Second)
+	configs.RedisDb.Set(ctx, "PhoneVerificationCodeTime_"+cast.ToString(phone), time.Now(), 60*time.Second)
+	c.JSON(http.StatusOK, router.CreateResult())
+
+}
+
+func testSendSms() string {
+	mins := big.NewInt(100000)
+	maxs := big.NewInt(999999)
+	randomNum := share.RandomInt(mins, maxs)
+	//if matched {
+	//	//bools, err = configs.Engine.Table("user").Where("username = ?", username).Exist(&user)
+	//
+	//	share.SendMail(username, strconv.Itoa(int(randomNum.Int64())))
+	//
+	//} else {
+	//	share.SendSms(strconv.Itoa(int(randomNum.Int64())), username)
+	//}
+	return randomNum.String()
+}
+
+func register(c *gin.Context) {
+
+	data := share.GetJsonAnyParam(c)
+
+	username, _ := data("username")
+	password, _ := data("password")
+	code, _ := data("code")
+	phone, _ := data("phone")
+
+	if !checkEmail(c, cast.ToString(username)) {
+		return
+	}
+	if !checkPhone(c, cast.ToString(phone)) {
+		return
+	}
+	if !checkCode(c, cast.ToString(code)) {
+		return
+	}
+	if !checkPassword(c, cast.ToString(password)) {
+		return
 	}
+	// 验证验证码
+	get := configs.RedisDb.Get(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
+	fmt.Println(code, get.Val())
+	if code != get.Val() {
+		c.JSON(http.StatusOK, router.CreateResultError(400, "验证码错误!"))
+		return
+	}
+	configs.RedisDb.Del(ctx, "PhoneVerificationCode_"+cast.ToString(phone))
+
+	//判断是否已经注册
+	b, err := GetUserByPhoneOrEmail(cast.ToString(phone), cast.ToString(username))
+	if err != nil {
+		c.JSON(http.StatusOK, router.CreateResultError(400, "验证手机号及用户名,数据错误"))
+		return
+	}
+	if b {
+		c.JSON(http.StatusOK, router.CreateResultError(400, "手机号或邮箱已注册!!!"))
+		return
+	}
+
+	timestamp := time.Now().Unix()
+	user := configs.User{
+		Username:      cast.ToString(username),
+		Password:      cast.ToString(password),
+		Creation_time: int(timestamp),
+		Status:        0,
+		Role_id:       2,
+		Phone:         cast.ToString(phone),
+		Email:         cast.ToString(username),
+		Name:          cast.ToString(username),
+		RecommendCode: fmt.Sprint(strconv.FormatInt(timestamp, 16), util.RandomArrays(13, 62)),
+	}
+
+	user, err = SaveNewUser(user)
+	if err != nil {
+		fmt.Println(err)
+		c.JSON(http.StatusOK, router.CreateResultError(400, "数据库错误!!!"))
+		return
+	}
+	if user.Id != 0 {
+		fmt.Println("用户注册成功!!!")
+		c.JSON(http.StatusOK, router.CreateResultData(map[string]any{"user": user}))
+		//用户钱包添加
+		manage.SaveUserWallet(&domain.UserWallet{UserId: user.Id})
+
+		return
+	} else {
+		fmt.Println("用户注册失败!!!")
+		c.JSON(http.StatusOK, router.CreateResultError(400, "用户注册失败!!!"))
+		return
+	}
+}
+
+func checkEmail(c *gin.Context, email string) bool {
+	//// 定义正则表达式
+	regexPattern := `^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "邮箱格式错误!!!"))
+		return false
+	}
+	//判断是否为邮箱格式
+	matched := reg.MatchString(cast.ToString(email))
+	if !matched {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "邮箱格式错误!!!"))
+		return false
+	}
+	return true
+}
+func checkPhone(c *gin.Context, phone string) bool {
+	//// 定义正则表达式
+	regexPattern := `^1[3-9]\d{9}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("1 Error compiling regex:", err)
+		c.JSON(200, router.CreateResultError(500, "手机号格式错误!!!"))
+		return false
+	}
+	matched := reg.MatchString(cast.ToString(phone))
+	if !matched {
+		fmt.Println("2 Error compiling regex:", err)
+		c.JSON(200, router.CreateResultError(500, "手机号格式错误!!!"))
+		return false
+	}
+	return true
+}
+func checkPassword(c *gin.Context, email string) bool {
+	//// 定义正则表达式
+	regexPattern := `^[a-zA-Z0-9,./<>?;'\\:"|\[\]{}~!@#$%^&*()_+=-]{6,32}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "密码格式错误!!!"))
+		return false
+	}
+	//判断是否为邮箱格式
+	matched := reg.MatchString(cast.ToString(email))
+	if !matched {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "密码格式错误!!!"))
+		return false
+	}
+	return true
+}
+func checkCode(c *gin.Context, code string) bool {
+	//// 定义正则表达式
+	regexPattern := `^\d{6}$`
+	reg, err := regexp.Compile(regexPattern)
+	if err != nil {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "验证码格式错误!!!"))
+		return false
+	}
+	//判断是否为邮箱格式
+	matched := reg.MatchString(cast.ToString(code))
+	if !matched {
+		fmt.Println("Error compiling regex:", err)
+		c.JSON(500, router.CreateResultError(500, "验证码格式错误!!!"))
+		return false
+	}
+
+	return true
 }
 
-// SendVerificationCode
+// SendVerificationCode 发送验证码
 func SendVerificationCode(c *gin.Context) {
 	data := share.GetJsonAnyParam(c)
 	var err error

+ 69 - 9
user/userdao.go

@@ -1,6 +1,7 @@
 package user
 
 import (
+	"crypto/md5"
 	"demo/configs"
 	"demo/share"
 	"fmt"
@@ -8,25 +9,28 @@ import (
 	"strconv"
 )
 
-func logins(username, password string, matched bool) (configs.User, error) {
+func logins(username, password, t string) (configs.User, error) {
 	user := configs.User{}
 	var err error
 	fmt.Println("username", username, "password", password)
-	if matched {
-		_, err = configs.Engine.Table("user").Where("username = ?", username).Where("password = ?", password).Get(&user)
-	} else {
-		_, err = configs.Engine.Table("user").Where("phone = ?", username).Where("password = ?", password).Get(&user)
+	hash := md5.New()
+	hash.Write([]byte("kkc-" + password))
+
+	pwd := Md5_KKC(password)
+	fmt.Println("678", username, pwd, t)
+	//md5摘要
+	if t == "email" {
+		_, err = configs.Engine.Table("user").Where("email = ?", username).Where("password = ?", pwd).Get(&user)
+	} else if t == "phone" {
+		_, err = configs.Engine.Table("user").Where("phone = ?", username).Where("password = ?", pwd).Get(&user)
 	}
 
-	fmt.Println(err)
 	if err == nil {
 		return user, err
 	}
 	return configs.User{}, err
 }
-
-// 发送验证码
-func sendSms(matched bool, username string) {
+func sendSms(matched bool, username string) string {
 	mins := big.NewInt(100000)
 	maxs := big.NewInt(999999)
 	randomNum := share.RandomInt(mins, maxs)
@@ -38,4 +42,60 @@ func sendSms(matched bool, username string) {
 	} else {
 		share.SendSms(strconv.Itoa(int(randomNum.Int64())), username)
 	}
+	return randomNum.String()
+}
+
+func SaveNewUser(user configs.User) (configs.User, error) {
+	insert, err := configs.Engine.Table("user").Insert(user)
+	if err != nil {
+		return user, err
+	}
+	if insert > 0 {
+		configs.Engine.Select("id").Where("phone = ?", user.Phone).Get(&user)
+		fmt.Println("user666:", user)
+	}
+
+	return user, nil
+}
+func GetUserByPhoneOrEmail(phone, email string) (bool, error) {
+	var user = configs.User{}
+	_, err := configs.Engine.Select("id").Where("phone = ?", phone).Or("email = ?", email).Get(&user)
+	if err != nil {
+		fmt.Println("err:", err)
+	}
+	return user.Id > 0, err
+}
+
+// 判断手机号数量
+func existsPhone(phone string) (bool, error) {
+	count, err := configs.Engine.Table("user").Where("phone = ?", phone).Count()
+	if err != nil {
+		return false, err
+	}
+	return count > 0, nil
+}
+
+func saveUser(username, password, code, phone string) bool {
+	return true
+
+}
+
+func Md5_KKC(str string) string {
+	hash := md5.New()
+	hash.Write([]byte("kkc-" + str))
+	return fmt.Sprintf("%x", hash.Sum(nil))
+}
+
+func SetName(id int, newName string) (configs.User, error) {
+	user := configs.User{}
+	_, err := configs.Engine.Table("user").Where("id = ?", id).Get(&user)
+	if err != nil {
+		return user, err
+	}
+	user.Name = newName
+	_, err = configs.Engine.Table("user").ID(id).Update(user)
+	if err != nil {
+		return user, err
+	}
+	return user, nil
 }

+ 20 - 0
util/RandomUtil.go

@@ -0,0 +1,20 @@
+package util
+
+import (
+	"demo/share"
+	"fmt"
+	"math/big"
+)
+
+const data = "66"
+
+var charArrays = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
+
+func RandomArrays(charCount, hex int) string {
+	result := ""
+	for i := 0; i < charCount; i++ {
+		randomInt := share.RandomInt(big.NewInt(0), big.NewInt(int64(hex))).Int64()
+		result += fmt.Sprint(string(charArrays[randomInt]))
+	}
+	return result
+}

Деякі файли не було показано, через те що забагато файлів було змінено