438 lines
12 KiB
Go
438 lines
12 KiB
Go
package controller
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"math/rand"
|
|
"net/http"
|
|
"os"
|
|
"strings"
|
|
"time"
|
|
"xiawan/wx/api/req"
|
|
"xiawan/wx/api/service"
|
|
"xiawan/wx/api/vo"
|
|
"xiawan/wx/clientsdk/baseutils"
|
|
"xiawan/wx/db"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
"github.com/gogf/guuid"
|
|
)
|
|
|
|
func init() {
|
|
rand.Seed(time.Now().UnixNano())
|
|
}
|
|
|
|
// 检查请求参数 key 对应的 license 是否可用
|
|
func checkLicense(ctx *gin.Context) (string, error) {
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
errMsg := fmt.Sprintf("%s 该 key 无效! 请 检查正确性 或 联系管理员生成", queryKey)
|
|
if !isExist || len(strings.TrimSpace(queryKey)) == 0 {
|
|
// 请求参数中没有携带 license 或者 license 为空
|
|
return "", errors.New(errMsg)
|
|
}
|
|
has, err := db.HasLicense(queryKey)
|
|
if has == nil || err != nil {
|
|
// MySQL 数据库没有该 license
|
|
return "", errors.New(errMsg)
|
|
}
|
|
if db.CheckExpiry(has.ExpiryDate, has.Type) {
|
|
// MySQL 数据库中的该 license 已过期
|
|
return "", errors.New(fmt.Sprintf("%s 该 key 已过期!", queryKey))
|
|
}
|
|
|
|
// license 可用
|
|
return queryKey, nil
|
|
}
|
|
|
|
// GetLoginQrCodeTempShow HTML展示登录二维码
|
|
func GetLoginQrCodeTempShow(ctx *gin.Context) {
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
//获取二维码
|
|
qrcodeResponse, dto := service.GetLoginQrCodeShow(queryKey)
|
|
|
|
// 二维码写入到文件
|
|
baseutils.WriteToFile(qrcodeResponse.GetQrcode().GetSrc(), "static/qrcode/"+qrcodeResponse.GetUuid()+".png")
|
|
// 延时删除图片
|
|
go func() {
|
|
time.Sleep(time.Second * 10)
|
|
err := os.Remove("static/qrcode/" + qrcodeResponse.GetUuid() + ".png")
|
|
if err != nil {
|
|
return
|
|
}
|
|
}()
|
|
|
|
if dto.Code == vo.SUCCESS {
|
|
ctx.HTML(http.StatusOK, "login.tmpl", gin.H{"img": qrcodeResponse.GetUuid()})
|
|
} else {
|
|
ctx.HTML(http.StatusOK, "err.tmpl", gin.H{"showlog": dto})
|
|
}
|
|
}
|
|
|
|
// GetLoginQrCodeNewApi 获取登录二维码-iPad(异地IP必须用代理! socks5://username:password@ipv4:port)
|
|
func GetLoginQrCodeNewApi(ctx *gin.Context) {
|
|
reqModel := new(req.GetLoginQrCodeModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.GetLoginQrCodeNewService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// GetLoginQrCodeNewApi 获取登录二维码-直登(异地IP必须用代理! socks5://username:password@ipv4:port)
|
|
func GetLoginQrCodeNewApiDirect(ctx *gin.Context) {
|
|
reqModel := new(req.GetLoginQrCodeModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.GetLoginQrCodeNewServiceDirect(queryKey, *reqModel, reqModel.IpadOrmac)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// WxBindOpMobileForRegApi 获取验证码
|
|
func WxBindOpMobileForRegApi(ctx *gin.Context) {
|
|
reqModel := new(req.WxBindOpMobileForModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.WxBindOpMobileForRegService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// Get62DataApi 提取62数据
|
|
func Get62DataApi(ctx *gin.Context) {
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
if !isExist {
|
|
queryKey = guuid.New().String()
|
|
}
|
|
result := service.Get62DataService(queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// PhoneDeviceLoginApi 辅助新手机登录
|
|
func PhoneDeviceLoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.PhoneLoginModel)
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
|
//确保每次都有Key
|
|
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
|
return
|
|
}
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.PhoneDeviceLoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// DeviceIdLoginApi 62账号密码登录
|
|
func DeviceIdLoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.DeviceIdLoginModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.DeviceIdLoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// SmsLoginApi 短信登录
|
|
func SmsLoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.DeviceIdLoginModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
reqModel.Password = "strdm@," + reqModel.Password
|
|
result := service.SmsLoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// A16LoginApi A16数据登录
|
|
func A16LoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.DeviceIdLoginModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.A16LoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// LoginNewApi 62LoginNew新疆号登录
|
|
func LoginNewApi(ctx *gin.Context) {
|
|
reqModel := new(req.DeviceIdLoginModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
reqModel.Type = 1
|
|
result := service.A16LoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// CheckLoginStatusApi 检测扫码状态
|
|
func CheckLoginStatusApi(ctx *gin.Context) {
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
|
//确保每次都有Key
|
|
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
|
return
|
|
}
|
|
|
|
result := service.CheckLoginQrCodeStatusService(queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// GetInItStatusApi 初始化状态
|
|
func GetInItStatusApi(ctx *gin.Context) {
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
|
//确保每次都有Key
|
|
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
|
return
|
|
}
|
|
result := service.GetInItStatusService(queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// WakeUpLoginApi 唤醒登录(只限扫码登录)
|
|
func WakeUpLoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.GetLoginQrCodeModel)
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
|
//确保每次都有Key
|
|
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
|
return
|
|
}
|
|
result := service.WakeUpLoginService(queryKey, reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// GetLoginStatusApi 获取在线状态
|
|
func GetLoginStatusApi(ctx *gin.Context) {
|
|
autoLogin := true
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
|
//确保每次都有Key
|
|
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
|
return
|
|
}
|
|
isAutoLogin, isExist := ctx.GetQuery("autoLogin")
|
|
if isExist {
|
|
if strings.Contains(isAutoLogin, "false") {
|
|
autoLogin = false
|
|
}
|
|
}
|
|
|
|
result := service.GetLoginStatusService(queryKey, false, autoLogin)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// GetSafetyInfoApi 获取安全设备列表
|
|
func GetSafetyInfoApi(ctx *gin.Context) {
|
|
queryKey, _ := ctx.GetQuery("key")
|
|
result := service.GetSafetyInfoService(queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// DelSafeDeviceApi 删除安全设备
|
|
func DelSafeDeviceApi(ctx *gin.Context) {
|
|
reqModel := new(req.DelSafeDeviceModel)
|
|
queryKey, _ := ctx.GetQuery("key")
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.DelSafeDeviceService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// GetBoundHardDevice 获取硬件设备情况
|
|
func GetBoundHardDevice(ctx *gin.Context) {
|
|
queryKey, _ := ctx.GetQuery("key")
|
|
result := service.GetBoundHardDeviceService(queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// CheckCanSetAliasApi 检测微信登录环境
|
|
func CheckCanSetAliasApi(ctx *gin.Context) {
|
|
queryKey, _ := ctx.GetQuery("key")
|
|
result := service.CheckCanSetAliasService(queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// IWXConnectMgrApi 打印链接数量
|
|
func IWXConnectMgrApi(ctx *gin.Context) {
|
|
result := service.IWXConnectMgrService()
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// GetConnectInfo 打印链接信息
|
|
func GetConnectInfo(ctx *gin.Context) {
|
|
result := service.GetConnectInfo()
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// LogOutRequestApi 退出登录
|
|
func LogOutRequestApi(ctx *gin.Context) {
|
|
|
|
queryKey, isExist := ctx.GetQuery("key")
|
|
if !isExist || strings.Trim(queryKey, "") == "" || strings.Trim(queryKey, "") == "null" {
|
|
//确保每次都有Key
|
|
ctx.JSON(http.StatusOK, vo.NewFailUUId(""))
|
|
return
|
|
}
|
|
|
|
result := service.LogOutService(queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// MacLoginApi 获取Mac登录二维码 (异地IP必须用代理 socks5://username:password@ipv4:port)
|
|
func MacLoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.GetLoginQrCodeModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.MacLoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// AndroidPadLoginApi 获取安卓平板登录二维码 (异地IP必须用代理 socks5://username:password@ipv4:port)
|
|
func AndroidPadLoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.GetLoginQrCodeModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.AndroidPadLoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// CarLoginApi 获取车载登录二维码 (异地IP必须用代理 socks5://username:password@ipv4:port)
|
|
func CarLoginApi(ctx *gin.Context) {
|
|
reqModel := new(req.GetLoginQrCodeModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.CarLoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// VerifyCodeApi 验证码验证(输入iPad登录验证码)
|
|
func VerifyCodeApi(ctx *gin.Context) {
|
|
reqModel := new(req.VerifyCodeModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
|
|
param := req.VerifyCodeModel{
|
|
Code: reqModel.Code,
|
|
Data62: reqModel.Data62,
|
|
Ticket: reqModel.Ticket,
|
|
}
|
|
result := service.Verificationcode2(param, queryKey)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// VerifyCodeSlideApi 过mac滑块验证
|
|
func VerifyCodeApiSlide(ctx *gin.Context) {
|
|
reqModel := new(req.SlideTicketModel)
|
|
queryKey, _ := ctx.GetQuery("key")
|
|
if queryKey != "408449830" {
|
|
ctx.JSON(http.StatusOK, vo.NewFail("key错误"))
|
|
return
|
|
}
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
param := req.SlideTicketModel{
|
|
Data62: reqModel.Data62,
|
|
Ticket: reqModel.Ticket,
|
|
RandStr: reqModel.RandStr,
|
|
SlideTicket: reqModel.SlideTicket,
|
|
}
|
|
result := service.VerificationcodeSlide(param)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|
|
|
|
// WinLoginService win登录
|
|
func WinLoginService(ctx *gin.Context) {
|
|
reqModel := new(req.GetLoginQrCodeModel)
|
|
queryKey, err := checkLicense(ctx)
|
|
if err != nil {
|
|
ctx.JSON(http.StatusOK, vo.NewFail(err.Error()))
|
|
return
|
|
}
|
|
|
|
if !validateData(ctx, &reqModel) {
|
|
return
|
|
}
|
|
result := service.WinLoginService(queryKey, *reqModel)
|
|
ctx.JSON(http.StatusOK, result)
|
|
}
|