Browse Source

后台登陆、登出接口

caipin 4 năm trước cách đây
mục cha
commit
f7ff653b72

+ 94 - 0
lib/cld.go

@@ -0,0 +1,94 @@
+/*
+ * @description:计量支付接口相关操作
+ * @Author: CP
+ * @Date: 2020-09-03 16:57:56
+ * @FilePath: \construction_management\lib\cld.go
+ */
+package lib
+
+import (
+	"encoding/json"
+	"errors"
+	"io/ioutil"
+	"net/http"
+	"net/url"
+	"strings"
+
+	"go.mod/web/viewmodels"
+)
+
+type Cld struct {
+	AuthUrl string
+	Token   string
+}
+
+type Result struct {
+	// viewmodels.StaffCld []string
+	Code int                  `form:"code" json:"code" `
+	Data viewmodels.ResultCld `form:"data" json:"data" `
+	Msg  string               `form:"msg" json:"msg" `
+}
+
+//创建项目用户service
+func NewCld() *Cld {
+	return &Cld{
+		AuthUrl: "http://cld.smartcost.com.cn/cm/auth",
+		// AuthUrl: "http://cld.com/cm/auth",
+		Token: "sc@ConS!tru@ct*88",
+	}
+}
+
+// 验证CLD账号的登陆密码
+func (c *Cld) LoginValid(loginData viewmodels.StaffCld) (*Result, error) {
+	// TODO 生成令牌和提交时间
+	//const [encryptToken, postTime] = this.generateCLDToken();
+	client := &http.Client{}
+	// 构成数据
+	data := url.Values{}
+	data.Set("staffName", loginData.StaffName)
+	data.Set("password", loginData.Password)
+	parameter := strings.NewReader(data.Encode())
+
+	reqest, err := http.NewRequest("POST", c.AuthUrl, parameter)
+	if err != nil {
+		return nil, errors.New("CLD网络出现问题")
+	}
+	reqest.Header.Add("Content-Type", "application/x-www-form-urlencoded")
+	// 发送请求
+	response, err := client.Do(reqest)
+	if err != nil {
+		return nil, errors.New("CLD网络出现问题")
+	}
+	if response.StatusCode != 200 {
+		return nil, errors.New("请求CLD发送错误")
+	}
+
+	body, _ := ioutil.ReadAll(response.Body)
+	// fmt.Println(string(body))
+	result := Result{}
+	err = json.Unmarshal(body, &result)
+	if err != nil {
+		return nil, errors.New("解析数据错误")
+	}
+
+	return &result, nil
+	// fmt.Println("response Body:", string(body))
+
+	// TODO 有接口在调试
+	/*
+		req := HttpRequest.NewRequest()
+		res, _ := req.Post(j.AuthUrl, map[string]interface{}{
+			"code":     loginData.Code,
+			"account":  loginData.Account,
+			"password": loginData.Password,
+			"posttime": "",
+			"token":    "",
+		})
+		_, err := res.Body()
+		if err != nil {
+			return errors.New("账号或密码不正确")
+		}
+	*/
+	//return string(body)
+
+}

+ 110 - 0
services/backstage_service.go

@@ -0,0 +1,110 @@
+/*
+ * @description:登陆相关数据操作
+ * @Author: CP
+ * @Date: 2020-09-02 09:56:28
+ * @FilePath: \construction_management\services\backstage_service.go
+ */
+package services
+
+import (
+	"errors"
+	"log"
+	"net/http"
+	"net/url"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/comm"
+	"go.mod/conf"
+	"go.mod/lib"
+	"go.mod/web/viewmodels"
+)
+
+//定义项目用户Service接口
+type BackstageService interface {
+	ValidRuleLogin(ctx iris.Context) (viewmodels.StaffCld, error)
+	ValidCldStaff(loginData viewmodels.StaffCld, writer http.ResponseWriter) (*viewmodels.ResultCld, error)
+	Out(ctx iris.Context) error
+}
+
+//返回service操作类
+type backstageService struct {
+	// projectAccountDao *dao.ProjectAccountDao
+	// projectDao        *dao.ProjectDao
+}
+
+//创建项目用户service
+func NewBackstageService() BackstageService {
+	return &backstageService{
+		// projectAccountDao: dao.NewProjectAccountDao(datasource.InstanceDbMaster()),
+		// projectDao:        dao.NewProjectDao(datasource.InstanceDbMaster()),
+	}
+}
+
+// 登陆验证
+func (s *backstageService) ValidRuleLogin(ctx iris.Context) (viewmodels.StaffCld, error) {
+	loginVaild := viewmodels.StaffCld{}
+	err := ctx.ReadJSON(&loginVaild)
+	if err != nil {
+		log.Println("ReadForm转换异常, error=", err)
+		return loginVaild, err
+	}
+
+	err = loginVaild.ValidateLogin()
+	if err != nil {
+		log.Println("登录验证, error=", err)
+		return loginVaild, err
+	}
+	return loginVaild, nil
+}
+
+// 验证项目用户登陆相关
+func (s *backstageService) ValidCldStaff(loginData viewmodels.StaffCld, writer http.ResponseWriter) (*viewmodels.ResultCld, error) {
+
+	// 1.验证CLD账号密码
+	cld := lib.NewCld()
+	result, err := cld.LoginValid(loginData)
+	if err != nil {
+		return nil, err
+	}
+	if result.Code != 0 {
+		return nil, errors.New(result.Msg)
+	}
+
+	// 2.写入登录态
+	// 加密用户标识
+	identity, err := comm.AesEncrypt(result.Data.UserName, conf.CookieSecret)
+	if err != nil {
+		return nil, err
+	}
+	// 加密项目标识
+	category, err := comm.AesEncrypt(result.Data.UserName, conf.CookieSecret)
+	if err != nil {
+		return nil, err
+	}
+
+	digitalToken := comm.CreateSign(conf.CookieSecret + identity)
+
+	// 设置cookie
+	maxAge := 60 * 60 * 24 * 7
+	params := url.Values{}
+	params.Add("identity", identity)
+	params.Add("attachedIdentity", category)
+	params.Add("digitalToken", digitalToken)
+	c := &http.Cookie{
+		Name:     "cmBackstage",
+		Value:    params.Encode(),
+		Path:     "/",
+		MaxAge:   maxAge,
+		HttpOnly: true,
+	}
+	http.SetCookie(writer, c)
+
+	return &result.Data, nil
+}
+
+// 登出
+func (s *backstageService) Out(ctx iris.Context) error {
+	// 移除cookie
+	ctx.RemoveCookie("cmBackstage")
+	return nil
+}

+ 1 - 1
services/tree_service.go

@@ -97,7 +97,7 @@ func (s *treeService) GetAllProject(projectId int) *viewmodels.Tree {
 	id, _ := comm.AesEncrypt(strconv.Itoa(0), conf.SignSecret)
 	parentId, _ := comm.AesEncrypt(strconv.Itoa(-1), conf.SignSecret)
 	folder.Id = id
-	folder.Name = "root"
+	folder.Name = "根目录"
 	folder.Isfolder = 1
 	folder.ParentId = parentId
 	folderlist = append(folderlist, folder)

+ 66 - 0
web/backstage/login_bs.go

@@ -0,0 +1,66 @@
+/*
+ * @description: 后台 登陆接口相关
+ * @Author: CP
+ * @Date: 2020-09-17 16:23:02
+ * @FilePath: \construction_management\web\backstage\login_bs.go
+ */
+package backstage
+
+import (
+	"fmt"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/services"
+	"go.mod/web/utils"
+)
+
+type LoginBs struct {
+	//框架-web应用上下文环境
+	Ctx iris.Context
+	// 需要用的service
+	ServiceBackstage services.BackstageService
+}
+
+// @Summary 后台-登录
+// @Description 登录接口
+// @Tags 后台 - 登录/登出
+// @Accept  json
+// @Produce  json
+// @Param   account     body    string     true        "CLD账号" 	default(蔡频)
+// @Param   password     body    string    true        "密码"		default(123456)
+// @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,data:viewmodels.ProjectAccount,msg:}"
+// @Failure 400 {string} string	"{code:-1参数类错误,msg:错误信息}"
+// @Router /backstage/login [post]
+func (c *LoginBs) Post() {
+
+	//验证规则
+	LoginData, err := c.ServiceBackstage.ValidRuleLogin(c.Ctx)
+	if err != nil {
+		ErrMsg := utils.FormValidError(err)
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
+		return
+	}
+	//验证登陆用户
+	Data, err := c.ServiceBackstage.ValidCldStaff(LoginData, c.Ctx.ResponseWriter())
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "",
+		"data": Data,
+	})
+}
+
+// @Summary 后台-登出
+// @Tags 后台 - 登录/登出
+// @Accept  json
+// @Produce  json
+// @Success 200 {string} string	"{code:0,msg:string}"
+// @Failure 400 {string} string "{code:-1,msg:string}"
+// @Router /backstage/out [post]
+func (c *LoginBs) PostOut() {
+	c.ServiceBackstage.Out(c.Ctx)
+	c.Ctx.JSON(iris.Map{"code": 0, "msg": ""})
+}

+ 93 - 0
web/backstage/project_bs.go

@@ -0,0 +1,93 @@
+/*
+ * @description: 后台项目相关
+ * @Author: CP
+ * @Date: 2020-09-23 09:46:21
+ * @FilePath: \construction_management\web\backstage\project_bs.go
+ */
+package backstage
+
+import (
+	"fmt"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/services"
+	"go.mod/web/utils"
+	"go.mod/web/viewmodels"
+)
+
+type ProjectApi struct {
+	//框架-web应用上下文环境
+	Ctx iris.Context
+	// 需要用的service
+	ServiceProject services.ProjectService
+}
+
+// @Summary 获得登陆项目信息
+// @Tags 项目相关
+// @Description 获得登陆项目信息
+// @Accept  json
+// @Produce  json
+// @Security ApiKeyAuth
+// @Success 200 {object} viewmodels.Project "{code:0成功,-1参数类错误,data:viewmodels.ProjectAccount,msg:错误信息}"
+// @Router /api/project [get]
+func (c *ProjectApi) Get() {
+	// 获得项目ID
+	projectIdInt, err := utils.GetProjectId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	// 获得项目信息
+	ProjectData, err := c.ServiceProject.Get(projectIdInt)
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"data": ProjectData,
+		"msg":  fmt.Sprintf("%s", err),
+	})
+	// }
+}
+
+// 保存项目管理员信息
+func (c *ProjectApi) PostSave() {
+	// ErrMsg := ""
+	// // 验证内容
+	// AccountData, err := c.ServiceProjectAccount.ValidRule(c.Ctx)
+	// if err != nil {
+	// 	ErrMsg = utils.FormValidError(err)
+	// 	comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
+	// } else {
+	// 	// 获得更新用户ID
+	// 	id, err := c.Ctx.Values().GetInt("accountId")
+	// 	if err != nil {
+	// 		comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
+	// 	}
+	// 	// 保存信息
+	// 	err = c.ServiceProjectAccount.Save(AccountData, id, 0)
+	// 	if err != nil {
+	// 		comm.Redirect(c.Ctx.ResponseWriter(), "/account?errMsg="+ErrMsg)
+	// 	}
+	// 	comm.Redirect(c.Ctx.ResponseWriter(), "/account?success=修改成功")
+	// }
+}
+
+// 获得多个项目信息--暂无使用
+func (c *ProjectApi) GetList() {
+	// 验证内容
+	ProjectData := viewmodels.Project{}
+	err := c.Ctx.ReadForm(&ProjectData)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{
+			"code": -1,
+			"msg":  "ReadForm转换异常",
+		})
+		return
+	} else {
+		// 获得项目信息
+		dataList := c.ServiceProject.GetList(ProjectData)
+		c.Ctx.JSON(iris.Map{
+			"code": 0,
+			"msg":  "",
+			"data": dataList,
+		})
+	}
+}

+ 8 - 1
web/routes/routes.go

@@ -11,6 +11,7 @@ import (
 	"go.mod/bootstrap"
 	"go.mod/services"
 	"go.mod/web/api"
+	"go.mod/web/backstage"
 	"go.mod/web/controllers"
 	"go.mod/web/middleware"
 )
@@ -33,6 +34,8 @@ func Configure(b *bootstrap.Bootstrapper) {
 	QualityAuditService := services.NewQualityAuditService()
 	ProjectMessageService := services.NewProjectMessageService()
 	VersionService := services.NewVersionService()
+	backstageService := services.NewBackstageService()
+
 	//CSRF相关
 	b.Use(middleware.SetCsrf)
 
@@ -188,8 +191,12 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiDashboard.Register(QualityService)
 	apiDashboard.Register(ProjectMessageService)
 	apiDashboard.Register(VersionService)
-
 	apiDashboard.Router.Use(middleware.SessionsAuth)
 	apiDashboard.Router.Use(middleware.AccessAuth)
 	apiDashboard.Handle(new(api.DashboardApi))
+
+	// 后台相关
+	backstageCM := mvc.New(b.Party("/backstage/login"))
+	backstageCM.Register(backstageService)
+	backstageCM.Handle(new(backstage.LoginBs))
 }

+ 30 - 0
web/viewmodels/backstage.go

@@ -0,0 +1,30 @@
+/*
+ * @description: 后台模板
+ * @Author: CP
+ * @Date: 2021-02-18 10:07:58
+ * @FilePath: \construction_management\web\viewmodels\backstage.go
+ */
+package viewmodels
+
+import (
+	validation "github.com/go-ozzo/ozzo-validation/v3"
+)
+
+type StaffCld struct {
+	Id        string `from:"id" json:"id"`
+	StaffName string `from:"staffName" json:"staffName"`
+	Password  string `from:"password" json:"password"`
+	Category  string `from:"category" json:"category"`
+}
+
+type ResultCld struct {
+	UserName string `from:"username" json:"username"`
+	Category string `from:"category" json:"category"`
+}
+
+func (l StaffCld) ValidateLogin() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.StaffName, validation.Required.Error("CLD账号不能为空")),
+		validation.Field(&l.Password, validation.Required.Error("密码不能为空"), validation.Length(6, 18).Error("密码位数6~18之间")),
+	)
+}