上传文件至 dbop
This commit is contained in:
commit
36c67636dc
31
dbop/georedis.go
Normal file
31
dbop/georedis.go
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
package dbop
|
||||||
|
|
||||||
|
import (
|
||||||
|
|
||||||
|
|
||||||
|
"github.com/shockliu/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
Location = "dqkposition"
|
||||||
|
Maintain = "maintain"
|
||||||
|
)
|
||||||
|
|
||||||
|
func GetPlace(client int) (place int) {
|
||||||
|
err := MDb.QueryRow("select location from dqk_client where id=?;", client).Scan(&place)
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("获取设备位置错误%s\n", err)
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// func GetDistance(place int, Lat, Long float64) float64 {
|
||||||
|
// var plat, plong float64
|
||||||
|
// err := MDb.QueryRow("select lon,lat from place_table where id=?;", place).Scan(&plong, &plat)
|
||||||
|
// if err != nil {
|
||||||
|
// logger.Debugf("获取定位%d信息失败%s\n", place, err)
|
||||||
|
// return -1
|
||||||
|
// }
|
||||||
|
// return dmap.Distance(plat, Lat, plong, Long)
|
||||||
|
// }
|
121
dbop/mysqlop.go
Normal file
121
dbop/mysqlop.go
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
package dbop
|
||||||
|
|
||||||
|
import (
|
||||||
|
"database/sql"
|
||||||
|
"fmt"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/shockliu/logger"
|
||||||
|
|
||||||
|
_ "github.com/go-sql-driver/mysql"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
MDb *sql.DB
|
||||||
|
err error // 错误信息
|
||||||
|
client map[string]string //设备信息,根据client_code查询
|
||||||
|
clientname map[string]string // 设备名称
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
// 初始化链接
|
||||||
|
func init() {
|
||||||
|
//"用户名:密码@[连接方式](主机名:端口号)/数据库名"
|
||||||
|
const (
|
||||||
|
USER_NAME = "eshc"
|
||||||
|
PASS_WORD = "Eshc88$*"
|
||||||
|
HOST = "47.118.40.174"
|
||||||
|
PORT = "3306"
|
||||||
|
DATABASE = "eshc_dev"
|
||||||
|
CHARSET = "utf8mb4"
|
||||||
|
)
|
||||||
|
|
||||||
|
// 豆曲咖数据库
|
||||||
|
//dsn := "eshc:Eshc88$*@tcp(47.118.40.174:3306)/eshc_dev"
|
||||||
|
dbDSN := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=%s&parseTime=true", USER_NAME, PASS_WORD, HOST, PORT, DATABASE, CHARSET)
|
||||||
|
// 打开连接失败
|
||||||
|
MDb, err = sql.Open("mysql", dbDSN)
|
||||||
|
//defer MysqlDb.Close();
|
||||||
|
if err != nil {
|
||||||
|
logger.Error("dbDSN: " + dbDSN)
|
||||||
|
panic("数据源配置不正确: " + err.Error())
|
||||||
|
}
|
||||||
|
|
||||||
|
// 最大连接数
|
||||||
|
MDb.SetMaxOpenConns(10)
|
||||||
|
// 闲置连接数
|
||||||
|
MDb.SetMaxIdleConns(5)
|
||||||
|
// 最大连接周期
|
||||||
|
MDb.SetConnMaxLifetime(100 * time.Second)
|
||||||
|
if err = MDb.Ping(); nil != err {
|
||||||
|
panic("数据库链接失败: " + err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserUnionID(openId string) (unionId string) {
|
||||||
|
MDb.QueryRow("select union_id from wechat_member where open_Id=?;", openId).Scan(&unionId)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func AddMpUser(openId, unionId string, scribeTime int32) {
|
||||||
|
var id int64
|
||||||
|
var uid string
|
||||||
|
// 已经有这个openID,则需要更新UnionID
|
||||||
|
err := MDb.QueryRow("select id,IFNULL(extra,'') from user_relation where openId=?;", openId).Scan(&id, &uid)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("获取用户%s信息失败:%s\n", openId, err)
|
||||||
|
} else if uid != unionId {
|
||||||
|
_, err = MDb.Exec("update user_relation set extra=? where openID=?;", unionId, openId)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("更新用户%s-%s信息失败:%s\n", openId, unionId, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(uid) > 0 {
|
||||||
|
_, err := MDb.Exec("UPDATE wxmp_user set statu=1,unionId=?,scribeTime=now() where openId=?;", unionId, openId)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("更新用户open[%s]union[%s]状态信息失败:%s\n", openId, unionId, err)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
_, err := MDb.Exec("INSERT into wxmp_user (openId,unionId,scribeTime,statu)values(?,?,from_unixtime(?),1);", openId, unionId, scribeTime)
|
||||||
|
if err != nil {
|
||||||
|
logger.Errorf("插入公众号用户表失败:%s\n", err)
|
||||||
|
}
|
||||||
|
if len(unionId) > 0 {
|
||||||
|
err = MDb.QueryRow("select id from user_relation where extra=?;", unionId).Scan(&id)
|
||||||
|
if err == nil {
|
||||||
|
_, err = MDb.Exec("insert into user_relation (id,channel,openId,extra,`time`) values(?,1,?,?,now());", id, openId, unionId)
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("插入user_relation表id[%d][%s][%s]失败:%s\n", id, openId, unionId, err)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//创建新用户
|
||||||
|
rst, err := MDb.Exec("insert into dqk_user (name,nickname,registerTime) values('公众号用户','公众号用户',now());")
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("创建用户失败:%s\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
id, err = rst.LastInsertId()
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("获取新建用户ID失败:%s\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
_, err = MDb.Exec("insert into user_relation (id,channel,openId,extra,`time`) values(?,1,?,?,now());", id, openId, unionId)
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("插入user_relation表失败:%s\n", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetUserId(openid, unionId string) (id int) {
|
||||||
|
logger.Debugf("用户鉴权openid:%s\n", openid)
|
||||||
|
err := MDb.QueryRow("select a.user_id from user_account a where a.open_id = ?;", openid).Scan(&id)
|
||||||
|
if err != nil {
|
||||||
|
return -1
|
||||||
|
}
|
||||||
|
return id
|
||||||
|
}
|
112
dbop/redisop.go
Normal file
112
dbop/redisop.go
Normal file
@ -0,0 +1,112 @@
|
|||||||
|
package dbop
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/shockliu/logger"
|
||||||
|
|
||||||
|
"github.com/go-redis/redis"
|
||||||
|
//"errors"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
RD_TRADE_HEAD = "ORDER:"
|
||||||
|
RD_MACHINE_HEAD = "ZDDevice:"
|
||||||
|
RD_SESSION_HEAD = "SessionKey:"
|
||||||
|
RD_SALERSESSION_HEAD = "SalerSessionKey:"
|
||||||
|
RD_ICCARD_HEAD = "IC:"
|
||||||
|
RD_SALE_HEAD = "SALE:"
|
||||||
|
RD_DEVSTAT_HEAD = "MACHINE:"
|
||||||
|
RD_ALARM_HEAD = "ALARM:"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
RDb *redis.Client
|
||||||
|
)
|
||||||
|
|
||||||
|
// Redis 预订单状态存储,临时存储,支付后就进入数据库
|
||||||
|
type OrderInfo struct {
|
||||||
|
McId string `json:"mcId"` // 机器
|
||||||
|
TradeNo string `json:"tradeNo"` // 订单
|
||||||
|
ProdName string `json:"ProdName"` // 产品名称
|
||||||
|
ProdCode string `json:"ProdCode"` // 产品编码
|
||||||
|
FavorCode string `json:"FavorCode"` // 口味ID,下发制作使用
|
||||||
|
Amount int `json:"amount"` // 价格
|
||||||
|
PayType string `json:"payType"` // 支付类型
|
||||||
|
}
|
||||||
|
|
||||||
|
// 初始化连接
|
||||||
|
func init() {
|
||||||
|
RDb = redis.NewClient(&redis.Options{
|
||||||
|
Addr: "47.118.40.174:6379",
|
||||||
|
Password: "88480288", // no password set
|
||||||
|
DB: 0, // use default DB
|
||||||
|
PoolSize: 100, // 连接池大小
|
||||||
|
})
|
||||||
|
_, err = RDb.Ping().Result()
|
||||||
|
if err != nil {
|
||||||
|
panic("Redis初始化失败")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// 待支付订单列表 dbop.InsertTrade(McId,tradeNo,data.ProdName,data.amount,"wxpay")
|
||||||
|
func InsertRedisTrade(McId,tradeNo,Name,code string,amount int,pchan string){
|
||||||
|
s,_:=json.Marshal(OrderInfo{McId,tradeNo,Name,code,amount,pchan})
|
||||||
|
RDb.Set(RD_TRADE_HEAD+tradeNo,s,30*time.Minute)
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
/*
|
||||||
|
// 订单状态修改
|
||||||
|
func UpdateRedisTrade(tradeNo,status string) bool{
|
||||||
|
s,err:=RDb.Get(RD_TRADE_HEAD+tradeNo).Result()
|
||||||
|
if(err==redis.Nil){
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var data OrderInfo
|
||||||
|
_ = json.Unmarshal([]byte(s), &data)
|
||||||
|
data.PayStatus=status
|
||||||
|
st,_:=json.Marshal(data)
|
||||||
|
RDb.Set(RD_TRADE_HEAD+tradeNo,string(st),10*time.Minute)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
// 获取订单支付信息
|
||||||
|
func GetRedisTradeInfo(TradeNo string) (rst OrderInfo, ok bool) {
|
||||||
|
s, err := RDb.Get(RD_TRADE_HEAD + TradeNo).Result()
|
||||||
|
if err != nil {
|
||||||
|
//if(err==redis.Nil){
|
||||||
|
logger.Errorf("获取Redis订单信息[%s]失败:%v\n", RD_TRADE_HEAD+TradeNo, err)
|
||||||
|
return
|
||||||
|
} // 其它错误未捕获 err!=nil
|
||||||
|
_ = json.Unmarshal([]byte(s), &rst)
|
||||||
|
ok = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
// 获取订单支付状态
|
||||||
|
func GetRedisTradeStatus(TradeNo string) string{
|
||||||
|
s,err:=RDb.Get(RD_TRADE_HEAD+TradeNo).Result()
|
||||||
|
if(err==redis.Nil){
|
||||||
|
logger.Warnf("Redis no Key\n")
|
||||||
|
return "NO_EXIST"
|
||||||
|
} // 其它错误未捕获 err!=nil
|
||||||
|
var data OrderInfo
|
||||||
|
_ = json.Unmarshal([]byte(s), &data)
|
||||||
|
return data.PayStatus
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
func SaveSalerSessionKey(openid, sessionkey string) {
|
||||||
|
RDb.Set(RD_SALERSESSION_HEAD+openid, sessionkey, 240*time.Hour)
|
||||||
|
}
|
||||||
|
|
||||||
|
func SaveSessionKey(openid, sessionkey string) {
|
||||||
|
RDb.Set(RD_SESSION_HEAD+openid, sessionkey, 240*time.Hour)
|
||||||
|
}
|
||||||
|
|
||||||
|
func ClearSessionKey(openid string) {
|
||||||
|
RDb.Del(RD_SESSION_HEAD + openid)
|
||||||
|
}
|
66
dbop/selfcache.go
Normal file
66
dbop/selfcache.go
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
package dbop
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"time"
|
||||||
|
|
||||||
|
"github.com/shockliu/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
selfkeyhead = "sjwx:"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SelfCache struct {
|
||||||
|
Prefix string
|
||||||
|
}
|
||||||
|
|
||||||
|
// NewMemory create new memcache
|
||||||
|
func NewSelfCache(key string) *SelfCache {
|
||||||
|
return &SelfCache{Prefix: selfkeyhead + key}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Get return cached value
|
||||||
|
func (c *SelfCache) Get(key string) any {
|
||||||
|
key = c.Prefix + key
|
||||||
|
s, err := RDb.Get(key).Result()
|
||||||
|
if err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
var reply any
|
||||||
|
if err = json.Unmarshal([]byte(s), &reply); err != nil {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
logger.Debugf("微信小程序获取access_token[%v]\n", reply)
|
||||||
|
return reply
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsExist check value exists in memcache.
|
||||||
|
func (c *SelfCache) IsExist(key string) bool {
|
||||||
|
key = c.Prefix + key
|
||||||
|
|
||||||
|
a := RDb.Exists(key)
|
||||||
|
logger.Debugf("微信小程序确认access_token是否存在%d\n", a.Val())
|
||||||
|
return a.Val() > 0
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set cached value with key and expire time.
|
||||||
|
func (c *SelfCache) Set(key string, val any, timeout time.Duration) (err error) {
|
||||||
|
key = c.Prefix + key
|
||||||
|
|
||||||
|
var data []byte
|
||||||
|
if data, err = json.Marshal(val); err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
RDb.Set(key, data, timeout)
|
||||||
|
logger.Debugf("微信小程序确认access_token保存[%s]\n", data)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// deleteKey
|
||||||
|
func (c *SelfCache) Delete(key string) (err error) {
|
||||||
|
key = c.Prefix + key
|
||||||
|
RDb.Del(key)
|
||||||
|
logger.Debugf("微信小程序删除access_token\n")
|
||||||
|
return nil
|
||||||
|
}
|
133
dbop/user.go
Normal file
133
dbop/user.go
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
package dbop
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bytes"
|
||||||
|
"crypto/des"
|
||||||
|
"crypto/md5"
|
||||||
|
"encoding/base64"
|
||||||
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
|
|
||||||
|
"github.com/shockliu/logger"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
codekey = "HY&XC&MW"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
uOpenID map[int64]string
|
||||||
|
)
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
uOpenID = make(map[int64]string)
|
||||||
|
}
|
||||||
|
|
||||||
|
func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
|
||||||
|
padding := blockSize - len(ciphertext)%blockSize
|
||||||
|
padtext := bytes.Repeat([]byte{byte(padding)}, padding)
|
||||||
|
return append(ciphertext, padtext...)
|
||||||
|
}
|
||||||
|
|
||||||
|
// ECB+PKCS5加密
|
||||||
|
func EncryptDES_ECB(data []byte) []byte {
|
||||||
|
block, err := des.NewCipher([]byte(codekey))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
bs := block.BlockSize()
|
||||||
|
//对明文数据进行补码
|
||||||
|
data = PKCS5Padding(data, bs)
|
||||||
|
out := make([]byte, len(data))
|
||||||
|
dst := out
|
||||||
|
for len(data) > 0 {
|
||||||
|
//对明文按照blocksize进行分块加密
|
||||||
|
//必要时可以使用go关键字进行并行加密
|
||||||
|
block.Encrypt(dst, data[:bs])
|
||||||
|
data = data[bs:]
|
||||||
|
dst = dst[bs:]
|
||||||
|
}
|
||||||
|
// return fmt.Sprintf("%X", out)
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
// 测试验证发现,密码加密方式位
|
||||||
|
func EncryptPwd(code string) string {
|
||||||
|
enc := base64.StdEncoding.EncodeToString(EncryptDES_ECB([]byte(code)))
|
||||||
|
h := md5.New()
|
||||||
|
h.Write([]byte(enc))
|
||||||
|
return hex.EncodeToString(h.Sum(nil))
|
||||||
|
}
|
||||||
|
|
||||||
|
func SavePasswd(user int, passwd string) bool {
|
||||||
|
_, err := MDb.Exec("update aos_user set password=? where id=?;", EncryptPwd(passwd), user)
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func PasswdAuth(user int, passwd string) bool {
|
||||||
|
var encPwd string
|
||||||
|
err := MDb.QueryRow("select password from aos_user where id=?;", user).Scan(&encPwd)
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("获取用户[%d]密码失败%s\n", user, err)
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
return EncryptPwd(passwd) == encPwd
|
||||||
|
}
|
||||||
|
|
||||||
|
func AppUserAuth(user, passwd string) (bool, string, int, error) {
|
||||||
|
var encPwd, name string
|
||||||
|
var id int
|
||||||
|
err := MDb.QueryRow("select password,id,name from aos_user where account=?;", user).Scan(&encPwd, &id, &name)
|
||||||
|
if err != nil {
|
||||||
|
return false, "", 0, err
|
||||||
|
}
|
||||||
|
// 密码md5计算后比较
|
||||||
|
//enc := EncryptPwd(passwd)
|
||||||
|
//logger.Debugf("[%s]->[%s]===[%s]\n", passwd, enc, encPwd)
|
||||||
|
if EncryptPwd(passwd) == encPwd {
|
||||||
|
return true, name, id, nil
|
||||||
|
}
|
||||||
|
return false, "", 0, errors.New("账号密码鉴权失败")
|
||||||
|
}
|
||||||
|
|
||||||
|
func ExistWxUser(user string) bool {
|
||||||
|
if len(user) == 0 {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
var cnt int
|
||||||
|
err := MDb.QueryRow("select count(1) from wxmp_user where openId=? and statu=1 ;", user).Scan(&cnt)
|
||||||
|
return (err == nil && cnt > 0)
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetOpenId(id int64) string {
|
||||||
|
if openID, ok := uOpenID[id]; ok {
|
||||||
|
return openID
|
||||||
|
} else {
|
||||||
|
err := MDb.QueryRow("select openId from user_relation where channel=3 and id = ?;", id).Scan(&openID)
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("查询用户商城openID失败%s\n", err)
|
||||||
|
} else {
|
||||||
|
uOpenID[id] = openID // 缓存
|
||||||
|
}
|
||||||
|
return openID
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func GetMaintainer(id int) (user []int) {
|
||||||
|
rows, err := MDb.Query("select d.id from maintenance_user_place a RIGHT JOIN dqk_client b on a.place_id=b.location LEFT JOIN aos_user c on a.user_id=c.id left join dqk_user d on c.account=d.name where b.id=?;", id)
|
||||||
|
if err != nil {
|
||||||
|
logger.Debugf("查询设备[%d]维护人员失败%s\n", id, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
var uid int
|
||||||
|
for rows.Next() {
|
||||||
|
err = rows.Scan(&uid)
|
||||||
|
if err != nil {
|
||||||
|
logger.Warnf("获取设备%d维护人员失败%s\n", id, err)
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
user = append(user, uid)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user