Browse Source

Merge remote-tracking branch 'origin/token_fix' into eta/1.7.6

Roc 11 months ago
parent
commit
46de34f1d9

+ 21 - 17
controllers/base_auth.go

@@ -50,6 +50,7 @@ var AdminOperateRecordMap = map[string]string{
 type BaseAuthController struct {
 	web.Controller
 	SysUser *system.Admin
+	Session *system.SysSession
 }
 
 func (c *BaseAuthController) Prepare() {
@@ -92,26 +93,20 @@ func (c *BaseAuthController) Prepare() {
 				c.StopRun()
 				return
 			}
-			authorizationArr := strings.Split(authorization, "$")
-			if len(authorizationArr) <= 1 {
-				c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:Token is empty or account is empty"}, false, false)
-				c.StopRun()
-				return
-			}
-			tokenStr := authorizationArr[0]
+			//authorizationArr := strings.Split(authorization, "$")
+			//if len(authorizationArr) <= 1 {
+			//	c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新授权!", ErrMsg: "请重新授权:Token is empty or account is empty"}, false, false)
+			//	c.StopRun()
+			//	return
+			//}
+			tokenStr := authorization
 			tokenArr := strings.Split(tokenStr, "=")
 			token := tokenArr[1]
 
-			accountStr := authorizationArr[1]
-			accountArr := strings.Split(accountStr, "=")
-			account := accountArr[1]
-			//校验token是否合法
-			// JWT校验Token和Account
-			if !utils.CheckToken(account, token) {
-				c.JSON(models.BaseResponse{Ret: 408, Msg: "鉴权失败,请重新登录!", ErrMsg: "登录失效,请重新登陆!,CheckToken Fail"}, false, false)
-				c.StopRun()
-				return
-			}
+			//accountStr := authorizationArr[1]
+			//accountArr := strings.Split(accountStr, "=")
+			//account := accountArr[1]
+
 			session, err := system.GetSysSessionByToken(token)
 			if err != nil {
 				if err.Error() == utils.ErrNoRow() {
@@ -128,6 +123,14 @@ func (c *BaseAuthController) Prepare() {
 				c.StopRun()
 				return
 			}
+			//校验token是否合法
+			// JWT校验Token和Account
+			account := utils.MD5(session.UserName)
+			if !utils.CheckToken(account, token) {
+				c.JSON(models.BaseResponse{Ret: 408, Msg: "鉴权失败,请重新登录!", ErrMsg: "登录失效,请重新登陆!,CheckToken Fail"}, false, false)
+				c.StopRun()
+				return
+			}
 			if time.Now().After(session.ExpiredTime) {
 				c.JSON(models.BaseResponse{Ret: 408, Msg: "请重新登录!", ErrMsg: "获取用户信息异常,Eerr:" + err.Error()}, false, false)
 				c.StopRun()
@@ -184,6 +187,7 @@ func (c *BaseAuthController) Prepare() {
 
 			admin.RoleTypeCode = GetSysUserRoleTypeCode(admin.RoleTypeCode)
 			c.SysUser = admin
+			c.Session = session
 
 			//接口权限校验
 			roleId := admin.RoleId

+ 3 - 0
controllers/sys_role.go

@@ -705,6 +705,9 @@ func (this *SysRoleController) SystemConfig() {
 	}, system.BusinessConf{
 		ConfKey: "ChartViewUrl",
 		ConfVal: conf["ChartViewUrl"],
+	}, system.BusinessConf{
+		ConfKey: "LoginUrl",
+		ConfVal: conf["LoginUrl"],
 	})
 
 	osc := system.BusinessConf{

+ 90 - 7
controllers/sys_user.go

@@ -100,7 +100,7 @@ func (this *SysUserController) Login() {
 
 	resp := new(system.LoginResp)
 	resp.Authorization = token
-	resp.Authorization = "authorization=" + token + "$account=" + account
+	resp.Authorization = "authorization=" + token
 	resp.RealName = sysUser.RealName
 	resp.AdminName = sysUser.AdminName
 	resp.RoleName = sysUser.RoleName
@@ -347,16 +347,26 @@ func (this *SysUserController) AuthCodeLogin() {
 		this.Data["json"] = br
 		this.ServeJSON()
 	}()
-	authCode := this.GetString("AuthCode", "")
-	if authCode == "" {
-		br.Msg = "参数有误"
-		br.ErrMsg = "参数缺失, AuthCode"
-		return
+	//authCode := this.GetString("AuthCode", "")
+	//if authCode == "" {
+	//	br.Msg = "参数有误"
+	//	br.ErrMsg = "参数缺失, AuthCode"
+	//	return
+	//}
+
+	req := make(map[string]interface{})
+	query := this.Ctx.Request.URL.Query()
+	for key, value := range query {
+		req[key] = value[0]
 	}
+	fmt.Println(req)
 
-	data, e := services.CodeLoginFromMiddleServer(authCode)
+	data, e, errMsg := services.ThirdLogin(req)
 	if e != nil {
 		br.Msg = "获取失败"
+		if errMsg != `` {
+			br.Msg = errMsg
+		}
 		br.ErrMsg = "获取登录Token失败, Err: " + e.Error()
 		return
 	}
@@ -366,3 +376,76 @@ func (this *SysUserController) AuthCodeLogin() {
 	br.Success = true
 	br.Msg = "获取成功"
 }
+
+// SystemConfig
+// @Title 系统配置列表
+// @Description 系统配置列表
+// @Success 200 {object} []system.BusinessConf
+// @router /public_config [get]
+func (this *SysUserController) SystemConfig() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	list := make([]system.BusinessConf, 0)
+
+	// 获取基础配置, 若未配置则直接返回
+	conf, e := models.GetBusinessConf()
+	if e != nil {
+		br.Msg = "获取失败"
+		br.ErrMsg = "获取基础配置失败, Err: " + e.Error()
+		return
+	}
+
+	list = append(list, system.BusinessConf{
+		ConfKey: "LoginUrl",
+		ConfVal: conf["LoginUrl"],
+	}, system.BusinessConf{
+		ConfKey: "LogoutUrl",
+		ConfVal: conf["LogoutUrl"],
+	})
+
+	br.Data = list
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "获取成功"
+}
+
+// Logout
+// @Title 登出接口
+// @Description 登出接口
+// @Success 200 Ret=200 获取成功
+// @router /logout [post]
+func (this *SysUserAuthController) Logout() {
+	br := new(models.BaseResponse).Init()
+	defer func() {
+		if br.ErrMsg == "" {
+			br.IsSendEmail = false
+		}
+		this.Data["json"] = br
+		this.ServeJSON()
+	}()
+	sysUser := this.SysUser
+	if sysUser == nil {
+		br.Msg = "请登录"
+		br.ErrMsg = "请登录,SysUser Is Empty"
+		br.Ret = 408
+		return
+	}
+
+	services.ThirdLogout(this.Session.AccessToken)
+	//e := services.ThirdLogout(this.Session.AccessToken)
+	//if e != nil {
+	//	br.Msg = "登出失败"
+	//	br.ErrMsg = "登出失败, Err: " + e.Error()
+	//	return
+	//}
+
+	br.Ret = 200
+	br.Success = true
+	br.Msg = "登出成功"
+}

+ 1 - 1
controllers/user_login.go

@@ -535,7 +535,7 @@ func (this *UserLoginController) Login() {
 
 	resp := new(system.LoginResp)
 	resp.Authorization = token
-	resp.Authorization = "authorization=" + token + "$account=" + account
+	resp.Authorization = "authorization=" + token
 	resp.RealName = sysUser.RealName
 	resp.AdminName = sysUser.AdminName
 	resp.RoleName = sysUser.RoleName

+ 18 - 0
routers/commentsRouter.go

@@ -7891,6 +7891,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserAuthController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserAuthController"],
+        beego.ControllerComments{
+            Method: "Logout",
+            Router: `/logout`,
+            AllowHTTPMethods: []string{"post"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserAuthController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserAuthController"],
         beego.ControllerComments{
             Method: "ModifyPwd",
@@ -7918,6 +7927,15 @@ func init() {
             Filters: nil,
             Params: nil})
 
+    beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserController"],
+        beego.ControllerComments{
+            Method: "SystemConfig",
+            Router: `/public_config`,
+            AllowHTTPMethods: []string{"get"},
+            MethodParams: param.Make(),
+            Filters: nil,
+            Params: nil})
+
     beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserController"] = append(beego.GlobalControllerRouter["eta/eta_api/controllers:SysUserController"],
         beego.ControllerComments{
             Method: "Uuid",

+ 3 - 2
services/crm_eta.go

@@ -4,6 +4,7 @@ import (
 	"encoding/json"
 	"eta/eta_api/utils"
 	"fmt"
+	"io"
 	"io/ioutil"
 	"net/http"
 	"strings"
@@ -137,7 +138,7 @@ func CodeLoginFromMiddleServer(authCode string) (tokenResp GetCrmTokenData, err
 		return
 	}
 
-	body := ioutil.NopCloser(strings.NewReader(string(data)))
+	body := io.NopCloser(strings.NewReader(string(data)))
 	client := &http.Client{}
 	req, e := http.NewRequest("POST", url, body)
 	if e != nil {
@@ -156,7 +157,7 @@ func CodeLoginFromMiddleServer(authCode string) (tokenResp GetCrmTokenData, err
 	defer func() {
 		_ = resp.Body.Close()
 	}()
-	b, e := ioutil.ReadAll(resp.Body)
+	b, e := io.ReadAll(resp.Body)
 	if e != nil {
 		err = fmt.Errorf("resp body read err: %s", e.Error())
 		return

+ 9 - 4
services/data/excel/custom_analysis_edb.go

@@ -48,6 +48,7 @@ func GetCustomAnalysisExcelData(excelInfo *excel.ExcelInfo) (luckySheet excelSer
 			tmpSheetDataList := make([]excelServices.LuckySheetCellData, 0)
 			err = json.Unmarshal([]byte(cellData.Data), &tmpSheetDataList)
 			if err != nil {
+				err = errors.New(fmt.Sprintf("解析data的配置失败,sheetId:%d,Err:%s", cellData.ExcelDataId, err.Error()))
 				return
 			}
 			sheetCellDataMapList[cellData.ExcelSheetId] = append(sheetDataList, tmpSheetDataList...)
@@ -63,6 +64,7 @@ func GetCustomAnalysisExcelData(excelInfo *excel.ExcelInfo) (luckySheet excelSer
 		var luckySheetDataConfig excelServices.LuckySheetDataConfig
 		err = json.Unmarshal([]byte(sheet.Config), &luckySheetDataConfig)
 		if err != nil {
+			err = errors.New(fmt.Sprintf("解析sheet的配置失败,sheetId:%d,Err:%s", sheet.ExcelSheetId, err.Error()))
 			return
 		}
 		tmpLuckySheetDataInfo := excelServices.LuckySheetData{
@@ -218,6 +220,7 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
 	list, err := excel.GetAllExcelEdbMappingItemByExcelInfoId(excelInfo.ExcelInfoId)
 	if err != nil {
 		errMsg = "获取失败"
+		err = errors.New("查找所有的mapping失败" + err.Error())
 		return
 	}
 
@@ -231,7 +234,7 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
 		err = json.Unmarshal([]byte(v.CalculateFormula), &tmpCalculateFormula)
 		if err != nil {
 			errMsg = "获取失败"
-			err = errors.New("公式转换失败,Err:" + err.Error())
+			err = errors.New(fmt.Sprintf("指标id:%d,公式转换失败,Err:%s", v.EdbInfoId, err.Error()))
 			return
 		}
 		v.DateSequenceStr = tmpCalculateFormula.DateSequenceStr
@@ -241,12 +244,14 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
 
 	luckySheet, err, errMsg := GetCustomAnalysisExcelData(excelInfo)
 	if err != nil {
+		err = errors.New(fmt.Sprintf("获取自定义分析Excel数据失败,Err:%s", err.Error()))
 		return
 	}
 
 	// 获取excel表格数据
 	xlsxFile, err := luckySheet.GetExcelData(false)
 	if err != nil {
+		err = errors.New(fmt.Sprintf("获取excel表格数据,Err:%s", err.Error()))
 		return
 	}
 
@@ -260,7 +265,7 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
 		// 获取对应的日期和数据列表
 		relDateList, relDataList, tmpErr, tmpErrMsg := getDateAndDataList(v, xlsxFile)
 		if tmpErr != nil {
-			err = tmpErr
+			err = errors.New(fmt.Sprintf("获取对应的日期和数据列表,Err:%s", tmpErr.Error()))
 			errMsg = tmpErrMsg
 			return
 		}
@@ -274,12 +279,12 @@ func Refresh(excelInfo *excel.ExcelInfo) (err error, errMsg string, isSendEmail
 		// 调用指标库去更新
 		reqJson, tmpErr := json.Marshal(req2)
 		if tmpErr != nil {
-			err = tmpErr
+			err = errors.New(fmt.Sprintf("结构体转对象失败,Err:%s", tmpErr.Error()))
 			return
 		}
 		respItem, tmpErr := data.ResetCustomAnalysisData(string(reqJson))
 		if tmpErr != nil {
-			err = tmpErr
+			err = errors.New(fmt.Sprintf("调用指标库去更新,Err:%s", tmpErr.Error()))
 			return
 		}
 		if respItem.Ret != 200 {

+ 11 - 6
services/excel/lucky_sheet.go

@@ -903,10 +903,10 @@ var LuckyFontFamilyMap = map[int]string{
 	2:  "Tahoma",
 	3:  "Verdana",
 	4:  "微软雅黑",
-	5:  "宋体",   //宋体(Song)、
-	6:  "黑体",   // 黑体(ST Heiti)
-	7:  "楷体",   //楷体(ST Kaiti),
-	8:  "仿宋",   //仿宋(ST FangSong),
+	5:  "宋体",  //宋体(Song)、
+	6:  "黑体",  // 黑体(ST Heiti)
+	7:  "楷体",  //楷体(ST Kaiti),
+	8:  "仿宋",  //仿宋(ST FangSong),
 	9:  "新宋体", //新宋体(ST Song),
 	10: "华文新魏",
 	11: "华文行楷",
@@ -1684,11 +1684,16 @@ func GetTableDataByMixedTableData(config [][]request.MixedTableCellDataReq) (sel
 		for _, row := range config {
 			dataCol := make([]LuckySheetDataValue, 0)
 			for _, cell := range row {
-				dataCol = append(dataCol, LuckySheetDataValue{
+				tmp := LuckySheetDataValue{
 					Value:     cell.Value,
 					Monitor:   cell.ShowValue,
 					MergeCell: LuckySheetDataConfigMerge{},
-				})
+				}
+				if cell.ShowStyle != "" {
+					showFormatValue := fmt.Sprintf("%v", cell.ShowFormatValue)
+					tmp.Monitor = showFormatValue
+				}
+				dataCol = append(dataCol, tmp)
 			}
 			tableDataList = append(tableDataList, dataCol)
 		}

+ 180 - 0
services/user_login.go

@@ -2,12 +2,15 @@ package services
 
 import (
 	"encoding/json"
+	"errors"
 	"eta/eta_api/models"
 	"eta/eta_api/models/company"
 	"eta/eta_api/models/system"
 	"eta/eta_api/utils"
 	"fmt"
 	"github.com/go-ldap/ldap"
+	"io"
+	"net/http"
 	"strconv"
 	"strings"
 	"time"
@@ -239,3 +242,180 @@ func LdapUserCheck(userName, password string) (pass bool, err error) {
 	pass = true
 	return
 }
+
+// ThirdLogin
+// @Description: 第三方登录(换取token)
+// @author: Roc
+// @datetime 2024-01-30 16:09:18
+// @param req map[string]interface{}
+// @return data GetCrmTokenData
+// @return err error
+// @return errMsg string
+func ThirdLogin(req map[string]interface{}) (data GetCrmTokenData, err error, errMsg string) {
+	if utils.BusinessCode == utils.BusinessCodeRelease || utils.BusinessCode == utils.BusinessCodeSandbox {
+		authCode, ok := req["code"]
+		if !ok {
+			errMsg = "参数有误"
+			err = errors.New("参数缺失, code")
+			return
+		}
+		authCodeStr := fmt.Sprint(authCode)
+		if authCodeStr == "" {
+			errMsg = "参数有误"
+			err = errors.New("参数缺失, AuthCode")
+			return
+		}
+
+		data, err = CodeLoginFromMiddleServer(authCodeStr)
+
+		return
+	}
+
+	data, err, errMsg = ThirdCodeLoginFromMiddleServer(req)
+
+	// 普通的第三方
+
+	return
+}
+
+// ThirdCodeLoginFromMiddleServer
+// @Description:  第三方登录(向桥接服务换取token)
+// @author: Roc
+// @datetime 2024-01-30 16:09:35
+// @param param map[string]interface{}
+// @return tokenResp GetCrmTokenData
+// @return err error
+func ThirdCodeLoginFromMiddleServer(param map[string]interface{}) (tokenResp GetCrmTokenData, err error, errMsg string) {
+	if utils.EtaBridgeUrl == `` || utils.EtaBridgeLoginUrl == "" {
+		errMsg = `未配置第三方登录的桥接服务地址`
+		err = errors.New(errMsg)
+		return
+	}
+	data, e := json.Marshal(param)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+
+	body := io.NopCloser(strings.NewReader(string(data)))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", utils.EtaBridgeUrl+utils.EtaBridgeLoginUrl, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := io.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密, 注意有个坑前后的双引号
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(GetCrmTokenDataResp)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		utils.FileLog.Info("第三方登录(向桥接服务换取token):\n" + string(b))
+		return
+	}
+	if result.Code != 200 {
+		errMsg = result.Msg
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+	tokenResp = result.Data
+
+	return
+}
+
+// ThirdLogout
+// @Description: 第三方登出
+// @author: Roc
+// @datetime 2024-01-30 16:09:18
+// @param req map[string]interface{}
+// @return data GetCrmTokenData
+// @return err error
+func ThirdLogout(accessToken string) (err error) {
+	if utils.EtaBridgeUrl == "" || utils.EtaBridgeLogoutUrl == "" {
+		// 未配置第三方登出的桥接服务地址
+		return
+	}
+	params := map[string]interface{}{
+		"access_token": accessToken,
+	}
+	data, e := json.Marshal(params)
+	if e != nil {
+		err = fmt.Errorf("data json marshal err: %s", e.Error())
+		return
+	}
+
+	body := io.NopCloser(strings.NewReader(string(data)))
+	client := &http.Client{}
+	req, e := http.NewRequest("POST", utils.EtaBridgeUrl+utils.EtaBridgeLogoutUrl, body)
+	if e != nil {
+		err = fmt.Errorf("http create request err: %s", e.Error())
+		return
+	}
+
+	contentType := "application/json;charset=utf-8"
+	req.Header.Set("Content-Type", contentType)
+	checkToken := utils.MD5(utils.EtaBridgeAppNameEn + utils.EtaBridgeMd5Key)
+	req.Header.Set("Authorization", checkToken)
+	resp, e := client.Do(req)
+	if e != nil {
+		err = fmt.Errorf("http client do err: %s", e.Error())
+		return
+	}
+	defer func() {
+		_ = resp.Body.Close()
+	}()
+	b, e := io.ReadAll(resp.Body)
+	if e != nil {
+		err = fmt.Errorf("resp body read err: %s", e.Error())
+		return
+	}
+	if len(b) == 0 {
+		err = fmt.Errorf("resp body is empty")
+		return
+	}
+	// 生产环境解密, 注意有个坑前后的双引号
+	if utils.RunMode == "release" {
+		str := string(b)
+		str = strings.Trim(str, `"`)
+		b = utils.DesBase64Decrypt([]byte(str), utils.EtaBridgeDesKey)
+	}
+
+	result := new(GetCrmTokenDataResp)
+	if e = json.Unmarshal(b, &result); e != nil {
+		err = fmt.Errorf("result unmarshal err: %s\nresult: %s", e.Error(), string(b))
+		return
+	}
+	if result.Code != 200 {
+		err = fmt.Errorf("result: %s", string(b))
+		return
+	}
+
+	return
+}

+ 1 - 1
utils/common.go

@@ -2095,7 +2095,7 @@ func GetPredictEdbDayListByNum(startDate time.Time, num int, frequency string) (
 
 // FormatMixTableDataShowValue 格式化自定表格显示数据
 func FormatMixTableDataShowValue(x float64) (res string) {
-	res = fmt.Sprint(x)
+	res = strconv.FormatFloat(x, 'f', -1, 64)
 	return
 }
 

+ 4 - 0
utils/config.go

@@ -90,6 +90,8 @@ var (
 	EtaBridgeAppNameEn string // 桥接服务英文名称-鉴权用
 	EtaBridgeMd5Key    string // 桥接服务Md5密钥-鉴权用
 	EtaBridgeDesKey    string // 桥接服务Des密钥-解密数据用
+	EtaBridgeLoginUrl  string // 第三方登录鉴权接口地址
+	EtaBridgeLogoutUrl string // 第三方登出接口地址
 )
 
 // 微信配置信息
@@ -373,6 +375,8 @@ func init() {
 		EtaBridgeAppNameEn = config["eta_bridge_app_name_en"] // 桥接服务英文名称-鉴权用
 		EtaBridgeMd5Key = config["eta_bridge_md5_key"]        // 桥接服务Md5密钥-鉴权用
 		EtaBridgeDesKey = config["eta_bridge_des_key"]        // 桥接服务Des密钥-解密数据用
+		EtaBridgeLoginUrl = config["eta_bridge_login_url"]    // eta桥接服务-登录接口地址
+		EtaBridgeLogoutUrl = config["eta_bridge_logout_url"]  // eta桥接服务-登出接口地址
 	}
 
 	//日志配置