Commit 4bf1f194 by zhangjiec

1. 增加部分接口

parent 0829c0f2
set GOOS=linux set GOOS=linux
swag init
go build -o dcGoServer1 -ldflags "-w -s" main.go go build -o dcGoServer1 -ldflags "-w -s" main.go
\ No newline at end of file
...@@ -5,7 +5,7 @@ import ( ...@@ -5,7 +5,7 @@ import (
"time" "time"
) )
/*********************************************************全国行政区域**/ // ProvinceMap /*********************************************************全国行政区域**/------------------------OK
var ProvinceMap []DistrictStruct // 省份列表[]District var ProvinceMap []DistrictStruct // 省份列表[]District
var CityMap sync.Map // 城市列表map[uint32][]District //省份ID作为KEY var CityMap sync.Map // 城市列表map[uint32][]District //省份ID作为KEY
var CountyMap sync.Map // 区县列表map[uint32][]District //城市ID作为KEY var CountyMap sync.Map // 区县列表map[uint32][]District //城市ID作为KEY
...@@ -15,14 +15,21 @@ type DistrictStruct struct { ...@@ -15,14 +15,21 @@ type DistrictStruct struct {
Initial string `json:"initial" example:"S"` Initial string `json:"initial" example:"S"`
} }
/******************************************************区域(校区)**/ // CountyAreaMap /******************************************************************区县学校列表**/
var CountyAreaMap sync.Map //map[uint32][[]uint32] 区县ID作为KEY,[]area_id 作为Value
// TestAreaMap /******************************************************************测试校区列表**/
// AreaMap /******************************************************区域(校区)**/
var AreaMap sync.Map //area_id 作为KEY AreaStruct 作为VALUE var AreaMap sync.Map //area_id 作为KEY AreaStruct 作为VALUE
type AreaStruct struct { // AreaStruct 区域信息缓存,通过区域ID查出,后续再加支付信息 type AreaStruct struct { // AreaStruct 区域信息缓存,通过区域ID查出,后续再加支付信息
Name string Name string
Loc []uint32 Longitude uint32
CountyID uint32 Latitude uint32
Status uint8 //校区状态 0 不展示 1展示 2测试校区 CountyID uint32
CreatAt time.Time AreaService []uint32
Status uint8 //校区状态 0 不展示 1展示 2测试校区
// CreatAt time.Time
} }
/*********************************************************代理商**/ /*********************************************************代理商**/
...@@ -46,7 +53,7 @@ type AreaServiceStruct struct { // ...@@ -46,7 +53,7 @@ type AreaServiceStruct struct { //
ServiceID uint8 //服务项目 1公话 2定位 3饮水 4POS ......... ServiceID uint8 //服务项目 1公话 2定位 3饮水 4POS .........
OperatorID uint32 //运营商ID OperatorID uint32 //运营商ID
Name string //服务名字(例宿舍135栋饮水)name Name string //服务名字(例宿舍135栋饮水)name
Status uint8 //状态 0无服务1暂停10正式11测试 Status uint8 //状态 0无内容1正式2测试3暂停4暂未开放
} }
/*---------------------------------------------------------------*/ /*---------------------------------------------------------------*/
...@@ -55,7 +62,7 @@ type AreaServiceStruct struct { // ...@@ -55,7 +62,7 @@ type AreaServiceStruct struct { //
var adminMap sync.Map //后台管理用户 LoginAccount(string) 作为KEY var adminMap sync.Map //后台管理用户 LoginAccount(string) 作为KEY
type AdminStruct struct { type AdminStruct struct {
Password [16]byte Password [16]byte
tokenCreatTime int64 tokenCreatTime int64 // 初始化为0,则已有的token还有效
Name string Name string
upAdminID uint32 upAdminID uint32
//Phone string //Phone string
...@@ -73,38 +80,41 @@ type RoleAuthStruct struct { ...@@ -73,38 +80,41 @@ type RoleAuthStruct struct {
MenuRole map[uint32][]uint32 // 菜单、按钮权限 MenuRole map[uint32][]uint32 // 菜单、按钮权限
} }
/***************************************************微信用户(家长)**/ /***************************************************微信用户(家长)**/ //------------------------OK
var wechatCustomerMap sync.Map //微信的WechatUnionID(string)作为KEY var WechatCustomerUnionIDToIDMAP sync.Map // UnionID作为KEY(string),微信用户ID作为VALUE(uint32)
var WechatCustomerMap sync.Map // 微信的WechatUserID(uint32)作为KEY
type WechatCustomerStruct struct { type WechatCustomerStruct struct {
tokenCreatTime uint32 TokenCreatTime int64
testRole uint8 // 测试用户(可看到测试校区) TestRole bool // 测试用户(可看到测试校区)
wePhone string // WePhone string // 手机号
nickname string //微信昵称 Nickname string // 微信昵称
masterCardUserID []uint32 //自己创建的学生用户 AvatarURL string // 头像链接
slaveCardUserID []uint32 //被邀请查看的学生用户 MasterCardUserID []uint32 // 自己创建的学生用户
SlaveCardUserID []uint32 // 被邀请查看的学生用户
} }
/****************************************************************/ /****************************************************************/
/***************************************************卡用户(学生、教师、职工)**/ /***************************************************卡用户(学生、教师、职工)**/
var cardUserMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY 纯卡用户可以不绑定微信 var CardUserMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY 纯卡用户可以不绑定微信
type CardUserType struct { type CardUserType struct {
MasterWechatUnionID string MasterWechatUserID uint32
SlaveWechatUnionID []string SlaveWechatUserID []uint32
ShareCode string Role uint8 //角色0学生,1教师,2职工,default0
Role uint8 //角色0学生,1教师,2职工,default0 AreaID uint32
AreaID uint32 Name string
Name string Sex uint8 //0,无信息,1女,2男
Sex bool //false女 true男
// Birthday // Birthday
Grade uint8 Grade int8
Class uint8 Class int8
StudentNo string StuNum string
PhoneAreaServiceID uint32 Recharge bool //是否充过值
LocationAreaServiceID uint32
WaterAreaServiceID uint32 //PhoneAreaServiceID uint32
PosAreaServiceID uint32 //LocationAreaServiceID uint32
//WaterAreaServiceID uint32
//PosAreaServiceID uint32
SimCardID string SimCardID string
LocationCardID uint32 LocationCardID uint32
...@@ -140,40 +150,7 @@ type FamilyOnePerson struct { ...@@ -140,40 +150,7 @@ type FamilyOnePerson struct {
/*---------------------------------------------------------------*/ /*---------------------------------------------------------------*/
///********************************************************Sim卡信息(允许一卡多校区使用)**/ /***************************************************卡用户动态**/
//var simInfoMap sync.Map //card_id 作为KEY
//type SimInfoStruct struct {
// Status int8 //0没得这个数据 1 正常使用 其他各种异常
// MonthTalkMinutes uint16
// MonthPackageMinutes uint16
// AreaFamilyNum []sync.Map //area_id为KEY , []familyOnePerson 为 VALUE
//}
//type FamilyOnePerson struct {
// Phone string
// Nickname string
//}
///*---------------------------------------------------------------*/
///*******************************************************定位设备**/
//var phone20DeviceMap sync.Map //device_id 作为KEY DeviceStruct 作为VALUE
//type Phone20DeviceStruct struct {
// AreaID int32
// AllowCallTime uint8 //允许通话时长,255表示不限制时长
// Status bool
//}
///*---------------------------------------------------------------*/
//
//
///*******************************************************饮水设备**/
//var phone20DeviceMap sync.Map //device_id 作为KEY DeviceStruct 作为VALUE
//type Phone20DeviceStruct struct {
// AreaID int32
// AllowCallTime uint8 //允许通话时长,255表示不限制时长
// Status bool
//}
///*---------------------------------------------------------------*/
/***************************************************卡用户(学生、教师、职工)**/
var cardUserTrendMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY,[]CardUserTrendType作为VALUE var cardUserTrendMap sync.Map //卡用户 CardUserID卡用户ID(uint32) 作为KEY,[]CardUserTrendType作为VALUE
type CardUserTrendType struct { type CardUserTrendType struct {
ServiceType uint8 //服务项目 UI图标及颜色等 ServiceType uint8 //服务项目 UI图标及颜色等
...@@ -186,11 +163,12 @@ type CardUserTrendType struct { ...@@ -186,11 +163,12 @@ type CardUserTrendType struct {
func Init() { func Init() {
initBCityMaps() // 初始化行政区域省市区缓存 initBCityMaps() // 初始化行政区域省市区缓存
initAreaMap() initAreaMapAndCountyAreaMap()
initWechatCustomerMap()
initCardUserMap()
//initAdminMap()
//initOperatorMap() //initOperatorMap()
//initWechatCustomerMap()
//initCardUserMap()
//initAreaServiceMap() //initAreaServiceMap()
//initPhone20DeviceMap() //initPhone20DeviceMap()
//initSimFamilyNumMap() //initSimFamilyNumMap()
......
package cache
import (
"dc_golang_server_1/dbmodel"
"dc_golang_server_1/logger"
"fmt"
"go.uber.org/zap"
"log"
"time"
)
//id integer NOT NULL DEFAULT nextval('b_area_id_seq'::regclass),
//county_id integer,
//name character varying(32) COLLATE pg_catalog."default",
//longitude integer,
//latitude integer,
//status smallint,
//creator_id integer,
//updater_id integer,
//create_at timestamp without time zone,
//update_at timestamp without time zone,
//CONSTRAINT b_area_pkey PRIMARY KEY (id),
//CONSTRAINT b_area_uniq1 UNIQUE (name)
func initAreaMapAndCountyAreaMap() {
fmt.Println(time.Now(), "cache: initAreaMap begin")
var areaID uint32
var temp AreaStruct
rows, err := dbmodel.PgDb.Query("SELECT id,county_id,name,longitude,latitude,status FROM b_area") //
defer rows.Close()
if err != nil {
log.Panicln("SelectAreaToMap rows", err)
}
for rows.Next() {
err = rows.Scan(&areaID, &temp.CountyID, &temp.Name, &temp.Longitude, &temp.Latitude, &temp.Status)
if err != nil {
log.Panicln("SelectAreaToMap rows.Scan", err)
}
fmt.Println(areaID, temp)
AreaMap.Store(areaID, temp)
if temp.CountyID != 0 {
var areaIDList []uint32
if v, ok := CountyAreaMap.Load(temp.CountyID); ok {
areaIDList, _ = v.([]uint32)
}
areaIDList = append(areaIDList, areaID)
CountyAreaMap.Store(temp.CountyID, areaIDList)
fmt.Println(temp.CountyID, areaIDList)
}
}
// 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil {
log.Panicln(time.Now(), "initAreaMap rows.Err()", err)
}
fmt.Println(time.Now(), "cache: initAreaMap OK")
}
func GetAreaMapName(areaID uint32, test bool) string {
if v, ok := AreaMap.Load(areaID); ok {
if data, ok := v.(AreaStruct); ok {
if data.Status == 1 || (data.Status == 2 && test) {
return data.Name
}
} else {
AreaMap.Delete(areaID)
logger.Log.Error("AreaMap 类型断言错误",
zap.String("Src", "GetAreaMapName"),
zap.Uint32("areaID", areaID))
}
} else {
logger.Log.Error("AreaMap 没数据",
zap.String("Src", "GetAreaMapName"),
zap.Uint32("areaID", areaID))
}
// todo 查库
return ""
}
func GetAreaMapInfo(areaID uint32, info *AreaStruct) bool {
if v, ok := AreaMap.Load(areaID); ok {
if *info, ok = v.(AreaStruct); ok {
return true
} else {
AreaMap.Delete(areaID)
logger.Log.Error("AreaMap 类型断言错误",
zap.String("Src", "GetAreaMapInfo"),
zap.Uint32("areaID", areaID))
return false
}
} else {
logger.Log.Error("AreaMap 没数据",
zap.String("Src", "GetAreaMapInfo"),
zap.Uint32("areaID", areaID))
}
// todo 查库
return false
}
...@@ -36,10 +36,17 @@ func initAreaServiceMap() { ...@@ -36,10 +36,17 @@ func initAreaServiceMap() {
} }
} }
func GetAreaServiceInfo(areaServiceID uint32) AreaServiceStruct { func GetAreaServiceInfo(areaServiceID uint32) (areaServiceInfo AreaServiceStruct) {
if info, ok := areaServiceMap.Load(areaServiceID); ok { //map有 if info, ok := areaServiceMap.Load(areaServiceID); ok { //map有
if v, ok2 := info.(AreaServiceStruct); ok2 { //类型断言正确 if areaServiceInfo, ok = info.(AreaServiceStruct); ok { //类型断言正确
return v //,true if areaServiceInfo.Status == 0 {
areaServiceMap.Delete(areaServiceID)
logger.Log.Error("areaServiceMap areaServiceInfo.Status == 0",
zap.Uint32("areaServiceID", areaServiceID),
zap.String("src", "GetAreaServiceInfo"))
} else {
return areaServiceInfo
}
} else { //类型断言失败 } else { //类型断言失败
areaServiceMap.Delete(areaServiceID) areaServiceMap.Delete(areaServiceID)
logger.Log.Error("areaServiceMap 类型断言错误", logger.Log.Error("areaServiceMap 类型断言错误",
...@@ -47,26 +54,26 @@ func GetAreaServiceInfo(areaServiceID uint32) AreaServiceStruct { ...@@ -47,26 +54,26 @@ func GetAreaServiceInfo(areaServiceID uint32) AreaServiceStruct {
zap.String("src", "GetAreaServiceInfo")) zap.String("src", "GetAreaServiceInfo"))
} }
} }
var temp AreaServiceStruct
var err error var err error
for i := 0; i < 100; i++ { for i := 0; i < 10; i++ {
err = dbmodel.PgDb.QueryRow("SELECT name,status FROM b_area WHERE id=$1", err = dbmodel.PgDb.QueryRow("SELECT name,status FROM b_area WHERE id=$1",
areaServiceID).Scan(&temp.Name, &temp.Status) //todo areaServiceID).Scan(&areaServiceInfo.Name, &areaServiceInfo.Status) //todo
if err != nil { if err != nil {
fmt.Println("GetAreaInfo SELECT:", i, err) fmt.Println("GetAreaInfo SELECT:", i, err)
time.Sleep(3 * time.Millisecond) time.Sleep(3 * time.Millisecond)
continue continue
} }
areaServiceMap.Store(areaServiceID, temp) areaServiceMap.Store(areaServiceID, areaServiceInfo)
logger.Log.Error("数据库有而缓存没有 areaServiceMap", logger.Log.Error("数据库有而缓存没有 areaServiceMap",
zap.Uint32("areaServiceID", areaServiceID), zap.Uint32("areaServiceID", areaServiceID),
zap.Error(err), zap.Error(err),
zap.String("src", "GetAreaServiceInfo")) zap.String("src", "GetAreaServiceInfo"))
return temp //,true return
} }
logger.Log.Error("GetAreaServiceInfo SELECT operator_id,status FROM b_area WHERE id=$1", //todo logger.Log.Error("GetAreaServiceInfo SELECT operator_id,status FROM b_area WHERE id=$1", //todo
zap.Uint32("areaServiceID", areaServiceID), zap.Uint32("areaServiceID", areaServiceID),
zap.Error(err), zap.Error(err),
zap.String("src", "GetAreaServiceInfo")) zap.String("src", "GetAreaServiceInfo"))
return temp //,false return
} }
package cache
import (
"dc_golang_server_1/dbmodel"
"fmt"
"log"
"time"
)
func initAreaMap() {
fmt.Println(time.Now(), "cache: initAreaMap begin")
var areaID uint32
var temp AreaStruct
rows, err := dbmodel.PgDb.Query("SELECT id,county_id,name,location,status,create_at FROM b_area") //
defer rows.Close()
if err != nil {
log.Panicln("SelectAreaToMap rows", err)
}
var test2 string
for rows.Next() {
err = rows.Scan(&areaID, &temp.CountyID, &temp.Name, &test2, &temp.Status, &temp.CreatAt) //todo 它娘的location这个POINT取不来,咋个是string哦
if err != nil {
log.Panicln("SelectAreaToMap rows.Scan", err)
}
AreaMap.Store(areaID, temp)
}
// 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil {
log.Panicln(time.Now(), "initAreaMap rows.Err()", err)
}
fmt.Println(time.Now(), "cache: initAreaMap OK")
}
...@@ -11,21 +11,13 @@ import ( ...@@ -11,21 +11,13 @@ import (
) )
// 初始化行政区域缓存 // 初始化行政区域缓存
//var ProvinceMap []District // 省份列表[]District
//var CityMap sync.Map // 城市列表map[uint32][]District //省份ID作为KEY
//var CountyMap sync.Map // 区县列表map[uint32][]District //城市ID作为KEY
//type DistrictStruct struct {
// Id uint32 `json:"id" example:"1"`
// Name string `json:"name" example:"四川省"`
// Initial string `json:"initial" example:"S"`
//}
func initBCityMaps() { func initBCityMaps() {
fmt.Println(time.Now(), "cache: initBCityMaps begin") fmt.Println(time.Now(), "cache: initBCityMaps begin")
go func() bool { go func() bool {
ProvinceMap = []DistrictStruct{} //先清空原来的缓存 ProvinceMap = []DistrictStruct{} //先清空原来的缓存
var temp DistrictStruct var temp DistrictStruct
rows, err := dbmodel.PgDb.Query("SELECT id,name,initial FROM b_city WHERE level=1 ORDER BY sort") rows, err := dbmodel.PgDb.Query("SELECT id,name,initial FROM b_city WHERE level=1 ORDER BY initial,sort")
defer rows.Close() defer rows.Close()
if err != nil { if err != nil {
log.Panicln("ProvinceMap SELECT b_city rows", err) log.Panicln("ProvinceMap SELECT b_city rows", err)
...@@ -58,7 +50,7 @@ func selectToDistrictMap(level uint8, tempMap *sync.Map) bool { ...@@ -58,7 +50,7 @@ func selectToDistrictMap(level uint8, tempMap *sync.Map) bool {
var parentID uint32 var parentID uint32
var temp DistrictStruct var temp DistrictStruct
rows, err := dbmodel.PgDb.Query("SELECT id,name,parent_id,initial FROM b_city WHERE level=$1 ORDER BY sort", level) rows, err := dbmodel.PgDb.Query("SELECT id,name,parent_id,initial FROM b_city WHERE level=$1 ORDER BY initial,sort", level)
defer rows.Close() defer rows.Close()
if err != nil { if err != nil {
log.Panicln("SELECT b_city rows", err, level) log.Panicln("SELECT b_city rows", err, level)
......
...@@ -10,32 +10,33 @@ import ( ...@@ -10,32 +10,33 @@ import (
) )
//id integer NOT NULL DEFAULT nextval('u_card_user_id_seq'::regclass), //id integer NOT NULL DEFAULT nextval('u_card_user_id_seq'::regclass),
//role smallint DEFAULT 0, //role smallint 角色:0学生,1教师,2职工
//name character varying(16) COLLATE pg_catalog."default", //name character varying(16) COLLATE pg_catalog."default",
//sex boolean, //sex smallint,
//area_id integer, //area_id integer,
//grade smallint, //grade smallint,
//class smallint, //class smallint,
//student_num character varying(32) COLLATE pg_catalog."default", //student_num character varying(32) COLLATE pg_catalog."default",
//create_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP, //create_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
//update_at timestamp without time zone //first_topup_at timestamp without time zone,
func initCardUserMap() { func initCardUserMap() {
fmt.Println(time.Now(), "cache: initCardUserMap begin") fmt.Println(time.Now(), "cache: initCardUserMap begin")
var cardUserID uint32 var cardUserID uint32
var temp CardUserType var temp CardUserType
rows, err := dbmodel.PgDb.Query("SELECT id,role,name,sex,area_id,grade,class,student_num,we_uid,share_code FROM u_card_user") // rows, err := dbmodel.PgDb.Query("SELECT id,role,name,sex,area_id,grade,class,student_num,first_topup_at is not null FROM u_card_user") //
defer rows.Close() defer rows.Close()
if err != nil { if err != nil {
log.Panicln("Select u_card_user To Map rows", err) log.Panicln("Select u_card_user To Map rows", err)
} }
for rows.Next() { for rows.Next() {
err = rows.Scan(&cardUserID, &temp.Role, &temp.Name, &temp.Sex, &temp.AreaID, &temp.Grade, &temp.Class, &temp.StudentNo, &temp.MasterWechatUnionID, &temp.ShareCode) err = rows.Scan(&cardUserID, &temp.Role, &temp.Name, &temp.Sex, &temp.AreaID, &temp.Grade, &temp.Class, &temp.StuNum, &temp.Recharge)
if err != nil { if err != nil {
log.Panicln("SelectAreaToMap rows.Scan", err) log.Panicln("initCardUserMap rows.Scan", err)
} }
AreaMap.Store(cardUserID, temp) fmt.Println(cardUserID, temp)
CardUserMap.Store(cardUserID, temp)
} }
// 处理完毕后,需要判断一次遍历过程中是否有错误产生 // 处理完毕后,需要判断一次遍历过程中是否有错误产生
if err = rows.Err(); err != nil { if err = rows.Err(); err != nil {
...@@ -47,24 +48,21 @@ func initCardUserMap() { ...@@ -47,24 +48,21 @@ func initCardUserMap() {
fmt.Println(time.Now(), "cache: initCardUserMap OK") fmt.Println(time.Now(), "cache: initCardUserMap OK")
} }
func CreatNewCardUser(newUser CardUserType) { func GetCardUserInfo(cardUserID uint32) (CardUserType, bool) {
if s, ok := CardUserMap.Load(cardUserID); ok { // map有
}
func GetCardUserInfo(cardUserID uint32) CardUserType {
if s, ok := cardUserMap.Load(cardUserID); ok { // map有
if v, ok4 := s.(CardUserType); ok4 { //类型断言正确 if v, ok4 := s.(CardUserType); ok4 { //类型断言正确
return v return v, true
} else { //类型断言失败 } else { //类型断言失败
cardUserMap.Delete(cardUserID) CardUserMap.Delete(cardUserID)
logger.Log.Error("cardUserMap 类型断言错误", logger.Log.Error("CardUserMap 类型断言错误",
zap.Uint32("cardUserID", cardUserID), zap.Uint32("cardUserID", cardUserID),
zap.String("src", "GetCardUserInfo")) zap.String("src", "GetCardUserInfo"))
} }
} else {
// todo logger
} }
var temp CardUserType var temp CardUserType
// // todo 再去查一盘库
//// todo 再去查一盘库 return temp, false
return temp
} }
package cache
import (
"dc_golang_server_1/logger"
"go.uber.org/zap"
)
func GetCountyAreaMap(countyID uint32) ([]uint32, bool) {
var data []uint32
if v, ok := CountyAreaMap.Load(countyID); ok {
if data, ok = v.([]uint32); ok {
return data, true
} else {
logger.Log.Error("CountyAreaMap 类型断言错误",
zap.String("Src", "GetCountyAreaMap"),
zap.Uint32("countyID", countyID))
}
}
logger.Log.Error("CountyAreaMap 没数据",
zap.String("Src", "GetCountyAreaMap"),
zap.Uint32("countyID", countyID))
return data, false
}
...@@ -7,13 +7,13 @@ import ( ...@@ -7,13 +7,13 @@ import (
) )
var PgDb *sql.DB var PgDb *sql.DB
var stmtUpdateWechatUserLogin *sql.Stmt // 微信登录时间和登录次数更新
var stmtInsertDevHexCommandRecord *sql.Stmt var stmtInsertDevHexCommandRecord *sql.Stmt
var stmtInsertDevConnectRecord *sql.Stmt var stmtInsertDevConnectRecord *sql.Stmt
var stmtInsertDevHexResetRecord *sql.Stmt var stmtInsertDevHexResetRecord *sql.Stmt
// var stmtInsertUCallRecordAndUpdateUSimInfo *sql.Stmt //用事务处理
var stmtInsertUserCardUser *sql.Stmt
func InitDb() { func InitDb() {
var err error var err error
// fmt.Println("DBDSN",config.DbDSN) // fmt.Println("DBDSN",config.DbDSN)
...@@ -44,17 +44,32 @@ func InitDb() { ...@@ -44,17 +44,32 @@ func InitDb() {
////if err != nil { ////if err != nil {
//// panic("建立stmtUserCallRecord失败:" + err.Error()) //// panic("建立stmtUserCallRecord失败:" + err.Error())
////} ////}
//stmtInsertUserCardUser, err = PgDb.Prepare("INSERT INTO u_card_user VALUES($1,$2,$3,$4,$5,$6,$7,$8)")
//if err != nil { // 微信登录时间和登录次数更新
// panic("建立stmtUserCardUser失败:" + err.Error()) stmtUpdateWechatUserLogin, err = PgDb.Prepare("UPDATE u_we_customer SET login_at=$1,login_count=login_count+1 WHERE id=$2")
//} if err != nil {
panic("建立stmtUpdateWechatUserLogin失败:" + err.Error())
}
} }
func CloseDb() { func CloseDb() {
_ = stmtInsertDevHexCommandRecord.Close() if stmtUpdateWechatUserLogin != nil { // 微信登录时间和登录次数更新
_ = stmtInsertDevConnectRecord.Close() _ = stmtUpdateWechatUserLogin.Close()
_ = stmtInsertDevHexResetRecord.Close() }
//_ = stmtInsertUCallRecordAndUpdateUSimInfo.Close()
_ = stmtInsertUserCardUser.Close() if stmtInsertDevHexCommandRecord != nil {
_ = stmtInsertDevHexCommandRecord.Close()
}
if stmtInsertDevConnectRecord != nil {
_ = stmtInsertDevConnectRecord.Close()
}
if stmtInsertDevHexResetRecord != nil {
_ = stmtInsertDevHexResetRecord.Close()
}
//if stmtInsertUCallRecordAndUpdateUSimInfo != nil {
// _ = stmtInsertUCallRecordAndUpdateUSimInfo.Close()
//}
//_ = stmtInsertUserCardUser.Close()
_ = PgDb.Close() _ = PgDb.Close()
} }
...@@ -49,7 +49,7 @@ type TableUserCallRecord struct { ...@@ -49,7 +49,7 @@ type TableUserCallRecord struct {
func clearTransaction(tx *sql.Tx) { func clearTransaction(tx *sql.Tx) {
err := tx.Rollback() err := tx.Rollback()
if err != sql.ErrTxDone && err != nil { if err != sql.ErrTxDone && err != nil {
logger.Log.Panic("InsertUCallRecordAndUpdateUSimInfo clearTransaction", logger.Log.Error("clearTransaction",
zap.Error(err)) zap.Error(err))
} }
} }
......
package dbmodel package dbmodel
import "time" import (
"dc_golang_server_1/logger"
"go.uber.org/zap"
)
//CREATE TABLE IF NOT EXISTS public.u_card_user
//(
//id integer NOT NULL DEFAULT nextval('u_card_user_id_seq'::regclass), //id integer NOT NULL DEFAULT nextval('u_card_user_id_seq'::regclass),
//customer_id integer, //role smallint 角色:0学生,1教师,2职工
//area_id integer, //name character varying(16) COLLATE pg_catalog."default",
//name character varying(32) COLLATE pg_catalog."default",
//sex smallint, //sex smallint,
//birthday date, //area_id integer,
//grade smallint, //grade smallint,
//class smallint, //class smallint,
//student_no character varying(32) COLLATE pg_catalog."default", //student_num character varying(32) COLLATE pg_catalog."default",
//create_at timestamp without time zone, //create_at timestamp without time zone DEFAULT CURRENT_TIMESTAMP,
//update_at timestamp without time zone, //first_topup_at timestamp without time zone,
//CONSTRAINT u_card_user_pkey PRIMARY KEY (id)
//) type InsertTableUserCardUser struct {
type TableUserCardUser struct { Role uint8 `swaggerignore:"true"` // 后台添加选填,学生名字,角色:0学生,1教师,2职工
Id int32 //integer NOT NULL DEFAULT nextval('u_card_user_id_seq'::regclass), Name string `json:"name" example:"汤圆"` // 必填,学生名字,maxLen=16
CustomerId int32 //integer, AreaID uint32 `json:"areaID" example:"1"` // 必填,校区ID
AreaId int32 //integer, Grade int8 `json:"grade"` // 必填,"1~9对应一年级~九年级,10~12对应高一~高三"
Name string //character varying(32) COLLATE pg_catalog."default", Sex uint8 `json:"sex,omitempty"` // 选填,1女2男
Sex int8 //smallint, Class int8 `json:"class,omitempty"` // 选填,班级,number
Birthday time.Time StuNum string `json:"stuNum,omitempty"` // 选填,学号,字符串,maxLen=32
Grade int8 //smallint,
Class int8 //smallint,
StudentNo string //character varying(32) COLLATE pg_catalog."default",
CreateAt time.Time //timestamp without time zone,
UpdateAt time.Time //timestamp without time zone,
} }
func InsertUserCardUser(insertData TableUserCardUser) int8 { // InsertUserCardUserAndUserWeCardUser 事务处理两张表
_, err := stmtInsertUserCardUser.Exec( func InsertUserCardUserAndUserWeCardUser(insertData InsertTableUserCardUser, weUserID uint32) (cardUserID uint32) {
insertData.CustomerId, tx, err := PgDb.Begin()
insertData.AreaId, if err != nil {
logger.Log.Error("InsertUCallRecordAndUpdateUSimInfo PgDb.Begin():",
zap.Error(err))
return
}
defer clearTransaction(tx)
err = tx.QueryRow("INSERT INTO u_card_user(role,name,sex,area_id,grade,class,student_num)VALUES($1,$2,$3,$4,$5,$6,$7)RETURNING id",
insertData.Role,
insertData.Name, insertData.Name,
insertData.Sex, insertData.Sex,
insertData.Birthday, insertData.AreaID,
insertData.Grade, insertData.Grade,
insertData.Class, insertData.Class,
insertData.StudentNo, insertData.StuNum,
) ).Scan(&cardUserID)
if err == nil { if err != nil {
logger.Log.Error("InsertUserCardUserAndUserWeCardUser INSERT u_card_user:",
zap.Error(err))
return
}
_, err = tx.Exec("INSERT INTO u_we_card_user(we_user_id,card_user_id,master)VALUES($1,$2,true)", weUserID, cardUserID)
if err != nil {
logger.Log.Error("InsertUserCardUserAndUserWeCardUser INSERT u_we_card_user:",
zap.Error(err))
return 0 return 0
} }
return 1 //1
if err = tx.Commit(); err != nil {
logger.Log.Error("InsertUserCardUserAndUserWeCardUser Commit:",
zap.Error(err))
return 0
}
return
} }
{"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"}
{"level":"WARN","ts":"2021-10-09 14:42:58.848","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"GET","Path":"/","DataSize":0,"Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3875.400 QQBrowser/10.8.4492.400"}
{"level":"WARN","ts":"2021-10-09 14:42:59.535","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; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3875.400 QQBrowser/10.8.4492.400"}
{"level":"WARN","ts":"2021-10-10 00:17:49.872","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"GET","Path":"/","DataSize":0,"Agent":"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3875.400 QQBrowser/10.8.4492.400"}
{"level":"WARN","ts":"2021-10-13 15:03:27.882","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"DELETE","Path":"/we/carduser","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"}
{"level":"WARN","ts":"2021-10-13 15:03:35.683","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"DELETE","Path":"/we/carduser","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"}
{"level":"WARN","ts":"2021-10-13 16:18:48.126","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"POST","Path":"/we/bindcarduser","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"}
{"level":"WARN","ts":"2021-10-13 16:18:55.598","msg":"","HostName":"DESKTOP-2789F62","Status":404,"SpendNanoS":0,"Ip":"127.0.0.1","Method":"POST","Path":"/we/bindcarduser","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"}
...@@ -76,11 +76,16 @@ func Init() { ...@@ -76,11 +76,16 @@ func Init() {
func HttpGinLog() gin.HandlerFunc { //logger *log.Log func HttpGinLog() gin.HandlerFunc { //logger *log.Log
return func(c *gin.Context) { return func(c *gin.Context) {
startTime := time.Now().UnixNano() //defer func() {
// if r := recover();r!=nil{
// fmt.Println("recover",r)
// }
//}()
startTime := time.Now().UnixMicro()
c.Next() c.Next()
// stopTime := time.Since(startTime) // stopTime := time.Since(startTime)
// spendTime := stopTime.Nanoseconds()/1000000///fmt.Sprintf("%d ms", (stopTime.Nanoseconds()+500000)/1000000) // spendTime := stopTime.Nanoseconds()/1000000///fmt.Sprintf("%d ms", (stopTime.Nanoseconds()+500000)/1000000)
spendTime := time.Now().UnixNano() - startTime spendTime := time.Now().UnixMicro() - startTime
hostName, err := os.Hostname() hostName, err := os.Hostname()
if err != nil { if err != nil {
hostName = "unknown" hostName = "unknown"
......
...@@ -6,9 +6,12 @@ import ( ...@@ -6,9 +6,12 @@ import (
"dc_golang_server_1/dbmodel" "dc_golang_server_1/dbmodel"
"dc_golang_server_1/devproduct/dcphone20" "dc_golang_server_1/devproduct/dcphone20"
"dc_golang_server_1/logger" "dc_golang_server_1/logger"
"dc_golang_server_1/web" "dc_golang_server_1/web/router"
"fmt" "fmt"
"os"
"os/signal"
"runtime" "runtime"
"syscall"
"time" "time"
) )
...@@ -26,13 +29,22 @@ func main() { // ...@@ -26,13 +29,22 @@ func main() { //
config.Init() config.Init()
logger.Init() logger.Init()
go func() {
osc := make(chan os.Signal, 1)
signal.Notify(osc, syscall.SIGTERM, syscall.SIGINT, syscall.SIGKILL)
s := <-osc
dbmodel.CloseDb()
fmt.Println("程序退出:", s)
os.Exit(1)
}()
dbmodel.InitDb() dbmodel.InitDb()
defer dbmodel.CloseDb() // defer dbmodel.CloseDb()
cache.Init() cache.Init()
dcphone20.NewDCPhone20() dcphone20.NewDCPhone20()
//dcdrinking60.NewDCDrinking60() //dcdrinking60.NewDCDrinking60()
web.InitRouter() router.InitRouter()
} }
package tencent
import "errors"
func TencentCode2Session(code string) (string, error) {
var testTemp = map[string]string{
"codeTest1": "unionIDTest1",
"codeTest2": "unionIDTest2",
"codeTest3": "unionIDTest3",
"codeTest4": "unionIDTest4",
"codeTest5": "unionIDTest5",
"codeTest6": "unionIDTest6",
"codeTest7": "unionIDTest7",
"codeTest8": "unionIDTest8",
"codeTest9": "unionIDTest8",
}
if len(testTemp[code]) > 0 {
return testTemp[code], nil
} else {
return "", errors.New("code无效")
}
}
//func JsCode2session(code string) (responseData WxOAuth2ResponseData, err error) {
// var NAME = "微信授权"
// var name = NAME+"-code2Session"
// var url = "https://web.weixin.qq.com/sns/jscode2session?appid=${appId}&secret=${secret}&js_code=${code}&grant_type=authorization_code"
// baseWechatPayConfig := getBaseWechatPayConfig(appId)
// url = strings.ReplaceAll(url,"${appId}",baseWechatPayConfig.appId)
// url = strings.ReplaceAll(url,"${secret}",baseWechatPayConfig.secret)
// url = strings.ReplaceAll(url,"${code}",code)
// logger.Log.Debug(name,
// zap.String("url", url))
// request, err := http.NewRequest(http.MethodGet, url,nil)
// client := http.DefaultClient
// response, err := client.Do(request)
// if err != nil {
// return responseData, err
// }
// defer func() {
// response.Body.Close()
// }()
// bodyBytes, err := ioutil.ReadAll(response.Body)
// logger.Log.Debug(name,
// zap.String("url", url),
// zap.String("response", string(bodyBytes)))
// if err != nil {
// return responseData, err
// }
// if err = json.Unmarshal(bodyBytes, &responseData); err != nil {
// return responseData, err
// }
// if responseData.Errmsg != "" {
// return responseData, errors.New(responseData.Errmsg)
// }
// return responseData, nil
//}
...@@ -22,7 +22,6 @@ func TestHex2Cipher(t *testing.T) { ...@@ -22,7 +22,6 @@ func TestHex2Cipher(t *testing.T) {
// fmt.Printf("%02X",test[j]) // fmt.Printf("%02X",test[j])
// j++ // j++
// } // }
// fmt.Println()
//} //}
var b [3]byte var b [3]byte
for i := 10002; i <= 11001; i++ { for i := 10002; i <= 11001; i++ {
......
package v1 package api_public
import ( import (
"dc_golang_server_1/cache" "dc_golang_server_1/cache"
"dc_golang_server_1/logger"
"dc_golang_server_1/web"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"go.uber.org/zap"
"net/http" "net/http"
"strconv" "strconv"
) )
// GetProvinceList 获取省份列表 // GetProvinceList 获取省份列表
// @Tags 公用接口 // @Tags 公用接口
// @Summary 获取全国省份列表 // @Summary 获取全国省份列表 [complete]
// @Description 获取带首字母的省份列表 // @Description 获取带首字母的省份列表
// @Product json // @Product json
// @Success 0 {object} []cache.DistrictStruct "按首字母排序好的列表,可直接用作展示" // @Success 0 {object} []cache.DistrictStruct "按首字母排序好的列表,可直接用作展示"
...@@ -17,14 +20,14 @@ import ( ...@@ -17,14 +20,14 @@ import (
// @Security ApiKeyAuth // @Security ApiKeyAuth
func GetProvinceList(c *gin.Context) { func GetProvinceList(c *gin.Context) {
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": SUCCSE, "code": web.Success,
"data": cache.ProvinceMap, "data": cache.ProvinceMap,
}) })
} }
// GetCityList 获取城市或区县列表 // GetCityList 获取城市列表
// @Tags 公用接口 // @Tags 公用接口
// @Summary 通过省份ID获取城市列表 // @Summary 通过省份ID获取城市列表 [complete]
// @Description 获取带首字母的城市列表 // @Description 获取带首字母的城市列表
// @Param provinceID path integer true "省份id" // @Param provinceID path integer true "省份id"
// @Product json // @Product json
...@@ -36,14 +39,14 @@ func GetCityList(c *gin.Context) { ...@@ -36,14 +39,14 @@ func GetCityList(c *gin.Context) {
v, _ := cache.CityMap.Load(uint32(para)) // 如果查不到就直接返回空data v, _ := cache.CityMap.Load(uint32(para)) // 如果查不到就直接返回空data
// data, _ := v.([]cache.DistrictStruct) // data, _ := v.([]cache.DistrictStruct)
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": SUCCSE, "code": web.Success,
"data": v, "data": v,
}) })
} }
// GetCountyList 获取区县列表 // GetCountyList 获取区县列表
// @Tags 公用接口 // @Tags 公用接口
// @Summary 通过城市ID获取区县列表 // @Summary 通过城市ID获取区县列表 [complete]
// @Description 获取带首字母的城市列表 // @Description 获取带首字母的城市列表
// @Param cityID path integer true "城市ID" // @Param cityID path integer true "城市ID"
// @Product json // @Product json
...@@ -62,12 +65,12 @@ func GetCountyList(c *gin.Context) { ...@@ -62,12 +65,12 @@ func GetCountyList(c *gin.Context) {
type countyAreaRes struct { type countyAreaRes struct {
Name string `json:"name" example:"海科学校"` Name string `json:"name" example:"海科学校"`
ID int `json:"id" example:"1"` ID uint32 `json:"id" example:"1"`
} }
// GetAreaByCounty 根据区县ID获取学校列表 // GetAreaByCounty 根据区县ID获取学校列表
// @Tags 公用接口 // @Tags 公用接口
// @Summary 根据区县ID获取学校列表 // @Summary 根据区县ID获取学校列表 [complete]
// @Description 根据区县ID获取学校列表 // @Description 根据区县ID获取学校列表
// @Param countyID path integer true "区县id" default(2725) // @Param countyID path integer true "区县id" default(2725)
// @Product json // @Product json
...@@ -75,21 +78,55 @@ type countyAreaRes struct { ...@@ -75,21 +78,55 @@ type countyAreaRes struct {
// @Router /base/countyarea/{countyID} [GET] // @Router /base/countyarea/{countyID} [GET]
// @Security ApiKeyAuth // @Security ApiKeyAuth
func GetAreaByCounty(c *gin.Context) { func GetAreaByCounty(c *gin.Context) {
para, _ := strconv.Atoi(c.Param("id")) //todo countyID, err := strconv.Atoi(c.Param("id"))
if err != nil {
c.JSON(http.StatusOK, gin.H{
"code": web.ErrorReqParaFormat,
"message": web.CodeMsg[web.ErrorReqParaFormat],
})
return
}
userID, ok := c.Get("userID")
if ok == false {
logger.Log.Error("userID在Context里面居然没填对,遇到鬼了",
zap.String("Src", "GetAreaByCounty"),
zap.Int("countyID", countyID))
c.JSON(http.StatusOK, gin.H{
"code": web.ErrorSystemErr,
"message": web.CodeMsg[web.ErrorSystemErr],
})
return
}
testRole, ok := cache.GetWechatCustomerTestRole(userID.(uint32))
if ok == false {
c.JSON(http.StatusOK, gin.H{
"code": web.ErrorUserTokenWrong,
"message": web.CodeMsg[web.ErrorUserTokenWrong],
})
return
}
areaList, ok := cache.GetCountyAreaMap(uint32(countyID))
if ok == false {
c.JSON(http.StatusOK, gin.H{
"code": web.ErrorReqPara,
"message": web.CodeMsg[web.ErrorReqPara] + ",区县id=" + strconv.Itoa(countyID),
})
return
}
var data []countyAreaRes var data []countyAreaRes
if para == 2725 {
v, _ := cache.AreaMap.Load(uint32(1)) // for _, areaID := range areaList {
if a, ok := v.(cache.AreaStruct); ok { //类型断言正确 name := cache.GetAreaMapName(areaID, testRole)
data = append(data, countyAreaRes{ if len(name) > 0 {
a.Name, data = append(data, countyAreaRes{name, areaID})
1,
})
} }
} }
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": SUCCSE, "code": web.Success,
"data": data, "data": data,
}) })
} }
...@@ -102,7 +139,7 @@ type locationAreaRes struct { ...@@ -102,7 +139,7 @@ type locationAreaRes struct {
// GetAreaByLocation 根据经纬度获取附近学校列表 // GetAreaByLocation 根据经纬度获取附近学校列表
// @Tags 公用接口 // @Tags 公用接口
// @Summary 根据经纬度获取附近20所学校列表 // @Summary 根据经纬度获取附近20所学校列表 [can test]
// @Description 根据经纬度获取附近20所学校列表 // @Description 根据经纬度获取附近20所学校列表
// @Param longitude query integer true "经度*1000000" default(103000000) // @Param longitude query integer true "经度*1000000" default(103000000)
// @Param latitude query integer true "纬度*1000000" default(30000000) // @Param latitude query integer true "纬度*1000000" default(30000000)
...@@ -143,17 +180,17 @@ func GetAreaByLocation(c *gin.Context) { ...@@ -143,17 +180,17 @@ func GetAreaByLocation(c *gin.Context) {
} }
var data []locationAreaRes var data []locationAreaRes
v, _ := cache.AreaMap.Load(uint32(1)) // todo 根据经纬度计算距离 还要看status 和 用户的权限 v, _ := cache.AreaMap.Load(uint32(14)) // todo 根据经纬度计算距离 还要看status 和 用户的权限
if a, ok := v.(cache.AreaStruct); ok { //类型断言正确 if a, ok := v.(cache.AreaStruct); ok { //类型断言正确
data = append(data, locationAreaRes{ data = append(data, locationAreaRes{
a.Name, a.Name,
"四川省成都市温江区", "温江区",
1, 14,
}) })
} }
c.JSON(http.StatusOK, gin.H{ c.JSON(http.StatusOK, gin.H{
"code": SUCCSE, "code": web.Success,
"data": data, "data": data,
}) })
} }
package web
const (
Success = 0
ErrorTokenExist = 1
ErrorTokenWrong = 2
ErrorTokenRunTime = 3
ErrorTokenExit = 4
ErrorUserRole = 5
ErrorSystemErr = 6
ErrorTencentErr = 7
ErrorReqParaFormat = 10
ErrorReqPara = 11
ErrorReqInsertDuplicate = 12
ErrorUserTokenWrong = 1001
ErrorWechatLogin = 1002
ErrorReq
//ERROR = 500
// code = 1000...用户模块的错误
//ERROR_USERNAME_USED = 1001
//ERROR_PASSWORD_WRONG = 1002
//ERROR_USER_NOT_EXIST = 1003
//ERROR_TOKEN_EXIST = 1004
//ERROR_TOKEN_RUNTIME = 1005
//ERROR_TOKEN_WRONG = 1006
//ERROR_TOKEN_TYPE_WRONG = 1007
//ERROR_USER_NO_RIGHT = 1008
// code = 2000...XXXXX模块的错误
// code = 3000...XXXXX模块的错误
)
var CodeMsg = map[uint16]string{
ErrorTokenExist: "token不存在",
ErrorTokenWrong: "非法token",
ErrorTokenRunTime: "token过期",
ErrorTokenExit: "token已退出登录",
ErrorUserRole: "用户没有权限",
ErrorSystemErr: "系统错误,请尝试重新登录(开发测试人员请联系开发人员)",
ErrorTencentErr: "微信服务器返回的错误:",
ErrorReqPara: "请求参数内容(取值)错误",
ErrorReqParaFormat: "请求参数格式错误",
ErrorReqInsertDuplicate: "内容重复,无法创建",
ErrorUserTokenWrong: "用户token错误,系统找不到用户信息,请重新登录",
ErrorWechatLogin: "微信登录错误:",
// Success: "OK",
// ERROR: "FAIL",
// ERROR_USERNAME_USED: "用户名已存在!",
// ERROR_PASSWORD_WRONG: "密码错误",
// ERROR_USER_NOT_EXIST: "用户不存在",
// ERROR_TOKEN_EXIST: "TOKEN不存在",
// ERROR_TOKEN_RUNTIME: "TOKEN已过期",
// ERROR_TOKEN_WRONG: "TOKEN不正确",
// ERROR_TOKEN_TYPE_WRONG: "TOKEN格式错误",
// ERROR_USER_NO_RIGHT: "用户没有权限",
}
1. 查卡用户信息
1)小程序:通过微信UNIONID(token),查家长绑定的所有的 //查缓存
2) 后台:通过校区服务ID,查这一堆校区的,并提供筛选条件 //查库
一、管理后台接口
1. 后台用户登录
传:LoginAccount、Password、验证码
用LoginAccount,获得AdminStruct,成功就更新 tokenCreatTime
成功则进入首页
成功回:token,Name, 菜单按钮权限,首页展示内容(后面做统计内容,现在先全为空) AdminStruct RoleAuthStruct
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缴费(预留: 服务费/话费)
二、用户小程序接口
1. 登录:获取用户code->appid+appsecret+code获取session_key+openid等,生成token
2.
\ No newline at end of file
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{
gin.SetMode(config.HttpServerMode)
r := gin.New()
r.Use(logger.HttpGinLog(), gin.Recovery())
r.Use(Cors()) //全局跨域 局部跨域的话在路由组里面去添加
//r.Use(CheckToken()) //jwt 还是在对应需要token的路由组添加
fmt.Println("swagger", config.HttpServerSwagger)
if config.HttpServerSwagger {
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
}
base := r.Group("base/")
// base.Use(CheckToken())
{
base.GET("province", v1.GetProvinceList)
base.GET("city/:id", v1.GetCityList)
base.GET("county/:id", v1.GetCountyList)
base.GET("locarea", v1.GetAreaByLocation)
base.GET("countyarea/:id", v1.GetAreaByCounty)
}
r.POST("we/login/:code", v1.WeLogin)
wechat := r.Group("we/")
// wechat.Use(CheckToken())
{ // 需要token的
wechat.POST("carduser", v1.CreateCardUser) //创建学生
wechat.DELETE("carduser/:id", v1.DeleteCardUser) //删除学生
wechat.POST("bindcarduser/:share_code", v1.BindCardUser) //副家长绑定学生
wechat.DELETE("bindcarduser/:id", v1.DeleteBindCardUser) //副家长解绑学生
wechat.GET("trend/:id", v1.GetCardUsersTrend) //获取学生最新动态
wechat.GET("bindcarduser/:id", v1.GetBindCardUser) //获取学生副家长列表及邀请码内容(仅主家长有权限)
wechat.PUT("cardusershareon/:id", v1.PutCardUserShareOn) //打开邀请码开关(仅主家长有权限)
wechat.PUT("cardusershareoff/:id", v1.PutCardUserShareOff) //关闭邀请码开关(仅主家长有权限)
wechat.DELETE("slaveweuser", v1.DeleteSlaveWeUser) //删除副家长(仅主家长有权限)
wechat.PUT("carduser/:id", v1.PutCardUser) //修改学生信息
wechat.PUT("cardloss/:id", v1.CardLoss) //卡挂失/解挂
wechat.PUT("cardbind/:id", v1.CardBind) //绑定卡
wechat.DELETE("cardbind/:id", v1.DeleteCardBind) //解绑卡
wechat.GET("phonecardstatus/:id", v1.GetPhoneCardStatus) //获取学生公话卡状态
//wechat.GET("callrecord/:id",v1.GetCallRecord) // 查询通话记录
//添加亲情号
//修改亲情号
//删除亲情号
//缴费
//查询缴费记录
//获取学生定位卡状态
//查询通行记录
//缴费
//查询缴费记录
}
//router := r.Group("web/")
{
//router.POST()
}
fmt.Println(time.Now(), "server is running")
err := r.Run(config.HttpServerPort)
if err != nil {
panic(err)
}
}
package router
import (
"dc_golang_server_1/config"
_ "dc_golang_server_1/docs"
"dc_golang_server_1/logger"
"dc_golang_server_1/web"
"dc_golang_server_1/web/api_admin"
"dc_golang_server_1/web/api_public"
"dc_golang_server_1/web/api_we"
"fmt"
"github.com/gin-gonic/gin"
"github.com/swaggo/gin-swagger"
"github.com/swaggo/gin-swagger/swaggerFiles"
"time"
)
func InitRouter() { //*gin.Engine{
gin.SetMode(config.HttpServerMode)
r := gin.New()
r.Use(logger.HttpGinLog(), gin.Recovery())
r.Use(web.Cors()) //全局跨域 局部跨域的话在路由组里面去添加
//r.Use(CheckToken()) //jwt 还是在对应需要token的路由组添加
if config.HttpServerSwagger {
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
}
base := r.Group("base/")
base.Use(web.JeffWTPublic())
{
base.GET("province", api_public.GetProvinceList)
base.GET("city/:id", api_public.GetCityList)
base.GET("county/:id", api_public.GetCountyList)
base.GET("locarea", api_public.GetAreaByLocation)
base.GET("countyarea/:id", api_public.GetAreaByCounty)
}
r.POST("we/login/:code", api_we.WeLogin)
wechat := r.Group("we/")
wechat.Use(web.JeffWTWechat())
{ // 需要token的
wechat.POST("carduser", api_we.CreateCardUser) //创建学生
wechat.DELETE("carduser/:id", api_we.DeleteCardUser) //删除学生
wechat.GET("trend/:id", api_we.GetCardUsersTrend) //获取学生最新动态
wechat.GET("bindcarduser/:id", api_we.GetBindCardUser) //获取学生副家长列表(仅主家长有权限)
wechat.GET("sharecode/id", api_we.CardUserShareCode) //获取邀请码(仅主家长有权限)
wechat.POST("bindcarduser/:share_code", api_we.BindCardUser) //副家长绑定学生
wechat.DELETE("bindcarduser/:id", api_we.DeleteBindCardUser) //副家长解绑学生
//wechat.PUT("cardusershareon/:id", api_we.PutCardUserShareOn) //打开邀请码开关(仅主家长有权限)
//wechat.PUT("cardusershareoff/:id", api_we.PutCardUserShareOff) //关闭邀请码开关(仅主家长有权限)
wechat.DELETE("slaveweuser", api_we.DeleteSlaveWeUser) //删除副家长(仅主家长有权限)
//wechat.DELETE("allslaveweuser", api_we.DeleteAllSlaveWeUser) //删除副家长(仅主家长有权限)
wechat.PUT("carduser/:id", api_we.PutCardUser) //修改学生信息
wechat.PUT("cardloss/:id", api_we.CardLoss) //卡挂失/解挂
wechat.PUT("cardbind/:id", api_we.CardBind) //绑定卡
wechat.DELETE("cardbind/:id", api_we.DeleteCardBind) //解绑卡
wechat.GET("phonecardstatus/:id", api_we.GetPhoneCardStatus) //获取学生公话卡状态
wechat.GET("callrecord/:id", api_we.GetCallRecord) // 查询通话记录
wechat.POST("familynum/:id", api_we.AddFamilyNum) //添加亲情号
wechat.PUT("familynum/:id", api_we.PutFamilyNum) //修改亲情号
wechat.DELETE("familynum/:id", api_we.DeleteFamilyNum) //删除亲情号
//缴费
//查询缴费记录
//获取学生定位卡状态
//查询通行记录
//缴费
//查询缴费记录
}
// r.POST("ad/login", api_we.AdminLogin)
admin := r.Group("ad/")
// admin.Use(web.JeffWTAdmin())
{
admin.POST("area", api_admin.CreateArea) // 新建一个学校
// admin.GET("cache", api_cache.GetCacheMap) // 获取缓存内容
}
fmt.Println(time.Now(), "server is running:swagger", config.HttpServerSwagger)
err := r.Run(config.HttpServerPort)
if err != nil {
panic(err)
}
}
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
const (
SUCCSE = 0
ERROR = 500
// code = 1000...用户模块的错误
ERROR_USERNAME_USED = 1001
ERROR_PASSWORD_WRONG = 1002
ERROR_USER_NOT_EXIST = 1003
ERROR_TOKEN_EXIST = 1004
ERROR_TOKEN_RUNTIME = 1005
ERROR_TOKEN_WRONG = 1006
ERROR_TOKEN_TYPE_WRONG = 1007
ERROR_USER_NO_RIGHT = 1008
// code = 2000...XXXXX模块的错误
// code = 3000...XXXXX模块的错误
)
//var codeMsg = map[int]string{
// SUCCSE: "OK",
// ERROR: "FAIL",
// ERROR_USERNAME_USED: "用户名已存在!",
// ERROR_PASSWORD_WRONG: "密码错误",
// ERROR_USER_NOT_EXIST: "用户不存在",
// ERROR_TOKEN_EXIST: "TOKEN不存在",
// ERROR_TOKEN_RUNTIME: "TOKEN已过期",
// ERROR_TOKEN_WRONG: "TOKEN不正确",
// ERROR_TOKEN_TYPE_WRONG: "TOKEN格式错误",
// ERROR_USER_NO_RIGHT: "用户没有权限",
//}
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