wangfei 6 years ago
parent
commit
37de165c07

+ 31
- 39
controllers/component.go View File

@@ -1,12 +1,11 @@
1 1
 package controllers
2 2
 
3 3
 import (
4
+	"bytes"
4 5
 	"encoding/base64"
5 6
 	"encoding/json"
6
-	"encoding/xml"
7 7
 	"io/ioutil"
8 8
 	"net/http"
9
-	"strconv"
10 9
 	"wechat-conf/models"
11 10
 	"wechat-conf/models/model"
12 11
 	"wechat-conf/service/autoreply"
@@ -17,7 +16,7 @@ import (
17 16
 
18 17
 	"github.com/kinisky564477/wechat/component"
19 18
 
20
-	"github.com/zjxpcyc/wechat/core"
19
+	"github.com/kinisky564477/wechat/core"
21 20
 )
22 21
 
23 22
 // WechatController 用户
@@ -224,9 +223,16 @@ func (c *WechatController) WxReceive() {
224 223
 		replay, err = c.serv.GetAutoReplayByAppID(appid, content)
225 224
 		break
226 225
 	case "event":
227
-		if val["Event"] == "subscribe" {
226
+		beego.Error(val)
227
+		switch val["Event"] {
228
+		case "subscribe":
228 229
 			replay, err = c.serv.GetSubscribeByAppID(appid)
230
+			break
231
+		case "LICK":
232
+			// 点击事件
233
+
229 234
 		}
235
+
230 236
 		break
231 237
 	}
232 238
 	if err != nil {
@@ -237,46 +243,27 @@ func (c *WechatController) WxReceive() {
237 243
 		c.ResponseRaw([]byte(""))
238 244
 	}
239 245
 	openID := val["FromUserName"]
240
-	signature := c.GetString("msg_signature")
241
-	nonce := c.GetString("nonce")
242
-	timestamp, _ := strconv.Atoi(c.GetString("timestamp"))
243
-	beego.Error("signature:", signature, ",nonce:", nonce, ",timestamp:", timestamp)
244
-	message, err := c.getReplayMessage(replay, openID, AESKey, wechat)
246
+	message, err := c.getReplayMessage(replay, openID, wechat)
245 247
 	if err != nil {
246 248
 		utils.LogError("转换回复信息失败: " + err.Error())
247 249
 		c.ResponseRaw([]byte(""))
248 250
 	}
249
-	// message, err = utils.AesEncrypt(message, AESKey)
250
-	// if err != nil {
251
-	// 	utils.LogError("加密失败:", err)
252
-	// 	c.ResponseRaw([]byte(""))
253
-	// }
254
-	// beego.Error(string(message))
255
-	// data := PassiveMessage{
256
-	// 	Encrypt:      component.CDATA{string(message)},
257
-	// 	MsgSignature: component.CDATA{signature},
258
-	// 	TimeStamp:    int64(timestamp),
259
-	// 	Nonce:        component.CDATA{nonce},
260
-	// }
261
-	// beego.Error(data)
262
-	// res, err := xml.Marshal(data)
263
-	// beego.Error(err)
264
-	// beego.Error(string(res))
265
-	c.ResponseRaw(message)
266
-	c.DestroyContext()
267
-	c.StopRun()
268
-}
269 251
 
270
-// PassiveMessage 加密后的返回信息
271
-type PassiveMessage struct {
272
-	XMLName      xml.Name        `xml:"xml"`
273
-	Encrypt      component.CDATA `xml:"Encrypt"`
274
-	MsgSignature component.CDATA `xml:"MsgSignature"`
275
-	TimeStamp    int64           `xml:"TimeStamp"`
276
-	Nonce        component.CDATA `xml:"Nonce"`
252
+	cipher, err := core.NewCipher(utils.Component.GetToken(), EncodingAESKey, appid)
253
+	if err != nil {
254
+		utils.LogError("获取解密失败: " + err.Error())
255
+		c.ResponseRaw([]byte(""))
256
+	}
257
+
258
+	dt := bytes.NewBuffer([]byte{})
259
+	cipher.Encrypt(dt, []byte(message))
260
+	beego.Error("=========>", dt)
261
+
262
+	c.ResponseRaw(dt.Bytes())
263
+	// c.ResponseRaw([]byte("success"))
277 264
 }
278 265
 
279
-func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, Aeskey []byte, wx *component.WxClient) ([]byte, error) {
266
+func (c *WechatController) getReplayMessage(replay *model.TaAutoReply, openid string, wx *component.WxClient) ([]byte, error) {
280 267
 	switch replay.MessageType {
281 268
 	case models.MESSAGE_TYPE_PARAGRAPH:
282 269
 		msg, err := wx.ResponseMessageText(openid, replay.MessageParagraph)
@@ -322,14 +309,19 @@ func (c *WechatController) GetWechatInfoByAppID() {
322 309
 }
323 310
 
324 311
 // GetWechatMenuByAppID 获取菜单
325
-func (c *WechatController) GetWechatMenuByAppID() {
312
+func (c *WechatController) GetMaterialByAppID() {
326 313
 	appid := c.GetString(":appid")
327 314
 	wxclient, err := utils.Component.GetWxClient(appid)
328 315
 	if err != nil {
329 316
 		utils.LogError("获取微信信息失败: " + err.Error())
330 317
 		c.ResponseError(err)
331 318
 	}
332
-	menus, err := wxclient.GetMenu()
319
+	var data = map[string]string{}
320
+	data["offset"] = "0"
321
+	data["type"] = "image"
322
+	data["count"] = "10"
323
+
324
+	menus, err := wxclient.GetMaterialList(data)
333 325
 	if err != nil {
334 326
 		utils.LogError("获取微信详情失败: " + err.Error())
335 327
 		c.ResponseError(err)

+ 98
- 0
controllers/wechatimg/uploadImg.go View File

@@ -0,0 +1,98 @@
1
+package wechatimg
2
+
3
+import (
4
+	"bytes"
5
+	"encoding/json"
6
+	"errors"
7
+	"io"
8
+	"io/ioutil"
9
+	"mime/multipart"
10
+	"net/http"
11
+	"os"
12
+	"path/filepath"
13
+	"time"
14
+	"wechat-conf/utils"
15
+
16
+	"github.com/astaxie/beego"
17
+)
18
+
19
+const (
20
+	WechatUploadMediaAPI = "https://api.weixin.qq.com/cgi-bin/material/add_material"
21
+)
22
+
23
+var (
24
+	HttpRequstTimeOut time.Duration
25
+)
26
+
27
+type MediaUpload struct {
28
+	ErrCode   int    `json:"errcode"`
29
+	ErrMgs    string `json:"errmsg"`
30
+	Type      string `json:"type"`
31
+	MediaID   string `json:"media_id"`
32
+	CreatedAt string `json:"created_at"`
33
+}
34
+
35
+func init() {
36
+	HttpRequstTimeOut, _ = time.ParseDuration("5s")
37
+}
38
+
39
+func UploaImage(token, imagePath string) (mediaid string, err error) {
40
+	file, err := os.Open(imagePath)
41
+	if err != nil {
42
+		beego.Error(err)
43
+		utils.LogError("上传图片失败:", err)
44
+		return
45
+	}
46
+	defer file.Close()
47
+	body := &bytes.Buffer{}
48
+	writer := multipart.NewWriter(body)
49
+	part, err := writer.CreateFormFile("media", filepath.Base(imagePath))
50
+	if err != nil {
51
+		beego.Error(err)
52
+		utils.LogError("上传图片失败:", err)
53
+		return
54
+	}
55
+	_, err = io.Copy(part, file)
56
+	err = writer.Close()
57
+	if err != nil {
58
+		beego.Error(err)
59
+		utils.LogError("上传图片失败:", err)
60
+		return
61
+	}
62
+
63
+	req, err := http.NewRequest("POST", WechatUploadMediaAPI, body)
64
+	req.Header.Add("Content-Type", writer.FormDataContentType())
65
+	urlQuery := req.URL.Query()
66
+	if err != nil {
67
+		beego.Error(err)
68
+		utils.LogError("上传图片失败:", err)
69
+		return
70
+	}
71
+	urlQuery.Add("access_token", token)
72
+	urlQuery.Add("type", "image")
73
+
74
+	req.URL.RawQuery = urlQuery.Encode()
75
+	client := http.Client{}
76
+	res, err := client.Do(req)
77
+	if err != nil {
78
+		beego.Error(err)
79
+		utils.LogError("上传图片失败:", err)
80
+		return
81
+	}
82
+	defer res.Body.Close()
83
+	jsonbody, _ := ioutil.ReadAll(res.Body)
84
+	media := MediaUpload{}
85
+	err = json.Unmarshal(jsonbody, &media)
86
+	if err != nil {
87
+		beego.Error(media.ErrMgs)
88
+		utils.LogError("上传图片失败:", media.ErrMgs)
89
+		return
90
+	}
91
+	if media.MediaID == "" {
92
+		beego.Error(media.ErrMgs)
93
+		err = errors.New(media.ErrMgs)
94
+		utils.LogError("上传图片失败:", media.ErrMgs)
95
+	}
96
+	mediaid = media.MediaID
97
+	return
98
+}

+ 98
- 35
controllers/wechatimg/wechatimt.go View File

@@ -1,15 +1,18 @@
1 1
 package wechatimg
2 2
 
3 3
 import (
4
-	"mime/multipart"
4
+	"fmt"
5
+	"io"
6
+	"os"
5 7
 	"strconv"
6 8
 	"time"
7
-	"unsafe"
8 9
 	"wechat-conf/controllers"
9 10
 	"wechat-conf/models/model"
10 11
 	"wechat-conf/service/sysuser"
11 12
 	"wechat-conf/service/wechatimg"
12 13
 	"wechat-conf/utils"
14
+
15
+	"github.com/astaxie/beego"
13 16
 )
14 17
 
15 18
 // WechatImgController 信息
@@ -27,41 +30,74 @@ func (c *WechatImgController) Constructor() {
27 30
 	c.sdao = sysuser.NewSysuserServ(c.Context)
28 31
 }
29 32
 
33
+func (c *WechatImgController) GetWechatImgCount() {
34
+	user := c.Context.Get("user").(*model.SysUser)
35
+	appid, err := c.sdao.GetAppIdByOrgId(user.OrgId)
36
+	if err != nil {
37
+		c.ResponseError(err)
38
+	}
39
+	// appid := c.GetString(":appid")
40
+	wxclient, err := utils.Component.GetWxClient(appid)
41
+	if err != nil {
42
+		utils.LogError("获取微信信息失败: " + err.Error())
43
+		c.ResponseError(err)
44
+	}
45
+
46
+	count, err := wxclient.GetMaterialCount()
47
+	if err != nil {
48
+		utils.LogError("获取微信详情失败: " + err.Error())
49
+		c.ResponseError(err)
50
+	}
51
+	matype := c.GetString(":type")
52
+	c.ResponseJSON(count[matype+"_count"])
53
+}
54
+
30 55
 func (c *WechatImgController) GetWechatImgList() {
31 56
 	user := c.Context.Get("user").(*model.SysUser)
32
-	appId, err := c.sdao.GetAppIdByOrgId(user.OrgId)
57
+	appid, err := c.sdao.GetAppIdByOrgId(user.OrgId)
33 58
 	if err != nil {
34 59
 		c.ResponseError(err)
35 60
 	}
36
-	client, err := utils.Component.GetWxClient(appId)
61
+	// appid := c.GetString(":appid")
62
+	wxclient, err := utils.Component.GetWxClient(appid)
37 63
 	if err != nil {
64
+		utils.LogError("获取微信信息失败: " + err.Error())
38 65
 		c.ResponseError(err)
39 66
 	}
40
-	page, _ := c.GetInt("page")
41
-	pageSize, _ := c.GetInt("pagesize")
42
-	offset := page * (pageSize - 1)
43
-	var data map[string]string
44
-	data["offset"] = strconv.Itoa(offset)
45
-	data["type"] = "image"
46
-	data["count"] = strconv.Itoa(pageSize)
47
-	wechatImg, err := client.GetMaterialList(data)
67
+	var data = map[string]string{}
68
+	data["offset"] = "0"
69
+	data["type"] = c.GetString(":type")
70
+	data["count"] = "10"
71
+
72
+	wechatImgs, err := wxclient.GetMaterialList(data)
48 73
 	if err != nil {
74
+		utils.LogError("获取微信详情失败: " + err.Error())
49 75
 		c.ResponseError(err)
50 76
 	}
51
-	c.ResponseJSON(wechatImg)
77
+	c.ResponseJSON(wechatImgs)
52 78
 }
79
+
53 80
 func (c *WechatImgController) SyncWechatImg() {
54 81
 	user := c.Context.Get("user").(*model.SysUser)
55 82
 	appId, err := c.sdao.GetAppIdByOrgId(user.OrgId)
56 83
 	if err != nil {
57 84
 		c.ResponseError(err)
58 85
 	}
86
+	// appId := c.GetString(":appid")
59 87
 	client, err := utils.Component.GetWxClient(appId)
60 88
 	if err != nil {
61 89
 		c.ResponseError(err)
62 90
 	}
63
-	for i := 0; i < 200; i++ {
64
-		var data map[string]string
91
+
92
+	count, err := client.GetMaterialCount()
93
+	if err != nil {
94
+		c.ResponseError(err)
95
+	}
96
+
97
+	imgcount := count["image_count"].(float64)
98
+	page := int(imgcount)/20 + 1
99
+	for i := 0; i < page; i++ {
100
+		var data = map[string]string{}
65 101
 		offset := i * 20
66 102
 		data["offset"] = strconv.Itoa(offset)
67 103
 		data["type"] = "image"
@@ -74,18 +110,37 @@ func (c *WechatImgController) SyncWechatImg() {
74 110
 			break
75 111
 		}
76 112
 		err = c.dao.SyncWechatImg(wechatImg, user.OrgId)
77
-
78 113
 		if err != nil {
79 114
 			c.ResponseError(err)
80 115
 		}
81 116
 	}
82 117
 	c.ResponseJSON("同步成功")
83 118
 }
119
+
84 120
 func (c *WechatImgController) AddNewImg() {
121
+	file, head, err := c.Ctx.Request.FormFile("media")
122
+	if err != nil {
123
+		beego.Error(err)
124
+		c.ResponseError(err)
125
+	}
126
+	defer file.Close()
127
+
128
+	imgurl := "./upload/" + head.Filename
129
+	//创建文件
130
+	fW, err := os.Create(imgurl)
131
+	if err != nil {
132
+		fmt.Println("文件创建失败")
133
+		return
134
+	}
135
+	defer fW.Close()
136
+	_, err = io.Copy(fW, file)
137
+	if err != nil {
138
+		fmt.Println("文件保存失败")
139
+		return
140
+	}
141
+
85 142
 	user := c.Context.Get("user").(*model.SysUser)
86
-	fromFront := c.GetString("fromFront")
87
-	req := c.Ctx.Request
88
-	file, fh, err := req.FormFile(fromFront)
143
+
89 144
 	appId, err := c.sdao.GetAppIdByOrgId(user.OrgId)
90 145
 	if err != nil {
91 146
 		c.ResponseError(err)
@@ -94,22 +149,15 @@ func (c *WechatImgController) AddNewImg() {
94 149
 	if err != nil {
95 150
 		c.ResponseError(err)
96 151
 	}
97
-	token := utils.Component.GetToken()
98
-	type wechatMatrial struct {
99
-		access_token string
100
-		media        multipart.File
101
-	}
102
-	var media = wechatMatrial{
103
-		access_token: token,
104
-		media:        file,
105
-	}
106
-	byteDate := *(*[]byte)(unsafe.Pointer(&media))
107
-	data, err := client.AddMaterial(byteDate, "image")
152
+
153
+	id, err := UploaImage(client.GetToken(), imgurl)
154
+
108 155
 	var img = model.TaWechatImg{
109
-		MediaId:    data["media_id"].(string),
110
-		Url:        data["url"].(string),
111
-		Name:       fh.Filename,
156
+		MediaId:    id,
157
+		Url:        imgurl,
158
+		Name:       head.Filename,
112 159
 		UpdateTime: time.Now(),
160
+		OrgId:      user.OrgId,
113 161
 	}
114 162
 	err = c.dao.AddWechatImg(img)
115 163
 	if err != nil {
@@ -119,8 +167,23 @@ func (c *WechatImgController) AddNewImg() {
119 167
 
120 168
 }
121 169
 func (c *WechatImgController) DeleteImg() {
122
-	mediaId := c.GetString("mediaId")
123
-	err := c.dao.DeleteImg(mediaId)
170
+	user := c.Context.Get("user").(*model.SysUser)
171
+	appId, err := c.sdao.GetAppIdByOrgId(user.OrgId)
172
+	if err != nil {
173
+		c.ResponseError(err)
174
+	}
175
+	// appId := c.GetString(":appid")
176
+	client, err := utils.Component.GetWxClient(appId)
177
+	if err != nil {
178
+		c.ResponseError(err)
179
+	}
180
+
181
+	mediaId := c.GetString(":mediaId")
182
+	err = c.dao.DeleteImg(mediaId)
183
+	if err != nil {
184
+		c.ResponseError(err)
185
+	}
186
+	_, err = client.DelMaterial(mediaId)
124 187
 	if err != nil {
125 188
 		c.ResponseError(err)
126 189
 	}

+ 1
- 4
controllers/wechatmenu/wechatmenu.go View File

@@ -7,8 +7,6 @@ import (
7 7
 	"wechat-conf/service/sysuser"
8 8
 	"wechat-conf/service/wechatmenu"
9 9
 	"wechat-conf/utils"
10
-
11
-	"github.com/astaxie/beego"
12 10
 )
13 11
 
14 12
 // MenuController 信息
@@ -32,14 +30,13 @@ func (c *MenuController) GetMenuList() {
32 30
 	if err != nil {
33 31
 		c.ResponseError(err)
34 32
 	}
35
-	beego.Error(appId)
36 33
 	client, err := utils.Component.GetWxClient(appId)
37 34
 	if err != nil {
38 35
 		c.ResponseError(err)
39 36
 	}
40 37
 	menu, err := client.GetMenu()
41
-	var code string = err.Error()
42 38
 	if err != nil {
39
+		var code string = err.Error()
43 40
 		if strings.Contains(code, "46003") {
44 41
 			c.ResponseJSON(menu)
45 42
 		} else {

+ 1
- 1
models/model/ta_wechat_img.go View File

@@ -6,7 +6,7 @@ import (
6 6
 
7 7
 type TaWechatImg struct {
8 8
 	MediaId    string    `xorm:"not null pk VARCHAR(64)"`
9
-	Name       string    `xorm:"VARCHAR(32)"`
9
+	Name       string    `xorm:"VARCHAR(100)"`
10 10
 	UpdateTime time.Time `xorm:"DATETIME"`
11 11
 	Url        string    `xorm:"TEXT"`
12 12
 	OrgId      string    `xorm:"VARCHAR(64)"`

+ 6
- 0
models/wechatimg/wechatimg.go View File

@@ -54,6 +54,12 @@ func (m *WechatImgDAO) AddWechatImg(img model.TaWechatImg) error {
54 54
 	_, err := m.db.Insert(img)
55 55
 	return err
56 56
 }
57
+
58
+func (m *WechatImgDAO) AddWechatImgs(imgs []model.TaWechatImg) error {
59
+	_, err := m.db.Insert(imgs)
60
+	return err
61
+}
62
+
57 63
 func (m *WechatImgDAO) DeleteWechatImg(mediaId string) error {
58 64
 	_, err := m.db.Delete(&model.TaWechatImg{MediaId: mediaId})
59 65
 	return err

+ 11
- 6
routers/router.go View File

@@ -40,10 +40,17 @@ func RouteInit() {
40 40
 			beego.NSRouter("/autoreply/:autoreplyId", &autoreply.AutoreplyController{}, "delete:DeleteAutoReply"),
41 41
 			beego.NSRouter("/autoreply/isUse/:autoType/:isUse", &autoreply.AutoreplyController{}, "put:ChangeIsUse"),
42 42
 			// 图片资源
43
-			beego.NSRouter("/wechatimg", &wechatimg.WechatImgController{}, "get:GetWechatImgList"),
44
-			beego.NSRouter("/wechatimg/sync", &wechatimg.WechatImgController{}, "put:SyncWechatImg"),
45
-			beego.NSRouter("/wechatimg", &wechatimg.WechatImgController{}, "post:AddNewImg"),
46
-			beego.NSRouter("/wechatimg/:mediaId", &wechatimg.WechatImgController{}, "delete:DeleteImg"),
43
+			// beego.NSRouter("/wechatimg", &wechatimg.WechatImgController{}, "get:GetWechatImgList"),
44
+			// beego.NSRouter("/wechatimg/sync", &wechatimg.WechatImgController{}, "put:SyncWechatImg"),
45
+			// beego.NSRouter("/wechatimg", &wechatimg.WechatImgController{}, "post:AddNewImg"),
46
+			// beego.NSRouter("/wechatimg/:mediaId", &wechatimg.WechatImgController{}, "delete:DeleteImg"),
47
+
48
+			beego.NSRouter("/material/:type/count", &wechatimg.WechatImgController{}, "get:GetWechatImgCount"),
49
+			beego.NSRouter("/material/:type", &wechatimg.WechatImgController{}, "get:GetWechatImgList"),
50
+			beego.NSRouter("/material/:type/sync", &wechatimg.WechatImgController{}, "post:SyncWechatImg"),
51
+			beego.NSRouter("/material/image/save", &wechatimg.WechatImgController{}, "post:AddNewImg"),
52
+			beego.NSRouter("/material/:mediaId", &wechatimg.WechatImgController{}, "delete:DeleteImg"),
53
+
47 54
 			// 用户管理
48 55
 			beego.NSRouter("/sysuser", &sysuser.SysuserController{}, "get:GetUserList"),
49 56
 			beego.NSRouter("/sysuser/:userId", &sysuser.SysuserController{}, "get:GetUserById"),
@@ -79,8 +86,6 @@ func RouteInit() {
79 86
 		beego.NSRouter("/ticket", &controllers.WechatController{}, "get:ComponentPush"),
80 87
 		beego.NSRouter("/:appid/callback", &controllers.WechatController{}, "get:WxReceive"),
81 88
 		beego.NSRouter("/:appid/callback", &controllers.WechatController{}, "post:WxReceive"),
82
-		// beego.NSRouter("/wechatinfo/:appid", &controllers.WechatController{}, "get:GetWechatInfoByAppID"),
83
-		beego.NSRouter("/menu/:appid", &controllers.WechatController{}, "get:GetWechatMenuByAppID"),
84 89
 	)
85 90
 
86 91
 	beego.AddNamespace(ns)

+ 21
- 19
service/wechatimg/wechatimg.go View File

@@ -3,6 +3,7 @@ package wechatimg
3 3
 import (
4 4
 	"errors"
5 5
 	"time"
6
+	"wechat-conf/models"
6 7
 	"wechat-conf/models/model"
7 8
 	"wechat-conf/models/wechatimg"
8 9
 	"wechat-conf/utils"
@@ -39,26 +40,27 @@ func (s *WechatImgServ) SyncWechatImg(data interface{}, orgId string) error {
39 40
 		utils.LogError("同步图片失败: " + err.Error())
40 41
 		return errors.New("同步图片失败")
41 42
 	}
42
-	type wechatimg struct {
43
-		media_id    string
44
-		name        string
45
-		update_time time.Time
46
-		url         string
47
-	}
48
-	img := data.([]wechatimg)
49
-	for _, val := range img {
50
-		beego.Error(val)
51
-		var wechat model.TaWechatImg
52
-		wechat.MediaId = val.media_id
53
-		wechat.Name = val.name
43
+
44
+	imgs := data.([]interface{})
45
+	var wechatimgs []model.TaWechatImg
46
+	for _, img := range imgs {
47
+		beego.Error(img)
48
+		val := img.(map[string]interface{})
49
+		var wechat = model.TaWechatImg{}
50
+		wechat.MediaId = val["media_id"].(string)
51
+		wechat.Name = val["name"].(string)
54 52
 		wechat.OrgId = orgId
55
-		wechat.Url = val.url
56
-		wechat.UpdateTime = val.update_time
57
-		err := s.dao.AddWechatImg(wechat)
58
-		if err != nil {
59
-			utils.LogError("同步图片失败: " + err.Error())
60
-			return errors.New("同步图片失败")
61
-		}
53
+		wechat.Url = val["url"].(string)
54
+		// wechat.UpdateTime = val["update_time"]
55
+		wechat.Status = models.STATUS_NORMAL
56
+		wechat.CreateDate = time.Now()
57
+		wechatimgs = append(wechatimgs, wechat)
58
+	}
59
+
60
+	err = s.dao.AddWechatImgs(wechatimgs)
61
+	if err != nil {
62
+		utils.LogError("同步图片失败: " + err.Error())
63
+		return errors.New("同步图片失败")
62 64
 	}
63 65
 	return nil
64 66
 }

BIN
upload/FADC039C-0F97-40c7-9A9C-F15A9E6143DC.png View File


BIN
upload/timg.jpg View File