task_conf.go 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333
  1. package task
  2. import (
  3. "bufio"
  4. "bytes"
  5. "context"
  6. "crypto/md5"
  7. "encoding/hex"
  8. "errors"
  9. "fmt"
  10. "github.com/qiniu/api.v7/v7/auth/qbox"
  11. "github.com/qiniu/api.v7/v7/storage"
  12. "go.uber.org/zap"
  13. "gorm.io/gorm"
  14. "io"
  15. "log-server/global"
  16. "log-server/model/common/request"
  17. "log-server/model/task"
  18. taskReq "log-server/model/task/request"
  19. "log-server/model/task/response"
  20. "log-server/utils"
  21. "mime/multipart"
  22. "path"
  23. "strconv"
  24. "strings"
  25. "time"
  26. )
  27. type TaskConfService struct {
  28. }
  29. func (e *TaskConfService) Upload(file response.UploadFileResponse) error {
  30. return global.GVA_DB.Table("upload_file").Create(&file).Error
  31. }
  32. const ACCESSKEY string = "B81Gsvry2StqKVE3txS-7v9GBBfqykC9zhebmxnW"
  33. const SECRETKEY string = "YEZJuYcdeF7vRvzffxpopAVR-jMPZg9pZ-4IKTVW"
  34. const BUCKET string = "pinaishop"
  35. //更改的上传文件函数
  36. func (e *TaskConfService) UploadFileFunc(file *multipart.FileHeader, taskId string) (string, string, string, error) {
  37. // 读取文件后缀
  38. ext := path.Ext(file.Filename)
  39. // 读取文件名并加密
  40. name := strings.TrimSuffix(file.Filename, ext)
  41. name = utils.MD5V([]byte(name))
  42. // 拼接新文件名
  43. filename := name + "_" + time.Now().Format("20060102150405") + ext
  44. key := "shuyou/script/" + taskId + "/" + filename
  45. // 尝试创建此路径
  46. //mkdirErr := os.MkdirAll(global.GVA_CONFIG.Local.ScriptPath, os.ModePerm)
  47. //if mkdirErr != nil {
  48. // global.GVA_LOG.Error("function os.MkdirAll() Filed", zap.Any("err", mkdirErr.Error()))
  49. // return "", "", "", errors.New("function os.MkdirAll() Filed, err:" + mkdirErr.Error())
  50. //}
  51. // 拼接路径和文件名
  52. //p := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
  53. //filepath := global.GVA_CONFIG.Local.ScriptPath + "/" + filename
  54. uploadErr := e.UploadFileToQiNiu(filename, taskId, file)
  55. if uploadErr != nil {
  56. global.GVA_LOG.Error("function UploadFileToQiNiu Filed", zap.Any("err", uploadErr.Error()))
  57. return "", "", "", errors.New("function UploadFileToQiNiu Filed, err:" + uploadErr.Error())
  58. }
  59. //f, openError := file.Open() // 读取文件
  60. f1, openErr := file.Open() // 读取文件生成MD5值
  61. if openErr != nil {
  62. global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openErr.Error()))
  63. return "", "", "", errors.New("function file.Open() Filed, err:" + openErr.Error())
  64. }
  65. //defer f.Close() // 创建文件 defer 关闭
  66. defer f1.Close()
  67. //生成md5值
  68. md5h := md5.New()
  69. io.Copy(md5h, f1)
  70. md5String := hex.EncodeToString(md5h.Sum(nil))
  71. //
  72. //out, createErr := os.Create(p)
  73. //if createErr != nil {
  74. // global.GVA_LOG.Error("function os.Create() Filed", zap.Any("err", createErr.Error()))
  75. //
  76. // return "", "", "", errors.New("function os.Create() Filed, err:" + createErr.Error())
  77. //}
  78. //defer out.Close() // 创建文件 defer 关闭
  79. //_, copyErr := io.Copy(out, f) // 传输(拷贝)文件
  80. //fmt.Println("拷贝文件")
  81. //if copyErr != nil {
  82. // global.GVA_LOG.Error("function io.Copy() Filed", zap.Any("err", copyErr.Error()))
  83. // return "", "", "", errors.New("function io.Copy() Filed, err:" + copyErr.Error())
  84. //}
  85. return key, filename, md5String, nil
  86. }
  87. func (e *TaskConfService) UploadFileToQiNiu(fileName string, taskId string, file *multipart.FileHeader) ( error) {
  88. accessKey := "B81Gsvry2StqKVE3txS-7v9GBBfqykC9zhebmxnW"
  89. secretKey := "YEZJuYcdeF7vRvzffxpopAVR-jMPZg9pZ-4IKTVW"
  90. mac := qbox.NewMac(accessKey, secretKey)
  91. bucket := "pinaishop"
  92. putPolicy := storage.PutPolicy{
  93. Scope: bucket,
  94. }
  95. key :="shuyou/script/" + taskId + "/" + fileName
  96. upToken := putPolicy.UploadToken(mac)
  97. cfg := storage.Config{}
  98. // 空间对应的机房
  99. cfg.Region = &storage.ZoneHuanan
  100. // 是否使用https域名
  101. cfg.UseHTTPS = true
  102. // 上传是否使用CDN上传加速
  103. cfg.UseCdnDomains = false
  104. formUploader := storage.NewFormUploader(&cfg)
  105. ret := storage.PutRet{}
  106. putExtra := storage.PutExtra{
  107. //Params: map[string]string{
  108. // "x:name": "github logo",
  109. //},
  110. }
  111. // Get the file size
  112. fileSize := file.Size
  113. f, openError := file.Open() // 读取文件
  114. if openError != nil {
  115. global.GVA_LOG.Error("function file.Open() Filed", zap.Any("err", openError.Error()))
  116. return errors.New("function file.Open() Filed, err:" + openError.Error())
  117. }
  118. defer f.Close()
  119. // Read the file into a byte slice
  120. bs := make([]byte, fileSize)
  121. _, err := bufio.NewReader(f).Read(bs)
  122. if err != nil && err != io.EOF {
  123. fmt.Println(err)
  124. return errors.New("文件转化成字节数组错误, err:" + err.Error())
  125. }
  126. err = formUploader.Put(context.Background(), &ret, upToken, key, bytes.NewReader(bs), fileSize, &putExtra)
  127. if err != nil {
  128. fmt.Println(err)
  129. return errors.New("上传七牛云错误, err:" + err.Error())
  130. }
  131. fmt.Println(ret.Key, ret.Hash)
  132. return nil
  133. }
  134. //上传文件
  135. func (e *TaskConfService) UploadFile(taskId int, user string, header *multipart.FileHeader) (file response.UploadFileResponse, err error) {
  136. //查询数据库记录数
  137. var count int64
  138. //获取最后一条记录
  139. var lastRecord response.UploadFileResponse
  140. var version int
  141. //定义下载前缀
  142. var prefix string = "http://cdn.pinaishop.kfzs.com/"
  143. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Count(&count)
  144. if count == 0 {
  145. version = 1
  146. } else {
  147. fmt.Println(count)
  148. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Order("id desc").Limit(1).Find(&lastRecord)
  149. fmt.Println(lastRecord)
  150. version = lastRecord.Version + 1
  151. recordArr := []response.UploadFileResponse{}
  152. global.GVA_DB.Table("upload_file").Where("task_id = ?", taskId).Find(&recordArr)
  153. fmt.Println(recordArr)
  154. }
  155. filePath, key, md5String, uploadErr := e.UploadFileFunc(header,strconv.Itoa(taskId) )
  156. if uploadErr != nil {
  157. panic(err)
  158. }
  159. s := strings.Split(header.Filename, ".")
  160. f := response.UploadFileResponse{
  161. TaskID: taskId,
  162. ResponsiblePerson: user,
  163. Url: prefix + filePath,
  164. Name: header.Filename,
  165. Tag: s[len(s)-1],
  166. Key: key,
  167. Version: version,
  168. Md5String: md5String,
  169. State : 1,
  170. }
  171. return f, e.Upload(f)
  172. }
  173. //下载文件
  174. func (e *TaskConfService) DownloadFile(taskId int, md5String string) (info response.DownloadFile, err error) {
  175. var file response.UploadFileResponse
  176. //改由存储至数据库的时候拼接前缀
  177. //var prefix string = global.GVA_CONFIG.PrefixUrl.PrefixLocal
  178. //数据库中无记录,即不需要更新
  179. err = global.GVA_DB.Table("upload_file").Where("task_id = ? and state = 1", taskId).Order("id desc").First(&file).Error
  180. if errors.Is(err, gorm.ErrRecordNotFound) {
  181. info = response.DownloadFile{
  182. Url: "",
  183. Md5String: "",
  184. Flag: false,
  185. }
  186. return info, errors.New("无对应脚本")
  187. }
  188. if file.Md5String == md5String {
  189. info = response.DownloadFile{
  190. Url: "",
  191. Md5String: "",
  192. Flag: false,
  193. }
  194. return info, errors.New("不需要更新")
  195. } else {
  196. fullUrl := file.Url
  197. info = response.DownloadFile{
  198. Url: fullUrl,
  199. Md5String: file.Md5String,
  200. Flag: true,
  201. }
  202. }
  203. return info, err
  204. }
  205. //条件查询脚本列表
  206. func (e *TaskConfService) GetScriptList(script task.GameScriptResponse, info request.PageInfo, order string, desc bool) (list interface{}, total int64, err error) {
  207. //获取分页数据
  208. limit := info.PageSize
  209. offset := (info.Page - 1) * info.PageSize
  210. //绑定操作结构体
  211. db := global.GVA_DB.Table("upload_file").Model(&task.GameScriptResponse{})
  212. var scriptList []task.GameScriptResponse
  213. //条件查询
  214. if script.ResponsiblePerson != "" {
  215. db = db.Where("responsible_person = ?", script.ResponsiblePerson)
  216. }
  217. if script.TaskID != 0 {
  218. db = db.Where("task_id = ?", script.TaskID)
  219. }
  220. //先过滤在排序
  221. if err = db.Count(&total).Error; err != nil {
  222. return scriptList, total, err
  223. } else {
  224. //分页
  225. db.Limit(limit).Offset(offset)
  226. //判断是否有排序字段
  227. if order != "" {
  228. var orderStr string
  229. orderMap := make(map[string]bool, 1)
  230. orderMap["create_time"] = true
  231. orderMap["task_id"] = true
  232. orderMap["name"] = true
  233. orderMap["responsible_person"] = true
  234. orderMap["version"] = true
  235. if orderMap[order] {
  236. //合法排序字符
  237. if desc {
  238. orderStr = order + " desc"
  239. } else {
  240. orderStr = order
  241. }
  242. } else {
  243. //传入排序字段非法
  244. err = fmt.Errorf("传入非法字段 %v", order)
  245. return scriptList, total, err
  246. }
  247. err = db.Order(orderStr).Find(&scriptList).Error
  248. } else {
  249. //默认按照名字升序排序
  250. err = db.Order("id desc").Find(&scriptList).Error
  251. }
  252. }
  253. return scriptList, total, err
  254. }
  255. //更改脚本状态
  256. func (e *TaskConfService) UpdateScriptStatus(c taskReq.UpdateScriptStatusRequest) (err error) {
  257. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Error
  258. if errors.Is(err, gorm.ErrRecordNotFound) {
  259. return errors.New("请传入正确的Id")
  260. }
  261. err = global.GVA_DB.Table("upload_file").Where("id = ?", c.Id).Update("state", c.State).Error
  262. return err
  263. }
  264. //更改推送标准
  265. func (e *TaskConfService) JudgeOperate(taskConf task.TaskConf) (err error) {
  266. //查找数据库中是否有这条记录
  267. var entity task.TaskConf
  268. err = global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).First(&entity).Error
  269. //如果没有,创建
  270. if errors.Is(err, gorm.ErrRecordNotFound) {
  271. return global.GVA_DB.Model(&task.TaskConf{}).Create(&taskConf).Error
  272. }
  273. //如果有,更新
  274. return global.GVA_DB.Model(&task.TaskConf{}).Where("task_id = ?", taskConf.TaskId).Omit("task_id", "user").Updates(map[string]interface{}{"add_fee_notice": taskConf.AddFeeNotice, "simulator_type": taskConf.SimulatorType}).Error
  275. }
  276. //删除上传脚本
  277. func (e *TaskConfService) DeleteScript(file task.GameScriptResponse) (err error) {
  278. //七牛云删除所需要的条件
  279. mac := qbox.NewMac(ACCESSKEY, SECRETKEY)
  280. cfg := storage.Config{
  281. // 是否使用https域名进行资源管理
  282. UseHTTPS: true,
  283. }
  284. // 指定空间所在的区域,如果不指定将自动探测
  285. // 如果没有特殊需求,默认不需要指定
  286. //cfg.Region=&storage.ZoneHuabei
  287. bucketManager := storage.NewBucketManager(mac, &cfg)
  288. //删除数据库记录
  289. var entity task.GameScriptResponse
  290. err = global.GVA_DB.Table("upload_file").Where("id", file.Id).First(&entity).Error
  291. if errors.Is(err, gorm.ErrRecordNotFound) {
  292. return errors.New("无此条脚本记录")
  293. }
  294. key := file.Url[30:]
  295. fmt.Println(key)
  296. err = global.GVA_DB.Table("upload_file").Delete(&entity).Error
  297. if err != nil {
  298. return err
  299. }
  300. //删除七牛云的记录
  301. err = bucketManager.Delete(BUCKET, key)
  302. fmt.Println(err)
  303. return err
  304. }