Commit fcc5ecad by zhangjiec

1. 增加swagger

2. panic日志不在程序里重定向,改为shell脚本重定向
parent 3ce89231
set GOOS=linux
go build -o dcGoServer1 -ldflags "-w -s" main.go
\ No newline at end of file
......@@ -2,8 +2,19 @@ package cache
import (
"sync"
"time"
)
/*********************************************************全国行政区域**/
var provinceMap []District // 省份列表[]District
var cityMap sync.Map // 城市列表map[uint32][]District //省份ID作为KEY
var countyMap sync.Map // 区县列表map[uint32][]District //城市ID作为KEY
type District struct {
Id uint32 `json:"id" example:"1"`
Name string `json:"name" example:"四川省"`
Initial string `json:"initial" example:"S"`
}
/*********************************************************代理商**/
//// AgentMap 代理商
//var AgentMap sync.Map
......@@ -13,7 +24,6 @@ import (
var operatorMap sync.Map //运营商id作为KEY
type OperatorStruct struct {
ShortName string
AreaID []int //区域ID
// 可再添加运营商属性
}
......@@ -22,11 +32,11 @@ type OperatorStruct struct {
/******************************************************区域(校区)服务信息**/
var areaServiceMap sync.Map //area_service_id 作为KEY AreaStruct 作为VALUE
type AreaServiceStruct struct { //
AreaID int
AreaID uint32
ServiceID uint8 //服务项目 1公话 2定位 3饮水 4POS .........
OperatorID int32 //运营商ID
OperatorID uint32 //运营商ID
Name string //服务名字(例宿舍135栋饮水)name
Status uint8 //状态 1正式2测试3暂停
Status uint8 //状态 0无服务1暂停10正式11测试
}
/*---------------------------------------------------------------*/
......@@ -37,10 +47,11 @@ type AdminStruct struct {
Password [16]byte
tokenCreatTime uint32
Name string
upAdminID uint32
//Phone string
//OperatorID []int
SystemAuth int //系统角色权限
AreaServiceAuth [][]int //area_service_id,admin_role_id
SystemAuth uint32 //系统角色权限
AreaServiceAuth [][]uint32 //area_service_id,admin_role_id
}
/*---------------------------------------------------------------*/
......@@ -49,7 +60,7 @@ type AdminStruct struct {
var adminRoleAuthMap sync.Map //admin_role_id 作为KEY
type RoleAuthStruct struct {
Name string
// 考虑接口、菜单、按钮权限
MenuRole map[uint32][]uint32 // 菜单、按钮权限
}
/*---------------------------------------------------------------*/
......@@ -57,13 +68,10 @@ type RoleAuthStruct struct {
/******************************************************区域(校区)**/
var areaMap sync.Map //area_id 作为KEY AreaStruct 作为VALUE
type AreaStruct struct { // AreaStruct 区域信息缓存,通过区域ID查出,后续再加支付信息
// OperatorID int32 //运营商ID
Name string
Loc [2]uint32
CountyID uint32
Status bool //校区状态
ServicePhone bool
ServiceWater bool
ServiceLocation bool
ServicePos bool
}
/*---------------------------------------------------------------*/
......@@ -72,30 +80,34 @@ type AreaStruct struct { // AreaStruct 区域信息缓存,通过区域ID查出
var wechatCustomerMap sync.Map //微信的WechatUnionID(string)作为KEY
type WechatCustomerStruct struct {
tokenCreatTime uint32
CardUserID []int
testRole uint8 // 测试用户(可看到测试校区)
nickname string //微信昵称
masterCardUserID []uint32 //自己创建的学生用户
slaveCardUserID []uint32 //被邀请查看的学生用户
}
/****************************************************************/
/***************************************************卡用户(学生、教师、职工)**/
var cardUserMap sync.Map //卡用户 CardUserID卡用户ID(int) 作为KEY 纯卡用户可以不绑定微信
var cardUserMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY 纯卡用户可以不绑定微信
type CardUserType struct {
// WechatUnionID string
// AreaID int
AreaServiceID int
MasterWechatUnionID string
SlaveWechatUnionID []string
AreaID uint32
Name string
Sex uint8
// Birthday
Grade uint8
Class uint8
StudentNo string
Card CardStruct
}
type CardStruct struct {
Sim []string //电话卡 这里考虑下是否允许多张
Water []uint32 //水卡
Location []uint32 //定位卡
Pos []uint32 //pos消费卡
PhoneAreaServiceID uint32
SimCard uint32
WaterAreaServiceID uint32
WaterCard uint32
LocationAreaServiceID uint32
LocationCard uint32
PosAreaServiceID uint32
PosCard uint32
}
/*---------------------------------------------------------------*/
......@@ -103,8 +115,9 @@ type CardStruct struct {
/*******************************************************电话设备**/
var phone20DeviceMap sync.Map //device_id 作为KEY Phone20DeviceStruct 作为VALUE
type Phone20DeviceStruct struct {
AreaServiceID int
AreaServiceID uint32
AllowCallTime uint8 //允许通话时长,255表示不限制时长
Place string //安装位置
Status bool
}
......@@ -113,11 +126,11 @@ type Phone20DeviceStruct struct {
/********************************************************Sim卡信息**/
var simInfoMap sync.Map //card_id 作为KEY
type SimInfoStruct struct {
CardUserID int //卡用户ID
Status int8 //0没得这个数据 1 正常使用 其他各种异常
CardUserID uint32 //卡用户ID
Status int8 //0无数据 1 正常使用 2 服务已到期 3 已挂失
MonthTalkMinutes uint16
MonthPackageMinutes uint16
FamilyNum []FamilyOnePerson
FamilyNum []FamilyOnePerson // 如果一张sim卡,到多个学校绑定不一样的亲情号,则改成MAP,但是移动不允许。先这样。
}
type FamilyOnePerson struct {
Phone string
......@@ -159,11 +172,22 @@ type FamilyOnePerson struct {
//}
///*---------------------------------------------------------------*/
/***************************************************卡用户(学生、教师、职工)**/
var cardUserTrendMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY,[]CardUserTrendType作为VALUE
type CardUserTrendType struct {
ServiceType uint8 //服务项目 UI图标及颜色等
DeviceID uint32
Content string
Time time.Time
}
/*---------------------------------------------------------------*/
func Init() {
initOperatorMap()
initWechatCustomerMap()
initCardUserMap()
initAreaMap()
initAreaServiceMap()
initPhone20DeviceMap()
initSimFamilyNumMap()
}
......@@ -9,11 +9,11 @@ import (
"time"
)
func initAreaMap() {
func initAreaServiceMap() {
fmt.Println(time.Now(), "cache: initDeviceMap begin")
var areaID int32
var temp AreaStruct
rows, err := dbmodel.PgDb.Query("SELECT id,name,status FROM b_area")
var temp AreaServiceStruct
rows, err := dbmodel.PgDb.Query("SELECT id,name,status FROM b_area") //todo
defer rows.Close()
if err != nil {
log.Panicln("SelectAreaToMap rows", err)
......@@ -36,37 +36,37 @@ func initAreaMap() {
}
}
func GetAreaInfo(areaID int32) AreaStruct {
if info, ok := areaMap.Load(areaID); ok { //map有
if v, ok2 := info.(AreaStruct); ok2 { //类型断言正确
func GetAreaServiceInfo(areaServiceID uint32) AreaServiceStruct {
if info, ok := areaServiceMap.Load(areaServiceID); ok { //map有
if v, ok2 := info.(AreaServiceStruct); ok2 { //类型断言正确
return v //,true
} else { //类型断言失败
areaMap.Delete(areaID)
logger.Log.Error("AreaMap 类型断言错误",
zap.Int32("areaID", areaID),
zap.String("src", "GetAreaInfo"))
areaServiceMap.Delete(areaServiceID)
logger.Log.Error("areaServiceMap 类型断言错误",
zap.Uint32("areaServiceID", areaServiceID),
zap.String("src", "GetAreaServiceInfo"))
}
}
var temp AreaStruct
var temp AreaServiceStruct
var err error
for i := 0; i < 100; i++ {
err = dbmodel.PgDb.QueryRow("SELECT name,status FROM b_area WHERE id=$1",
areaID).Scan(&temp.Name, &temp.Status)
areaServiceID).Scan(&temp.Name, &temp.Status) //todo
if err != nil {
fmt.Println("GetAreaInfo SELECT:", i, err)
time.Sleep(3 * time.Millisecond)
continue
}
areaMap.Store(areaID, temp)
logger.Log.Error("数据库有而缓存没有 GetAreaInfo",
zap.Int32("areaID", areaID),
areaServiceMap.Store(areaServiceID, temp)
logger.Log.Error("数据库有而缓存没有 areaServiceMap",
zap.Uint32("areaServiceID", areaServiceID),
zap.Error(err),
zap.String("src", "GetAreaInfo"))
zap.String("src", "GetAreaServiceInfo"))
return temp //,true
}
logger.Log.Error("GetAreaInfo SELECT operator_id,status FROM b_area WHERE id=$1",
zap.Int32("areaID", areaID),
logger.Log.Error("GetAreaServiceInfo SELECT operator_id,status FROM b_area WHERE id=$1", //todo
zap.Uint32("areaServiceID", areaServiceID),
zap.Error(err),
zap.String("src", "getDeviceInfo"))
zap.String("src", "GetAreaServiceInfo"))
return temp //,false
}
package cache
import (
"dc_golang_server_1/logger"
"go.uber.org/zap"
)
func initCardUserMap() {
}
func GetCardUserInfo(cardUserID uint32) CardUserType {
if s, ok := cardUserMap.Load(cardUserID); ok { // map有
if v, ok4 := s.(CardUserType); ok4 { //类型断言正确
return v
} else { //类型断言失败
cardUserMap.Delete(cardUserID)
logger.Log.Error("cardUserMap 类型断言错误",
zap.Uint32("cardUserID", cardUserID),
zap.String("src", "GetCardUserInfo"))
}
}
var temp CardUserType
//
//// todo 再去查一盘库
return temp
}
......@@ -36,7 +36,7 @@ func initPhone20DeviceMap() {
}
}
func GetDeviceInfo(devID uint32) Phone20DeviceStruct {
func GetPhone20Info(devID uint32) Phone20DeviceStruct {
if info, ok := phone20DeviceMap.Load(devID); ok { //map有
if v, ok2 := info.(Phone20DeviceStruct); ok2 { //类型断言正确
return v //,true
......@@ -50,23 +50,23 @@ func GetDeviceInfo(devID uint32) Phone20DeviceStruct {
var temp Phone20DeviceStruct
var err error
for i := 0; i < 100; i++ {
err = dbmodel.PgDb.QueryRow("SELECT area_service_id,allow_call_time,status FROM d_device WHERE id=$1",
err = dbmodel.PgDb.QueryRow("SELECT area_service_id,allow_call_time,status FROM d_phone20 WHERE id=$1",
devID).Scan(&temp.AreaServiceID, &temp.AllowCallTime, &temp.Status)
if err != nil {
fmt.Println("getDeviceInfo SELECT:", i, err)
fmt.Println("GetPhone20Info SELECT:", i, err)
time.Sleep(3 * time.Millisecond)
continue
}
phone20DeviceMap.Store(devID, temp)
logger.Log.Error("数据库有而缓存没有 getDeviceInfo",
logger.Log.Error("数据库有而缓存没有 GetPhone20Info",
zap.Uint32("devID", devID),
zap.Error(err),
zap.String("src", "getDeviceInfo"))
zap.String("src", "GetPhone20Info"))
return temp //,true
}
logger.Log.Error("getDeviceInfo SELECT area_id,allow_call_time,status FROM d_device WHERE id=$1",
logger.Log.Error("getDeviceInfo SELECT SELECT area_service_id,allow_call_time,status FROM d_phone20 WHERE id=$1",
zap.Uint32("devID", devID),
zap.Error(err),
zap.String("src", "getDeviceInfo"))
zap.String("src", "GetPhone20Info"))
return temp //,false
}
package cache
import (
"dc_golang_server_1/logger"
"go.uber.org/zap"
)
func initSimFamilyNumMap() {
//fmt.Println(time.Now(),"cache: initSimFamilyNumMap begin")
//var keyTemp simFamilyNumMapKeyStruct
......@@ -59,26 +64,19 @@ func initSimFamilyNumMap() {
//}
}
func GetSimFamilyNum(areaId int32, cardId string) []FamilyOnePerson {
//if s,ok := simFamilyNumMap.Load(simFamilyNumMapKeyStruct{
// areaId,
// cardId,
//});ok{ // map有
// if sim,ok4 := s.(SimFamilyNumStruct);ok4 { //类型断言正确
// return sim
// } else { //类型断言失败
// simFamilyNumMap.Delete(simFamilyNumMapKeyStruct{
// areaId,
// cardId,
// })
// logger.Log.Error("simFamilyNumMap 类型断言错误",
// zap.String("cardId", cardId),
// zap.Int32("area_id", areaId),
// zap.String("src", "GetSimFamilyNum"))
// }
//}
//
var temp []FamilyOnePerson
func GetSimInfo( /*areaId int32, */ cardId string) SimInfoStruct {
if s, ok := simInfoMap.Load(cardId); ok { // map有
if family, ok4 := s.(SimInfoStruct); ok4 { //类型断言正确
return family
} else { //类型断言失败
simInfoMap.Delete(cardId)
logger.Log.Error("simInfoMap 类型断言错误",
zap.String("cardId", cardId),
zap.String("src", "GetSimInfo"))
}
}
var temp SimInfoStruct
//
//// todo 再去查一盘库
return temp
......
......@@ -3,3 +3,15 @@ package cache
func initWechatCustomerMap() {
}
func GetWechatCustomerCardUserID(unionID string) []uint32 {
return nil
}
func GetWechatCustomerTokenCreatTime(unionID string) int64 {
return 0x7fffffffffffffff
}
func SetWechatCustomerTokenCreatTime(unionID string, newTime int64) bool {
return false
}
......@@ -18,6 +18,7 @@ dbDSN = "user=higher password=hj^&bhjb789j$^* dbname=dctest1 host=pgm-2ze3yp0bss
#debug release
ServerMode = release
ServerPort = :50000
Swagger = true
[tcp_long_server]
#TCP服务监听的端口号
......
......@@ -11,6 +11,7 @@ var (
HttpServerMode string
HttpServerPort string
HttpServerSwagger bool
TcpLongPort string
TcpLongMaxConnections int32
......@@ -43,6 +44,7 @@ func ConfigInit() {
HttpServerMode = file.Section("http_server").Key("ServerMode").In("release", []string{"release", "debug"})
HttpServerPort = file.Section("http_server").Key("ServerPort").MustString(":50000")
HttpServerSwagger = file.Section("http_server").Key("Swagger").MustBool(true)
TcpLongPort = file.Section("tcp_long_server").Key("TcpPort").MustString("60000")
TcpLongMaxConnections = int32(file.Section("tcp_long_server").Key("MaxConnections").MustUint(20000))
......
package dcphone20
import (
"dc_golang_server_1/cache"
"dc_golang_server_1/dbmodel"
"dc_golang_server_1/devproduct"
"dc_golang_server_1/logger"
"fmt"
"github.com/axgle/mahonia"
"go.uber.org/zap"
"strconv"
"strings"
......@@ -346,75 +349,96 @@ func (dev *DCPhone20) response(data *devproduct.HexData) {
}
case 0x25: // 查询亲情号码 SIM ICCID
if data.Length == 21 {
// data.CtrlCode = ctrlCode | 0x80
// enc := mahonia.NewEncoder("gbk")
// // 根据设备编号查status area_id,根据area_id和iccid查status family_num
// v := cache.GetDeviceInfo(data.DevID)
// if v.AreaID == 0 { // 后台没添加该设备,返回显示 话机设备未注册
// data.Data[0] = 0xff
// data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("话机设备未注册")))
// return
// } // 后台没添加该设备,返回显示 话机设备未注册
// if v.Status == false {//设备已停用,返回显示 设备暂停使用
// data.Data[0] = 0xff
// data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("设备暂停使用")))
// return
// } //设备已停用,返回显示 设备暂停使用
// s := cache.GetSimFamilyNum(v.AreaID,string(data.Data[1:]))
// if s.Status == 0{ // 这张卡不对,显示 未查询到亲情号码
// data.Data[0] = 0xff
// data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("未查询到亲情号码")))
// return
// } // 这张卡不对,显示 未查询到亲情号码
// if s.Status > 1 { //用户卡暂停使用
// data.Data[0] = 0xff
// data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("用户卡暂停使用")))
// return
// } //用户卡暂停使用
// if s.MonthTalkMinutes >= s.MonthPackageMinutes { //本月套餐无剩余通话分钟数
// data.Data[0] = 0xff
// data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("本月套餐无剩余通话分钟数")))
// return
// } //本月套餐无剩余通话分钟数
//
// tempIccId := make([]byte,20)
// copy(tempIccId,data.Data[1:])
// data.Data = make([]byte, 255)
// userCanUseTime := v.AllowCallTime
// if (s.MonthPackageMinutes - s.MonthTalkMinutes)<uint16(userCanUseTime){
// userCanUseTime = uint8(s.MonthPackageMinutes - s.MonthTalkMinutes)
// }
// if len(s.Family) > 3 {
// logger.Log.Error("len(sim.Family)>3",
// zap.Int32("AreaID", v.AreaID),
// zap.Uint32("DevID", data.DevID),
// zap.Uint8("CtrlCode", ctrlCode),
// zap.Uint8("DataLen", data.Length),
// zap.Uint8s("RecvData", data.Data),
// zap.String("src", "tcp case 0x25"))
// data.Data[0] = 3
// } else {
// data.Data[0] = uint8(len(s.Family))
// }
// copy(data.Data[1:],tempIccId)
// var i uint8
// data.Length = 21
// for ;i<data.Data[0];i++ {
// if i != 0 {
// data.Data[data.Length] = '-'
// data.Length++
// }
// data.Length += byte(copy(data.Data[data.Length:], s.Family[i].Phone))
// data.Data[data.Length] = '_'
// data.Length++
// data.Length += byte(copy(data.Data[data.Length:], strconv.Itoa(int(userCanUseTime))))
// data.Data[data.Length] = '_'
// data.Length++
// strNickname := enc.ConvertString(s.Family[i].Nickname)
// if len(strNickname) < 17 {
// data.Length += byte(copy(data.Data[data.Length:], strNickname))
// }
// }
data.CtrlCode = ctrlCode | 0x80
enc := mahonia.NewEncoder("gbk")
// 1.根据设备编号查status和AreaServiceID 3.根据ICCID查Status、MonthTalkMinutes、MonthPackageMinutes、family_num
v := cache.GetPhone20Info(data.DevID)
if v.AreaServiceID == 0 { // 后台没添加该设备,返回显示 话机设备未注册
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("话机设备未注册")))
return
} // 后台没添加该设备,返回显示 话机设备未注册
if v.Status == false { //设备已停用,返回显示 设备暂停使用
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("设备暂停使用")))
return
} //设备已停用,返回显示 设备暂停使用
if v.AllowCallTime == 0 {
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("设备无允许通话时长")))
return
}
//2.根据AreaServiceID查status
area := cache.GetAreaServiceInfo(v.AreaServiceID)
if area.Status == 0 || area.ServiceID != 1 {
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("该区域暂未开通公话业务")))
return
}
if area.Status == 1 {
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("该区域公话业务暂停使用")))
return
}
s := cache.GetSimInfo(string(data.Data[1:]))
if s.Status == 0 { // 这张卡不对,显示 未查询到亲情号码
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("未查询到亲情号码")))
return
} // 这张卡不对,显示 未查询到亲情号码
if s.Status > 1 { //用户卡暂停使用
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("用户卡暂停使用")))
return
} //用户卡暂停使用
if s.MonthTalkMinutes >= s.MonthPackageMinutes { //本月套餐无剩余通话分钟数
data.Data[0] = 0xff
data.Length = 21 + byte(copy(data.Data[21:], enc.ConvertString("本月套餐无剩余通话分钟数")))
return
} //本月套餐无剩余通话分钟数
tempIccId := make([]byte, 20)
copy(tempIccId, data.Data[1:])
data.Data = make([]byte, 255)
userCanUseTime := v.AllowCallTime
if (s.MonthPackageMinutes - s.MonthTalkMinutes) < uint16(userCanUseTime) {
userCanUseTime = uint8(s.MonthPackageMinutes - s.MonthTalkMinutes)
}
if len(s.FamilyNum) > 3 {
logger.Log.Error("len(sim.FamilyNum)>3",
zap.Uint32("AreaServiceID", v.AreaServiceID),
zap.Uint32("DevID", data.DevID),
zap.Uint8("CtrlCode", ctrlCode),
zap.Uint8("DataLen", data.Length),
zap.Uint8s("RecvData", data.Data),
zap.String("FamilyNum", fmt.Sprintf("%s", s.FamilyNum)),
zap.String("src", "tcp case 0x25"))
data.Data[0] = 3
} else {
data.Data[0] = uint8(len(s.FamilyNum))
}
copy(data.Data[1:], tempIccId)
var i uint8
data.Length = 21
for ; i < data.Data[0]; i++ {
if i != 0 {
data.Data[data.Length] = '-'
data.Length++
}
data.Length += byte(copy(data.Data[data.Length:], s.FamilyNum[i].Phone))
data.Data[data.Length] = '_'
data.Length++
data.Length += byte(copy(data.Data[data.Length:], strconv.Itoa(int(userCanUseTime))))
data.Data[data.Length] = '_'
data.Length++
strNickname := enc.ConvertString(s.FamilyNum[i].Nickname)
if len(strNickname) < 17 {
data.Length += byte(copy(data.Data[data.Length:], strNickname))
}
}
} else {
logger.Log.Error("data.Length error",
zap.String("Src", "TCP-SERVER-response"),
......@@ -467,7 +491,7 @@ func (dev *DCPhone20) response(data *devproduct.HexData) {
zap.Uint8s("RecvData", data.Data))
}
case 0x26: // 0x22:"usedevice/dev_post_call_log",// 上报通话记录 SIM ICCID
if data.Length > 27 {
if data.Length > 27 { //todo
//devInfo := cache.GetDeviceInfo(data.DevID)
//var areaInfo cache.AreaStruct
//if devInfo.AreaID > 0 {
......@@ -483,7 +507,7 @@ func (dev *DCPhone20) response(data *devproduct.HexData) {
// }
//}
//// 以事务方式存2张表
//if result := model.InsertUCallRecordAndUpdateUSimInfo(model.TableUserCallRecord{
//if result := dbmodel.InsertUCallRecordAndUpdateUSimInfo(dbmodel.TableUserCallRecord{
// //CustomerId:
// //CardUserId:
// //CardUserName:
......@@ -502,7 +526,7 @@ func (dev *DCPhone20) response(data *devproduct.HexData) {
//} else if result == 0 { //扣套餐分钟数
//
//}
//data.CtrlCode = ctrlCode | 0x80
data.CtrlCode = ctrlCode | 0x80
} else {
data.CtrlCode = ctrlCode | 0x80 //还是回硬件
logger.Log.Error("data.Length error",
......
// Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT
// This file was generated by swaggo/swag
package docs
import (
"bytes"
"encoding/json"
"strings"
"text/template"
"github.com/swaggo/swag"
)
var doc = `{
"schemes": {{ marshal .Schemes }},
"swagger": "2.0",
"info": {
"description": "{{escape .Description}}",
"title": "{{.Title}}",
"contact": {},
"version": "{{.Version}}"
},
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {
"/base/city/{provinceID}": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取带首字母的城市列表",
"tags": [
"公用接口"
],
"summary": "通过省份ID获取城市列表",
"parameters": [
{
"type": "integer",
"description": "省份id",
"name": "provinceID",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "按首字母排序好的列表,可直接用作展示",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/cache.District"
}
}
}
}
}
},
"/base/county/{cityID}": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取带首字母的城市列表",
"tags": [
"公用接口"
],
"summary": "通过城市ID获取区县列表",
"parameters": [
{
"type": "integer",
"description": "城市ID",
"name": "cityID",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "按首字母排序好的列表,可直接用作展示",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/cache.District"
}
}
}
}
}
},
"/base/province": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取带首字母的省份列表",
"tags": [
"公用接口"
],
"summary": "获取全国省份列表",
"responses": {
"200": {
"description": "按首字母排序好的列表,可直接用作展示",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/cache.District"
}
}
}
}
}
},
"/we/login/{code}": {
"post": {
"description": "微信code传至后台,后台返回token,token有效时长:24小时",
"tags": [
"家长微信"
],
"summary": "登录",
"parameters": [
{
"type": "string",
"description": "用户微信的code",
"name": "code",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"token\": string}",
"schema": {
"type": "string"
}
}
}
}
},
"/we/trend/:id": {
"get": {
"description": "微信学生首页,获取近20条用户最新动态",
"tags": [
"public"
],
"summary": "微信学生首页,获取近20条用户最新动态",
"parameters": [
{
"type": "string",
"description": "请示参数code",
"name": "code",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"token\": string}",
"schema": {
"type": "string"
}
}
}
}
}
},
"definitions": {
"cache.District": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"example": 1
},
"initial": {
"type": "string",
"example": "S"
},
"name": {
"type": "string",
"example": "四川省"
}
}
}
},
"securityDefinitions": {
"ApiKeyAuth": {
"type": "apiKey",
"name": "Authorization",
"in": "header"
}
}
}`
type swaggerInfo struct {
Version string
Host string
BasePath string
Schemes []string
Title string
Description string
}
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = swaggerInfo{
Version: "V0.0.1",
Host: "",
BasePath: "/",
Schemes: []string{},
Title: "多彩中小学一卡通系统",
Description: "用于家长端微信小程序及web端管理后台",
}
type s struct{}
func (s *s) ReadDoc() string {
sInfo := SwaggerInfo
sInfo.Description = strings.Replace(sInfo.Description, "\n", "\\n", -1)
t, err := template.New("swagger_info").Funcs(template.FuncMap{
"marshal": func(v interface{}) string {
a, _ := json.Marshal(v)
return string(a)
},
"escape": func(v interface{}) string {
// escape tabs
str := strings.Replace(v.(string), "\t", "\\t", -1)
// replace " with \", and if that results in \\", replace that with \\\"
str = strings.Replace(str, "\"", "\\\"", -1)
return strings.Replace(str, "\\\\\"", "\\\\\\\"", -1)
},
}).Parse(doc)
if err != nil {
return doc
}
var tpl bytes.Buffer
if err := t.Execute(&tpl, sInfo); err != nil {
return doc
}
return tpl.String()
}
func init() {
swag.Register(swag.Name, &s{})
}
{
"swagger": "2.0",
"info": {
"description": "用于家长端微信小程序及web端管理后台",
"title": "多彩中小学一卡通系统",
"contact": {},
"version": "V0.0.1"
},
"basePath": "/",
"paths": {
"/base/city/{provinceID}": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取带首字母的城市列表",
"tags": [
"公用接口"
],
"summary": "通过省份ID获取城市列表",
"parameters": [
{
"type": "integer",
"description": "省份id",
"name": "provinceID",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "按首字母排序好的列表,可直接用作展示",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/cache.District"
}
}
}
}
}
},
"/base/county/{cityID}": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取带首字母的城市列表",
"tags": [
"公用接口"
],
"summary": "通过城市ID获取区县列表",
"parameters": [
{
"type": "integer",
"description": "城市ID",
"name": "cityID",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "按首字母排序好的列表,可直接用作展示",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/cache.District"
}
}
}
}
}
},
"/base/province": {
"get": {
"security": [
{
"ApiKeyAuth": []
}
],
"description": "获取带首字母的省份列表",
"tags": [
"公用接口"
],
"summary": "获取全国省份列表",
"responses": {
"200": {
"description": "按首字母排序好的列表,可直接用作展示",
"schema": {
"type": "array",
"items": {
"$ref": "#/definitions/cache.District"
}
}
}
}
}
},
"/we/login/{code}": {
"post": {
"description": "微信code传至后台,后台返回token,token有效时长:24小时",
"tags": [
"家长微信"
],
"summary": "登录",
"parameters": [
{
"type": "string",
"description": "用户微信的code",
"name": "code",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"token\": string}",
"schema": {
"type": "string"
}
}
}
}
},
"/we/trend/:id": {
"get": {
"description": "微信学生首页,获取近20条用户最新动态",
"tags": [
"public"
],
"summary": "微信学生首页,获取近20条用户最新动态",
"parameters": [
{
"type": "string",
"description": "请示参数code",
"name": "code",
"in": "path",
"required": true
}
],
"responses": {
"200": {
"description": "{\"code\": 200, \"token\": string}",
"schema": {
"type": "string"
}
}
}
}
}
},
"definitions": {
"cache.District": {
"type": "object",
"properties": {
"id": {
"type": "integer",
"example": 1
},
"initial": {
"type": "string",
"example": "S"
},
"name": {
"type": "string",
"example": "四川省"
}
}
}
},
"securityDefinitions": {
"ApiKeyAuth": {
"type": "apiKey",
"name": "Authorization",
"in": "header"
}
}
}
\ No newline at end of file
basePath: /
definitions:
cache.District:
properties:
id:
example: 1
type: integer
initial:
example: S
type: string
name:
example: 四川省
type: string
type: object
info:
contact: {}
description: 用于家长端微信小程序及web端管理后台
title: 多彩中小学一卡通系统
version: V0.0.1
paths:
/base/city/{provinceID}:
get:
description: 获取带首字母的城市列表
parameters:
- description: 省份id
in: path
name: provinceID
required: true
type: integer
responses:
"200":
description: 按首字母排序好的列表,可直接用作展示
schema:
items:
$ref: '#/definitions/cache.District'
type: array
security:
- ApiKeyAuth: []
summary: 通过省份ID获取城市列表
tags:
- 公用接口
/base/county/{cityID}:
get:
description: 获取带首字母的城市列表
parameters:
- description: 城市ID
in: path
name: cityID
required: true
type: integer
responses:
"200":
description: 按首字母排序好的列表,可直接用作展示
schema:
items:
$ref: '#/definitions/cache.District'
type: array
security:
- ApiKeyAuth: []
summary: 通过城市ID获取区县列表
tags:
- 公用接口
/base/province:
get:
description: 获取带首字母的省份列表
responses:
"200":
description: 按首字母排序好的列表,可直接用作展示
schema:
items:
$ref: '#/definitions/cache.District'
type: array
security:
- ApiKeyAuth: []
summary: 获取全国省份列表
tags:
- 公用接口
/we/login/{code}:
post:
description: 微信code传至后台,后台返回token,token有效时长:24小时
parameters:
- description: 用户微信的code
in: path
name: code
required: true
type: string
responses:
"200":
description: '{"code": 200, "token": string}'
schema:
type: string
summary: 登录
tags:
- 家长微信
/we/trend/:id:
get:
description: 微信学生首页,获取近20条用户最新动态
parameters:
- description: 请示参数code
in: path
name: code
required: true
type: string
responses:
"200":
description: '{"code": 200, "token": string}'
schema:
type: string
summary: 微信学生首页,获取近20条用户最新动态
tags:
- public
securityDefinitions:
ApiKeyAuth:
in: header
name: Authorization
type: apiKey
swagger: "2.0"
......@@ -3,27 +3,47 @@ module dc_golang_server_1
go 1.17
require (
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394
github.com/gin-gonic/gin v1.7.4
github.com/lib/pq v1.10.3
github.com/natefinch/lumberjack v2.0.0+incompatible
go.uber.org/zap v1.19.1
gopkg.in/ini.v1 v1.63.2
)
require (
github.com/BurntSushi/toml v0.4.1 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/PuerkitoBio/purell v1.1.1 // indirect
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 // indirect
github.com/gin-contrib/sse v0.1.0 // indirect
github.com/gin-gonic/gin v1.7.4 // indirect
github.com/go-openapi/jsonpointer v0.19.5 // indirect
github.com/go-openapi/jsonreference v0.19.6 // indirect
github.com/go-openapi/spec v0.20.3 // indirect
github.com/go-openapi/swag v0.19.15 // indirect
github.com/go-playground/locales v0.14.0 // indirect
github.com/go-playground/universal-translator v0.18.0 // indirect
github.com/go-playground/validator/v10 v10.9.0 // indirect
github.com/golang/protobuf v1.5.2 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/leodido/go-urn v1.2.1 // indirect
github.com/lib/pq v1.10.3 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattn/go-isatty v0.0.14 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/natefinch/lumberjack v2.0.0+incompatible // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/swaggo/gin-swagger v1.3.2 // indirect
github.com/swaggo/swag v1.7.3 // indirect
github.com/ugorji/go/codec v1.2.6 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/multierr v1.7.0 // indirect
go.uber.org/zap v1.19.1 // indirect
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 // indirect
golang.org/x/net v0.0.0-20210421230115-4e50805a0758 // indirect
golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069 // indirect
golang.org/x/text v0.3.6 // indirect
golang.org/x/tools v0.1.5 // indirect
google.golang.org/protobuf v1.27.1 // indirect
gopkg.in/ini.v1 v1.63.2 // indirect
gopkg.in/natefinch/lumberjack.v2 v2.0.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v0.4.1 h1:GaI7EiDXDRfa8VshkTj7Fym7ha+y8/XxIgD2okUIjLw=
github.com/BurntSushi/toml v0.4.1/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/PuerkitoBio/purell v1.1.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI=
github.com/PuerkitoBio/purell v1.1.1/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M=
github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE=
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394 h1:OYA+5W64v3OgClL+IrOD63t4i/RW7RqrAVl9LTZ9UqQ=
github.com/axgle/mahonia v0.0.0-20180208002826-3358181d7394/go.mod h1:Q8n74mJTIgjX4RBBcHnJ05h//6/k6foqmgE45jTQtxg=
github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8=
github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/gin-contrib/gzip v0.0.1/go.mod h1:fGBJBCdt6qCZuCAOwWuFhBB4OOq9EFqlo5dEaFhhu5w=
github.com/gin-contrib/sse v0.0.0-20170109093832-22d885f9ecc7/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s=
github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE=
github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI=
github.com/gin-gonic/gin v1.3.0/go.mod h1:7cKuhb5qV2ggCFctp2fJQ+ErvciLZrIeoOSOm6mUr7Y=
github.com/gin-gonic/gin v1.7.0/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/gin-gonic/gin v1.7.4 h1:QmUZXrvJ9qZ3GfWvQ+2wnW/1ePrTEJqPKMYEU3lD/DM=
github.com/gin-gonic/gin v1.7.4/go.mod h1:jD2toBW3GZUr5UMcdrwQA10I7RuaFOl/SGeDjXkfUtY=
github.com/go-openapi/jsonpointer v0.17.0/go.mod h1:cOnomiV+CVVwFLk0A/MExoFMjwdsUdVpsRhURCKh+3M=
github.com/go-openapi/jsonpointer v0.19.3/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY=
github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg=
github.com/go-openapi/jsonreference v0.17.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.19.0/go.mod h1:g4xxGn04lDIRh0GJb5QlpE3HfopLOL6uZrK/VgnsK9I=
github.com/go-openapi/jsonreference v0.19.5/go.mod h1:RdybgQwPxbL4UEjuAruzK1x3nE69AqPYEJeo/TWfEeg=
github.com/go-openapi/jsonreference v0.19.6 h1:UBIxjkht+AWIgYzCDSv2GN+E/togfwXUJFRTWhl2Jjs=
github.com/go-openapi/jsonreference v0.19.6/go.mod h1:diGHMEHg2IqXZGKxqyvWdfWU/aim5Dprw5bqpKkTvns=
github.com/go-openapi/spec v0.19.0/go.mod h1:XkF/MOi14NmjsfZ8VtAKf8pIlbZzyoTvZsdfssdxcBI=
github.com/go-openapi/spec v0.20.3 h1:uH9RQ6vdyPSs2pSy9fL8QPspDF2AMIMPtmK5coSSjtQ=
github.com/go-openapi/spec v0.20.3/go.mod h1:gG4F8wdEDN+YPBMVnzE85Rbhf+Th2DTvA9nFPQ5AYEg=
github.com/go-openapi/swag v0.17.0/go.mod h1:AByQ+nYG6gQg71GINrmuDXCPWdL640yX49/kXLo40Tg=
github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk=
github.com/go-openapi/swag v0.19.14/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-openapi/swag v0.19.15 h1:D2NRCBzS9/pEY3gP9Nl8aDqGUcPFrwG2p+CNFrLyrCM=
github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ=
github.com/go-playground/assert/v2 v2.0.1 h1:MsBgLAaY856+nPRTKrp3/OZK38U/wa0CcBYNjji3q3A=
github.com/go-playground/assert/v2 v2.0.1/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4=
github.com/go-playground/locales v0.13.0/go.mod h1:taPMhCMXrRLJO55olJkUXHZBHCxTMfnGwq/HNwmWNS8=
github.com/go-playground/locales v0.14.0 h1:u50s323jtVGugKlcYeyzC0etD1HifMjqmJqb8WugfUU=
......@@ -16,26 +54,41 @@ github.com/go-playground/universal-translator v0.18.0/go.mod h1:UvRDBj+xPUEGrFYl
github.com/go-playground/validator/v10 v10.4.1/go.mod h1:nlOn6nFhuKACm19sB/8EGNn9GlaMV7XkbRSipzJ0Ii4=
github.com/go-playground/validator/v10 v10.9.0 h1:NgTtmN58D0m8+UuxtYmGztBJB7VnPgjj221I1QHci2A=
github.com/go-playground/validator/v10 v10.9.0/go.mod h1:74x4gJWsvQexRdW8Pn3dXSGrTK4nAUsbPlLADvpJkos=
github.com/gofrs/uuid v4.0.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/josharian/intern v1.0.0 h1:vlS4z54oSdjm0bgjRigI+G1HpF+tI+9rE5LLzOg8HmY=
github.com/josharian/intern v1.0.0/go.mod h1:5DoeVV0s6jJacbCEi61lwdGj/aVlrQvzHFFd8Hwg//Y=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
github.com/kr/pretty v0.3.0 h1:WgNl7dwNpEZ6jJ9k1snq4pZsg7DOEN8hP9Xw0Tsjwk0=
github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/leodido/go-urn v1.2.0/go.mod h1:+8+nEpDfqqsY+g338gtMEUOtuK+4dEMhiQEgxpxOKII=
github.com/leodido/go-urn v1.2.1 h1:BqpAaACuzVSgi/VLzGZIobT2z4v53pjosyNd9Yv6n/w=
github.com/leodido/go-urn v1.2.1/go.mod h1:zt4jvISO2HfUBqxjfIshjdMTYS56ZS/qv49ictyFfxY=
github.com/lib/pq v1.10.3 h1:v9QZf2Sn6AmjXtQeFpdoq/eaNtYP6IN+7lcrygsIAtg=
github.com/lib/pq v1.10.3/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/mailru/easyjson v0.0.0-20180823135443-60711f1a8329/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc=
github.com/mailru/easyjson v0.7.6/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mailru/easyjson v0.7.7 h1:UGYAvKxe3sBsEDzO8ZeWOSlIQfWFlxbzLZe7hwFURr0=
github.com/mailru/easyjson v0.7.7/go.mod h1:xzfreul335JAWq5oZzymOObrkdz5UnU4kGfJJLY9Nlc=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.14 h1:yVuAays6BHfxijgZPzw+3Zlu5yQgKGP2/hcQbHb7S9Y=
github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27kJ6hsGG94=
......@@ -43,30 +96,53 @@ github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJ
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/natefinch/lumberjack v2.0.0+incompatible h1:4QJd3OLAMgj7ph+yZTuX13Ld4UpgHp07nNdFX7mqFfM=
github.com/natefinch/lumberjack v2.0.0+incompatible/go.mod h1:Wi9p2TTF5DG5oU+6YfsmYQpsTIOm0B1VNzQg9Mw6nPk=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/shopspring/decimal v1.2.0/go.mod h1:DKyhrW/HYNuLGql+MJL6WCR6knT2jwCFRcu2hWCYk4o=
github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
github.com/swaggo/files v0.0.0-20190704085106-630677cd5c14/go.mod h1:gxQT6pBGRuIGunNf/+tSOB5OHvguWi8Tbt82WOkf35E=
github.com/swaggo/gin-swagger v1.3.2 h1:v4x39WgGCpJh9smvidElXep42uFZEiSU7hHfmCAB5+I=
github.com/swaggo/gin-swagger v1.3.2/go.mod h1:8GN8KIlwgjawtEvE+B8sx3q9SPJuX/ZPxyuoFVrl6gM=
github.com/swaggo/swag v1.5.1/go.mod h1:1Bl9F/ZBpVWh22nY0zmYyASPO1lI/zIwRDrpZU+tv8Y=
github.com/swaggo/swag v1.7.3 h1:ucB7irEdRrhjmW+Z1Ss4GjO68oPKQFjSgOR8BCAvcbU=
github.com/swaggo/swag v1.7.3/go.mod h1:zD8h6h4SPv7t3l+4BKdRquqW1ASWjKZgT6Qv9z3kNqI=
github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw=
github.com/ugorji/go v1.2.6 h1:tGiWC9HENWE2tqYycIqFTNorMmFRVhNwCpDOpWqnk8E=
github.com/ugorji/go v1.2.6/go.mod h1:anCg0y61KIhDlPZmnH+so+RQbysYVyDko0IMgJv0Nn0=
github.com/ugorji/go/codec v0.0.0-20181022190402-e5e69e061d4f/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY=
github.com/ugorji/go/codec v1.2.6 h1:7kbGefxLoDBuYXOms4yD7223OpNMMPNPZxXk5TvFcyQ=
github.com/ugorji/go/codec v1.2.6/go.mod h1:V6TCNZ4PHqoHGFZuSG1W8nrCzzdgA2DozYxWFFpvxTw=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli/v2 v2.3.0/go.mod h1:LJmUH05zAU44vOAcrfzZQKsZbVcdbOG8rtL3/XcUArI=
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723 h1:sHOAIxRGBp443oHZIPB+HsUGaksVCXVQENPxwTfQdH4=
go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ=
go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU=
go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec=
......@@ -79,19 +155,34 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97 h1:/UOmuWzQfxxo9UtlXMwuQU8CMgg1eZXqTRwkSQJWKOI=
golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/net v0.0.0-20181005035420-146acd28ed58/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190611141213-3f473d35a33a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20190827160401-ba9fcec4b297/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758 h1:aEpZnXcAmXkd6AvLb2OPt+EN1Zu/8Ne3pCqPjja5PXY=
golang.org/x/net v0.0.0-20210421230115-4e50805a0758/go.mod h1:72T/g9IO56b78aLF+1Kcs5dz7/ng1VjMUvfKvpfy+jM=
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sys v0.0.0-20181228144115-9a3f9b0469bb/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210420072515-93ed5bcd2bfe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
......@@ -101,15 +192,21 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
golang.org/x/tools v0.0.0-20190606050223-4d9ae51c2468/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20190611222205-d73e1c7e250b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0=
golang.org/x/tools v0.1.5 h1:ouewzE6p+/VEB31YYnTbEJdi8pFqKp4P4n85vwo3DHA=
golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE=
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
......@@ -117,13 +214,23 @@ google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+Rur
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE=
gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y=
gopkg.in/ini.v1 v1.63.2 h1:tGK/CyBg7SMzb60vP1M03vNZ3VDu3wGQJwn7Sxi9r3c=
gopkg.in/ini.v1 v1.63.2/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
gopkg.in/natefinch/lumberjack.v2 v2.0.0 h1:1Lc07Kr7qY4U2YPouBjpCLxpiyxIVoxqXgkXLknAOE8=
gopkg.in/natefinch/lumberjack.v2 v2.0.0/go.mod h1:l0ndWWf7gzL7RNwBG7wST/UCcT4T24xpD6X8LsfU/+k=
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
panic: SelectAreaToMap rows pq: column "status" does not exist
panic: runtime error: invalid memory address or nil pointer dereference
[signal 0xc0000005 code=0x0 addr=0x0 pc=0x6f7cce]
goroutine 1 [running]:
database/sql.(*Rows).close(0x0, {0x0, 0x0})
C:/Users/Administrator/go/go1.17/src/database/sql/sql.go:3267 +0x8e
database/sql.(*Rows).Close(0x2f9620)
C:/Users/Administrator/go/go1.17/src/database/sql/sql.go:3263 +0x1d
panic({0x7681e0, 0xc0003851e0})
C:/Users/Administrator/go/go1.17/src/runtime/panic.go:1038 +0x215
log.Panicln({0xc00029fdf0, 0x902f30, 0xc0000aa1b0})
C:/Users/Administrator/go/go1.17/src/log/log.go:368 +0x65
dc_golang_server_1/cache.initAreaMap()
D:/work/SoftwareGroup/goland_project/dc_golang_server_1/cache/cmap_area.go:19 +0x1c8
dc_golang_server_1/cache.Init()
D:/work/SoftwareGroup/goland_project/dc_golang_server_1/cache/cache.go:165 +0x17
main.main()
D:/work/SoftwareGroup/goland_project/dc_golang_server_1/main.go:75 +0x51
{"level":"WARN","ts":"2021-10-07 16:08:55.565","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"GET","Path":"/swagger/","DataSize":18,"Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"}
{"level":"WARN","ts":"2021-10-07 16:09:16.983","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"GET","Path":"/favicon.ico","DataSize":0,"Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"}
package main
import (
"dc_golang_server_1/cache"
"dc_golang_server_1/config"
"dc_golang_server_1/dbmodel"
"dc_golang_server_1/devproduct/dcphone20"
"dc_golang_server_1/logger"
"dc_golang_server_1/web"
"os"
"fmt"
"runtime"
"syscall"
"time"
)
//windows
var (
kernel32 = syscall.MustLoadDLL("kernel32.dll")
procSetStdHandle = kernel32.MustFindProc("SetStdHandle")
)
func setStdHandle(stdhandle int32, handle syscall.Handle) error {
r0, _, e1 := syscall.Syscall(procSetStdHandle.Addr(), 2, uintptr(stdhandle), uintptr(handle), 0)
if r0 == 0 {
if e1 != 0 {
return error(e1)
}
return syscall.EINVAL
}
return nil
}
// redirectStderr to the file passed in
func redirectStderrWindows(f *os.File) {
err := setStdHandle(syscall.STD_ERROR_HANDLE, syscall.Handle(f.Fd()))
if err != nil {
logger.Log.Panic(err.Error())
}
// SetStdHandle does not affect prior references to stderr
os.Stderr = f
}
//windows end
//func redirectStderrLinux(f *os.File) {
// err := syscall.Dup2(int(f.Fd()), int(os.Stderr.Fd()))
// if err != nil {
// logger.Log.Panic(err.Error())
// }
//}
//func init() {
//
//}
......@@ -56,24 +18,33 @@ func initConfigAndLogger() {
config.ConfigInit()
logger.InitLogger()
f, err := os.OpenFile(config.LogPath+"panic.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755)
if err != nil {
logger.Log.Panic(err.Error())
}
//突然发现这种方式瓜眉日眼的,以后不用了,直接在shell脚本里面重定向输出文件
//f, err := os.OpenFile(config.LogPath+"panic.log", os.O_CREATE|os.O_APPEND|os.O_WRONLY, 0755)
//if err != nil {
// logger.Log.Panic(err.Error())
//}
redirectStderrWindows(f)
//redirectStderrWindows(f)
//redirectStderrLinux(f)
}
// @title 多彩中小学一卡通系统
// @version V0.0.1
// @Description 用于家长端微信小程序及web端管理后台
// @securityDefinitions.apikey ApiKeyAuth
// @in header
// @name Authorization
// @BasePath /
func main() { //
fmt.Println(time.Now(), "system init")
runtime.GOMAXPROCS(runtime.NumCPU())
initConfigAndLogger()
dbmodel.InitDb()
defer dbmodel.CloseDb()
cache.Init()
//dbmodel.InitDb()
//defer dbmodel.CloseDb()
//
//cache.Init()
dcphone20.NewDCPhone20()
//dcdrinking60.NewDCDrinking60()
......
set GOOS=windows
swag init
go run main.go
\ No newline at end of file
......@@ -39,6 +39,46 @@ func Cors() gin.HandlerFunc {
}
//func Cors() gin.HandlerFunc {
// return func(c *gin.Context) {
// method := c.Request.Method
// origin := c.Request.Header.Get("Origin")
// var headerKeys []string
// for k, _ := range c.Request.Header {
// headerKeys = append(headerKeys, k)
// }
// headerStr := strings.Join(headerKeys, ", ")
// if headerStr != "" {
// headerStr = fmt.Sprintf("access-control-allow-origin, access-control-allow-headers, %s", headerStr)
// } else {
// headerStr = "access-control-allow-origin, access-control-allow-headers"
// }
// if origin != "" {
// c.Writer.Header().Set("Access-Control-Allow-Origin", "*")
// c.Header("Access-Control-Allow-Origin", "*") // 这是允许访问所有域
// c.Header("Access-Control-Allow-Methods", "POST, GET, OPTIONS, PUT, DELETE,UPDATE") //服务器支持的所有跨域请求的方法,为了避免浏览次请求的多次'预检'请求
// // header的类型
// c.Header("Access-Control-Allow-Headers", "Authorization, Content-Length, X-CSRF-Token, Token,session,X_Requested_With,Accept, Origin, Host, Connection, Accept-Encoding, Accept-Language,DNT, X-CustomHeader, Keep-Alive, User-Agent, X-Requested-With, If-Modified-Since, Cache-Control, Content-Type, Pragma")
// // 允许跨域设置 可以返回其他子段
// c.Header("Access-Control-Expose-Headers", "Content-Length, Access-Control-Allow-Origin, Access-Control-Allow-Headers,Cache-Control,Content-Language,Content-Type,Expires,Last-Modified,Pragma,FooBar") // 跨域关键设置 让浏览器可以解析
// c.Header("Access-Control-Max-Age", "172800") // 缓存请求信息 单位为秒
// c.Header("Access-Control-Allow-Credentials", "false") // 跨域请求是否需要带cookie信息 默认设置为true
// c.Set("content-type", "application/json") // 设置返回格式是json
// }
//
// //放行所有OPTIONS方法
// //if method == "OPTIONS" {
// // c.JSON(http.StatusOK, "Options Request!")
// //}
// if method == "OPTIONS" {
// c.AbortWithStatus(204)
// return
// }
// // 处理请求
// c.Next() // 处理请求
// }
//}
//func Cors() gin.HandlerFunc {
// return func(context *gin.Context) {
// method := context.Request.Method
// origin := context.Request.Header.Get("Origin")
......
package web
import (
"dc_golang_server_1/cache"
"dc_golang_server_1/util"
"github.com/gin-gonic/gin"
"net/http"
......@@ -28,6 +29,8 @@ const jeffWTKey = "jeffWT@666%b;'~+"
// TokenInvalid error = errors.New("这不是一个token,请重新登录")
//)
const tokenLen = 60
// CreateToken 生成token,duration=0表示不限时长
func CreateToken(creatTime int64, userName string, admin bool, duration uint32) string {
expireTime := uint32(creatTime/1000000) + duration
......@@ -96,133 +99,77 @@ func CreateToken(creatTime int64, userName string, admin bool, duration uint32)
return util.EncryptBytesToBase64URL(clear, jeffWTKey)
}
// ParserToken 解析token
//func ParserToken(tokenString string) (jeffWTInfo, bool) {
// var info jeffWTInfo
// clear,err := util.DecryptBase64URLToBytes(tokenString, jeffWTKey)
// if err != nil {
// // ntodo logger 有人在非法请求
// return info,false //errors.New("TOKEN格式错误")//err
// }
// if len(clear) != 44 {
// // ntodo logger
// return info,false //errors.New("TOKEN格式错误")//("明文长度错误")
// }
//
// random := clear[12] - 0x5a
// clear[42] = ^clear[42] - random
// clear[43] = ^(clear[43] + random)
// if util.CheckCRC(clear)==false {
// // ntodo logger
// return info,false //errors.New("TOKEN格式错误")//("明文校验错误")
// }
//
// userNameLen := clear[22] - random
// if userNameLen < 1 || userNameLen > 30 {
// // ntodo logger
// return info,false //errors.New("TOKEN格式错误")//("登录名长度错误")
// }
//
// if clear[30] & 0x80 == 0x80 {
// info.Admin = true
// clear[30] &= 0x7f
// }
//func CreateToken(creatTime int64, userName string, duration uint32) string {
// expireTime := uint32(creatTime/1000000) + duration
//
// info.ExpireTime = (uint32(clear[2] - 27 - random)) +
// (uint32(^clear[20]) << 8) +
// (uint32(clear[17] + random)<<16) +
// (uint32(clear[26] + random)<<24)
// var clear = make([]byte, 44) //8字节创建时间 4字节结束时间 30字节userName 2字节CRC
//
// info.CreatTime = int64(random) +
// (int64(clear[41] + 69 + random)<<8) +
// (int64(clear[35] + 88 - random)<<16) +
// (int64(^(clear[40] + random))<<24) +
// (int64(clear[10] - 66 -random)<<32) +
// (int64(^(clear[36] + 28 + random))<<40) +
// (int64(clear[30] - 8 - random)<<48)
//
// if info.ExpireTime < uint32(info.CreatTime/1000000) {
// // ntodo logger
// return info,false
// //r := rand.New(rand.NewSource(time.Now().UnixNano()))
// if len(userName) > 30 {
// return ""
// }
//
// random := byte(creatTime)
// var str [30]byte
//
// str[8] = clear[0]
// str[25] = clear[1]
// str[27] = clear[3]
// str[15] = clear[4]
// str[19] = clear[5]
// str[11] = clear[6]
// str[23] = clear[7]
// str[6] = clear[8]
// str[28] = clear[9]
// str[16] = clear[11]
// str[17] = clear[13]
// str[3] = clear[14]
// str[21] = clear[15]
// str[1] = clear[16]
// str[0] = clear[18]
// str[4] = clear[19]
// str[5] = clear[21]
// str[7] = clear[23]
// str[9] = clear[24]
// str[10] = clear[25]
// str[12] = clear[27]
// str[13] = clear[28]
// str[14] = clear[29]
// str[18] = clear[31]
// str[20] = clear[32]
// str[22] = clear[33]
// str[2] = clear[34]
// str[24] = clear[37]
// str[26] = clear[38]
// str[29] = clear[39]
//
// for i := uint8(0); i < userNameLen; i++ {
// str[i] = str[i] - random - (i << 2)
// for i := 0; i < len(userName); i++ {
// str[i] = userName[i] + (uint8(i) << 2) + random
// }
// info.UserName = string(str[:userNameLen])
//
// return info,true
// clear[0] = str[8]
// clear[1] = str[25]
// clear[2] = byte(expireTime) + random + 27
// clear[3] = str[27]
// clear[4] = str[15]
// clear[5] = str[19]
// clear[6] = str[11]
// clear[7] = str[23]
// clear[8] = str[6]
// clear[9] = str[28]
// clear[10] = byte(creatTime>>32) + random + 66
// clear[11] = str[16]
// clear[12] = ^random + 0x5a
// clear[13] = str[17]
// clear[14] = str[3]
// clear[15] = str[21]
// clear[16] = str[1]
// clear[17] = byte(expireTime>>16) - random
// clear[18] = str[0]
// clear[19] = str[4]
// clear[20] = ^byte(expireTime >> 8)
// clear[21] = str[5]
// clear[22] = byte(len(userName)) + random
// clear[23] = str[7]
// clear[24] = str[9]
// clear[25] = str[10]
// clear[26] = byte(expireTime>>24) + random + 99
// clear[27] = str[12]
// clear[28] = str[13]
// clear[29] = str[14]
// clear[30] = byte(creatTime >> 48)
// clear[31] = str[18]
// clear[32] = str[20]
// clear[33] = str[22]
// clear[34] = str[2]
// clear[35] = byte(creatTime>>16) + random - 88
// clear[36] = ^byte(creatTime>>40) - random - 28
// clear[37] = str[24]
// clear[38] = str[26]
// clear[39] = str[29]
// clear[40] = ^byte(creatTime>>24) - random
// clear[41] = byte(creatTime>>8) - random - 69
// util.GetCRC(clear[:42], 42)
// clear[42] = ^(clear[42] + random)
// clear[43] = ^clear[43] - random
//
// //token, err := jwt.ParseWithClaims(tokenString, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
// // return j.JwtKey, nil
// //})
// //
// //if err != nil {
// // if ve, ok := err.(*jwt.ValidationError); ok {
// // if ve.Errors&jwt.ValidationErrorMalformed != 0 {
// // return nil, errors.New("Token不正确,请重新登录")
// // } else if ve.Errors&jwt.ValidationErrorExpired != 0 {
// // // Token is expired
// // return nil, errors.New("Token已过期,请重新登录")
// // } else if ve.Errors&jwt.ValidationErrorNotValidYet != 0 {
// // return nil, errors.New("Token无效,请重新登录")
// // } else {
// // return nil, errors.New("这不是一个token,请重新登录")
// // }
// // }
// //}
// //
// //if token != nil {
// // if claims, ok := token.Claims.(*MyClaims); ok && token.Valid {
// // return claims, nil
// // }
// // return nil, errors.New("这不是一个token,请重新登录")
// //}
// //
// //return nil, errors.New("这不是一个token,请重新登录")
// return util.EncryptBytesToBase64URL(clear, jeffWTKey)
//}
// JwtToken jwt中间件
func JwtToken() gin.HandlerFunc {
func CheckToken() gin.HandlerFunc {
return func(c *gin.Context) {
tokenHeader := c.Request.Header.Get("Authorization")
if tokenHeader == "" {
c.JSON(http.StatusOK, gin.H{
"status": 1004,
"message": "TOKEN不存在",
"message": "token不存在",
})
c.Abort()
return
......@@ -246,7 +193,16 @@ func JwtToken() gin.HandlerFunc {
c.Abort()
return
}
//
if len(checkToken[1]) != tokenLen {
// todo logger 有人在非法请求
c.JSON(http.StatusOK, gin.H{
"status": 1004,
"message": "token长度错误",
})
c.Abort()
return
}
clear, err := util.DecryptBase64URLToBytes(checkToken[1], jeffWTKey)
if err != nil {
......@@ -370,98 +326,19 @@ func JwtToken() gin.HandlerFunc {
// todo 查cache 已退出登录
} else {
// todo 查cache 已退出登录
cacheCreatTime := cache.GetWechatCustomerTokenCreatTime(userName)
if cacheCreatTime > creatTime { //如果缓存里面存的CreatTime比token里面的CreatTime要晚,则token已退出登录
// todo logger warn
c.JSON(http.StatusOK, gin.H{
"status": 1006,
"message": "用户已退出登录",
})
c.Abort()
return //
}
}
c.Set("username", userName)
c.Next()
}
}
//var JwtKey = []byte(utils.JwtKey)
//
//type MyClaims struct {
// Username string `json:"username"`
// jwt.StandardClaims
//}
//
//// 生成token
//func SetToken(username string) (string,int){
// setClaims := MyClaims{
// username,
// jwt.StandardClaims{
// ExpiresAt: time.Now().Add(10*time.Hour).Unix(),
// Issuer: "ginblog",
// },
// }
//
// reqClaim := jwt.NewWithClaims(jwt.SigningMethodHS256, setClaims)
// token,err := reqClaim.SignedString(JwtKey)
// if err != nil {
// return "",errmsg.ERROR
// }
// return token,errmsg.SUCCSE
//}
//
//// 验证token
//func CheckToken(token string) (*MyClaims, int){
// if token == "" || token == "null"{
// return nil,errmsg.ERROR
// }
// setToken,_ := jwt.ParseWithClaims(token, &MyClaims{}, func(token *jwt.Token) (interface{}, error) {
// return JwtKey, nil
// })
// if key,_ := setToken.Claims.(*MyClaims); setToken.Valid{
// return key,errmsg.SUCCSE
// }
// return nil,errmsg.ERROR
//}
//
//// jwt中间件
//func JwtToken() gin.HandlerFunc{
// var code int
// return func(c *gin.Context) {
// tokenHeader := c.Request.Header.Get("Authorization")
//
// if tokenHeader == "" {
// code = errmsg.ERROR_TOKEN_EXIST
// c.JSON(http.StatusOK,gin.H{
// "code":code,
// "message":errmsg.GetErrMsg(code),
// })
// c.Abort()
// return
// }
// checkToken := strings.SplitN(tokenHeader, " ", 2)
// if len(checkToken) != 2 && checkToken[0] != "Bearer" {
// code = errmsg.ERROR_TOKEN_TYPE_WRONG
// c.JSON(http.StatusOK,gin.H{
// "code":code,
// "message":errmsg.GetErrMsg(code),
// })
// c.Abort()
// return
// }
// key,tCode := CheckToken(checkToken[1])
// if tCode == errmsg.ERROR {
// code = errmsg.ERROR_TOKEN_WRONG
// c.JSON(http.StatusOK,gin.H{
// "code":code,
// "message":errmsg.GetErrMsg(code),
// })
// c.Abort()
// return
// }
// if time.Now().Unix() > key.ExpiresAt {
// code = errmsg.ERROR_TOKEN_RUNTIME
// c.JSON(http.StatusOK,gin.H{
// "code":code,
// "message":errmsg.GetErrMsg(code),
// })
// c.Abort()
// return
// }
//
// c.Set("username",key.Username)
// c.Next()
// }
//}
1. 查卡用户信息
1)小程序:通过微信UNIONID(token),查家长绑定的所有的 //查缓存
2) 后台:通过校区服务ID,查这一堆校区的,并提供筛选条件 //查库
一、管理后台接口
1. 后台用户登录
传:LoginAccount、Password、验证码
用LoginAccount,获得AdminStruct,成功就更新 tokenCreatTime
成功则进入首页
成功回:token,Name, 菜单按钮权限,首页展示内容(后面做统计内容,现在先全为空) AdminStruct RoleAuthStruct
2.
1基础数据
1. 获取区域列表
区域ID 省市区县 区域名字 经纬度 状态 创建时间
2. 服务商列表
列表-总记录
服务商ID 省市区县 服务商名字 法人 法人电话 联系人 联系人电话
3. 收款账户信息列表
4. 获取校区服务列表
(省市区) (服务类型) (区域名称) (运营状态) (服务商 名字) 【搜索-固定有】【新增-根据权限】
列表-总记录290条:
区域服务id,省市区县,区域服务名字,区域名字,负责人,负责人电话,状态, 服务商名字,创建时间,服务项目, [编辑][详情][收款信息 收款账户列表比例 -充值/代扣]充值项配置
2订单数据
1. 充值订单
2. 消费订单
3. 通话清单
4. 通行记录
3用户数据
1. 微信用户数据
2. 卡用户数据
模板下载(电话卡、定位卡、) 导入模板
4设备管理
1. 设备列表
模板下载(不同设备类型模板不同) 导入模板
2. 设备状态
3. 设备参数
4. 电话卡
5. 设备告警信息
5系统管理
1. 系统用户
2. 角色管理
-- 3. 菜单管理
6缴费(预留: 服务费/话费)
二、用户小程序接口
......
......@@ -2,9 +2,14 @@ package web
import (
"dc_golang_server_1/config"
_ "dc_golang_server_1/docs"
"dc_golang_server_1/logger"
v1 "dc_golang_server_1/web/v1"
"fmt"
"github.com/gin-gonic/gin"
"github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
"time"
)
func InitRouter() { //*gin.Engine{
......@@ -12,31 +17,38 @@ func InitRouter() { //*gin.Engine{
r := gin.New()
r.Use(logger.HttpGinLog(), gin.Recovery())
r.Use(Cors()) //全局跨域 局部跨域的话在路由组里面去添加
r.Use(JwtToken()) //jwt 还是在对应需要token的路由组添加
//r.Use(CheckToken()) //jwt 还是在对应需要token的路由组添加
user := r.Group("user/")
user.Use(JwtToken())
{ // 需要token的
//user.GET("users",GetUsers)
fmt.Println("swagger", config.HttpServerSwagger)
if config.HttpServerSwagger {
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
}
// 登录:用户名,密码,验证码 返回token 返回用户信息、账号、token、菜单权限
//
// 会员管理:
//家长信息(ID,微信UNIONID,手机号,昵称,注册时间,最后一次登录时间,卡用户绑定状态)
//学生信息(ID, 家长ID, 区域, 名字, 性别, 生日,年级,班级,学号,注册时间) 校区ID、家长ID、家长手机、学生名字
base := r.Group("base/")
// base.Use(CheckToken())
{
base.GET("province", v1.GetProvinceList)
base.GET("city/:provinceID", v1.GetCityList)
base.GET("county/:cityID", v1.GetCountyList)
}
// 基础数据
// 区域
r.POST("we/login/:code", v1.WeLogin)
wechat := r.Group("we/")
// wechat.Use(CheckToken())
{ // 需要token的
wechat.GET("trend/:id", v1.GetCardUsersTrend)
}
//router := r.Group("web/")
{
//router.POST()
}
fmt.Println(time.Now(), "server is running")
err := r.Run(config.HttpServerPort)
if err != nil {
panic(err)
}
fmt.Println("GAME OVER")
}
package v1
import (
"dc_golang_server_1/cache"
"github.com/gin-gonic/gin"
"net/http"
)
// GetCardUsers 登录接口,返回Token及 微信首页获取卡用户信息列表
func GetCardUsers(c *gin.Context) {
cardUsersID := cache.GetWechatCustomerCardUserID(c.Param("username"))
cardUserInfos := make([]cache.CardUserType, len(cardUsersID))
for i, v := range cardUsersID {
cardUserInfos[i] = cache.GetCardUserInfo(v)
}
c.JSON(http.StatusOK, gin.H{
"status": 200,
// "total": 0,
"data": cardUserInfos,
"message": "OK",
})
}
var WechatCardUsersTrendType struct {
ServiceType uint8 `json:"service"` //服务项目 UI图标及颜色等
TrendName string `json:"title"` //显示在第一行
Content string `json:"content"` //显示在第二行
Time string `json:"time"` //显示在第三行
}
// GetCardUsersTrend 微信学生首页,获取近10条用户最新动态
// @Tags public
// @Summary 微信学生首页,获取近20条用户最新动态
// @Description 微信学生首页,获取近20条用户最新动态
// @Param code path string true "请示参数code"
// @Product json
// @Success 200 {object} string "{"code": 200, "token": string}"
// @Router /we/trend/:id [GET]
func GetCardUsersTrend(c *gin.Context) {
//id, _ := strconv.Atoi(c.Param("id"))
c.JSON(http.StatusOK, gin.H{
"status": 200,
"message": "OK",
})
}
package v1
import (
"dc_golang_server_1/cache"
"github.com/gin-gonic/gin"
"net/http"
)
// GetProvinceList 获取省份列表
// @Tags 公用接口
// @Summary 获取全国省份列表
// @Description 获取带首字母的省份列表
// @Product json
// @Success 200 {object} []cache.District "按首字母排序好的列表,可直接用作展示"
// @Router /base/province [GET]
// @Security ApiKeyAuth
func GetProvinceList(c *gin.Context) {
data := []cache.District{
{1, "四川省", "S"},
{1, "四川省", "S"},
}
c.JSON(http.StatusOK, gin.H{
"status": 200,
"data": data,
})
}
// GetCityList 获取城市列表
// @Tags 公用接口
// @Summary 通过省份ID获取城市列表
// @Description 获取带首字母的城市列表
// @Param provinceID path integer true "省份id"
// @Product json
// @Success 200 {object} []cache.District "按首字母排序好的列表,可直接用作展示"
// @Router /base/city/{provinceID} [GET]
// @Security ApiKeyAuth
func GetCityList(c *gin.Context) {
//province, _ := strconv.Atoi(c.Param("provinceID"))
data := make(map[string][]string)
data["S"] = append(data["C"], "成都市")
c.JSON(http.StatusOK, gin.H{
"status": 200,
"data": data,
})
}
// GetCountyList 获取区县列表
// @Tags 公用接口
// @Summary 通过城市ID获取区县列表
// @Description 获取带首字母的城市列表
// @Param cityID path integer true "城市ID"
// @Product json
// @Success 200 {object} []cache.District "按首字母排序好的列表,可直接用作展示"
// @Router /base/county/{cityID} [GET]
// @Security ApiKeyAuth
func GetCountyList(c *gin.Context) {
//province, _ := strconv.Atoi(c.Param("cityID"))
data := make(map[string][]string)
data["S"] = append(data["W"], "温江区")
c.JSON(http.StatusOK, gin.H{
"status": 200,
"data": data,
})
}
package v1
import (
"fmt"
"github.com/gin-gonic/gin"
"net/http"
)
// WeLogin 微信登录
// @Tags 家长微信
// @Summary 登录
// @Description 微信code传至后台,后台返回token,token有效时长:24小时
// @Param code path string true "用户微信的code"
// @Product json
// @Success 200 {object} string "{"code": 200, "token": string}"
// @Router /we/login/{code} [POST]
func WeLogin(c *gin.Context) {
code := c.Param("code")
fmt.Println(code)
//todo 拿code去找腾讯要东西
c.JSON(http.StatusOK, gin.H{
"status": 200,
"token": "diohafuahfuihaeuifhrgjkngk3134",
})
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment