asset.go 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958
  1. package controller
  2. import (
  3. "crypto/md5"
  4. "designs/app/common/request"
  5. localConfig "designs/config"
  6. "designs/global"
  7. "designs/model"
  8. "designs/response"
  9. "designs/service"
  10. "designs/utils"
  11. "encoding/hex"
  12. "fmt"
  13. "github.com/antihax/optional"
  14. "github.com/gin-gonic/gin"
  15. "github.com/tencentad/marketing-api-go-sdk/pkg/ads/v3"
  16. "github.com/tencentad/marketing-api-go-sdk/pkg/api/v3"
  17. "github.com/tencentad/marketing-api-go-sdk/pkg/config/v3"
  18. "io"
  19. "mime/multipart"
  20. "os"
  21. "path/filepath"
  22. "strconv"
  23. "strings"
  24. "time"
  25. )
  26. func GetAccessToken(gid string, pid string) string {
  27. var org struct {
  28. AccessToken string `json:"access_token" gorm:"column:access_token"`
  29. }
  30. var AccessToken string
  31. global.App.DB.Table("organizations").Where("oid", 46379136).Select("access_token").First(&org)
  32. if org.AccessToken != "" {
  33. AccessToken = org.AccessToken
  34. } else {
  35. AccessToken = "da5a0590d1653fd1e6c9b72cabcb14f1"
  36. }
  37. return AccessToken
  38. }
  39. func generateFileMD5(fileHeader *multipart.FileHeader) (string, error) {
  40. file, err := fileHeader.Open()
  41. if err != nil {
  42. return "", err
  43. }
  44. defer file.Close()
  45. hash := md5.New()
  46. if _, err := io.Copy(hash, file); err != nil {
  47. return "", err
  48. }
  49. return hex.EncodeToString(hash.Sum(nil)), nil
  50. }
  51. // 上传图片到服务器
  52. func Upload(c *gin.Context) {
  53. // 获取文件
  54. file, err := c.FormFile("file")
  55. if err != nil {
  56. response.Fail(c, 400, "未选择文件")
  57. return
  58. }
  59. // 类型检查
  60. ext := strings.ToLower(filepath.Ext(file.Filename))
  61. allowed := map[string]bool{".jpg": true, ".jpeg": true, ".png": true, ".avi": true, ".mp4": true}
  62. if !allowed[ext] {
  63. response.Fail(c, 1001, "图片仅支持JPG/PNG,视频支持avi/mp4")
  64. return
  65. }
  66. md5Value, err := generateFileMD5(file)
  67. // 存储路径生成
  68. saveDir := fmt.Sprintf("uploads/%s", time.Now().Format("2006-01-02"))
  69. os.MkdirAll(saveDir, 0755)
  70. savePath := filepath.Join(saveDir, md5Value+ext)
  71. // 保存文件
  72. if err := c.SaveUploadedFile(file, savePath); err != nil {
  73. response.Fail(c, 500, "文件保存失败")
  74. return
  75. }
  76. response.Success(c, gin.H{
  77. "path": savePath,
  78. "md5": md5Value,
  79. })
  80. }
  81. func ImageSet(c *gin.Context) {
  82. form := request.Check(c, &struct {
  83. ImgPath string `json:"imgPath" binding:"required"`
  84. Md5 string `json:"md5" binding:"required"`
  85. Name string `json:"name" binding:"required"`
  86. Gid string `json:"gid" binding:"required"`
  87. Pid string `json:"pid" binding:""`
  88. Tags []int `json:"tags" binding:""`
  89. IsImg9 int `json:"isImg9" binding:""`
  90. Resolution struct {
  91. Width int `json:"width" binding:""`
  92. Height int `json:"height" binding:""`
  93. } `json:"resolution" binding:""`
  94. }{})
  95. if !CheckTags(form.Tags) {
  96. response.Fail(c, 500, "tag中有不存在或错误的ID")
  97. return
  98. }
  99. //检查重复
  100. var image model.PropertyImage
  101. global.App.DB.Table(model.TablePropertyImage).Where("name", form.Name).Or("md5", form.Md5).First(&image)
  102. if image.ID != 0 {
  103. response.Fail(c, 1001, "图片名称或素材重复")
  104. return
  105. }
  106. //处理9图
  107. if form.IsImg9 != 0 {
  108. err := service.SliceImg(form.ImgPath, form.Name)
  109. if err != nil {
  110. response.Fail(c, 500, err.Error())
  111. return
  112. }
  113. }
  114. //上传微信
  115. files, err := os.Open(form.ImgPath)
  116. if err != nil {
  117. response.Fail(c, 500, "文件读取失败"+err.Error())
  118. return
  119. }
  120. defer files.Close()
  121. //请求微信接口
  122. va := api.ImagesAddOpts{File: optional.NewInterface(files), AccountId: optional.NewInt64(57213719)}
  123. tads := ads.Init(&config.SDKConfig{
  124. AccessToken: GetAccessToken("", ""),
  125. })
  126. ctx := *tads.Ctx
  127. //res, _, err := tads.Advertiser().Get(ctx, nil)
  128. res, _, err := tads.Images().Add(ctx, "UPLOAD_TYPE_FILE", form.Md5, &va)
  129. if err != nil {
  130. response.Fail(c, 1001, err.Error())
  131. return
  132. }
  133. //归档到纯皓系统中
  134. now := model.XTime{Time: time.Now()}
  135. newImage := model.PropertyImage{
  136. Name: form.Name,
  137. LocalPath: form.ImgPath,
  138. Gid: form.Gid,
  139. Pid: form.Pid,
  140. WxId: *res.ImageId,
  141. ImageWidth: int(*res.ImageWidth),
  142. ImageHeight: int(*res.ImageHeight),
  143. ImageFileSize: int(*res.ImageFileSize),
  144. ImageSignature: *res.ImageSignature,
  145. IsImg9: form.IsImg9,
  146. CreatedAt: now,
  147. UpdatedAt: now,
  148. Resolution: strconv.Itoa(form.Resolution.Width) + "x" + strconv.Itoa(form.Resolution.Height),
  149. }
  150. err = global.App.DB.Transaction(func(tx *utils.WtDB) error {
  151. err = global.App.DB.Table(model.TablePropertyImage).Create(&newImage).Error
  152. if err != nil {
  153. return err
  154. }
  155. //增加新tag
  156. var tags []model.PropertyImageTag
  157. for _, v := range form.Tags {
  158. tags = append(tags, model.PropertyImageTag{
  159. TagId: v,
  160. ImageId: newImage.ID,
  161. })
  162. }
  163. err = global.App.DB.Table(model.TablePropertyImageTag).CreateInBatches(&tags, 100).Error
  164. if err != nil {
  165. return err
  166. }
  167. userId := c.GetInt("userId")
  168. err = service.SetActionLog("新增", userId, "图片", newImage)
  169. if err != nil {
  170. global.App.Log.Error("")
  171. return err
  172. }
  173. return nil
  174. })
  175. if err != nil {
  176. response.Fail(c, 1001, "存入数据库失败"+err.Error())
  177. return
  178. }
  179. response.Success(c, gin.H{
  180. "data": res,
  181. })
  182. }
  183. func ImageList(c *gin.Context) {
  184. form := request.Check(c, &struct {
  185. Limit int `form:"limit" json:"limit" binding:"required"`
  186. Offset int `form:"offset" json:"offset" binding:""`
  187. Search string `form:"search" json:"search" binding:""`
  188. Gid string `form:"gid" json:"gid" binding:""`
  189. Pid *string `form:"pid" json:"pid" binding:""`
  190. Order string `form:"order" json:"order" binding:""`
  191. Prop string `form:"prop" json:"prop" binding:""`
  192. IsImg9 string `form:"isImg9" json:"isImg9" binding:""`
  193. Resolution string `form:"resolution" json:"resolution" binding:""`
  194. Tag []int `form:"tag" json:"tag" binding:""`
  195. }{})
  196. query := global.App.DB.Table(model.TablePropertyImage)
  197. if form.Search != "" {
  198. query = query.Where("name", "like", "%"+form.Search+"%")
  199. }
  200. if form.Gid != "" {
  201. query = query.Where("gid", "=", form.Gid)
  202. }
  203. if form.Pid != nil && form.Gid == "" {
  204. var gid []string
  205. global.App.DB.Table(model.TableGame).Where("pid", form.Pid).Pluck("gid", &gid)
  206. query = query.WhereIn("gid", gid)
  207. }
  208. if form.IsImg9 != "" {
  209. query = query.Where("is_img9", "=", form.IsImg9)
  210. }
  211. if form.Resolution != "" {
  212. query = query.Where("resolution", "=", form.Resolution)
  213. }
  214. if form.Order != "" && form.Prop != "" {
  215. query = query.Order(form.Prop + " " + form.Order)
  216. }
  217. if form.Tag != nil {
  218. var imageIds []int
  219. query1 := global.App.DB.Table(model.TablePropertyImageTag)
  220. for _, tag := range form.Tag {
  221. query1 = query1.Where("tag_id", tag)
  222. }
  223. query1.Pluck("image_id", &imageIds)
  224. query = query.WhereIn("id", imageIds)
  225. }
  226. var count int64
  227. err := query.Count(&count).Error
  228. if err != nil {
  229. response.Fail(c, 500, err.Error())
  230. return
  231. }
  232. type TagData struct {
  233. model.PropertyImageTag
  234. Name string `json:"name" gorm:"not null;"`
  235. }
  236. var imgData []model.PropertyImage
  237. err = query.Offset(form.Offset).Limit(form.Limit).Scan(&imgData).Error
  238. if err != nil {
  239. response.Fail(c, 500, err.Error())
  240. return
  241. }
  242. //查询出tag
  243. var ids []int
  244. for _, v := range imgData {
  245. ids = append(ids, v.ID)
  246. }
  247. var tagData []TagData
  248. err = global.App.DB.Table(model.TablePropertyImageTag).
  249. LeftJoin(model.TablePropertyTag, "property_image_tag.tag_id = property_tag.id").
  250. WhereIn("property_image_tag.image_id", ids).
  251. Scan(&tagData).Error
  252. if err != nil {
  253. response.Fail(c, 500, err.Error())
  254. return
  255. }
  256. list := make([]struct {
  257. model.PropertyImage
  258. Tag []TagData `json:"tag"`
  259. Download string `json:"download"`
  260. }, len(imgData))
  261. for k, v := range imgData {
  262. list[k].ID = v.ID
  263. list[k].Gid = v.Gid
  264. list[k].Pid = v.Pid
  265. list[k].WxId = v.WxId
  266. list[k].Name = v.Name
  267. list[k].CreatedAt = v.CreatedAt
  268. list[k].UpdatedAt = v.UpdatedAt
  269. list[k].LocalPath = v.LocalPath
  270. list[k].ImageWidth = v.ImageWidth
  271. list[k].ImageHeight = v.ImageHeight
  272. list[k].ImageFileSize = v.ImageFileSize
  273. list[k].ImageSignature = v.ImageSignature
  274. list[k].ImageType = v.ImageType
  275. list[k].Resolution = v.Resolution
  276. list[k].Download = GetDownload(v.LocalPath)
  277. for _, tag := range tagData {
  278. if v.ID == tag.ImageId {
  279. list[k].Tag = append(list[k].Tag, tag)
  280. }
  281. }
  282. }
  283. response.Success(c, gin.H{
  284. "data": map[string]interface{}{
  285. "list": list,
  286. "count": count,
  287. },
  288. })
  289. }
  290. func GetImageListHead(c *gin.Context) {
  291. //获取分辨率的数据
  292. var resolution []string
  293. err := global.App.DB.Table(model.TablePropertyImage).Group("resolution").Pluck("resolution", &resolution).Error
  294. if err != nil {
  295. response.Fail(c, 500, err.Error())
  296. return
  297. }
  298. response.Success(c, gin.H{
  299. "data": map[string]interface{}{
  300. "resolution": resolution,
  301. },
  302. })
  303. }
  304. func GetVideoListHead(c *gin.Context) {
  305. //获取分辨率的数据
  306. var resolution []string
  307. err := global.App.DB.Table(model.TablePropertyVideo).Group("resolution").Pluck("resolution", &resolution).Error
  308. if err != nil {
  309. response.Fail(c, 500, err.Error())
  310. return
  311. }
  312. response.Success(c, gin.H{
  313. "data": map[string]interface{}{
  314. "resolution": resolution,
  315. },
  316. })
  317. }
  318. func ImageDelete(c *gin.Context) {
  319. form := request.Check(c, &struct {
  320. IdList []int `form:"idList" json:"idList" binding:"required"`
  321. }{})
  322. var image []model.PropertyImage
  323. global.App.DB.Table(model.TablePropertyImage).WhereIn("id", form.IdList).Scan(&image)
  324. if len(image) != len(form.IdList) {
  325. response.Fail(c, 500, "图片id错误")
  326. return
  327. }
  328. ////删除云端数据
  329. //for _, v := range image {
  330. // var AccountId = int64(57213719)
  331. // va := modelV3.ImagesDeleteRequest{
  332. // AccountId: &AccountId,
  333. // ImageId: &v.WxId,
  334. // }
  335. // tads := ads.Init(&config.SDKConfig{
  336. // AccessToken: GetAccessToken("", ""),
  337. // })
  338. // ctx := *tads.Ctx
  339. // //res, _, err := tads.Advertiser().Get(ctx, nil)
  340. // _, _, err := tads.Images().Delete(ctx, va)
  341. // if err != nil {
  342. // response.Fail(c, 1001, err.Error())
  343. // return
  344. // }
  345. //}
  346. var d interface{}
  347. err := global.App.DB.Transaction(func(tx *utils.WtDB) error {
  348. //删除image
  349. err := global.App.DB.Table(model.TablePropertyImage).WhereIn("id", form.IdList).Delete(d).Error
  350. if err != nil {
  351. return err
  352. }
  353. //删除tag
  354. err = global.App.DB.Table(model.TablePropertyImageTag).WhereIn("image_id", form.IdList).Delete(d).Error
  355. if err != nil {
  356. return err
  357. }
  358. userId := c.GetInt("userId")
  359. err = service.SetActionLog("删除", userId, "图片", image)
  360. if err != nil {
  361. global.App.Log.Error("")
  362. return err
  363. }
  364. return nil
  365. })
  366. if err != nil {
  367. fmt.Println(err.Error())
  368. response.Fail(c, 500, err.Error())
  369. return
  370. }
  371. //记录日志
  372. response.Success(c, gin.H{})
  373. }
  374. func UpdateImageTags(c *gin.Context) {
  375. form := request.Check(c, &struct {
  376. Id int `form:"id" json:"id" binding:"required"`
  377. Tags []int `form:"tags" json:"tags" binding:""`
  378. }{})
  379. if !CheckTags(form.Tags) {
  380. response.Fail(c, 500, "tag中有不存在或错误的ID")
  381. return
  382. }
  383. var image model.PropertyImage
  384. global.App.DB.Table(model.TablePropertyImage).Where("id", form.Id).Select("id", "wx_id").First(&image)
  385. if image.ID == 0 {
  386. response.Fail(c, 500, "图片id错误")
  387. return
  388. }
  389. var d interface{}
  390. err := global.App.DB.Transaction(func(tx *utils.WtDB) error {
  391. //删除tag
  392. err := global.App.DB.Table(model.TablePropertyImageTag).Where("image_id", image.ID).Delete(d).Error
  393. if err != nil {
  394. return err
  395. }
  396. //增加新tag
  397. var tags []model.PropertyImageTag
  398. for _, v := range form.Tags {
  399. tags = append(tags, model.PropertyImageTag{
  400. TagId: v,
  401. ImageId: image.ID,
  402. })
  403. }
  404. err = global.App.DB.Table(model.TablePropertyImageTag).CreateInBatches(&tags, 100).Error
  405. if err != nil {
  406. return err
  407. }
  408. //更新image表更新时间
  409. err = global.App.DB.Table(model.TablePropertyImage).Where("id", image.ID).Updates(map[string]interface{}{
  410. "updatedAt": time.Now(),
  411. }).Error
  412. if err != nil {
  413. return err
  414. }
  415. userId := c.GetInt("userId")
  416. err = service.SetActionLog("修改tag", userId, "图片", form.Tags)
  417. if err != nil {
  418. global.App.Log.Error("")
  419. return err
  420. }
  421. return nil
  422. })
  423. if err != nil {
  424. response.Fail(c, 500, err.Error())
  425. return
  426. }
  427. //记录日志
  428. response.Success(c, gin.H{})
  429. }
  430. func CheckTags(Tags []int) bool {
  431. var count int64
  432. global.App.DB.Table(model.TablePropertyTag).WhereIn("id", Tags).Count(&count)
  433. return int(count) == len(Tags)
  434. }
  435. func SetTag(c *gin.Context) {
  436. form := request.Check(c, &struct {
  437. Name string `form:"name" json:"name" binding:"required"`
  438. }{})
  439. var tag model.PropertyTag
  440. global.App.DB.Table(model.TablePropertyTag).Where("name", form.Name).First(&tag)
  441. if tag.ID != 0 {
  442. response.Fail(c, 1001, "该tag已建立")
  443. return
  444. }
  445. now := model.XTime{
  446. Time: time.Now(),
  447. }
  448. tag = model.PropertyTag{
  449. Name: form.Name,
  450. CreatedAt: now,
  451. }
  452. err := global.App.DB.Table(model.TablePropertyTag).Create(&tag).Error
  453. if err != nil {
  454. response.Fail(c, 500, err.Error())
  455. return
  456. }
  457. //记录日志
  458. userId := c.GetInt("userId")
  459. err = service.SetActionLog("新增", userId, "tag", tag)
  460. if err != nil {
  461. global.App.Log.Error("")
  462. response.Fail(c, 500, err.Error())
  463. return
  464. }
  465. response.Success(c, gin.H{
  466. "data": map[string]interface{}{
  467. "id": tag.ID,
  468. },
  469. })
  470. }
  471. func DeleteTag(c *gin.Context) {
  472. form := request.Check(c, &struct {
  473. Id int `form:"id" json:"id" binding:"required"`
  474. }{})
  475. var tag model.PropertyTag
  476. global.App.DB.Table(model.TablePropertyTag).Where("id", form.Id).First(&tag)
  477. if tag.ID == 0 {
  478. response.Fail(c, 1001, "该tag不存在")
  479. return
  480. }
  481. var d interface{}
  482. err := global.App.DB.Table(model.TablePropertyTag).Where("id", form.Id).Delete(d).Error
  483. if err != nil {
  484. response.Fail(c, 500, err.Error())
  485. return
  486. }
  487. //记录日志
  488. userId := c.GetInt("userId")
  489. err = service.SetActionLog("删除", userId, "tag", tag)
  490. if err != nil {
  491. global.App.Log.Error("")
  492. response.Fail(c, 500, err.Error())
  493. return
  494. }
  495. response.Success(c, gin.H{})
  496. }
  497. func VideoSet(c *gin.Context) {
  498. form := request.Check(c, &struct {
  499. VideoPath string `json:"videoPath" binding:"required"`
  500. HeadImgPath string `json:"headImgPath" binding:"required"`
  501. Md5 string `json:"md5" binding:"required"`
  502. Name string `json:"name" binding:"required"`
  503. Gid string `json:"gid" binding:"required"`
  504. Pid string `json:"pid" binding:""`
  505. Tags []int `json:"tags" binding:""`
  506. Resolution struct {
  507. Width int `json:"width" binding:""`
  508. Height int `json:"height" binding:""`
  509. } `json:"resolution" binding:""`
  510. VideoType int `json:"videoType" binding:"required"`
  511. }{})
  512. if !CheckTags(form.Tags) {
  513. response.Fail(c, 500, "tag中有不存在或错误的ID")
  514. return
  515. }
  516. //检查重复
  517. var video model.PropertyVideo
  518. global.App.DB.Table(model.TablePropertyVideo).Where("name", form.Name).Or("md5", form.Md5).First(&video)
  519. if video.ID != 0 {
  520. response.Fail(c, 1001, "视频名称或素材重复")
  521. return
  522. }
  523. //上传微信
  524. files, err := os.Open(form.VideoPath)
  525. if err != nil {
  526. response.Fail(c, 500, "文件读取失败"+err.Error())
  527. return
  528. }
  529. defer files.Close()
  530. //请求微信接口
  531. va := api.VideosAddOpts{AccountId: optional.NewInt64(57213719)}
  532. tads := ads.Init(&config.SDKConfig{
  533. AccessToken: GetAccessToken("", ""),
  534. })
  535. ctx := *tads.Ctx
  536. //res, _, err := tads.Advertiser().Get(ctx, nil)
  537. res, _, err := tads.Videos().Add(ctx, files, form.Md5, &va)
  538. if err != nil {
  539. response.Fail(c, 1001, err.Error())
  540. return
  541. }
  542. //入库
  543. //归档到纯皓系统中
  544. now := model.XTime{Time: time.Now()}
  545. newVideo := model.PropertyVideo{
  546. Name: form.Name,
  547. LocalPath: form.VideoPath,
  548. Gid: form.Gid,
  549. Pid: form.Pid,
  550. WxId: int(*res.VideoId),
  551. VideoSignature: form.Md5,
  552. CreatedAt: now,
  553. UpdatedAt: now,
  554. VideoType: form.VideoType,
  555. Resolution: strconv.Itoa(form.Resolution.Width) + "x" + strconv.Itoa(form.Resolution.Height),
  556. HeadImgPath: form.HeadImgPath,
  557. }
  558. err = global.App.DB.Transaction(func(tx *utils.WtDB) error {
  559. err = global.App.DB.Table(model.TablePropertyVideo).Create(&newVideo).Error
  560. if err != nil {
  561. return err
  562. }
  563. //增加新tag
  564. var tags []model.PropertyVideoTag
  565. for _, v := range form.Tags {
  566. tags = append(tags, model.PropertyVideoTag{
  567. TagId: v,
  568. VideoId: newVideo.ID,
  569. })
  570. }
  571. err = global.App.DB.Table(model.TablePropertyVideoTag).CreateInBatches(&tags, 100).Error
  572. if err != nil {
  573. return err
  574. }
  575. //记录日志
  576. userId := c.GetInt("userId")
  577. err = service.SetActionLog("新增", userId, "视频", newVideo)
  578. if err != nil {
  579. return err
  580. }
  581. return nil
  582. })
  583. if err != nil {
  584. response.Fail(c, 1001, "存入数据库失败"+err.Error())
  585. return
  586. }
  587. response.Success(c, gin.H{
  588. "files": res,
  589. })
  590. }
  591. func VideoDelete(c *gin.Context) {
  592. form := request.Check(c, &struct {
  593. IdList []int `form:"idList" json:"idList" binding:"required"`
  594. }{})
  595. var video []model.PropertyVideo
  596. global.App.DB.Table(model.TablePropertyVideo).WhereIn("id", form.IdList).Scan(&video)
  597. if len(video) != len(form.IdList) {
  598. response.Fail(c, 500, "图片id错误")
  599. return
  600. }
  601. ////删除云端数据
  602. //videoId := int64(video.WxId)
  603. //var AccountId = int64(57213719)
  604. //va := modelV3.VideosDeleteRequest{
  605. // AccountId: &AccountId,
  606. // VideoId: &videoId,
  607. //}
  608. //tads := ads.Init(&config.SDKConfig{
  609. // AccessToken: GetAccessToken("", ""),
  610. //})
  611. //ctx := *tads.Ctx
  612. ////res, _, err := tads.Advertiser().Get(ctx, nil)
  613. //_, _, err := tads.Videos().Delete(ctx, va)
  614. //if err != nil {
  615. // response.Fail(c, 1001, err.Error())
  616. // return
  617. //}
  618. var d interface{}
  619. err := global.App.DB.Transaction(func(tx *utils.WtDB) error {
  620. //删除video
  621. err := global.App.DB.Table(model.TablePropertyVideo).WhereIn("id", form.IdList).Delete(d).Error
  622. if err != nil {
  623. return err
  624. }
  625. //删除tag
  626. err = global.App.DB.Table(model.TablePropertyVideoTag).Where("video_id", form.IdList).Delete(d).Error
  627. if err != nil {
  628. return err
  629. }
  630. //记录日志
  631. userId := c.GetInt("userId")
  632. err = service.SetActionLog("删除", userId, "视频", video)
  633. if err != nil {
  634. return err
  635. }
  636. return nil
  637. })
  638. if err != nil {
  639. response.Fail(c, 501, err.Error())
  640. return
  641. }
  642. response.Success(c, gin.H{})
  643. }
  644. func UpdateVideoTags(c *gin.Context) {
  645. form := request.Check(c, &struct {
  646. Id int `form:"id" json:"id" binding:"required"`
  647. Tags []int `form:"tags" json:"tags" binding:""`
  648. }{})
  649. if !CheckTags(form.Tags) {
  650. response.Fail(c, 500, "tag中有不存在或错误的ID")
  651. return
  652. }
  653. var video model.PropertyVideo
  654. global.App.DB.Table(model.TablePropertyVideo).Where("id", form.Id).Select("id", "wx_id").First(&video)
  655. if video.ID == 0 {
  656. response.Fail(c, 500, "图片id错误")
  657. return
  658. }
  659. var d interface{}
  660. err := global.App.DB.Transaction(func(tx *utils.WtDB) error {
  661. //删除tag
  662. err := global.App.DB.Table(model.TablePropertyVideoTag).Where("video_id", video.ID).Delete(d).Error
  663. if err != nil {
  664. return err
  665. }
  666. //增加新tag
  667. var tags []model.PropertyVideoTag
  668. for _, v := range form.Tags {
  669. tags = append(tags, model.PropertyVideoTag{
  670. TagId: v,
  671. VideoId: video.ID,
  672. })
  673. }
  674. err = global.App.DB.Table(model.TablePropertyVideoTag).CreateInBatches(&tags, 100).Error
  675. if err != nil {
  676. return err
  677. }
  678. //更新image表更新时间
  679. err = global.App.DB.Table(model.TablePropertyVideo).Where("id", video.ID).Updates(map[string]interface{}{
  680. "updatedAt": time.Now(),
  681. }).Error
  682. if err != nil {
  683. return err
  684. }
  685. //记录日志
  686. userId := c.GetInt("userId")
  687. err = service.SetActionLog("修改", userId, "视频", form.Tags)
  688. if err != nil {
  689. return err
  690. }
  691. return nil
  692. })
  693. if err != nil {
  694. response.Fail(c, 500, "数据库错误"+err.Error())
  695. return
  696. }
  697. response.Success(c, gin.H{})
  698. }
  699. func GetTags(c *gin.Context) {
  700. form := request.Check(c, &struct {
  701. Offset int `form:"offset" json:"offset" binding:""`
  702. Limit int `form:"limit" json:"limit" binding:""`
  703. Search string `form:"search" json:"search" binding:""`
  704. }{})
  705. query := global.App.DB.Table(model.TablePropertyTag)
  706. if form.Search != "" {
  707. query = query.Where("name", "like", "%"+form.Search+"%")
  708. }
  709. var count int64
  710. err := query.Count(&count).Error
  711. if err != nil {
  712. response.Fail(c, 500, err.Error())
  713. return
  714. }
  715. if form.Offset != 0 {
  716. query = query.Offset(form.Offset)
  717. }
  718. if form.Limit != 0 {
  719. query = query.Limit(form.Limit)
  720. }
  721. var tags []model.PropertyTag
  722. err = query.Scan(&tags).Error
  723. if err != nil {
  724. response.Fail(c, 500, err.Error())
  725. return
  726. }
  727. response.Success(c, gin.H{
  728. "data": tags,
  729. "count": count,
  730. })
  731. }
  732. func VideoList(c *gin.Context) {
  733. form := request.Check(c, &struct {
  734. Offset int `form:"offset" json:"offset" binding:""`
  735. Limit int `form:"limit" json:"limit" binding:"required"`
  736. Search string `form:"search" json:"search" binding:""`
  737. Order string `form:"order" json:"order" binding:""`
  738. Prop string `form:"prop" json:"prop" binding:""`
  739. Gid string `form:"gid" json:"gid" binding:""`
  740. Pid string `form:"pid" json:"pid" binding:""`
  741. Resolution string `form:"resolution" json:"resolution" binding:""`
  742. VideoType string `form:"video_type" json:"video_type" binding:""`
  743. Tag []int `form:"tag" json:"tag" binding:""`
  744. }{})
  745. query := global.App.DB.Table(model.TablePropertyVideo)
  746. if form.Search != "" {
  747. query = query.Where("name", "like", "%"+form.Search+"%")
  748. }
  749. if form.Gid != "" {
  750. query = query.Where("gid", "=", form.Gid)
  751. }
  752. if form.Pid != "" {
  753. query = query.Where("pid", "=", form.Pid)
  754. }
  755. if form.Order != "" && form.Prop != "" {
  756. query = query.Order(form.Prop + " " + form.Order)
  757. }
  758. if form.Resolution != "" {
  759. query = query.Where("resolution", "=", form.Resolution)
  760. }
  761. if form.VideoType != "" {
  762. query = query.Where("video_type", "=", form.VideoType)
  763. }
  764. if form.Tag != nil {
  765. var videoIds []int
  766. query1 := global.App.DB.Table(model.TablePropertyVideoTag)
  767. for _, tag := range form.Tag {
  768. query1 = query1.Where("tag_id", tag)
  769. }
  770. query1.Pluck("video_id", &videoIds)
  771. query = query.WhereIn("id", videoIds)
  772. }
  773. var count int64
  774. err := query.Count(&count).Error
  775. if err != nil {
  776. response.Fail(c, 500, err.Error())
  777. return
  778. }
  779. type TagData struct {
  780. model.PropertyVideoTag
  781. Name string `json:"name" gorm:"not null;"`
  782. }
  783. var videos []model.PropertyVideo
  784. err = query.Offset(form.Offset).Limit(form.Limit).Scan(&videos).Error
  785. if err != nil {
  786. response.Fail(c, 500, err.Error())
  787. return
  788. }
  789. //查询出tag
  790. var ids []int
  791. for _, v := range videos {
  792. ids = append(ids, v.ID)
  793. }
  794. var tagData []TagData
  795. err = global.App.DB.Table(model.TablePropertyImageTag).
  796. LeftJoin(model.TablePropertyTag, "property_image_tag.tag_id = property_tag.id").
  797. WhereIn("property_image_tag.image_id", ids).
  798. Scan(&tagData).Error
  799. if err != nil {
  800. response.Fail(c, 500, err.Error())
  801. return
  802. }
  803. list := make([]struct {
  804. model.PropertyVideo
  805. Tag []TagData `json:"tag"`
  806. Download string `json:"download"`
  807. HeadImgDownload string `json:"headImgDownload"`
  808. }, len(videos))
  809. for k, v := range videos {
  810. list[k].ID = v.ID
  811. list[k].Gid = v.Gid
  812. list[k].Pid = v.Pid
  813. list[k].Name = v.Name
  814. list[k].WxId = v.WxId
  815. list[k].CreatedAt = v.CreatedAt
  816. list[k].UpdatedAt = v.UpdatedAt
  817. list[k].LocalPath = v.LocalPath
  818. list[k].Resolution = v.Resolution
  819. list[k].VideoType = v.VideoType
  820. list[k].Download = GetDownload(v.LocalPath)
  821. list[k].HeadImgPath = v.HeadImgPath
  822. list[k].HeadImgDownload = GetDownload(v.HeadImgPath)
  823. for _, tag := range tagData {
  824. if v.ID == tag.VideoId {
  825. list[k].Tag = append(list[k].Tag, tag)
  826. }
  827. }
  828. }
  829. response.Success(c, gin.H{
  830. "data": map[string]interface{}{
  831. "list": list,
  832. "count": count,
  833. },
  834. })
  835. }
  836. func GetDownload(filPath string) string {
  837. return localConfig.Get("app.appUrl") + "/download?filename=" + filPath
  838. }