13 changed files with 929 additions and 25 deletions
@ -0,0 +1,47 @@
@@ -0,0 +1,47 @@
|
||||
package api |
||||
|
||||
import ( |
||||
"changeme/cameraFunc" |
||||
"changeme/util/response" |
||||
|
||||
"github.com/gogf/gf/v2/net/ghttp" |
||||
) |
||||
|
||||
func DownLoadCameraJpg(r *ghttp.Request) { |
||||
deviceId := r.Get("device_id").String() |
||||
fileType := r.Get("file_type").String() |
||||
id := r.Get("id").String() |
||||
if deviceId == "" || id == "" { |
||||
response.FailJson(true, r,"参数错误") |
||||
return |
||||
} |
||||
if fileType == "" { |
||||
err1 := cameraFunc.DownLoadCameraJpgByFtp(id,deviceId,"1") |
||||
err2 := cameraFunc.DownLoadCameraJpgByFtp(id,deviceId,"2") |
||||
|
||||
if err1 != nil && err2 != nil { |
||||
response.FailJson(true, r,"下载失败",[]string{err1.Error(),err2.Error()}) |
||||
return |
||||
} |
||||
|
||||
if err1 != nil && err2 == nil { |
||||
response.FailJson(true, r,"预览图下载失败,高清图下载成功",[]string{err1.Error()}) |
||||
return |
||||
} |
||||
|
||||
if err1 == nil && err2 != nil { |
||||
response.FailJson(true, r,"预览图下载成功,高清图下载失败",[]string{err2.Error()}) |
||||
return |
||||
} |
||||
|
||||
response.SusJson(true, r, "下载成功") |
||||
|
||||
}else{ |
||||
err := cameraFunc.DownLoadCameraJpgByFtp(id,deviceId,fileType) |
||||
if err != nil { |
||||
response.FailJson(true, r,"下载失败",[]string{err.Error()}) |
||||
return |
||||
} |
||||
response.SusJson(true, r, "下载成功") |
||||
} |
||||
} |
||||
@ -0,0 +1,24 @@
@@ -0,0 +1,24 @@
|
||||
package api |
||||
|
||||
import ( |
||||
"changeme/masterFunc" |
||||
"changeme/util/response" |
||||
|
||||
"github.com/gogf/gf/v2/net/ghttp" |
||||
) |
||||
|
||||
func DownLoadMasterJpg(r *ghttp.Request) { |
||||
id := r.Get("id").Int() |
||||
if id == 0 { |
||||
response.FailJson(true, r, "参数错误") |
||||
return |
||||
} |
||||
|
||||
err := masterFunc.DownLoadMasterJpgBySftp(id) |
||||
if err != nil { |
||||
response.FailJson(true, r, "下载失败", []string{err.Error()}) |
||||
return |
||||
} |
||||
response.SusJson(true, r, "下载成功") |
||||
|
||||
} |
||||
@ -0,0 +1,76 @@
@@ -0,0 +1,76 @@
|
||||
package api |
||||
|
||||
import ( |
||||
"changeme/db" |
||||
"changeme/model" |
||||
"changeme/util/response" |
||||
|
||||
"github.com/gogf/gf/v2/net/ghttp" |
||||
) |
||||
|
||||
func AddDbData(r *ghttp.Request) { |
||||
var req *model.AddData |
||||
//获取参数&参数校验
|
||||
if err := r.Parse(&req); err != nil { |
||||
//fmt.Fprintf(w,gconv.String(g.Map{"code":"-1","msg":err.Error()}))
|
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
DBFunc := db.GetInstance() |
||||
err := DBFunc.Add(req) |
||||
if err != nil { |
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
response.SusJson(true, r, "查询成功") |
||||
} |
||||
|
||||
func Page(r *ghttp.Request) { |
||||
var req *model.PageReqData |
||||
//获取参数&参数校验
|
||||
if err := r.Parse(&req); err != nil { |
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
DBFunc := db.GetInstance() |
||||
list,err := DBFunc.List(req) |
||||
if err != nil { |
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
response.SusJson(true, r, "查询成功",list) |
||||
} |
||||
|
||||
func UpdateDbData(r *ghttp.Request) { |
||||
var req *model.Data |
||||
//获取参数&参数校验
|
||||
if err := r.Parse(&req); err != nil { |
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
DBFunc := db.GetInstance() |
||||
err := DBFunc.Update(req) |
||||
if err != nil { |
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
response.SusJson(true, r, "更新成功") |
||||
} |
||||
|
||||
|
||||
|
||||
func DeleteDbData(r *ghttp.Request) { |
||||
var req *model.DeleteReqData |
||||
//获取参数&参数校验
|
||||
if err := r.Parse(&req); err != nil { |
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
DBFunc := db.GetInstance() |
||||
err := DBFunc.Delete(req) |
||||
if err != nil { |
||||
response.FailJson(true, r, err.Error()) |
||||
return |
||||
} |
||||
response.SusJson(true, r, "操作成功") |
||||
} |
||||
@ -0,0 +1,75 @@
@@ -0,0 +1,75 @@
|
||||
package cameraFunc |
||||
|
||||
import ( |
||||
"io" |
||||
"os" |
||||
"path/filepath" |
||||
|
||||
"github.com/gogf/gf/v2/frame/g" |
||||
"github.com/jlaffaye/ftp" |
||||
) |
||||
|
||||
//连接到相机 FTP 服务器,下载文件
|
||||
func DownLoadCameraJpgByFtp(id,deviceId string,fileType string) error { |
||||
ip := "192.168.88."+deviceId+":21" |
||||
// 连接到 FTP 服务器
|
||||
c, err := ftp.Dial(ip) // 替换为你的 FTP 服务器地址
|
||||
if err != nil { |
||||
g.Dump("ftp.Dial(ip) error:",err) |
||||
return err |
||||
} |
||||
defer c.Quit() |
||||
// 登录到 FTP 服务器
|
||||
err = c.Login("icatch", "icatch") // 替换为你的用户名和密码
|
||||
if err != nil { |
||||
g.Dump("c.Login error:",err) |
||||
return err |
||||
} |
||||
//现在本地创建文件夹和文件
|
||||
fileName := id+"_"+deviceId+"_"+fileType+".jpg" |
||||
file,err := IsExistDirAndFileForCreate(id,fileName) |
||||
if err != nil { |
||||
defer file.Close() |
||||
g.Dump("IsExistDirAndFileForCreate error:",err) |
||||
return err |
||||
} |
||||
// 从 FTP 服务器获取文件
|
||||
r,err := c.Retr("jpg/"+fileName) // 远程文件名
|
||||
if err != nil { |
||||
g.Dump("c.Retr error:",err) |
||||
return err |
||||
} |
||||
defer file.Close() |
||||
defer r.Close() |
||||
_, err = io.Copy(file, r) |
||||
if err != nil { |
||||
g.Dump("io.Copy error:",err) |
||||
return err |
||||
} |
||||
return nil |
||||
} |
||||
|
||||
|
||||
//判断当前根目录是否存在指定的文件夹和文件夹下的文件,没有则创建
|
||||
func IsExistDirAndFileForCreate(id string,fileName string) (file *os.File,err error) { |
||||
// 指定的目录和文件名
|
||||
dirPath := "downloads_new/"+id // 目标文件夹
|
||||
//fileName := "myfile.txt" // 目标文件
|
||||
// 检查目录是否存在
|
||||
if _, err := os.Stat(dirPath); os.IsNotExist(err) { |
||||
// 目录不存在,创建目录
|
||||
err := os.MkdirAll(dirPath, os.ModePerm) |
||||
if err != nil { |
||||
return nil,err |
||||
} |
||||
} |
||||
// 检查文件是否存在
|
||||
filePath := filepath.Join(dirPath, fileName) |
||||
// 文件不存在,创建文件
|
||||
file, err = os.Create(filePath) |
||||
if err != nil { |
||||
return nil,err |
||||
} |
||||
// 关闭文件
|
||||
return file,nil |
||||
} |
||||
@ -0,0 +1,220 @@
@@ -0,0 +1,220 @@
|
||||
package db |
||||
|
||||
import ( |
||||
"changeme/model" |
||||
"database/sql" |
||||
"errors" |
||||
"fmt" |
||||
"reflect" |
||||
"strings" |
||||
"sync" |
||||
|
||||
"github.com/gogf/gf/v2/util/gconv" |
||||
_ "github.com/mattn/go-sqlite3" |
||||
) |
||||
|
||||
// DB 结构体
|
||||
type DB struct { |
||||
*sql.DB |
||||
} |
||||
|
||||
var ( |
||||
instance *DB |
||||
once sync.Once |
||||
) |
||||
var TableName = "photo_studio_shoot_order" |
||||
// GetInstance 返回数据库单例实例
|
||||
func GetInstance() *DB { |
||||
once.Do(func() { |
||||
db, err := sql.Open("sqlite3", "test.db") |
||||
if err != nil { |
||||
panic(err) |
||||
} |
||||
instance = &DB{db} |
||||
//检测表是否存在
|
||||
checkTableSQL := `SELECT count(*) FROM sqlite_master WHERE type='table' AND name='`+TableName+`';` |
||||
var count int |
||||
if err := instance.QueryRow(checkTableSQL).Scan(&count); err != nil { |
||||
panic(err) |
||||
} |
||||
if count > 0 { |
||||
return |
||||
} |
||||
// 创建表
|
||||
createTableSQL := `CREATE TABLE "`+TableName+`" ( |
||||
"id" INTEGER NOT NULL, |
||||
"pid" INTEGER NOT NULL, |
||||
"customer_id" INTEGER NOT NULL, |
||||
"customer_name" TEXT NOT NULL, |
||||
"status" INTEGER NOT NULL, |
||||
"order_id" INTEGER NOT NULL, |
||||
"digital_order_id" INTEGER NOT NULL, |
||||
"digital_type" INTEGER NOT NULL, |
||||
"cover_path" TEXT NOT NULL, |
||||
"cover_rotate_deg" INTEGER NOT NULL, |
||||
"shoot_at_count" INTEGER NOT NULL, |
||||
"shoot_done_count" INTEGER NOT NULL, |
||||
"upload_cover_count" INTEGER NOT NULL, |
||||
"upload_highmode_count" INTEGER NOT NULL, |
||||
"upload_yuv_count" INTEGER NOT NULL, |
||||
"first_shoot_at" DATETIME NULL, |
||||
"first_shoot_done_at" DATETIME NULL, |
||||
"last_shoot_at" DATETIME NULL, |
||||
"last_shoot_done_at" DATETIME NULL, |
||||
"check_status" INTEGER NOT NULL, |
||||
"check_fail_reason" TEXT NOT NULL, |
||||
"check_at" DATETIME NULL, |
||||
"shop_id" INTEGER NOT NULL, |
||||
"eq_id" INTEGER NOT NULL, |
||||
"master_ver" TEXT NOT NULL, |
||||
"eq_type" INTEGER NOT NULL, |
||||
"created_at" DATETIME NULL, |
||||
"upload_done_at" DATETIME NULL, |
||||
"minipreview_upload_done_at" DATETIME NULL, |
||||
"updated_at" DATETIME NULL, |
||||
"is_privary" INTEGER NOT NULL, |
||||
"cancel_at" DATETIME NULL, |
||||
PRIMARY KEY ("id") |
||||
);` |
||||
if _, err = instance.Exec(createTableSQL); err != nil { |
||||
panic(err) |
||||
} |
||||
}) |
||||
return instance |
||||
} |
||||
|
||||
|
||||
//Add 新增数据
|
||||
func (db *DB) Add(addData *model.AddData) error { |
||||
v := reflect.ValueOf(addData) |
||||
// 确保传入的参数是指向结构体的指针
|
||||
if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct { |
||||
return errors.New("invalid input") |
||||
} |
||||
// 获取结构体的类型和字段
|
||||
t := v.Elem().Type() |
||||
fields := []string{} |
||||
placeholders := []string{} |
||||
values := []interface{}{} |
||||
|
||||
for i := 0; i < v.Elem().NumField(); i++ { |
||||
field := t.Field(i) |
||||
value := v.Elem().Field(i) |
||||
// 使用 db 标签作为字段名
|
||||
dbTag := field.Tag.Get("json") |
||||
fields = append(fields, dbTag) |
||||
placeholders = append(placeholders, "?") |
||||
values = append(values, value.Interface()) |
||||
} |
||||
// 生成 SQL 语句
|
||||
sqlStatement := fmt.Sprintf("INSERT INTO %s (%s) VALUES (%s)", |
||||
TableName, |
||||
strings.Join(fields, ", "), |
||||
strings.Join(placeholders, ", ")) |
||||
// 执行 SQL 语句
|
||||
_, err := db.Exec(sqlStatement, values...) |
||||
return err |
||||
} |
||||
|
||||
//根据查询列表数据
|
||||
// List 方法
|
||||
func (db *DB) List(req *model.PageReqData) (list []*model.Data, err error) { |
||||
// 基本的 SQL 查询语句
|
||||
query := "SELECT cover_path,pid,customer_name FROM "+TableName+" WHERE 1=1" |
||||
var args []interface{} |
||||
|
||||
// 根据请求参数动态构建查询条件
|
||||
if req.Pid > 0 { |
||||
query += " AND pid = ?" |
||||
args = append(args, req.Pid) |
||||
} |
||||
if req.CustomerId > 0 { |
||||
query += " AND customer_id = ?" |
||||
args = append(args, req.CustomerId) |
||||
} |
||||
if req.CustomerName != "" { |
||||
query += " AND customer_name LIKE ?" |
||||
args = append(args, "%"+req.CustomerName+"%") |
||||
} |
||||
if req.Status > 0 { |
||||
query += " AND status = ?" |
||||
args = append(args, req.Status) |
||||
} |
||||
|
||||
// 添加分页条件
|
||||
if req.Page <= 0 { |
||||
req.Page = 1 |
||||
} |
||||
if req.Size <= 0 { |
||||
req.Size = 20 |
||||
} |
||||
offset := (req.Page - 1) * req.Size |
||||
query += fmt.Sprintf(" LIMIT %d OFFSET %d", req.Size, offset) |
||||
// 执行查询
|
||||
rows, err := db.Query(query, args...) |
||||
if err != nil { |
||||
return nil, err |
||||
} |
||||
defer rows.Close() |
||||
|
||||
// 读取查询结果
|
||||
for rows.Next() { |
||||
var addData model.Data |
||||
if err := rows.Scan(&addData.CoverPath, &addData.Pid, &addData.CustomerName); err != nil { |
||||
return nil, err |
||||
} |
||||
list = append(list, &addData) |
||||
} |
||||
return list, nil |
||||
} |
||||
|
||||
func (db *DB) Delete(req *model.DeleteReqData) (err error) { |
||||
if req.Pid == 0 && req.Id == 0 { |
||||
return errors.New("参数不能为空") |
||||
} |
||||
query := "DELETE FROM "+TableName+" WHERE 1=1" |
||||
var args []interface{} |
||||
if req.Pid > 0 { |
||||
query += " AND pid = ?" |
||||
args = append(args, req.Pid) |
||||
} |
||||
if req.Id > 0 { |
||||
query += " AND id = ?" |
||||
args = append(args, req.Id) |
||||
} |
||||
_, err = db.Exec(query, args...) |
||||
return err |
||||
} |
||||
|
||||
func (db *DB) Update(addData *model.Data) error { |
||||
v := reflect.ValueOf(addData) |
||||
// 确保传入的参数是指向结构体的指针
|
||||
if v.Kind() != reflect.Ptr || v.Elem().Kind() != reflect.Struct { |
||||
return errors.New("invalid input") |
||||
} |
||||
|
||||
// 获取结构体的类型和字段
|
||||
t := v.Elem().Type() |
||||
fields := []string{} |
||||
values := []interface{}{} |
||||
|
||||
for i := 0; i < v.Elem().NumField(); i++ { |
||||
field := t.Field(i) |
||||
value := v.Elem().Field(i) |
||||
// 使用 db 标签作为字段名
|
||||
dbTag := field.Tag.Get("json") |
||||
if gconv.String(value.Interface()) != "" && gconv.String(value.Interface()) != "0" && dbTag != "id" { |
||||
fields = append(fields, fmt.Sprintf("%s = ?", dbTag)) |
||||
values = append(values, value.Interface()) |
||||
} |
||||
} |
||||
// 生成 Update SQL 语句
|
||||
sqlStatement := fmt.Sprintf("UPDATE %s SET %s WHERE id = %s", |
||||
TableName, |
||||
strings.Join(fields, ", "), |
||||
gconv.String(addData.Id), |
||||
) |
||||
// 执行 SQL 语句
|
||||
_, err := db.Exec(sqlStatement, values...) |
||||
return err |
||||
} |
||||
@ -0,0 +1,127 @@
@@ -0,0 +1,127 @@
|
||||
package masterFunc |
||||
|
||||
import ( |
||||
"fmt" |
||||
"io" |
||||
"os" |
||||
"path/filepath" |
||||
"strings" |
||||
|
||||
"github.com/gogf/gf/v2/frame/g" |
||||
"github.com/pkg/sftp" |
||||
"golang.org/x/crypto/ssh" |
||||
) |
||||
|
||||
// DownLoadCameraJpgBySftp 使用 SFTP 连接下载远程文件
|
||||
func DownLoadMasterJpgBySftp(id int) error { |
||||
ip := "192.168.88.2:22" // SFTP 服务器地址 (通常是 SSH 协议端口)
|
||||
username := "pi" |
||||
password := "picc2008" |
||||
|
||||
// 配置 SSH 客户端
|
||||
sshConfig := &ssh.ClientConfig{ |
||||
User: username, |
||||
Auth: []ssh.AuthMethod{ |
||||
ssh.Password(password), |
||||
}, |
||||
HostKeyCallback: ssh.InsecureIgnoreHostKey(), // 忽略主机密钥验证(不建议用于生产环境)
|
||||
} |
||||
|
||||
// 连接到 SSH 服务器
|
||||
client, err := ssh.Dial("tcp", ip, sshConfig) |
||||
if err != nil { |
||||
fmt.Println("ssh.Dial error:", err) |
||||
return err |
||||
} |
||||
defer client.Close() |
||||
|
||||
// 创建 SFTP 客户端
|
||||
sftpClient, err := sftp.NewClient(client) |
||||
if err != nil { |
||||
fmt.Println("sftp.NewClient error:", err) |
||||
return err |
||||
} |
||||
defer sftpClient.Close() |
||||
|
||||
fmt.Println("id:", id) |
||||
|
||||
// 设定远程目录路径
|
||||
remotePath := "/home/pi/photos/" + fmt.Sprint(id) |
||||
// 本地目录路径
|
||||
localPathPhoto1 := "./downloads/" + fmt.Sprint(id) + "/photo1" |
||||
localPathPhoto2 := "./downloads/" + fmt.Sprint(id) + "/photo2" |
||||
|
||||
// 创建本地目录
|
||||
err = os.MkdirAll(localPathPhoto1, os.ModePerm) |
||||
if err != nil { |
||||
fmt.Println("os.MkdirAll error:", err) |
||||
return err |
||||
} |
||||
|
||||
err = os.MkdirAll(localPathPhoto2, os.ModePerm) |
||||
if err != nil { |
||||
fmt.Println("os.MkdirAll error:", err) |
||||
return err |
||||
} |
||||
|
||||
// 获取远程目录中的文件和子目录
|
||||
entries, err := sftpClient.ReadDir(remotePath) |
||||
if err != nil { |
||||
fmt.Println("sftpClient.ReadDir error:", err) |
||||
return err |
||||
} |
||||
g.Dump("entries", entries, remotePath) |
||||
|
||||
// 遍历远程目录中的所有文件
|
||||
for _, entry := range entries { |
||||
localFilePath := "" |
||||
|
||||
// 判断文件名称是否包含 _1.jpg
|
||||
if strings.Contains(entry.Name(), "_1.jpg") { |
||||
// 生成本地文件路径
|
||||
localFilePath = filepath.Join(localPathPhoto1, entry.Name()) |
||||
} |
||||
|
||||
// 判断文件名称是否包含 _8.jpg
|
||||
if strings.Contains(entry.Name(), "_8.jpg") { |
||||
localFilePath = filepath.Join(localPathPhoto2, entry.Name()) |
||||
} |
||||
|
||||
// 下载文件
|
||||
err := DownloadFile(sftpClient, remotePath+"/"+entry.Name(), localFilePath) |
||||
if err != nil { |
||||
return err |
||||
} |
||||
} |
||||
|
||||
return nil |
||||
} |
||||
|
||||
// DownloadFile 下载单个文件
|
||||
func DownloadFile(client *sftp.Client, remoteFile, localFile string) error { |
||||
// 创建本地文件
|
||||
file, err := os.Create(localFile) |
||||
if err != nil { |
||||
fmt.Println("os.Create error:", err) |
||||
return err |
||||
} |
||||
defer file.Close() |
||||
|
||||
// 打开远程文件
|
||||
remoteFileHandle, err := client.Open(remoteFile) |
||||
if err != nil { |
||||
fmt.Println("client.Open error:", err) |
||||
return err |
||||
} |
||||
defer remoteFileHandle.Close() |
||||
|
||||
// 将文件内容从远程文件复制到本地文件
|
||||
_, err = io.Copy(file, remoteFileHandle) |
||||
if err != nil { |
||||
fmt.Println("io.Copy error:", err) |
||||
return err |
||||
} |
||||
|
||||
fmt.Println("Downloaded file:", localFile) |
||||
return nil |
||||
} |
||||
@ -0,0 +1,125 @@
@@ -0,0 +1,125 @@
|
||||
package model |
||||
|
||||
// CREATE TABLE "photo_studio_shoot_order" (
|
||||
// "id" INTEGER NOT NULL,
|
||||
// "pid" INTEGER NOT NULL,
|
||||
// "customer_id" INTEGER NOT NULL,
|
||||
// "customer_name" TEXT NOT NULL,
|
||||
// "status" INTEGER NOT NULL,
|
||||
// "order_id" INTEGER NOT NULL,
|
||||
// "digital_order_id" INTEGER NOT NULL,
|
||||
// "digital_type" INTEGER NOT NULL,
|
||||
// "cover_path" TEXT NOT NULL,
|
||||
// "cover_rotate_deg" INTEGER NOT NULL,
|
||||
// "shoot_at_count" INTEGER NOT NULL,
|
||||
// "shoot_done_count" INTEGER NOT NULL,
|
||||
// "upload_cover_count" INTEGER NOT NULL,
|
||||
// "upload_highmode_count" INTEGER NOT NULL,
|
||||
// "upload_yuv_count" INTEGER NOT NULL,
|
||||
// "first_shoot_at" DATETIME NULL,
|
||||
// "first_shoot_done_at" DATETIME NULL,
|
||||
// "last_shoot_at" DATETIME NULL,
|
||||
// "last_shoot_done_at" DATETIME NULL,
|
||||
// "check_status" INTEGER NOT NULL,
|
||||
// "check_fail_reason" TEXT NOT NULL,
|
||||
// "check_at" DATETIME NULL,
|
||||
// "shop_id" INTEGER NOT NULL,
|
||||
// "eq_id" INTEGER NOT NULL,
|
||||
// "master_ver" TEXT NOT NULL,
|
||||
// "eq_type" INTEGER NOT NULL,
|
||||
// "created_at" DATETIME NULL,
|
||||
// "upload_done_at" DATETIME NULL,
|
||||
// "minipreview_upload_done_at" DATETIME NULL,
|
||||
// "updated_at" DATETIME NULL,
|
||||
// "is_privary" INTEGER NOT NULL,
|
||||
// "cancel_at" DATETIME NULL,
|
||||
// PRIMARY KEY ("id")
|
||||
// );
|
||||
|
||||
type AddData struct { |
||||
Pid int `json:"pid"` |
||||
CustomerId int `json:"customer_id"` |
||||
CustomerName string `json:"customer_name"` |
||||
Status int `json:"status"` |
||||
OrderId int `json:"order_id"` |
||||
DigitalOrderId int `json:"digital_order_id"` |
||||
DigitalType int `json:"digital_type"` |
||||
CoverPath string `json:"cover_path"` |
||||
CoverRotateDeg int `json:"cover_rotate_deg"` |
||||
ShootAtCount int `json:"shoot_at_count"` |
||||
ShootDoneCount int `json:"shoot_done_count"` |
||||
UploadCoverCount int `json:"upload_cover_count"` |
||||
UploadHighmodeCount int `json:"upload_highmode_count"` |
||||
UploadYuvCount int `json:"upload_yuv_count"` |
||||
FirstShootAt string `json:"first_shoot_at"` |
||||
FirstShootDoneAt string `json:"first_shoot_done_at"` |
||||
LastShootAt string `json:"last_shoot_at"` |
||||
LastShootDoneAt string `json:"last_shoot_done_at"` |
||||
CheckStatus int `json:"check_status"` |
||||
CheckFailReason string `json:"check_fail_reason"` |
||||
CheckAt string `json:"check_at"` |
||||
ShopId int `json:"shop_id"` |
||||
EqId int `json:"eq_id"` |
||||
MasterVer string `json:"master_ver"` |
||||
EqType int `json:"eq_type"` |
||||
CreatedAt string `json:"created_at"` |
||||
UploadDoneAt string `json:"upload_done_at"` |
||||
MinipreviewUploadDoneAt string `json:"minipreview_upload_done_at"` |
||||
UpdatedAt string `json:"updated_at"` |
||||
IsPrivary int `json:"is_privary"` |
||||
CancelAt string `json:"cancel_at"` |
||||
} |
||||
|
||||
type Data struct { |
||||
Id int `json:"id"` |
||||
Pid int `json:"pid"` |
||||
CustomerId int `json:"customer_id"` |
||||
CustomerName string `json:"customer_name"` |
||||
Status int `json:"status"` |
||||
OrderId int `json:"order_id"` |
||||
DigitalOrderId int `json:"digital_order_id"` |
||||
DigitalType int `json:"digital_type"` |
||||
CoverPath string `json:"cover_path"` |
||||
CoverRotateDeg int `json:"cover_rotate_deg"` |
||||
ShootAtCount int `json:"shoot_at_count"` |
||||
ShootDoneCount int `json:"shoot_done_count"` |
||||
UploadCoverCount int `json:"upload_cover_count"` |
||||
UploadHighmodeCount int `json:"upload_highmode_count"` |
||||
UploadYuvCount int `json:"upload_yuv_count"` |
||||
FirstShootAt string `json:"first_shoot_at"` |
||||
FirstShootDoneAt string `json:"first_shoot_done_at"` |
||||
LastShootAt string `json:"last_shoot_at"` |
||||
LastShootDoneAt string `json:"last_shoot_done_at"` |
||||
CheckStatus int `json:"check_status"` |
||||
CheckFailReason string `json:"check_fail_reason"` |
||||
CheckAt string `json:"check_at"` |
||||
ShopId int `json:"shop_id"` |
||||
EqId int `json:"eq_id"` |
||||
MasterVer string `json:"master_ver"` |
||||
EqType int `json:"eq_type"` |
||||
CreatedAt string `json:"created_at"` |
||||
UploadDoneAt string `json:"upload_done_at"` |
||||
MinipreviewUploadDoneAt string `json:"minipreview_upload_done_at"` |
||||
UpdatedAt string `json:"updated_at"` |
||||
IsPrivary int `json:"is_privary"` |
||||
CancelAt string `json:"cancel_at"` |
||||
} |
||||
|
||||
type PageResData struct { |
||||
Total int `json:"total"` |
||||
Rows []AddData `json:"rows"` |
||||
} |
||||
|
||||
type PageReqData struct { |
||||
Page int `json:"page"` |
||||
Size int `json:"size"` |
||||
Pid int `json:"pid"` |
||||
CustomerId int `json:"customer_id"` |
||||
CustomerName string `json:"customer_name"` |
||||
Status int `json:"status"` |
||||
} |
||||
|
||||
type DeleteReqData struct { |
||||
Pid int `json:"pid"` |
||||
Id int `json:"id"` |
||||
} |
||||
Binary file not shown.
@ -0,0 +1,86 @@
@@ -0,0 +1,86 @@
|
||||
package response |
||||
|
||||
import ( |
||||
"github.com/gogf/gf/v2/net/ghttp" |
||||
"github.com/gogf/gf/v2/os/gmutex" |
||||
) |
||||
|
||||
const ( |
||||
SuccessCode int = 1000 |
||||
ErrorCode int = -1 |
||||
) |
||||
|
||||
type Response struct { |
||||
// 代码
|
||||
Code int `json:"code" example:"200"` |
||||
// 数据集
|
||||
Data interface{} `json:"data"` |
||||
// 消息
|
||||
Message string `json:"message"` |
||||
} |
||||
|
||||
var ( |
||||
response = new(Response) |
||||
mu = gmutex.New() |
||||
) |
||||
|
||||
|
||||
func RJson(r *ghttp.Request, code int, message string, data ...interface{}) { |
||||
response.RJson(r, code, message, data...) |
||||
} |
||||
|
||||
func SusJson(isExit bool, r *ghttp.Request, message string, data ...interface{}) { |
||||
// message = lang.ToKey(r.GetCtx(), message)
|
||||
response.SusJson(isExit, r, message, data...) |
||||
} |
||||
|
||||
func FailJson(isExit bool, r *ghttp.Request, message string, data ...interface{}) { |
||||
// message = lang.ToKey(r.GetCtx(), message)
|
||||
response.FailJson(isExit, r, message, data...) |
||||
} |
||||
|
||||
|
||||
|
||||
// 返回JSON数据并退出当前HTTP执行函数。
|
||||
func (res *Response) JsonExit(r *ghttp.Request, code int, message string, data ...interface{}) { |
||||
res.RJson(r, code, message, data...) |
||||
r.Exit() |
||||
} |
||||
|
||||
|
||||
// 标准返回结果数据结构封装。
|
||||
// 返回固定数据结构的JSON:
|
||||
// code: 状态码(200:成功,302跳转,和http请求状态码一至);
|
||||
// message: 请求结果信息;
|
||||
// data: 请求结果,根据不同接口返回结果的数据结构不同;
|
||||
func (res *Response) RJson(r *ghttp.Request, code int, message string, data ...interface{}) { |
||||
responseData := interface{}(nil) |
||||
if len(data) > 0 { |
||||
responseData = data[0] |
||||
} |
||||
response = &Response{ |
||||
Code: code, |
||||
Message: message, |
||||
Data: responseData, |
||||
} |
||||
r.SetParam("apiReturnRes", response) |
||||
r.Response.WriteJson(response) |
||||
} |
||||
|
||||
// 成功返回JSON
|
||||
func (res *Response) SusJson(isExit bool, r *ghttp.Request, message string, data ...interface{}) { |
||||
if isExit { |
||||
res.JsonExit(r, SuccessCode, message, data...) |
||||
} |
||||
res.RJson(r, SuccessCode, message, data...) |
||||
} |
||||
|
||||
// 失败返回JSON
|
||||
func (res *Response) FailJson(isExit bool, r *ghttp.Request, message string, data ...interface{}) { |
||||
if isExit { |
||||
res.JsonExit(r, ErrorCode, message, data...) |
||||
} |
||||
res.RJson(r, ErrorCode, message, data...) |
||||
} |
||||
|
||||
|
||||
Loading…
Reference in new issue