Browse Source

尝试部署

eason 1 năm trước cách đây
mục cha
commit
2a335a3c23
100 tập tin đã thay đổi với 1200 bổ sung319 xóa
  1. 4 9
      fore-end/API/appraise.js
  2. 3 1
      fore-end/components/messageRecord/messageRecord.wxss
  3. 60 11
      fore-end/pages/chat/chat.js
  4. 3 1
      fore-end/pages/chat/chat.wxss
  5. 16 10
      fore-end/pages/message/message.js
  6. 1 1
      fore-end/project.private.config.json
  7. 5 4
      fore-end/utils/util.js
  8. 1 1
      trading-go/common/database.go
  9. 1 1
      trading-go/config/config.yml
  10. 78 14
      trading-go/controller/chatcontroller.go
  11. 66 17
      trading-go/controller/goodscontroller.go
  12. 1 1
      trading-go/controller/ordercontroller.go
  13. 0 7
      trading-go/controller/piccontrller.go
  14. 2 1
      trading-go/controller/relationcontroller.go
  15. 57 9
      trading-go/controller/usercontroller.go
  16. 203 24
      trading-go/docs/docs.go
  17. 202 24
      trading-go/docs/swagger.json
  18. 137 21
      trading-go/docs/swagger.yaml
  19. 2 13
      trading-go/go.mod
  20. 3 30
      trading-go/go.sum
  21. 0 1
      trading-go/main.go
  22. 66 48
      trading-go/model/goods.go
  23. 54 3
      trading-go/model/message.go
  24. 7 5
      trading-go/model/orders.go
  25. 17 13
      trading-go/model/pic.go
  26. 154 0
      trading-go/model/recommend.go
  27. 17 14
      trading-go/model/relation.go
  28. 26 33
      trading-go/model/table.go
  29. 14 2
      trading-go/model/user.go
  30. BIN
      trading-go/pics/1698476053aWZd7PE7nICad85dedb14362dc3a251c6c85705ec495.jpg
  31. BIN
      trading-go/pics/1698752652MF3qSSC7MzFjb1493fda534929a5b5d05f80a8cf3d16.jpg
  32. BIN
      trading-go/pics/1698753512AiD8PaNrvqsDb1493fda534929a5b5d05f80a8cf3d16.jpg
  33. BIN
      trading-go/pics/1698845281tmp_31510c11e3073fe31c4ee963558f5f954ba91a124775b40c.jpg
  34. BIN
      trading-go/pics/1698845379tmp_2f7cea566577915f03cb307d0540904770f938500a6377ae.jpg
  35. BIN
      trading-go/pics/1698845408tmp_a0cec4ce123ef00c158d0da1f6fe11d86e6ccb263bfe6e8d.jpg
  36. BIN
      trading-go/pics/1698845418tmp_af79c23e356fad52c9194a33033ef7f168a710b7a3cc19c7.jpg
  37. BIN
      trading-go/pics/1698845498tmp_ee023136c58602bb4ff2d75a9b82931a3c72b931c54ef941.jpg
  38. BIN
      trading-go/pics/1698845584tmp_69fe84d4b7b444512c31c8693e95336113d42d50aaca0699.jpg
  39. BIN
      trading-go/pics/1698846108tmp_c0bcb90fd9ef93e065c22b977d7bc8aea17a1ac1e8393c21.jpg
  40. BIN
      trading-go/pics/1699175056BvtgC8vv8gSzd85dedb14362dc3a251c6c85705ec495.jpg
  41. BIN
      trading-go/pics/1699375397UN3eFHEVeEtEb1493fda534929a5b5d05f80a8cf3d16.jpg
  42. BIN
      trading-go/pics/1699376791kDvVkMDqGaKjb1493fda534929a5b5d05f80a8cf3d16.jpg
  43. BIN
      trading-go/pics/1699376842DbDkdnl78sbBb1493fda534929a5b5d05f80a8cf3d16.jpg
  44. BIN
      trading-go/pics/1699377248GdPib7YWQsXAb1493fda534929a5b5d05f80a8cf3d16.jpg
  45. BIN
      trading-go/pics/1699378552vxHfGwZXkePTb1493fda534929a5b5d05f80a8cf3d16.jpg
  46. BIN
      trading-go/pics/1699378578JPJKVU20yj8xb1493fda534929a5b5d05f80a8cf3d16.jpg
  47. BIN
      trading-go/pics/1699378604WzGV4QEYsyqzb1493fda534929a5b5d05f80a8cf3d16.jpg
  48. BIN
      trading-go/pics/16993786734xio8nxv2TFNb1493fda534929a5b5d05f80a8cf3d16.jpg
  49. BIN
      trading-go/pics/1699378762ThBCYkhdz9zqb1493fda534929a5b5d05f80a8cf3d16.jpg
  50. BIN
      trading-go/pics/16993787821A2FjRLvVruhb1493fda534929a5b5d05f80a8cf3d16.jpg
  51. BIN
      trading-go/pics/1699378849dxutdmTao1rOb1493fda534929a5b5d05f80a8cf3d16.jpg
  52. BIN
      trading-go/pics/1699378868UNzjT86U9mZrb1493fda534929a5b5d05f80a8cf3d16.jpg
  53. BIN
      trading-go/pics/1699379040BxHIa2rdXr7Ab1493fda534929a5b5d05f80a8cf3d16.jpg
  54. BIN
      trading-go/pics/1699379135EcsSvbvLkVhTb1493fda534929a5b5d05f80a8cf3d16.jpg
  55. BIN
      trading-go/pics/1699379236UMWxsQPiGipJb1493fda534929a5b5d05f80a8cf3d16.jpg
  56. BIN
      trading-go/pics/16993792564VwCgGljHv72b1493fda534929a5b5d05f80a8cf3d16.jpg
  57. BIN
      trading-go/pics/1699379298Q9wKiV6pwJWQb1493fda534929a5b5d05f80a8cf3d16.jpg
  58. BIN
      trading-go/pics/1699379379PHHZ05aCWJFzdce75ebb26860c9184474d8244e28d16.png
  59. BIN
      trading-go/pics/1699379466JZV4SlIiQXvtb1493fda534929a5b5d05f80a8cf3d16.jpg
  60. BIN
      trading-go/pics/16993794898oKJ95NJEsbab1493fda534929a5b5d05f80a8cf3d16.jpg
  61. BIN
      trading-go/pics/16993794935ty3B2H5X3Bmdce75ebb26860c9184474d8244e28d16.png
  62. BIN
      trading-go/pics/1699379550IZYTYrqt06SLb1493fda534929a5b5d05f80a8cf3d16.jpg
  63. BIN
      trading-go/pics/16993795680m8uW98B2zfyb1493fda534929a5b5d05f80a8cf3d16.jpg
  64. BIN
      trading-go/pics/1699379608gJefzz5qUT66b1493fda534929a5b5d05f80a8cf3d16.jpg
  65. BIN
      trading-go/pics/16993796119oiRGyv8ZJCydce75ebb26860c9184474d8244e28d16.png
  66. BIN
      trading-go/pics/1699379613yT0RetLuz33T7baafd97122013df4eefc138a9d491e4.png
  67. BIN
      trading-go/pics/1699379672CnNaaJF3YcLeb1493fda534929a5b5d05f80a8cf3d16.jpg
  68. BIN
      trading-go/pics/1699379674ratvWnFOC9vPdce75ebb26860c9184474d8244e28d16.png
  69. BIN
      trading-go/pics/1699379676RMOFWe5Byq947baafd97122013df4eefc138a9d491e4.png
  70. BIN
      trading-go/pics/1699379751qAqzwUA2PA5cb1493fda534929a5b5d05f80a8cf3d16.jpg
  71. BIN
      trading-go/pics/1699379788EG6q1cjspfrGb432cdf9781144598ab25ee646cd049d.jpg
  72. BIN
      trading-go/pics/169937981339pnnWLwtUrtdce75ebb26860c9184474d8244e28d16.png
  73. BIN
      trading-go/pics/1699381222EFHkA4BUioDyb1493fda534929a5b5d05f80a8cf3d16.jpg
  74. BIN
      trading-go/pics/16993821607EVsrcizBfSTb1493fda534929a5b5d05f80a8cf3d16.jpg
  75. BIN
      trading-go/pics/1699382199cc45G808GUT8b1493fda534929a5b5d05f80a8cf3d16.jpg
  76. BIN
      trading-go/pics/1699382296S6Uu2diSpWkHb1493fda534929a5b5d05f80a8cf3d16.jpg
  77. BIN
      trading-go/pics/1699382571CXZVd9rNqgPAb1493fda534929a5b5d05f80a8cf3d16.jpg
  78. BIN
      trading-go/pics/1699382666EuwAd5QVrvHZb1493fda534929a5b5d05f80a8cf3d16.jpg
  79. BIN
      trading-go/pics/1699382681Pn8FxS8qyQ09b1493fda534929a5b5d05f80a8cf3d16.jpg
  80. BIN
      trading-go/pics/1699382734DyGE8MNb6jlIb1493fda534929a5b5d05f80a8cf3d16.jpg
  81. BIN
      trading-go/pics/1699449524Qijb0Nylwcjv3fe18ddeee3f922fde4ea74ae229e235.jpg
  82. BIN
      trading-go/pics/1699450042EKRxNaHJGEJHdce75ebb26860c9184474d8244e28d16.png
  83. BIN
      trading-go/pics/1699450079vDMN0qnbpNyTdce75ebb26860c9184474d8244e28d16.png
  84. BIN
      trading-go/pics/1699451535SuxOmjisW2tkd85dedb14362dc3a251c6c85705ec495.jpg
  85. BIN
      trading-go/pics/1702540218QWS0sjmdtMywcb800b0e59cd22f2a10309329be957a9.jpg
  86. BIN
      trading-go/pics/1702540821sZwY77rQFtM2dce75ebb26860c9184474d8244e28d16.png
  87. BIN
      trading-go/pics/17025409532eMSafToj8gudce75ebb26860c9184474d8244e28d16.png
  88. BIN
      trading-go/pics/1702541132uT2BCMgiZA0v7baafd97122013df4eefc138a9d491e4.png
  89. BIN
      trading-go/pics/1702541386VRlRuBCi9b0qdce75ebb26860c9184474d8244e28d16.png
  90. BIN
      trading-go/pics/1702542127wVeSqPyrviJUdce75ebb26860c9184474d8244e28d16.png
  91. BIN
      trading-go/pics/1702542233WjAPxDBg44wvdce75ebb26860c9184474d8244e28d16.png
  92. BIN
      trading-go/pics/17025422755pRxydltjb99dce75ebb26860c9184474d8244e28d16.png
  93. BIN
      trading-go/pics/17025423420kg8E4hkvczOdce75ebb26860c9184474d8244e28d16.png
  94. BIN
      trading-go/pics/1702542562gTfCcjXqQ2Zydce75ebb26860c9184474d8244e28d16.png
  95. BIN
      trading-go/pics/170254528518oQnJKgKLqAdce75ebb26860c9184474d8244e28d16.png
  96. BIN
      trading-go/pics/1702545454z1REibHMQiA7dce75ebb26860c9184474d8244e28d16.png
  97. BIN
      trading-go/pics/1702545527aav1gLONEjOUdce75ebb26860c9184474d8244e28d16.png
  98. BIN
      trading-go/pics/1702545650hhYlNXcydp3vdce75ebb26860c9184474d8244e28d16.png
  99. BIN
      trading-go/pics/1702545696WpBAYlipKjAcdce75ebb26860c9184474d8244e28d16.png
  100. BIN
      trading-go/pics/17026291282u3VVWKPLyQhdce75ebb26860c9184474d8244e28d16.png

+ 4 - 9
fore-end/API/appraise.js

@@ -26,7 +26,8 @@ const API = {
     postGoodsURL: '/goods/create',
     getGoodsDetailURL: '/goods/detail',
     postReviseOrder: '/order/revise',
-    getRecommendUrl: '/goods/recommend',
+	getRecommendUrl: '/goods/recommend',
+	getUserAllGoodsUrl:'/goods/user'
 }
 
 //查询列表时传参---注意参数数据类型
@@ -70,10 +71,6 @@ function login(params) {
 function getUserInfo(params) {
 	return request.get(
 		API.getUserInfoURL,
-		{
-			header: params.header,
-			params: params.data,
-		}
 	);
 }
 
@@ -181,7 +178,7 @@ function getUserInfoList(params) {
 	return request.post(
 		API.getUserInfoListUrl,
 		{
-			data: params.data,
+			data:params.data
 		}
 	)
 }
@@ -252,10 +249,8 @@ function postOrderChange(params) {
 
 //获取推荐商品
 function getRecommend(data) {
-    var uid = parseInt(data.user_id);
-    console.log(uid);
     return request.get(
-        API.getRecommendUrl + '?id=' + uid + '&size=' + data.pageSize
+        API.getRecommendUrl +`?id=${data.user_id}&size=${data.pageSIze}`
     )
 }
 

+ 3 - 1
fore-end/components/messageRecord/messageRecord.wxss

@@ -23,8 +23,10 @@
 }
 
 .message-text-record{
-	font-size: 12px;
+	font-size: 14px;
 	color: rgba(128, 128, 128, 1);
+	width: 160px;
+	overflow: hidden;
 }
 
 .message-text-time{

+ 60 - 11
fore-end/pages/chat/chat.js

@@ -1,5 +1,6 @@
 // pages/chat/chat.js
-const {getUserInfoList,getChattingRecord,getGoodsInfo,setWsConnect} = require('../../API/appraise')
+const {getUserInfoList,getChattingRecord,getGoodsInfo,setWsConnect,getUserInfo} = require('../../API/appraise');
+const {formatTime} = require('../../utils/util')
 import messageMap from '../../utils/util'
 var socketMsgQueue = {
 	from: wx.getStorageSync('uid'),
@@ -10,7 +11,7 @@ var socketMsgQueue = {
 }
 var getUserInfoListOption = {
 	data:{
-		uid:[]
+		id:[]
 	}
 }
 var getChattingRecordOption = {
@@ -22,6 +23,11 @@ var getGoodsInfoOption = {
 	uid:'',
 	date:''
 }
+
+var getChattingRecordOption = {
+	uid:'',
+	target:''
+}
 var setWsConnectOption = {
 	uid: wx.getStorageSync('uid')
 }
@@ -80,6 +86,7 @@ Page({
 			uid:wx.getStorageSync('uid'),
 			date:time
 		}
+		let targetId = '';
 		getGoodsInfo(getGoodsInfoOption).then((res)=>{
 			console.log(res);
 			const good = res.data.data;
@@ -93,16 +100,63 @@ Page({
 		}).catch((err)=>{
 			console.log(err);
 		})
-		//获取用户信息
-		getUserInfoListOption.data.uid = [this.data.toUid];
+		//获取对方用户信息
+		getUserInfoListOption.data.id = [this.data.toUid];
 		getUserInfoList(getUserInfoListOption).then((res)=> {
 			console.log(res);
 			const {users} = res.data.data;
+			targetId = users[0].uid;
+			getChattingRecordOption.target = targetId;
 			wx.setStorageSync('anotherNickName', users[0].name);
 			wx.setStorageSync('anotherAvatar', users[0].avatar);
 		}).catch((err)=>{
 			console.log(err);
 		})
+
+		//获取用户本人信息
+		getUserInfo().then((res)=>{
+			console.log(res);
+			let data = res.data.data;
+			wx.setStorageSync('avatar', data.avatar);
+			wx.setStorageSync('nickname', data.name);
+		}).catch((err) => {
+			console.log(err);
+		})
+
+		//获取聊天记录
+		getChattingRecordOption.uid = wx.getStorageSync('uid');
+		console.log(getChattingRecordOption);
+		getChattingRecord(getChattingRecordOption).then((res)=>{
+			let data = res.data.data;
+			console.log(data);
+			let chatList1 = [];
+			for(let i = 0;i<data.length;i++)
+			{
+				let message = {};
+				message['from'] = data[i].from;
+				message['to'] = data[i].to;
+				message['message'] = data[i].content;
+				message['type'] = data[i].msgType == 1 ? 'text':'pic';
+				message['time'] = formatTime(data[i].time);
+				if(data[i].from === wx.getStorageSync('uid'))
+				{
+					message['nickname'] = wx.getStorageSync('nickname');
+					message['avatar'] = wx.getStorageSync('avatar');
+				}else {
+					message['nickname'] = wx.getStorageSync('anotherNickName');
+					message['avatar'] = wx.getStorageSync('anotherAvatar');
+				}
+				console.log(message);
+				chatList1.push(message);
+				console.log(chatList1);
+			}
+			this.setData({
+				chatList:chatList1,
+			})
+		}).catch((err)=>{
+			console.log(err);
+		})
+
 		//建立ws连接
 		setWsConnect(setWsConnectOption).then((res)=> {
 			console.log(res);
@@ -114,12 +168,7 @@ Page({
 			if(res.msgType == 1){
 			  //获取当前时间
 			  let date = new Date();
-			  let month = date.getMonth() + 1;
-			  let day = date.getDate();
-			  let hour = date.getHours();
-			  let minu = date.getMinutes();
-			  let now1 = month < 10 ? '0' + month : month;
-			  let now2 = day < 10 ? '0' + day : day;
+			  console.log(date);
 			  //处理数据
 			  if(res.from == this.data.toUid){
 				let msg = {
@@ -127,7 +176,7 @@ Page({
 					to:res.to,
 					message: res.content,
 					type: 'text',
-					time: now1 + '-' + now2 + ' ' + hour + ':' + minu,
+					time: formatTime(date),
 					nickname: wx.getStorageSync('anotherNiakName'),
 					avatar: wx.getStorageSync('anotherAvatar')
 				}

+ 3 - 1
fore-end/pages/chat/chat.wxss

@@ -63,7 +63,9 @@ page {
     padding: 20rpx;
     display: flex;
     align-items: center;
-    line-height: 45rpx;
+	line-height: 45rpx;
+	max-width: 240px;
+	word-break: break-all;
 }
 
 .msg-self {

+ 16 - 10
fore-end/pages/message/message.js

@@ -1,5 +1,6 @@
 // pages/message/message.js
 const {getUserRelation,addUserRelation, getUserInfoList, getGoodsInfoList,getLatestChattingRecord} = require('../../API/appraise')
+const {formatTime} = require('../../utils/util')
 import messageMap from '../../utils/util'
 var baseUrl = 'http://192.168.31.27:8084';
 var getRelationOption = {
@@ -19,7 +20,7 @@ var addRelationOption = {
 
 var getUserInfoListOption = {
 	data:{
-		uid:[]
+		id:[]
 	}
 }
 
@@ -101,12 +102,6 @@ Page({
      * 生命周期函数--监听页面加载
      */
     onLoad(options) {
-		
-    },
-    /**
-     * 生命周期函数--监听页面初次渲染完成
-     */
-    onReady() {
 		var message = this.data.message;
 		// addUserRelation(addRelationOption).then((res) => {
 		// 	console.log(res);
@@ -132,7 +127,7 @@ Page({
 			}
 			console.log(target);
 			console.log(goodsId);
-			getUserInfoListOption.data.uid = target;
+			getUserInfoListOption.data.id = target;
 			console.log(getUserInfoListOption);
 			getUserInfoList(getUserInfoListOption).then((res) => {
 				console.log(res);
@@ -148,11 +143,16 @@ Page({
 					targetIds.push(users[i].uid);
 				}
 				//获取最后一条聊天记录
-				for(let v of targetIds){
+				for(let i = 0;i<targetIds.length;i++){
 					getLatestChattingRecordOption.uid = wx.getStorageSync('uid');
-					getLatestChattingRecordOption.target = v;
+					getLatestChattingRecordOption.target = targetIds[i];
 					getLatestChattingRecord(getLatestChattingRecordOption).then((res=>{
 						console.log(res);
+						let data = res.data.data;
+						console.log(data);
+						message[i].item['lastMessageRecord'] = data.content;
+						message[i].item['messageTime'] = formatTime(data.time);
+						console.log(message);
 					})).catch((err=>{
 						console.log(err);
 					}))
@@ -180,6 +180,12 @@ Page({
 			console.log(err);
 		})
     },
+    /**
+     * 生命周期函数--监听页面初次渲染完成
+     */
+    onReady() {
+		
+    },
 
     /**
      * 生命周期函数--监听页面显示

+ 1 - 1
fore-end/project.private.config.json

@@ -2,7 +2,7 @@
 	"description": "项目私有配置文件。此文件中的内容将覆盖 project.config.json 中的相同字段。项目的改动优先同步到此文件中。详见文档:https://developers.weixin.qq.com/miniprogram/dev/devtools/projectconfig.html",
 	"projectname": "wechatTrading",
 	"setting": {
-		"compileHotReLoad": true,
+		"compileHotReLoad": false,
 		"urlCheck": false,
 		"autoAudits": false,
 		"bigPackageSizeSupport": false,

+ 5 - 4
fore-end/utils/util.js

@@ -1,9 +1,10 @@
 import Toast from '@vant/weapp/toast/toast';
 const { loginURL, registerURL } = require('../API/appraise')
-const baseURL = "http://124.222.126.172:8084";//后台服务提供的地址
-const wsConnectURL = "ws://124.222.126.172:8084";//websocket连接地址
+const baseURL = "http://192.168.31.27:8084";//后台服务提供的地址
+const wsConnectURL = "ws://192.168.31.27:8084";//websocket连接地址
 const uploadUrl = "/pic/upload";
-const formatTime = date => {
+const formatTime = timestamp => {
+	let date = new Date(timestamp);
   const year = date.getFullYear()
   const month = date.getMonth() + 1
   const day = date.getDate()
@@ -30,7 +31,7 @@ function http(url, option) {
 		  url: baseURL + url,
 		  header:{
             "Authorization": (url!=loginURL && url!=registerURL) ? wx.getStorageSync('token') : '',
-            "content-type":"application/x-www-form-urlencoded"
+            "content-type":"application/json"
 		  },
 		  ...option,
 

+ 1 - 1
trading-go/common/database.go

@@ -2,7 +2,7 @@ package common
 
 import (
 	"fmt"
-	"github.com/go-redis/redis/v8"
+	"github.com/go-redis/redis/v9"
 	_ "github.com/go-sql-driver/mysql"
 	"github.com/jmoiron/sqlx"
 	"github.com/spf13/viper"

+ 1 - 1
trading-go/config/config.yml

@@ -15,4 +15,4 @@ redis:
 time:
   time: 2023-8-16
 gorse:
-  addr: "http://47.109.143.151:8088"
+  addr: "http://127.0.0.1:8088"

+ 78 - 14
trading-go/controller/chatcontroller.go

@@ -90,20 +90,20 @@ func reception(conn *websocket.Conn, uid uint) {
 	}
 }
 
-func broadcast(data model.Message) {
-	for _, conn := range Conns {
-		msg, err := json.Marshal(data)
-		if err != nil {
-			fmt.Println(err.Error())
-			break
-		}
-		err = conn.conn.WriteMessage(data.MsgType, msg)
-		if err != nil {
-			fmt.Println(err.Error())
-			break
-		}
-	}
-}
+//func broadcast(data model.Message) {
+//	for _, conn := range Conns {
+//		msg, err := json.Marshal(data)
+//		if err != nil {
+//			fmt.Println(err.Error())
+//			break
+//		}
+//		err = conn.conn.WriteMessage(data.MsgType, msg)
+//		if err != nil {
+//			fmt.Println(err.Error())
+//			break
+//		}
+//	}
+//}
 
 func heartBeat(conn *websocket.Conn, uid uint) {
 	defer func() {
@@ -231,3 +231,67 @@ func GetMsgToPaged(c *gin.Context) {
 	}
 	response.Success(c.Writer, "success", rsp)
 }
+
+// GetMsg
+// @Tags 聊天模块
+// @Summary 获取与特定两个用户之间的所有聊天记录
+// @Param uid query string true "用户id"
+// @Param target query string true "对象id"
+// @Success 200 {object} response.Response
+// @Router /chat/msg [get]
+func GetMsg(c *gin.Context) {
+	var ms model.Message
+	id := c.Query("uid")
+	uid, err := strconv.ParseUint(id, 10, 64)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	t := c.Query("target")
+	target, err := strconv.ParseUint(t, 10, 64)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	msgs, err := ms.GetMsg(uint(uid), uint(target))
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	response.Success(c.Writer, "success", msgs)
+}
+
+// GetMsgLatest
+// @Tags 聊天模块
+// @Summary 获取与特定用户相关的最后一条聊天记录
+// @Param uid query string true "用户id"
+// @Param target query string true "对象id"
+// @Success 200 {object} response.Response
+// @Router /chat/latest [get]
+func GetMsgLatest(c *gin.Context) {
+	var ms model.Message
+	id := c.Query("uid")
+	uid, err := strconv.ParseUint(id, 10, 64)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	t := c.Query("target")
+	target, err := strconv.ParseUint(t, 10, 64)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	msg, err := ms.GetLatestMsg(uint(uid), uint(target))
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 400)
+		return
+	}
+	response.Success(c.Writer, "success", msg)
+}

+ 66 - 17
trading-go/controller/goodscontroller.go

@@ -1,9 +1,9 @@
 package controller
 
 import (
+	"fmt"
 	"github.com/gin-gonic/gin"
 	"strconv"
-	"time"
 	"trading-go/model"
 	"trading-go/response"
 	"trading-go/util"
@@ -31,6 +31,7 @@ import (
 // @Success 200 {object} response.Response
 // @Router /goods/create [post]
 func CreatGoods(c *gin.Context) {
+	var pic model.Pic
 	var goodsJson model.GoodsJson
 	var category model.CategoryOfGoods
 	err := c.ShouldBindJSON(&goodsJson)
@@ -44,11 +45,12 @@ func CreatGoods(c *gin.Context) {
 		response.Fail(c.Writer, msg, 500)
 		return
 	}
+	fmt.Println(goodsJson)
 	goods := goodsJson.Change()
 	id, err := goods.Create()
-	go util.NewItem(id, uint(time.Now().Unix()), goodsJson.Title, goodsJson.Desc)
 	go util.NewIndex(id, goodsJson.Desc+goodsJson.Title)
 	err = category.Save(id, goodsJson.Categories)
+	err = pic.Save(id, goodsJson.Pic)
 	if err != nil {
 		msg := err.Error()
 		response.Fail(c.Writer, msg, 500)
@@ -66,17 +68,28 @@ func CreatGoods(c *gin.Context) {
 // @Router /goods/delete/{id} [delete]
 func DGoods(c *gin.Context) {
 	var goods model.Goods
+	var pic model.Pic
 	ids := c.Param("id")
 	id, err := strconv.Atoi(ids)
 
-	go util.DelItem(uint(id))
-
 	if err != nil {
 		response.Fail(c.Writer, err.Error(), 500)
 		return
 	}
 	goods.Id = uint(id)
+	pic.Id = uint(id)
 	err = goods.Delete()
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	err = pic.Delete()
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
 	go util.DelIndex(goods.Id)
 	if err != nil {
 		msg := err.Error()
@@ -133,7 +146,7 @@ func GetGoodsPage(c *gin.Context) {
 // @Router /goods/recommend [get]
 func GetRecommend(c *gin.Context) {
 	var goods model.GoodsSurface
-	ids := c.Param("id")
+	ids := c.Query("id")
 	s := c.Query("size")
 	id, err := strconv.Atoi(ids)
 	size, err := strconv.Atoi(s)
@@ -159,6 +172,7 @@ func GetRecommend(c *gin.Context) {
 // @Router /goods/revise [post]
 func ReviseGoods(c *gin.Context) {
 	var goods model.Goods
+	var pic model.Pic
 	err := c.ShouldBindJSON(&goods)
 	if err != nil {
 		msg := err.Error()
@@ -166,19 +180,23 @@ func ReviseGoods(c *gin.Context) {
 		return
 	}
 	err = goods.Revise()
-	go func() {
-		util.DelIndex(goods.Id)
-		util.NewIndex(goods.Id, goods.Desc+goods.Title)
-	}()
-	go func() {
-		util.DelItem(goods.Id)
-		util.NewItem(goods.Id, uint(time.Now().Unix()), goods.Title, goods.Desc)
-	}()
 	if err != nil {
 		msg := err.Error()
 		response.Fail(c.Writer, msg, 500)
 		return
 	}
+	pic.Id = goods.Id
+	err = pic.Delete()
+	err = pic.Save(pic.Id, goods.Pic)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	go func() {
+		util.DelIndex(goods.Id)
+		util.NewIndex(goods.Id, goods.Desc+goods.Title)
+	}()
 	response.Success(c.Writer, "success", nil)
 }
 
@@ -188,28 +206,32 @@ func ReviseGoods(c *gin.Context) {
 // @Produce application/json
 // @Param id path int64 true "商品id"
 // @Param uid query int64 true "访问的用户id"
-// @Param date query int64 true "访问时间的时间戳"
 // @Success 200 {object} response.Response
 // @Router /goods/detail/{id} [get]
 func GetGoodDetail(c *gin.Context) {
 	var goods model.Goods
+	var pic model.Pic
 	ids := c.Param("id")
 	uids := c.Query("uid")
-	ts := c.Query("date")
 	id, err := strconv.Atoi(ids)
 	uid, err := strconv.Atoi(uids)
-	date, err := strconv.Atoi(ts)
 	if err != nil {
 		response.Fail(c.Writer, err.Error(), 500)
 		return
 	}
 	goods.Id = uint(id)
 	err = goods.GetDetail()
+	pics, err := pic.GetGoodsPic(uint(id))
+	goods.Pic = pics
+	if err != nil {
+		response.Fail(c.Writer, err.Error(), 500)
+		return
+	}
+	err = model.Recommend(uint(uid), uint(id))
 	if err != nil {
 		response.Fail(c.Writer, err.Error(), 500)
 		return
 	}
-	go util.Recommend(uint(uid), uint(id), uint(date))
 	response.Success(c.Writer, "success", goods)
 }
 
@@ -305,3 +327,30 @@ func GetGoodsCategory(c *gin.Context) {
 	}
 	response.Success(c.Writer, "success", rsp)
 }
+
+// GetGoodsList
+// @Tags 商品模块
+// @Summary 批量获取商品信息
+// @Produce application/json
+// @Param id body []string true "商品id列表"
+// @Success 200 {object} response.Response
+// @Router /goods/list [post]
+func GetGoodsList(c *gin.Context) {
+	var g model.GoodsSurface
+	jsonData := struct {
+		Id []uint `json:"id"`
+	}{}
+	err := c.ShouldBindJSON(&jsonData)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	goodsInfo, err := g.GetGoodsList(jsonData.Id)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	response.Success(c.Writer, "success", gin.H{"goods": goodsInfo})
+}

+ 1 - 1
trading-go/controller/ordercontroller.go

@@ -28,7 +28,7 @@ func GetAllOrder(c *gin.Context) {
 // @Tags 订单模块
 // @Summary 获取用户的所有订单
 // @Produce application/json
-// @Param id query uint true "用户id"
+// @Param id query string true "用户id"
 // @Success 200 {object} response.Response
 // @Router /order/user [get]
 func GetUserOrder(c *gin.Context) {

+ 0 - 7
trading-go/controller/piccontrller.go

@@ -47,14 +47,7 @@ func Upload(c *gin.Context) {
 		return
 	}
 	url := "http://" + c.Request.Host + path
-	pic.Name = file.Filename
 	pic.Url = url
-	err = pic.Save()
-	if err != nil {
-		msg := err.Error()
-		response.Fail(c.Writer, msg, 500)
-		return
-	}
 	response.Success(c.Writer, "success", pic)
 }
 

+ 2 - 1
trading-go/controller/relationcontroller.go

@@ -19,6 +19,7 @@ import (
 func RCreat(c *gin.Context) {
 	var relationJson model.RelationJson
 	err := c.ShouldBindJSON(&relationJson)
+	fmt.Println(relationJson)
 	if err != nil {
 		response.Fail(c.Writer, err.Error(), 500)
 		return
@@ -53,7 +54,7 @@ func GetFriend(c *gin.Context) {
 		response.Fail(c.Writer, err.Error(), 500)
 		return
 	}
-	response.Success(c.Writer, "success", friends)
+	response.Success(c.Writer, "success", gin.H{"fUid": friends})
 }
 
 // GetBadRelation

+ 57 - 9
trading-go/controller/usercontroller.go

@@ -2,7 +2,6 @@ package controller
 
 import (
 	"errors"
-	"fmt"
 	"github.com/gin-gonic/gin"
 	"strconv"
 	"trading-go/model"
@@ -21,7 +20,6 @@ import (
 func Register(c *gin.Context) {
 	var userJ model.UserJson
 	err := c.ShouldBindJSON(&userJ)
-	fmt.Println(userJ)
 	if err != nil {
 		msg := err.Error()
 		response.Fail(c.Writer, msg, 500)
@@ -52,8 +50,6 @@ func Register(c *gin.Context) {
 
 	err = user.Register()
 
-	go util.NewUser(uint(id))
-
 	if err != nil {
 		msg := err.Error()
 		response.Fail(c.Writer, msg, 500)
@@ -64,6 +60,35 @@ func Register(c *gin.Context) {
 	}
 }
 
+type NewRec struct {
+	Uid  uint   `json:"uid"`
+	CIds []uint `json:"cIds"`
+}
+
+// NewRecommend
+// @Tags 用户模块
+// @Summary 初始化用户推荐数据
+// @Produce application/json
+// @param data body NewRec false "推荐信息"
+// @Success 200 {object} response.Response
+// @Router /user/rec/new [post]
+func NewRecommend(c *gin.Context) {
+	jsonData := NewRec{}
+	err := c.ShouldBind(&jsonData)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	err = model.NewRecommend(jsonData.Uid, jsonData.CIds)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	response.Success(c.Writer, "success", nil)
+}
+
 // Login
 // @Tags 用户模块
 // @Summary 登录
@@ -75,7 +100,6 @@ func Login(c *gin.Context) {
 	var user model.User
 	user.Vid = c.PostForm("vid")
 	err, nu := user.Login()
-	fmt.Printf("%v", user.Vid)
 	if err != nil && err.Error() == "sql: no rows in result set" {
 		err = util.NoSuchUserError
 		msg := err.Error()
@@ -97,7 +121,6 @@ func Login(c *gin.Context) {
 		"token":     token,
 		"user_info": nu,
 	}
-	fmt.Println(data)
 	response.Success(c.Writer, "success", data)
 }
 
@@ -112,7 +135,6 @@ func Login(c *gin.Context) {
 func ModifyUser(c *gin.Context) {
 	var userJ model.UserJson
 	err := c.ShouldBindJSON(&userJ)
-	fmt.Printf("%#v", userJ)
 	user := userJ.Change()
 	if err != nil {
 		msg := err.Error()
@@ -154,7 +176,6 @@ func ModifyUser(c *gin.Context) {
 func UserInfo(c *gin.Context) {
 	var u model.User
 	token := c.GetHeader("Authorization")
-	fmt.Println(token)
 	t, claim, err := util.ParseToken(token)
 	if err != nil {
 		response.Fail(c.Writer, "failed to parse token", 500)
@@ -166,7 +187,6 @@ func UserInfo(c *gin.Context) {
 	}
 	u.Uid = claim.UserId
 	nu, err := u.Info()
-	fmt.Printf("%v", nu)
 	if err != nil || nu.Vid == "" {
 		response.Fail(c.Writer, "failed", 500)
 	}
@@ -208,3 +228,31 @@ func GetUserPaged(c *gin.Context) {
 	}
 	response.Success(c.Writer, "success", rsp)
 }
+
+// GetUserList
+// @Tags 用户模块
+// @Summary 批量获取用户信息
+// @Produce application/json
+// @Param uid body []string true "用户id列表"
+// @Success 200 {object} response.Response
+// @Router /user/list [post]
+func GetUserList(c *gin.Context) {
+	var u model.User
+	jsonData := struct {
+		Uid []string `json:"uid"`
+	}{}
+	err := c.ShouldBindJSON(&jsonData)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+		return
+	}
+	userInfo, err := u.GetUserList(jsonData.Uid)
+	if err != nil {
+		msg := err.Error()
+		response.Fail(c.Writer, msg, 500)
+
+		return
+	}
+	response.Success(c.Writer, "success", gin.H{"users": userInfo})
+}

+ 203 - 24
trading-go/docs/docs.go

@@ -310,6 +310,70 @@ const docTemplate = `{
                 }
             }
         },
+        "/chat/latest": {
+            "get": {
+                "tags": [
+                    "聊天模块"
+                ],
+                "summary": "获取与特定用户相关的最后一条聊天记录",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "用户id",
+                        "name": "uid",
+                        "in": "query",
+                        "required": true
+                    },
+                    {
+                        "type": "string",
+                        "description": "对象id",
+                        "name": "target",
+                        "in": "query",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/chat/msg": {
+            "get": {
+                "tags": [
+                    "聊天模块"
+                ],
+                "summary": "获取与特定两个用户之间的所有聊天记录",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "用户id",
+                        "name": "uid",
+                        "in": "query",
+                        "required": true
+                    },
+                    {
+                        "type": "string",
+                        "description": "对象id",
+                        "name": "target",
+                        "in": "query",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/chat/to/{page}/{pageSize}": {
             "get": {
                 "tags": [
@@ -475,13 +539,39 @@ const docTemplate = `{
                         "name": "uid",
                         "in": "query",
                         "required": true
-                    },
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/goods/list": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "商品模块"
+                ],
+                "summary": "批量获取商品信息",
+                "parameters": [
                     {
-                        "type": "integer",
-                        "description": "访问时间的时间戳",
-                        "name": "date",
-                        "in": "query",
-                        "required": true
+                        "description": "商品id列表",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
                     }
                 ],
                 "responses": {
@@ -787,7 +877,7 @@ const docTemplate = `{
                 "summary": "获取用户的所有订单",
                 "parameters": [
                     {
-                        "type": "integer",
+                        "type": "string",
                         "description": "用户id",
                         "name": "id",
                         "in": "query",
@@ -1123,6 +1213,39 @@ const docTemplate = `{
                 }
             }
         },
+        "/user/list": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "用户模块"
+                ],
+                "summary": "批量获取用户信息",
+                "parameters": [
+                    {
+                        "description": "用户id列表",
+                        "name": "uid",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/user/login": {
             "post": {
                 "produces": [
@@ -1183,6 +1306,35 @@ const docTemplate = `{
                 }
             }
         },
+        "/user/rec/new": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "用户模块"
+                ],
+                "summary": "初始化用户推荐数据",
+                "parameters": [
+                    {
+                        "description": "推荐信息",
+                        "name": "data",
+                        "in": "body",
+                        "schema": {
+                            "$ref": "#/definitions/controller.NewRec"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/user/register": {
             "post": {
                 "consumes": [
@@ -1253,6 +1405,20 @@ const docTemplate = `{
         }
     },
     "definitions": {
+        "controller.NewRec": {
+            "type": "object",
+            "properties": {
+                "cIds": {
+                    "type": "array",
+                    "items": {
+                        "type": "integer"
+                    }
+                },
+                "uid": {
+                    "type": "integer"
+                }
+            }
+        },
         "model.Appraise": {
             "type": "object",
             "properties": {
@@ -1316,14 +1482,15 @@ const docTemplate = `{
                 "id": {
                     "type": "integer"
                 },
-                "integrity": {
-                    "type": "integer"
-                },
                 "ownerId": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
-                "picId": {
-                    "type": "integer"
+                "pic": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
                 },
                 "place": {
                     "type": "string"
@@ -1351,14 +1518,15 @@ const docTemplate = `{
                 "desc": {
                     "type": "string"
                 },
-                "integrity": {
-                    "type": "integer"
-                },
                 "ownerId": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
-                "pic_id": {
-                    "type": "integer"
+                "pic": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
                 },
                 "place": {
                     "type": "string"
@@ -1378,7 +1546,8 @@ const docTemplate = `{
             "type": "object",
             "properties": {
                 "buyerId": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
                 "goodsId": {
                     "type": "integer"
@@ -1400,11 +1569,16 @@ const docTemplate = `{
         "model.RelationJson": {
             "type": "object",
             "properties": {
-                "owner": {
+                "goodsId": {
                     "type": "integer"
                 },
+                "owner": {
+                    "type": "string",
+                    "example": "0"
+                },
                 "target": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
                 "type": {
                     "type": "integer"
@@ -1427,7 +1601,8 @@ const docTemplate = `{
                     "type": "string"
                 },
                 "uid": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
                 "vid": {
                     "type": "string"
@@ -1449,6 +1624,10 @@ const docTemplate = `{
                 "sign": {
                     "type": "string"
                 },
+                "uid": {
+                    "type": "string",
+                    "example": ""
+                },
                 "vid": {
                     "type": "string"
                 }
@@ -1472,7 +1651,7 @@ const docTemplate = `{
 // SwaggerInfo holds exported Swagger Info so clients can modify it
 var SwaggerInfo = &swag.Spec{
 	Version:          "1.0",
-	Host:             "192.168.31.28:8084",
+	Host:             "",
 	BasePath:         "/WeChatTrading/trading-go",
 	Schemes:          []string{},
 	Title:            "二手交易",

+ 202 - 24
trading-go/docs/swagger.json

@@ -11,7 +11,6 @@
         },
         "version": "1.0"
     },
-    "host": "192.168.31.28:8084",
     "basePath": "/WeChatTrading/trading-go",
     "paths": {
         "/appraise/create": {
@@ -303,6 +302,70 @@
                 }
             }
         },
+        "/chat/latest": {
+            "get": {
+                "tags": [
+                    "聊天模块"
+                ],
+                "summary": "获取与特定用户相关的最后一条聊天记录",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "用户id",
+                        "name": "uid",
+                        "in": "query",
+                        "required": true
+                    },
+                    {
+                        "type": "string",
+                        "description": "对象id",
+                        "name": "target",
+                        "in": "query",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/chat/msg": {
+            "get": {
+                "tags": [
+                    "聊天模块"
+                ],
+                "summary": "获取与特定两个用户之间的所有聊天记录",
+                "parameters": [
+                    {
+                        "type": "string",
+                        "description": "用户id",
+                        "name": "uid",
+                        "in": "query",
+                        "required": true
+                    },
+                    {
+                        "type": "string",
+                        "description": "对象id",
+                        "name": "target",
+                        "in": "query",
+                        "required": true
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/chat/to/{page}/{pageSize}": {
             "get": {
                 "tags": [
@@ -468,13 +531,39 @@
                         "name": "uid",
                         "in": "query",
                         "required": true
-                    },
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
+        "/goods/list": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "商品模块"
+                ],
+                "summary": "批量获取商品信息",
+                "parameters": [
                     {
-                        "type": "integer",
-                        "description": "访问时间的时间戳",
-                        "name": "date",
-                        "in": "query",
-                        "required": true
+                        "description": "商品id列表",
+                        "name": "id",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
                     }
                 ],
                 "responses": {
@@ -780,7 +869,7 @@
                 "summary": "获取用户的所有订单",
                 "parameters": [
                     {
-                        "type": "integer",
+                        "type": "string",
                         "description": "用户id",
                         "name": "id",
                         "in": "query",
@@ -1116,6 +1205,39 @@
                 }
             }
         },
+        "/user/list": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "用户模块"
+                ],
+                "summary": "批量获取用户信息",
+                "parameters": [
+                    {
+                        "description": "用户id列表",
+                        "name": "uid",
+                        "in": "body",
+                        "required": true,
+                        "schema": {
+                            "type": "array",
+                            "items": {
+                                "type": "string"
+                            }
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/user/login": {
             "post": {
                 "produces": [
@@ -1176,6 +1298,35 @@
                 }
             }
         },
+        "/user/rec/new": {
+            "post": {
+                "produces": [
+                    "application/json"
+                ],
+                "tags": [
+                    "用户模块"
+                ],
+                "summary": "初始化用户推荐数据",
+                "parameters": [
+                    {
+                        "description": "推荐信息",
+                        "name": "data",
+                        "in": "body",
+                        "schema": {
+                            "$ref": "#/definitions/controller.NewRec"
+                        }
+                    }
+                ],
+                "responses": {
+                    "200": {
+                        "description": "OK",
+                        "schema": {
+                            "$ref": "#/definitions/response.Response"
+                        }
+                    }
+                }
+            }
+        },
         "/user/register": {
             "post": {
                 "consumes": [
@@ -1246,6 +1397,20 @@
         }
     },
     "definitions": {
+        "controller.NewRec": {
+            "type": "object",
+            "properties": {
+                "cIds": {
+                    "type": "array",
+                    "items": {
+                        "type": "integer"
+                    }
+                },
+                "uid": {
+                    "type": "integer"
+                }
+            }
+        },
         "model.Appraise": {
             "type": "object",
             "properties": {
@@ -1309,14 +1474,15 @@
                 "id": {
                     "type": "integer"
                 },
-                "integrity": {
-                    "type": "integer"
-                },
                 "ownerId": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
-                "picId": {
-                    "type": "integer"
+                "pic": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
                 },
                 "place": {
                     "type": "string"
@@ -1344,14 +1510,15 @@
                 "desc": {
                     "type": "string"
                 },
-                "integrity": {
-                    "type": "integer"
-                },
                 "ownerId": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
-                "pic_id": {
-                    "type": "integer"
+                "pic": {
+                    "type": "array",
+                    "items": {
+                        "type": "string"
+                    }
                 },
                 "place": {
                     "type": "string"
@@ -1371,7 +1538,8 @@
             "type": "object",
             "properties": {
                 "buyerId": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
                 "goodsId": {
                     "type": "integer"
@@ -1393,11 +1561,16 @@
         "model.RelationJson": {
             "type": "object",
             "properties": {
-                "owner": {
+                "goodsId": {
                     "type": "integer"
                 },
+                "owner": {
+                    "type": "string",
+                    "example": "0"
+                },
                 "target": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
                 "type": {
                     "type": "integer"
@@ -1420,7 +1593,8 @@
                     "type": "string"
                 },
                 "uid": {
-                    "type": "integer"
+                    "type": "string",
+                    "example": "0"
                 },
                 "vid": {
                     "type": "string"
@@ -1442,6 +1616,10 @@
                 "sign": {
                     "type": "string"
                 },
+                "uid": {
+                    "type": "string",
+                    "example": ""
+                },
                 "vid": {
                     "type": "string"
                 }

+ 137 - 21
trading-go/docs/swagger.yaml

@@ -1,5 +1,14 @@
 basePath: /WeChatTrading/trading-go
 definitions:
+  controller.NewRec:
+    properties:
+      cIds:
+        items:
+          type: integer
+        type: array
+      uid:
+        type: integer
+    type: object
   model.Appraise:
     properties:
       buyerId:
@@ -41,12 +50,13 @@ definitions:
         type: string
       id:
         type: integer
-      integrity:
-        type: integer
       ownerId:
-        type: integer
-      picId:
-        type: integer
+        example: "0"
+        type: string
+      pic:
+        items:
+          type: string
+        type: array
       place:
         type: string
       price:
@@ -64,12 +74,13 @@ definitions:
         type: array
       desc:
         type: string
-      integrity:
-        type: integer
       ownerId:
-        type: integer
-      pic_id:
-        type: integer
+        example: "0"
+        type: string
+      pic:
+        items:
+          type: string
+        type: array
       place:
         type: string
       price:
@@ -82,7 +93,8 @@ definitions:
   model.OrderJson:
     properties:
       buyerId:
-        type: integer
+        example: "0"
+        type: string
       goodsId:
         type: integer
       phone:
@@ -96,10 +108,14 @@ definitions:
     type: object
   model.RelationJson:
     properties:
-      owner:
+      goodsId:
         type: integer
+      owner:
+        example: "0"
+        type: string
       target:
-        type: integer
+        example: "0"
+        type: string
       type:
         type: integer
     type: object
@@ -114,7 +130,8 @@ definitions:
       sign:
         type: string
       uid:
-        type: integer
+        example: "0"
+        type: string
       vid:
         type: string
     type: object
@@ -128,6 +145,9 @@ definitions:
         type: string
       sign:
         type: string
+      uid:
+        example: ""
+        type: string
       vid:
         type: string
     type: object
@@ -139,7 +159,6 @@ definitions:
       message:
         type: string
     type: object
-host: 192.168.31.28:8084
 info:
   contact: {}
   description: 一个基于微信小程序的校园二手交易平台的api文档
@@ -336,6 +355,48 @@ paths:
       summary: 获取未过期且来源为特定用户的聊天记录
       tags:
       - 聊天模块
+  /chat/latest:
+    get:
+      parameters:
+      - description: 用户id
+        in: query
+        name: uid
+        required: true
+        type: string
+      - description: 对象id
+        in: query
+        name: target
+        required: true
+        type: string
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/response.Response'
+      summary: 获取与特定用户相关的最后一条聊天记录
+      tags:
+      - 聊天模块
+  /chat/msg:
+    get:
+      parameters:
+      - description: 用户id
+        in: query
+        name: uid
+        required: true
+        type: string
+      - description: 对象id
+        in: query
+        name: target
+        required: true
+        type: string
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/response.Response'
+      summary: 获取与特定两个用户之间的所有聊天记录
+      tags:
+      - 聊天模块
   /chat/to/{page}/{pageSize}:
     get:
       parameters:
@@ -465,11 +526,6 @@ paths:
         name: uid
         required: true
         type: integer
-      - description: 访问时间的时间戳
-        in: query
-        name: date
-        required: true
-        type: integer
       produces:
       - application/json
       responses:
@@ -480,6 +536,27 @@ paths:
       summary: 获取商品详细信息
       tags:
       - 商品模块
+  /goods/list:
+    post:
+      parameters:
+      - description: 商品id列表
+        in: body
+        name: id
+        required: true
+        schema:
+          items:
+            type: string
+          type: array
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/response.Response'
+      summary: 批量获取商品信息
+      tags:
+      - 商品模块
   /goods/recommend:
     get:
       parameters:
@@ -670,7 +747,7 @@ paths:
         in: query
         name: id
         required: true
-        type: integer
+        type: string
       produces:
       - application/json
       responses:
@@ -887,6 +964,27 @@ paths:
       summary: 获取用户信息
       tags:
       - 用户模块
+  /user/list:
+    post:
+      parameters:
+      - description: 用户id列表
+        in: body
+        name: uid
+        required: true
+        schema:
+          items:
+            type: string
+          type: array
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/response.Response'
+      summary: 批量获取用户信息
+      tags:
+      - 用户模块
   /user/login:
     post:
       parameters:
@@ -925,6 +1023,24 @@ paths:
       summary: 修改用户信息
       tags:
       - 用户模块
+  /user/rec/new:
+    post:
+      parameters:
+      - description: 推荐信息
+        in: body
+        name: data
+        schema:
+          $ref: '#/definitions/controller.NewRec'
+      produces:
+      - application/json
+      responses:
+        "200":
+          description: OK
+          schema:
+            $ref: '#/definitions/response.Response'
+      summary: 初始化用户推荐数据
+      tags:
+      - 用户模块
   /user/register:
     post:
       consumes:

+ 2 - 13
trading-go/go.mod

@@ -6,7 +6,7 @@ require (
 	github.com/gin-contrib/size v0.0.0-20230212012657-e14a14094dc4
 	github.com/gin-gonic/gin v1.9.1
 	github.com/go-ego/riot v0.0.0-20201013133145-f4c30acb3704
-	github.com/go-redis/redis/v8 v8.11.5
+	github.com/go-redis/redis/v9 v9.0.0-rc.1
 	github.com/go-sql-driver/mysql v1.7.1
 	github.com/golang-jwt/jwt v3.2.2+incompatible
 	github.com/gorilla/websocket v1.5.0
@@ -15,9 +15,6 @@ require (
 	github.com/swaggo/files v1.0.1
 	github.com/swaggo/gin-swagger v1.6.0
 	github.com/swaggo/swag v1.16.1
-	github.com/zhenghaoz/gorse v0.5.0-alpha.0.20230905121337-24d69b1426a0
-	gorm.io/driver/mysql v1.5.1
-	gorm.io/gorm v1.25.4
 )
 
 require (
@@ -34,7 +31,6 @@ require (
 	github.com/dgraph-io/ristretto v0.0.2 // indirect
 	github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
 	github.com/dustin/go-humanize v1.0.0 // indirect
-	github.com/felixge/httpsnoop v1.0.3 // indirect
 	github.com/fsnotify/fsnotify v1.6.0 // indirect
 	github.com/gabriel-vasile/mimetype v1.4.2 // indirect
 	github.com/gin-contrib/sse v0.1.0 // indirect
@@ -42,8 +38,6 @@ require (
 	github.com/go-ego/gpy v0.31.0 // indirect
 	github.com/go-ego/gse v0.50.3 // indirect
 	github.com/go-ego/murmur v0.10.0 // indirect
-	github.com/go-logr/logr v1.2.3 // indirect
-	github.com/go-logr/stdr v1.2.2 // indirect
 	github.com/go-ole/go-ole v1.2.4 // indirect
 	github.com/go-openapi/jsonpointer v0.20.0 // indirect
 	github.com/go-openapi/jsonreference v0.20.2 // indirect
@@ -58,12 +52,11 @@ require (
 	github.com/golang/protobuf v1.5.3 // indirect
 	github.com/golang/snappy v0.0.4 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
-	github.com/jinzhu/inflection v1.0.0 // indirect
-	github.com/jinzhu/now v1.1.5 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.5 // indirect
 	github.com/leodido/go-urn v1.2.4 // indirect
+	github.com/lib/pq v1.10.6 // indirect
 	github.com/magiconair/properties v1.8.7 // indirect
 	github.com/mailru/easyjson v0.7.7 // indirect
 	github.com/mattn/go-isatty v0.0.19 // indirect
@@ -83,10 +76,6 @@ require (
 	github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
 	github.com/ugorji/go/codec v1.2.11 // indirect
 	go.etcd.io/bbolt v1.3.4 // indirect
-	go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 // indirect
-	go.opentelemetry.io/otel v1.11.1 // indirect
-	go.opentelemetry.io/otel/metric v0.33.0 // indirect
-	go.opentelemetry.io/otel/trace v1.11.1 // indirect
 	golang.org/x/arch v0.4.0 // indirect
 	golang.org/x/crypto v0.11.0 // indirect
 	golang.org/x/net v0.12.0 // indirect

+ 3 - 30
trading-go/go.sum

@@ -111,8 +111,6 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
-github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
-github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
 github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
 github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
@@ -146,11 +144,6 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2
 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
 github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
 github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
-github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
-github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
-github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
-github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
 github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
 github.com/go-ole/go-ole v1.2.4 h1:nNBDSCOigTSiarFpYE9J/KtEA1IOW4CNeqT9TQDqCxI=
 github.com/go-ole/go-ole v1.2.4/go.mod h1:XCwSNxSkXRo4vlyPy93sltvi/qJq0jqQhjqQNIwKuxM=
@@ -180,11 +173,9 @@ github.com/go-playground/universal-translator v0.18.1/go.mod h1:xekY+UJKNuX9WP91
 github.com/go-playground/validator/v10 v10.10.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
 github.com/go-playground/validator/v10 v10.14.1 h1:9c50NUPC30zyuKprjL3vNZ0m5oG+jU0zvx4AqHGnv4k=
 github.com/go-playground/validator/v10 v10.14.1/go.mod h1:9iXMNT7sEkjXb0I+enO7QXmzG6QCsPWY4zveKFVRSyU=
-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-redis/redis/v9 v9.0.0-rc.1 h1:/+bS+yeUnanqAbuD3QwlejzQZ+4eqgfUtFTG4b+QnXs=
+github.com/go-redis/redis/v9 v9.0.0-rc.1/go.mod h1:8et+z03j0l8N+DvsVnclzjf3Dl/pFHgRk+2Ct1qw66A=
 github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
-github.com/go-sql-driver/mysql v1.7.0/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-sql-driver/mysql v1.7.1 h1:lUIinVbN1DY0xBg0eMOzmmtGoHwWBbvnWubQUrtU8EI=
 github.com/go-sql-driver/mysql v1.7.1/go.mod h1:OXbVy3sEdcQ2Doequ6Z5BW6fXNQTmx+9S1MCJN5yJMI=
 github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
@@ -283,11 +274,7 @@ github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpO
 github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
 github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
-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.1/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
-github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
-github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
 github.com/jmoiron/sqlx v1.3.5 h1:vFFPA71p1o5gAeqtEAwLU4dnX2napprKtHr7PYIcN3g=
 github.com/jmoiron/sqlx v1.3.5/go.mod h1:nRVWtLre0KfCLJvgxzCsLVMogSvQ1zNJtpYr2Ccp0mQ=
 github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
@@ -323,6 +310,7 @@ github.com/leodido/go-urn v1.2.4 h1:XlAE/cm/ms7TE/VMVoduSpNBoyc2dOxHs5MZSwAN63Q=
 github.com/leodido/go-urn v1.2.4/go.mod h1:7ZrI8mTSeBSHl/UaRyKQW1qZeMgak41ANeCNaVckg+4=
 github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
 github.com/lib/pq v1.10.6 h1:jbk+ZieJ0D7EVGJYpL9QTz7/YW6UHbmdnZWYyK5cdBs=
+github.com/lib/pq v1.10.6/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
 github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
 github.com/magiconair/properties v1.8.7 h1:IeQXZAiQcpL9mgcAe1Nu6cX9LLw6ExEHKjN0VQdvPDY=
 github.com/magiconair/properties v1.8.7/go.mod h1:Dhd985XPs7jluiymwWYZ0G4Z61jb3vdS329zhj2hYo0=
@@ -357,7 +345,7 @@ github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+W
 github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
 github.com/onsi/gomega v1.4.3/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
-github.com/onsi/gomega v1.18.1 h1:M1GfJqGRrBrrGGsbxzV5dqM2U2ApXefZCQpkukxYRLE=
+github.com/onsi/gomega v1.21.1 h1:OB/euWYIExnPBohllTicTHmGTrMaqJ67nIu80j0/uEM=
 github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o=
 github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
 github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
@@ -463,8 +451,6 @@ github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9de
 github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
 github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
-github.com/zhenghaoz/gorse v0.5.0-alpha.0.20230905121337-24d69b1426a0 h1:F2EDo6P92f6+wiYpP4N+g/w+Q3s2KE1AvT3Mdnf3E0s=
-github.com/zhenghaoz/gorse v0.5.0-alpha.0.20230905121337-24d69b1426a0/go.mod h1:JJucbAUvBHFPRoIJ+EOaStQsbn9NRPfx7dXh4jH1AEU=
 go.etcd.io/bbolt v1.3.4 h1:hi1bXHMVrlQh6WwxAy+qZCV/SYIlqo+Ushwdpa4tAKg=
 go.etcd.io/bbolt v1.3.4/go.mod h1:G5EMThwa9y8QZGBClrRx5EY+Yw9kAhnjy3bSjsnlVTQ=
 go.etcd.io/etcd v3.3.10+incompatible/go.mod h1:yaeTdrJi5lOmYerz05bd8+V7KubZs8YSFZfzsF9A6aI=
@@ -474,14 +460,6 @@ go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
 go.opencensus.io v0.22.5/go.mod h1:5pWMHQbX5EPX2/62yrJeAkowc+lfs/XD7Uxpq3pI6kk=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4 h1:aUEBEdCa6iamGzg6fuYxDA8ThxvOG240mAvWDU+XLio=
-go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.36.4/go.mod h1:l2MdsbKTocpPS5nQZscqTR9jd8u96VYZdcpF8Sye7mA=
-go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4=
-go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE=
-go.opentelemetry.io/otel/metric v0.33.0 h1:xQAyl7uGEYvrLAiV/09iTJlp1pZnQ9Wl793qbVvED1E=
-go.opentelemetry.io/otel/metric v0.33.0/go.mod h1:QlTYc+EnYNq/M2mNk1qDDMRLpqCOj2f/r5c7Fd5FYaI=
-go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ=
-go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk=
 go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
 go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
 go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
@@ -848,11 +826,6 @@ gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C
 gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/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/driver/mysql v1.5.1 h1:WUEH5VF9obL/lTtzjmML/5e6VfFR/788coz2uaVCAZw=
-gorm.io/driver/mysql v1.5.1/go.mod h1:Jo3Xu7mMhCyj8dlrb3WoCaRd1FhsVh+yMXb1jUInf5o=
-gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
-gorm.io/gorm v1.25.4 h1:iyNd8fNAe8W9dvtlgeRI5zSVZPsq3OpcTu37cYcpCmw=
-gorm.io/gorm v1.25.4/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
 honnef.co/go/tools v0.0.0-20180728063816-88497007e858/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
 honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 0 - 1
trading-go/main.go

@@ -15,7 +15,6 @@ import (
 // @license.name Apache 2.0
 // @license.url http://www.apache.org/licenses/LICENSE-2.0.html
 
-// @host 192.168.31.28:8084
 // @BasePath /WeChatTrading/trading-go
 func main() {
 

+ 66 - 48
trading-go/model/goods.go

@@ -9,70 +9,69 @@ import (
 )
 
 type Goods struct {
-	Id        uint   `db:"id"`
-	Pic       string `db:"pic"`
-	OwnerId   uint   `db:"owner_id"`
-	Desc      string `db:"desc"`
-	Title     string `db:"title"`
-	Price     uint   `db:"price"`
-	Integrity int    `db:"integrity"`
-	Place     string `db:"place"`
-	State     int    `db:"state"`
+	Id      uint   `db:"id"`
+	OwnerId uint   `db:"owner_id" json:"ownerId,string"`
+	Desc    string `db:"desc"`
+	Title   string `db:"title"`
+	Price   uint   `db:"price"`
+	Place   string `db:"place"`
+	State   int    `db:"state"`
+	Pic     []string
 }
 
 type GoodsJson struct {
-	Pic        string `json:"pic"`
-	OwnerId    uint   `json:"ownerId"`
-	Desc       string `json:"desc"`
-	Title      string `json:"title"`
-	Price      uint   `json:"price"`
-	Integrity  int    `json:"integrity"`
-	Place      string `json:"place"`
-	Categories []uint `json:"categories"`
-	State      int    `json:"state"`
+	OwnerId    uint     `json:"ownerId,string"`
+	Desc       string   `json:"desc"`
+	Title      string   `json:"title"`
+	Price      uint     `json:"price"`
+	Place      string   `json:"place"`
+	Categories []uint   `json:"categories"`
+	State      int      `json:"state"`
+	Pic        []string `json:"pic"`
 }
 
 type GoodsSurfaceJson struct {
-	Pic       string `json:"pic"`
-	OwnerId   uint   `json:"ownerId"`
-	Title     string `json:"title"`
-	Price     uint   `json:"price"`
-	Integrity int    `json:"integrity"`
-	State     int    `json:"state"`
+	Pic     string `json:"pic"`
+	OwnerId uint   `json:"ownerId,string"`
+	Title   string `json:"title"`
+	Price   uint   `json:"price"`
+	State   int    `json:"state"`
 }
 
 type GoodsSurface struct {
-	Id        uint   `db:"id"`
-	Pic       string `db:"pic"`
-	OwnerId   uint   `db:"owner_id"`
-	Title     string `db:"title"`
-	Price     uint   `db:"price"`
-	Integrity int    `db:"integrity"`
-	State     int    `db:"state"`
+	Id      uint   `db:"id"`
+	Pic     string `db:"pic"`
+	OwnerId uint   `db:"owner_id" json:"ownerId,string"`
+	Title   string `db:"title"`
+	Price   uint   `db:"price"`
+	State   int    `db:"state"`
 }
 
 func (g *GoodsJson) Change() Goods {
 	return Goods{
-		Pic:       g.Pic,
-		OwnerId:   g.OwnerId,
-		Desc:      g.Desc,
-		Title:     g.Title,
-		Price:     g.Price,
-		Integrity: g.Integrity,
-		Place:     g.Place,
-		State:     g.State,
+		Pic:     g.Pic,
+		OwnerId: g.OwnerId,
+		Desc:    g.Desc,
+		Title:   g.Title,
+		Price:   g.Price,
+		Place:   g.Place,
+		State:   g.State,
 	}
 }
 
 func (g *Goods) Create() (id uint, err error) {
 	db := common.DB
-	sqlStr := "INSERT INTO goods(pic, owner_id, `desc`, title, price, integrity, place, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?)"
-	_, err = db.Exec(sqlStr, g.Pic, g.OwnerId, g.Desc, g.Title, g.Price, g.Integrity, g.Place, g.State)
+	sqlStr := "INSERT INTO goods(owner_id, `desc`, title, price, place, state) VALUES (?, ?, ?, ?, ?, ?)"
+	result, err := db.Exec(sqlStr, g.OwnerId, g.Desc, g.Title, g.Price, g.Place, g.State)
 	if err != nil {
 		return
 	}
-	sqlStr = "INSERT INTO goods_surfaces(pic, owner_id, title, price, integrity, state) VALUES (?, ?, ?, ?, ?, ?)"
-	exec, err := db.Exec(sqlStr, g.Pic, g.OwnerId, g.Title, g.Price, g.Integrity, g.State)
+	insertId, err := result.LastInsertId()
+	if err != nil {
+		return
+	}
+	sqlStr = "INSERT INTO goods_surfaces(id, pic, owner_id, title, price, state) VALUES (?, ?, ?, ?, ?, ?)"
+	exec, err := db.Exec(sqlStr, insertId, g.Pic[0], g.OwnerId, g.Title, g.Price, g.State)
 	if err != nil {
 		return
 	}
@@ -119,13 +118,13 @@ func (g *GoodsSurface) GetCnt() (cnt int, err error) {
 
 func (g *Goods) Revise() error {
 	db := common.DB
-	sqlStr := "UPDATE goods SET pic = ?, owner_id = ?, `desc` = ?, title = ?, price = ?, integrity = ?, place = ?, state = ? WHERE id = ?"
-	_, err := db.Exec(sqlStr, g.Pic, g.OwnerId, g.Desc, g.Title, g.Price, g.Integrity, g.Place, g.State, g.Id)
+	sqlStr := "UPDATE goods SET owner_id = ?, `desc` = ?, title = ?, price = ?, place = ?, state = ? WHERE id = ?"
+	_, err := db.Exec(sqlStr, g.OwnerId, g.Desc, g.Title, g.Price, g.Place, g.State, g.Id)
 	if err != nil {
 		return err
 	}
-	sqlStr = "UPDATE goods_surfaces SET pic = ?, owner_id = ?, title = ?, price = ?, integrity = ?, state = ? WHERE id = ?"
-	_, err = db.Exec(sqlStr, g.Pic, g.OwnerId, g.Title, g.Price, g.Integrity, g.State, g.Id)
+	sqlStr = "UPDATE goods_surfaces SET pic = ?, owner_id = ?, title = ?, price = ?, state = ? WHERE id = ?"
+	_, err = db.Exec(sqlStr, g.Pic[0], g.OwnerId, g.Title, g.Price, g.State, g.Id)
 	return err
 }
 
@@ -152,6 +151,7 @@ func (g *GoodsSurface) GetCategoryPaged(page, pageSize int, category uint) (rsp
 	rsp.PageSize = pageSize
 	sqlStr := "SELECT goods_id FROM category_of_goods WHERE category_id = ?"
 	err = db.Select(&goodsIds, sqlStr, category)
+	fmt.Println(goodsIds)
 	if err != nil {
 		return
 	}
@@ -198,7 +198,7 @@ func (g *GoodsSurface) SearchPaged(key string, page, pageSize int) (rsp response
 }
 
 func (g *GoodsSurface) GetRecommend(id uint, size int) (goods []GoodsSurface, err error) {
-	ids, err := util.GetRecommend(id, size)
+	ids, err := GetRecommend(id, size)
 	db := common.DB
 	if err != nil {
 		return nil, err
@@ -214,3 +214,21 @@ func (g *GoodsSurface) GetRecommend(id uint, size int) (goods []GoodsSurface, er
 	err = db.Select(&goods, query, args...)
 	return
 }
+
+func (g *GoodsSurface) GetGoodsList(id []uint) (goods []GoodsSurface, err error) {
+	db := common.DB
+	sqlStr := "SELECT * FROM goods_surfaces WHERE id IN (?)"
+	query, args, err := sqlx.In(sqlStr, id)
+	if err != nil {
+		return nil, err
+	}
+	err = db.Select(&goods, query, args...)
+	return
+}
+
+func getGoodsIds() (ids []uint, err error) {
+	db := common.DB
+	sqlStr := "SELECT id FROM goods_surfaces"
+	err = db.Select(&ids, sqlStr)
+	return
+}

+ 54 - 3
trading-go/model/message.go

@@ -7,13 +7,14 @@ import (
 	"time"
 	"trading-go/common"
 	"trading-go/response"
+	"trading-go/util"
 )
 
 type Message struct {
 	MsgType int  `json:"msgType"`
-	From    uint `json:"from"`
-	To      uint `json:"to"`
-	Time    uint `json:"time"`
+	From    uint `json:"from,string"`
+	To      uint `json:"to,string"`
+	Time    uint `json:"time,string"`
 	Content any  `json:"content"`
 }
 
@@ -76,6 +77,25 @@ func (m Message) GetFrom(uid uint, page, pageSize int) (ms response.PageResponse
 	return
 }
 
+func (m Message) GetMsg(uid, target uint) (ms []Message, err error) {
+	mFrom, err := m.GetFrom(uid, 1, 10000000)
+	if err != nil {
+		return nil, err
+	}
+	mTo, err := m.GetTo(uid, 1, 10000000)
+	if err != nil {
+		return nil, err
+	}
+	s1, s2 := mFrom.Data.([]Message), mTo.Data.([]Message)
+	msgs := append(s1, s2...)
+	for _, msg := range msgs {
+		if msg.To == target || msg.From == target {
+			ms = append(ms, msg)
+		}
+	}
+	return ms, nil
+}
+
 func (m Message) GetTo(uid uint, page, pageSize int) (ms response.PageResponse, err error) {
 	var mess []Message
 	if page == 1 {
@@ -112,3 +132,34 @@ func (m Message) GetTo(uid uint, page, pageSize int) (ms response.PageResponse,
 	ms.Page = page
 	return
 }
+
+func (m Message) GetLatestMsg(uid, target uint) (msg Message, err error) {
+	mFrom, err := m.GetFrom(uid, 1, 10000000)
+	if err != nil {
+		return Message{}, err
+	}
+	mTo, err := m.GetTo(uid, 1, 10000000)
+	if err != nil {
+		return Message{}, err
+	}
+	s1, s2 := mFrom.Data.([]Message), mTo.Data.([]Message)
+	ms := append(s1, s2...)
+	if len(ms) == 0 {
+		return Message{}, util.NoMessageError
+	}
+	last := -1
+	for i := range ms {
+		if ms[i].From != target && ms[i].To != target {
+			continue
+		}
+		if last == -1 {
+			last = i
+		} else if ms[i].Time > ms[last].Time {
+			last = i
+		}
+	}
+	if last == -1 {
+		return Message{}, util.NoMessageError
+	}
+	return ms[last], nil
+}

+ 7 - 5
trading-go/model/orders.go

@@ -8,7 +8,7 @@ import (
 type Order struct {
 	Id      uint   `db:"id"`
 	GoodsId uint   `db:"goods_id"`
-	BuyerId uint   `db:"buyer_id"`
+	BuyerId uint   `db:"buyer_id" json:"buyerId,string"`
 	Time    uint   `db:"time"`
 	Place   string `db:"place"`
 	Phone   string `db:"phone"`
@@ -17,7 +17,7 @@ type Order struct {
 
 type OrderJson struct {
 	GoodsId uint   `json:"goodsId"`
-	BuyerId uint   `json:"buyerId"`
+	BuyerId uint   `json:"buyerId,string"`
 	Time    uint   `json:"time"`
 	Place   string `json:"place"`
 	Phone   string `json:"phone"`
@@ -25,6 +25,8 @@ type OrderJson struct {
 }
 
 type OrderSurface struct {
+	OrderId  uint   `json:"orderId" db:"order_id"`
+	GoodsId  uint   `json:"goodsId" db:"goods_id"`
 	GoodsImg string `json:"goodsImg" db:"pic"`
 	Price    uint   `json:"price" db:"price"`
 	State    int    `json:"state" db:"state"`
@@ -53,9 +55,9 @@ func (o Order) GetAll() (orders []Order, err error) {
 
 func (o Order) GetOwner(ownerId uint) (orderSurface []OrderSurface, err error) {
 	db := common.DB
-	sqlStr := `SELECT g.pic, g.price, o.state, g.title, u.name, u.uid 
-			   FROM orders as o, goods_surfaces as g, users as u
-			   WHERE o.buyer_id = ? AND o.goods_id = g.id AND g.owner_id = u.uid ;`
+	sqlStr := `SELECT o.id as order_id, g.id as goods_id, g.pic as pic, g.price as price, o.state as state, g.title as title, u.name as name, u.uid as uid
+	FROM orders as o, goods_surfaces as g, users as u
+	WHERE o.buyer_id = ? AND o.goods_id = g.id AND g.owner_id = u.uid;`
 	err = db.Select(&orderSurface, sqlStr, ownerId)
 	return
 }

+ 17 - 13
trading-go/model/pic.go

@@ -6,23 +6,20 @@ import (
 )
 
 type Pic struct {
-	Id   uint   `db:"id"`
-	Name string `db:"name"`
-	Url  string `db:"url"`
+	Id      uint   `db:"id"`
+	Url     string `db:"url"`
+	GoodsId uint   `db:"goods_id"`
 }
 
-func (p *Pic) Save() error {
+func (p *Pic) Save(uid uint, pics []string) error {
 	db := common.DB
-	sqlStr := "INSERT INTO pics(name, url) VALUES (:name, :url)"
-	exec, err := db.NamedExec(sqlStr, p)
-	if err != nil {
-		return err
+	sqlStr := "INSERT INTO pics(url, goods_id) VALUES (?, ?)"
+	for _, pic := range pics {
+		_, err := db.Exec(sqlStr, uid, pic)
+		if err != nil {
+			return err
+		}
 	}
-	id, err := exec.LastInsertId()
-	if err != nil {
-		return err
-	}
-	p.Id = uint(id)
 	return nil
 }
 
@@ -57,3 +54,10 @@ func (p *Pic) GetCnt() (cnt int, err error) {
 	err = db.Get(&cnt, sqlStr)
 	return
 }
+
+func (p *Pic) GetGoodsPic(id uint) (pics []string, err error) {
+	db := common.DB
+	sqlStr := "SELECT url FROM pics WHERE goods_id = ?"
+	err = db.Select(&pics, sqlStr, id)
+	return
+}

+ 154 - 0
trading-go/model/recommend.go

@@ -0,0 +1,154 @@
+package model
+
+import (
+	"math"
+	"trading-go/common"
+)
+
+type vector struct {
+	v []Pair
+}
+
+type recommendList struct {
+	list map[uint]float64
+}
+
+type Pair struct {
+	CategoryId uint `db:"category_id"`
+	Score      int  `db:"score"`
+}
+
+func Recommend(uid, goodsId uint) error {
+	db := common.DB
+	var cIds []int64
+	sqlStr := "SELECT category_id FROM category_of_goods WHERE goods_id = ?"
+	err := db.Select(&cIds, sqlStr, goodsId)
+	if err != nil {
+		return err
+	}
+	sqlStr = "INSERT INTO feedback(uid, category_id, score) VALUE (?, ?, 1) ON DUPLICATE KEY update  score=score + 1"
+	for _, id := range cIds {
+		_, err := db.Exec(sqlStr, uid, id)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func NewRecommend(uid uint, categoryId []uint) error {
+	db := common.DB
+
+	sqlStr := "INSERT INTO feedback(uid, category_id, score) VALUE (?, ?, 1) ON DUPLICATE KEY update  score=score + 1"
+	for _, id := range categoryId {
+		_, err := db.Exec(sqlStr, uid, id)
+		if err != nil {
+			return err
+		}
+	}
+	return nil
+}
+
+func GetRecommend(uid uint, cnt int) (goods []uint, err error) {
+	var rList recommendList
+	rList.list = make(map[uint]float64)
+	userV, err := getUserVector(uid)
+	if err != nil {
+		return nil, err
+	}
+	mx := userV.max()
+	goodsIds, err := getGoodsIds()
+	if err != nil {
+		return nil, err
+	}
+	for _, id := range goodsIds {
+		itemV, err := getItemVector(id, uint(mx))
+		if err != nil {
+			return nil, err
+		}
+		rList.list[id] = userV.similarity(itemV)
+	}
+	goods = rList.Sort(cnt)
+	return
+}
+
+func getUserVector(uid uint) (vector, error) {
+	var p []Pair
+	db := common.DB
+	sqlStr := "SELECT category_id, score FROM feedback WHERE uid = ? ORDER BY category_id DESC"
+	err := db.Select(&p, sqlStr, uid)
+	if err != nil {
+		return vector{}, err
+	}
+	return vector{v: p}, err
+}
+
+func getItemVector(id uint, maxId uint) (vector, error) {
+	var p []Pair
+	var cIds []uint
+	db := common.DB
+	sqlStr := "SELECT category_id FROM category_of_goods WHERE goods_id = ? AND category_id <= ?"
+	err := db.Select(&cIds, sqlStr, id, maxId)
+	if err != nil {
+		return vector{}, err
+	}
+	for i := 0; i < len(cIds); i++ {
+		p = append(p, Pair{
+			CategoryId: cIds[i],
+			Score:      1,
+		})
+	}
+	return vector{p}, err
+}
+
+func (v vector) similarity(other vector) float64 {
+	user, item := make(map[uint]int), make(map[uint]int)
+	for _, pair := range v.v {
+		user[pair.CategoryId] = pair.Score
+	}
+	for _, pair := range other.v {
+		item[pair.CategoryId] = 1
+	}
+
+	a, b, cnt := 0, 0, 0
+
+	for ke, va := range user {
+		if _, ok := item[ke]; ok {
+			cnt++
+			a += va
+		}
+		b += va * va
+	}
+
+	if cnt == 0 {
+		return 0
+	}
+
+	return float64(a) / (math.Sqrt(float64(b)) * math.Sqrt(float64(cnt)))
+}
+
+func (v vector) max() uint {
+	return v.v[0].CategoryId
+}
+
+func (r recommendList) Sort(n int) []uint {
+	ids := make([]uint, 0, len(r.list))
+	scores := make([]float64, 0, len(r.list))
+	result := make([]uint, 0, n)
+	for id, score := range r.list {
+		ids = append(ids, id)
+		scores = append(scores, score)
+	}
+	for i := 0; i < n; i++ {
+		mxid := uint(i)
+		for j := 0; j < len(ids); j++ {
+			if scores[j] > scores[mxid] {
+				mxid = uint(j)
+			}
+		}
+		scores[mxid] = -1
+		result = append(result, ids[mxid])
+	}
+
+	return result
+}

+ 17 - 14
trading-go/model/relation.go

@@ -7,29 +7,32 @@ import (
 )
 
 type Relation struct {
-	Id     uint `db:"id"`
-	Owner  uint `db:"owner"`
-	Target uint `db:"target"`
-	Type   int  `db:"type"`
+	Id      uint `db:"id"`
+	Owner   uint `db:"owner"`
+	Target  uint `db:"target"`
+	GoodsId uint `db:"goods_id"`
+	Type    int  `db:"type"`
 }
 
 type RelationJson struct {
-	Owner  uint `json:"owner"`
-	Target uint `json:"target"`
-	Type   int  `json:"type"`
+	Owner   uint `json:"owner,string" db:"owner"`
+	Target  uint `json:"target,string" db:"target"`
+	GoodsId uint `json:"goodsId" db:"goods_id"`
+	Type    int  `json:"type" db:"type"`
 }
 
 func (r RelationJson) Change() Relation {
 	return Relation{
-		Owner:  r.Owner,
-		Target: r.Target,
-		Type:   r.Type,
+		Owner:   r.Owner,
+		Target:  r.Target,
+		Type:    r.Type,
+		GoodsId: r.GoodsId,
 	}
 }
 
 func (r Relation) Creat() error {
 	db := common.DB
-	sqlStr := "INSERT INTO relations(owner, target, type) VALUES (:owner, :target, :type)"
+	sqlStr := "INSERT INTO relations(owner, target, type, goods_id) VALUES (:owner, :target, :type, :goods_id)"
 	rows, err := db.NamedExec(sqlStr, r)
 	if err != nil {
 		return err
@@ -41,10 +44,10 @@ func (r Relation) Creat() error {
 	return err
 }
 
-func (r Relation) Friend(uid int) ([]int64, error) {
-	var friends []int64
+func (r Relation) Friend(uid int) ([]RelationJson, error) {
+	var friends []RelationJson
 	db := common.DB
-	sqlStr := "SELECT target From relations WHERE owner = ? AND type = 1"
+	sqlStr := "SELECT owner, target, type, goods_id From relations WHERE owner = ? AND type = 1"
 	err := db.Select(&friends, sqlStr, uid)
 	return friends, err
 }

+ 26 - 33
trading-go/model/table.go

@@ -1,37 +1,30 @@
 package model
 
-import (
-	"fmt"
-	"github.com/spf13/viper"
-	"gorm.io/driver/mysql"
-	"gorm.io/gorm"
-)
-
 func init() {
-	host := viper.GetString("mysql.host")
-	port := viper.GetString("mysql.port")
-	database := viper.GetString("mysql.database")
-	username := viper.GetString("mysql.username")
-	password := viper.GetString("mysql.password")
-	charset := viper.GetString("mysql.charset")
-	dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
-		username,
-		password,
-		host,
-		port,
-		database,
-		charset)
-	db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
-	if err != nil {
-		panic(err.Error())
-	}
-	db.AutoMigrate(User{})
-	db.AutoMigrate(Category{})
-	db.AutoMigrate(Pic{})
-	db.AutoMigrate(Appraise{})
-	db.AutoMigrate(GoodsSurface{})
-	db.AutoMigrate(Goods{})
-	db.AutoMigrate(Relation{})
-	db.AutoMigrate(Order{})
-	db.AutoMigrate(CategoryOfGoods{})
+	//host := viper.GetString("mysql.host")
+	//port := viper.GetString("mysql.port")
+	//database := viper.GetString("mysql.database")
+	//username := viper.GetString("mysql.username")
+	//password := viper.GetString("mysql.password")
+	//charset := viper.GetString("mysql.charset")
+	//dsn := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true",
+	//	username,
+	//	password,
+	//	host,
+	//	port,
+	//	database,
+	//	charset)
+	//db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
+	//if err != nil {
+	//	panic(err.Error())
+	//}
+	////db.AutoMigrate(User{})
+	////db.AutoMigrate(Category{})
+	////db.AutoMigrate(Pic{})
+	////db.AutoMigrate(Appraise{})
+	////db.AutoMigrate(GoodsSurface{})
+	////db.AutoMigrate(Goods{})
+	////db.AutoMigrate(Relation{})
+	////db.AutoMigrate(Order{})
+	////db.AutoMigrate(CategoryOfGoods{})
 }

+ 14 - 2
trading-go/model/user.go

@@ -2,6 +2,7 @@ package model
 
 import (
 	"fmt"
+	"github.com/jmoiron/sqlx"
 	"strconv"
 	"trading-go/common"
 	"trading-go/response"
@@ -18,7 +19,7 @@ type User struct {
 }
 
 type UserJson struct {
-	Uid    string `json:"uid"`
+	Uid    string `json:"uid,string"`
 	Vid    string `json:"vid"`
 	Name   string `json:"name"`
 	Avatar string `json:"avatar"`
@@ -160,7 +161,7 @@ func (u User) CheckVid() bool {
 	db := common.DB
 	sqlStr := "SELECT COUNT(1) FROM users WHERE vid = ?"
 	cnt := 0
-	_ = db.Get(&cnt, sqlStr)
+	_ = db.Get(&cnt, sqlStr, u.Vid)
 	return cnt == 0
 }
 
@@ -170,3 +171,14 @@ func (u User) GetUser() (user User) {
 	_ = db.Get(&user, sqlStr, u.Uid)
 	return
 }
+
+func (u User) GetUserList(uid []string) (users []User, err error) {
+	db := common.DB
+	sqlStr := "SELECT * FROM users WHERE uid IN (?)"
+	query, args, err := sqlx.In(sqlStr, uid)
+	if err != nil {
+		return nil, err
+	}
+	err = db.Select(&users, query, args...)
+	return
+}

BIN
trading-go/pics/1698476053aWZd7PE7nICad85dedb14362dc3a251c6c85705ec495.jpg


BIN
trading-go/pics/1698752652MF3qSSC7MzFjb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1698753512AiD8PaNrvqsDb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1698845281tmp_31510c11e3073fe31c4ee963558f5f954ba91a124775b40c.jpg


BIN
trading-go/pics/1698845379tmp_2f7cea566577915f03cb307d0540904770f938500a6377ae.jpg


BIN
trading-go/pics/1698845408tmp_a0cec4ce123ef00c158d0da1f6fe11d86e6ccb263bfe6e8d.jpg


BIN
trading-go/pics/1698845418tmp_af79c23e356fad52c9194a33033ef7f168a710b7a3cc19c7.jpg


BIN
trading-go/pics/1698845498tmp_ee023136c58602bb4ff2d75a9b82931a3c72b931c54ef941.jpg


BIN
trading-go/pics/1698845584tmp_69fe84d4b7b444512c31c8693e95336113d42d50aaca0699.jpg


BIN
trading-go/pics/1698846108tmp_c0bcb90fd9ef93e065c22b977d7bc8aea17a1ac1e8393c21.jpg


BIN
trading-go/pics/1699175056BvtgC8vv8gSzd85dedb14362dc3a251c6c85705ec495.jpg


BIN
trading-go/pics/1699375397UN3eFHEVeEtEb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699376791kDvVkMDqGaKjb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699376842DbDkdnl78sbBb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699377248GdPib7YWQsXAb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699378552vxHfGwZXkePTb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699378578JPJKVU20yj8xb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699378604WzGV4QEYsyqzb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993786734xio8nxv2TFNb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699378762ThBCYkhdz9zqb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993787821A2FjRLvVruhb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699378849dxutdmTao1rOb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699378868UNzjT86U9mZrb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379040BxHIa2rdXr7Ab1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379135EcsSvbvLkVhTb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379236UMWxsQPiGipJb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993792564VwCgGljHv72b1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379298Q9wKiV6pwJWQb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379379PHHZ05aCWJFzdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1699379466JZV4SlIiQXvtb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993794898oKJ95NJEsbab1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993794935ty3B2H5X3Bmdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1699379550IZYTYrqt06SLb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993795680m8uW98B2zfyb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379608gJefzz5qUT66b1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993796119oiRGyv8ZJCydce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1699379613yT0RetLuz33T7baafd97122013df4eefc138a9d491e4.png


BIN
trading-go/pics/1699379672CnNaaJF3YcLeb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379674ratvWnFOC9vPdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1699379676RMOFWe5Byq947baafd97122013df4eefc138a9d491e4.png


BIN
trading-go/pics/1699379751qAqzwUA2PA5cb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699379788EG6q1cjspfrGb432cdf9781144598ab25ee646cd049d.jpg


BIN
trading-go/pics/169937981339pnnWLwtUrtdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1699381222EFHkA4BUioDyb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/16993821607EVsrcizBfSTb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699382199cc45G808GUT8b1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699382296S6Uu2diSpWkHb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699382571CXZVd9rNqgPAb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699382666EuwAd5QVrvHZb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699382681Pn8FxS8qyQ09b1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699382734DyGE8MNb6jlIb1493fda534929a5b5d05f80a8cf3d16.jpg


BIN
trading-go/pics/1699449524Qijb0Nylwcjv3fe18ddeee3f922fde4ea74ae229e235.jpg


BIN
trading-go/pics/1699450042EKRxNaHJGEJHdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1699450079vDMN0qnbpNyTdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1699451535SuxOmjisW2tkd85dedb14362dc3a251c6c85705ec495.jpg


BIN
trading-go/pics/1702540218QWS0sjmdtMywcb800b0e59cd22f2a10309329be957a9.jpg


BIN
trading-go/pics/1702540821sZwY77rQFtM2dce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/17025409532eMSafToj8gudce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702541132uT2BCMgiZA0v7baafd97122013df4eefc138a9d491e4.png


BIN
trading-go/pics/1702541386VRlRuBCi9b0qdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702542127wVeSqPyrviJUdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702542233WjAPxDBg44wvdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/17025422755pRxydltjb99dce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/17025423420kg8E4hkvczOdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702542562gTfCcjXqQ2Zydce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/170254528518oQnJKgKLqAdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702545454z1REibHMQiA7dce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702545527aav1gLONEjOUdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702545650hhYlNXcydp3vdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/1702545696WpBAYlipKjAcdce75ebb26860c9184474d8244e28d16.png


BIN
trading-go/pics/17026291282u3VVWKPLyQhdce75ebb26860c9184474d8244e28d16.png


Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác