lanjianrong 4 سال پیش
والد
کامیت
55f3299e89
5فایلهای تغییر یافته به همراه158 افزوده شده و 256 حذف شده
  1. 119 109
      services/login_service.go
  2. 0 65
      services/rpc_service.go
  3. 31 3
      web/api/login_api.go
  4. 1 71
      web/routes/routes.go
  5. 7 8
      web/viewmodels/login.go

+ 119 - 109
services/login_service.go

@@ -10,23 +10,26 @@ import (
 	"errors"
 	"log"
 	"net/http"
-	"net/url"
 	"strconv"
+	"time"
 
+	"github.com/iris-contrib/middleware/jwt"
 	"github.com/kataras/iris/v12"
 	"go.mod/comm"
 	"go.mod/conf"
 	"go.mod/dao"
 	"go.mod/datasource"
 	"go.mod/lib"
+	"go.mod/models"
 	"go.mod/web/viewmodels"
 )
 
 //定义项目用户Service接口
 type LoginService interface {
 	ValidRule(ctx iris.Context) (viewmodels.Login, error)
-	ValidProjectAccount(viewmodels.Login, http.ResponseWriter) (*viewmodels.ProjectAccount, error)
+	ValidProjectAccount(viewmodels.Login, http.ResponseWriter) (error, string)
 	Out(ctx iris.Context) error
+	CrtateAccount(viewmodels.Login) error
 }
 
 //返回service操作类
@@ -61,142 +64,149 @@ func (s *loginService) ValidRule(ctx iris.Context) (viewmodels.Login, error) {
 }
 
 // 验证项目用户登陆相关
-func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) (*viewmodels.ProjectAccount, error) {
+// func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) (*viewmodels.ProjectAccount, error) {
 
-	// 1-1.工程项目是否存在
-	projectInfo := s.projectDao.GetCode(loginData.Code)
-	if projectInfo.Id == 0 {
-		return nil, errors.New("工程建设管理员还未创建项目,禁止登录")
-	}
-	// 1-2.获得项目管理员
-	projectAdminInfo := s.projectAccountDao.Get(projectInfo.UserId, projectInfo.Id)
-
-	if projectAdminInfo.Id == 0 {
-		return nil, errors.New("工程建设管理员不存在,禁止登录")
-	}
-
-	// 2.验证登陆-临时
-	projectAccountInfo := s.projectAccountDao.GetAccount(loginData.Account)
-	if projectAccountInfo.Id == 0 {
-		return nil, errors.New("未找到该账号")
-	}
-	// 2.账号停用
-	if projectAccountInfo.Enable == 0 {
-		return nil, errors.New("该账号已被停用")
-	}
-
-	password := comm.CreatePasswordSign(loginData.Password, loginData.Account)
-
-	if projectAccountInfo.Password != password {
-		return nil, errors.New("密码不正确")
-	}
-
-	// 验证密码-TODO
-	Jlzf := lib.NewJlzf()
-	err := Jlzf.LoginValid(loginData)
-	if err != nil {
-		return nil, err
-	}
-
-	// 加密用户标识
-	identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
-	if err != nil {
-		return nil, err
-	}
-	// 加密项目标识
-	projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
-	if err != nil {
-		return nil, err
-	}
+// 	// 1-1.工程项目是否存在
+// 	projectInfo := s.projectDao.GetCode(loginData.Code)
+// 	if projectInfo.Id == 0 {
+// 		return nil, errors.New("工程建设管理员还未创建项目,禁止登录")
+// 	}
+// 	// 1-2.获得项目管理员
+// 	projectAdminInfo := s.projectAccountDao.Get(projectInfo.UserId, projectInfo.Id)
 
-	digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
-
-	// 设置cookie
-	maxAge := 60 * 60 * 24 * 7
-	params := url.Values{}
-	params.Add("identity", identity)
-	params.Add("attachedIdentity", projectId)
-	params.Add("digitalToken", digitalToken)
-	c := &http.Cookie{
-		Name:     "cm",
-		Value:    params.Encode(),
-		Path:     "/",
-		MaxAge:   maxAge,
-		HttpOnly: true,
-	}
-	http.SetCookie(writer, c)
+// 	if projectAdminInfo.Id == 0 {
+// 		return nil, errors.New("工程建设管理员不存在,禁止登录")
+// 	}
 
-	// TODO--分布式会话--后续需要在加入
+// 2.验证登陆-临时
+// 	projectAccountInfo := s.projectAccountDao.GetAccount(loginData.Account)
+// 	if projectAccountInfo.Id == 0 {
+// 		return nil, errors.New("未找到该账号")
+// 	}
+// 	// 2.账号停用
+// 	if projectAccountInfo.Enable == 0 {
+// 		return nil, errors.New("该账号已被停用")
+// 	}
 
-	viewAccountData := comm.MakeProjectAccountVM(projectAccountInfo)
-	return &viewAccountData, nil
-}
+// 	password := comm.CreatePasswordSign(loginData.Password, loginData.Account)
 
-// TODO -替换jwt
-// 验证项目用户登陆相关
-// func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) error {
-// 	projectInfo := models.CmProject{}
-// 	// 工程项目是否存在
-// 	projectInfo.Code = loginData.Code
-// 	s.projectDao.Get(&projectInfo)
-// 	if projectInfo.Id == 0 {
-// 		return errors.New("工程建设管理员还未创建项目,禁止登录")
-// 	}
-// 	// 获得项目用户
-// 	projectAccountInfo := s.projectAccountDao.Get(projectInfo.UserId, projectInfo.Id)
-// 	if projectAccountInfo.Id == 0 {
-// 		return errors.New("工程建设管理员不存在,禁止登录")
+// 	if projectAccountInfo.Password != password {
+// 		return nil, errors.New("密码不正确")
 // 	}
+
 // 	// 验证密码-TODO
 // 	Jlzf := lib.NewJlzf()
 // 	err := Jlzf.LoginValid(loginData)
 // 	if err != nil {
-// 		return err
+// 		return nil, err
 // 	}
 
 // 	// 加密用户标识
 // 	identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
 // 	if err != nil {
-// 		return err
+// 		return nil, err
 // 	}
 // 	// 加密项目标识
 // 	projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
 // 	if err != nil {
-// 		return err
+// 		return nil, err
 // 	}
-// 	// jwt token
-// 	token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
-// 		// 根据需求,可以存一些必要的数据
-// 		"identity": identity,
-// 		"project":  projectId,
-// 		// 签发人
-// 		"iss": "cm",
-// 		// 签发时间
-// 		"iat": time.Now().Unix(),
-// 		// 设定过期时间,便于测试,设置7天过期
-// 		"exp": time.Now().Add(72 * time.Hour * time.Duration(1)).Unix(),
-// 	})
-
-// 	// 使用设置的秘钥,签名生成jwt字符串
-// 	tokenString, _ := token.SignedString([]byte(conf.SignSecret))
-// 	fmt.Println(tokenString)
+
+// 	digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
+
+// 	// 设置cookie
 // 	maxAge := 60 * 60 * 24 * 7
-// 	// params := url.Values{}
-// 	// params.Add("token", tokenString)
+// 	params := url.Values{}
+// 	params.Add("identity", identity)
+// 	params.Add("attachedIdentity", projectId)
+// 	params.Add("digitalToken", digitalToken)
 // 	c := &http.Cookie{
-// 		Name:   "cm",
-// 		Value:  tokenString, //params.Encode(),
-// 		Path:   "/",
-// 		MaxAge: maxAge,
-// 		//HttpOnly: true,
+// 		Name:     "cm",
+// 		Value:    params.Encode(),
+// 		Path:     "/",
+// 		MaxAge:   maxAge,
+// 		HttpOnly: true,
 // 	}
 // 	http.SetCookie(writer, c)
 
 // 	// TODO--分布式会话--后续需要在加入
 
-// 	return nil
+// 	viewAccountData := comm.MakeProjectAccountVM(projectAccountInfo)
+// 	return &viewAccountData, nil
 // }
 
+func (s *loginService) CrtateAccount(loginData viewmodels.Login) error {
+	newPsw := comm.CreatePasswordSign(loginData.Password, loginData.Account)
+	account := &models.CmProjectAccount{Account: loginData.Account, Password: newPsw}
+
+	err := s.projectAccountDao.Add(account)
+
+	return err
+}
+
+// TODO -替换jwt
+// 验证项目用户登陆相关
+func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer http.ResponseWriter) (error, string) {
+	// projectInfo := models.CmProject{}
+	// 工程项目是否存在
+	// projectInfo.Code = loginData.Code
+	// s.projectDao.Get(&projectInfo)
+	// if projectInfo.Id == 0 {
+	// return errors.New("工程建设管理员还未创建项目,禁止登录")
+	// }
+	// 获得项目用户
+	projectAccountInfo := s.projectAccountDao.GetAccount(loginData.Account)
+	if projectAccountInfo.Id == 0 {
+		return errors.New("账号/密码不正确"), ""
+	}
+	// 验证密码-TODO
+	Jlzf := lib.NewJlzf()
+	err := Jlzf.LoginValid(loginData)
+	if err != nil {
+		return err, ""
+	}
+
+	// 加密用户标识
+	identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
+	if err != nil {
+		return err, ""
+	}
+	// 加密项目标识
+	// projectId, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.ProjectId), conf.CookieSecret)
+	// if err != nil {
+	// 	return err
+	// }
+	// jwt token
+	token := jwt.NewTokenWithClaims(jwt.SigningMethodHS256, jwt.MapClaims{
+		// 根据需求,可以存一些必要的数据
+		"identity": identity,
+		// 签发人
+		"iss": "cm",
+		// 签发时间
+		"iat": time.Now().Unix(),
+		// 设定过期时间,便于测试,设置7天过期
+		"exp": time.Now().Add(72 * time.Hour * time.Duration(1)).Unix(),
+	})
+
+	// 使用设置的秘钥,签名生成jwt字符串
+	tokenString, _ := token.SignedString([]byte(conf.SignSecret))
+	// maxAge := 60 * 60 * 24 * 7
+	// params := url.Values{}
+	// params.Add("token", tokenString)
+	// c := &http.Cookie{
+	// 	Name:   "cm",
+	// 	Value:  tokenString, //params.Encode(),
+	// 	Path:   "/",
+	// 	MaxAge: maxAge,
+	// 	//HttpOnly: true,
+	// }
+	// http.SetCookie(writer, c)
+
+	// TODO--分布式会话--后续需要在加入
+
+	return nil, tokenString
+}
+
 // 登出
 func (s *loginService) Out(ctx iris.Context) error {
 	// 作废jwt token

+ 0 - 65
services/rpc_service.go

@@ -1,65 +0,0 @@
-/*
- * @description: rpc services 实例
- * @Author: CP
- * @Date: 2020-11-12 22:53:14
- * @FilePath: \construction_management\services\rpc_service.go
- */
-package services
-
-import (
-	"context"
-	"log"
-	"time"
-
-	safe "go.mod/proto"
-	"google.golang.org/grpc"
-)
-
-type RpcService interface {
-	Test(RpcConnect *grpc.ClientConn)
-}
-
-//返回service操作类
-type rpcService struct {
-	// address     string
-	// defaultName string
-	//Ctx iris.Context
-	//rpcClient *grpc.ClientConn
-	// 定义proto 接口文件- /proto/rpc.proto
-	// pb.UnimplementedGreeterServer
-}
-
-//创建项目用户service
-func NewRpcService() RpcService {
-	return &rpcService{
-		// address:     "192.168.1.26:5001",
-		//rpcClient: GetGrpcClient(ctx),
-	}
-}
-
-// func GetGrpcClient(ctx iris.Context) *grpc.ClientConn {
-// 	// // 启动grpc客户端,连接grpc服务端
-// 	// conn, err := grpc.Dial(address, grpc.WithInsecure())
-// 	// if err != nil {
-// 	// 	log.Fatalf("did not connect: %v", err)
-// 	// }
-// 	// // defer conn.Close()
-// 	// return conn
-// }
-
-// 具体的业务逻辑
-func (s *rpcService) Test(RpcConnect *grpc.ClientConn) {
-	// 1.结束后关闭
-	//defer s.rpcClient.Close()
-
-	rpcClient := safe.NewGreeterClient(RpcConnect)
-	// c := pb.NewGreeterClient(conn)
-
-	ctx, cancel := context.WithTimeout(context.Background(), time.Second)
-	defer cancel()
-	r, err := rpcClient.SayHello(ctx, &safe.HelloRequest{Name: "caipin"})
-	if err != nil {
-		log.Fatalf("could not greet: %v", err)
-	}
-	log.Printf("Greeting: %s", r.GetMessage())
-}

+ 31 - 3
web/api/login_api.go

@@ -29,7 +29,6 @@ type LoginApi struct {
 // @Tags 登录/登出
 // @Accept  json
 // @Produce  json
-// @Param   code     	body    string     true        "项目编号" 	default(234)
 // @Param   account     body    string     true        "项目账号" 	default(caipin)
 // @Param   password     body    string    true        "密码"		default(123456)
 // @Success 200 {object} viewmodels.ProjectAccount "{code:0成功,data:viewmodels.ProjectAccount,msg:}"
@@ -45,7 +44,7 @@ func (c *LoginApi) Post() {
 		return
 	}
 	//验证登陆用户
-	Data, err := c.ServiceLogin.ValidProjectAccount(LoginData, c.Ctx.ResponseWriter())
+	err, token := c.ServiceLogin.ValidProjectAccount(LoginData, c.Ctx.ResponseWriter())
 	if err != nil {
 		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
 		return
@@ -53,7 +52,7 @@ func (c *LoginApi) Post() {
 	c.Ctx.JSON(iris.Map{
 		"code": 0,
 		"msg":  "",
-		"data": Data,
+		"data": token,
 	})
 }
 
@@ -119,3 +118,32 @@ func (c *LoginApi) GetProjectName() {
 // 	// 返回
 // 	c.Ctx.JSON(tokenString)
 // }
+
+// @Summary 登录
+// @Description 登录接口
+// @Tags 创建账号
+// @Accept  json
+// @Produce  json
+// @Param   account     body    string     true        "项目账号" 	default(caipin)
+// @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 /api/login/create/acount [post]
+func (c *LoginApi) PostCreateAccount() {
+	//验证规则
+	LoginData, err := c.ServiceLogin.ValidRule(c.Ctx)
+	if err != nil {
+		ErrMsg := utils.FormValidError(err)
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": ErrMsg})
+		return
+	}
+	err = c.ServiceLogin.CrtateAccount(LoginData)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{"code": -1, "msg": fmt.Sprintf("%s", err)})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "",
+	})
+}

+ 1 - 71
web/routes/routes.go

@@ -11,8 +11,6 @@ import (
 	"go.mod/bootstrap"
 	"go.mod/services"
 	"go.mod/web/api"
-	"go.mod/web/backstage"
-	"go.mod/web/middleware"
 )
 
 func Configure(b *bootstrap.Bootstrapper) {
@@ -24,15 +22,9 @@ func Configure(b *bootstrap.Bootstrapper) {
 	BidsectionService := services.NewBidsectionService()
 	BidAccountService := services.NewBidAccountService()
 	ContractService := services.NewContractService()
-	// RpcService := services.NewRpcService()
-
-	RuleService := services.NewRuleService()
-	AnnexService := services.NewAnnexService()
-
-	backstageService := services.NewBackstageService()
 
 	//CSRF相关
-	b.Use(middleware.SetCsrf)
+	// b.Use(middleware.SetCsrf)
 
 	//b.Party("/", protect)
 	//protect := NewCsrf()
@@ -41,30 +33,17 @@ func Configure(b *bootstrap.Bootstrapper) {
 	// 接口相关
 	// 登陆接口
 	apiLogin := mvc.New(b.Party("/api/login"))
-	apiLogin.Register(ProjectAccountService)
 	apiLogin.Register(LoginService)
-	apiLogin.Register(ProjectService)
 	apiLogin.Handle(new(api.LoginApi))
 
-	// 项目相关接口
-	apiProject := mvc.New(b.Party("/api/project"))
-	apiProject.Register(ProjectService)
-	apiProject.Router.Use(middleware.SessionsAuth)
-	apiProject.Router.Use(middleware.AccessAuth)
-	apiProject.Handle(new(api.ProjectApi))
-
 	// 项目账号相关接口
 	apiProjectAccount := mvc.New(b.Party("/api/projectAccount"))
 	apiProjectAccount.Register(ProjectAccountService)
-	apiProjectAccount.Router.Use(middleware.SessionsAuth)
-	apiProjectAccount.Router.Use(middleware.AccessAuth)
 	apiProjectAccount.Handle(new(api.ProjectAccountApi))
 
 	// 标段相关接口
 	apiBidsection := mvc.New(b.Party("/api/bidsection"))
 	apiBidsection.Register(BidsectionService)
-	apiBidsection.Router.Use(middleware.SessionsAuth)
-	apiBidsection.Router.Use(middleware.AccessAuth)
 	apiBidsection.Handle(new(api.BidsectionApi))
 
 	// 项目设置接口
@@ -72,15 +51,11 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiSetting.Register(ProjectAccountService)
 	apiSetting.Register(ProjectService)
 	apiSetting.Register(BidAccountService)
-	apiSetting.Router.Use(middleware.SessionsAuth)
-	apiSetting.Router.Use(middleware.AccessAuth)
 	apiSetting.Handle(new(api.ProjectSettingApi))
 
 	// TreeNode相关接口
 	apiTree := mvc.New(b.Party("/api/tree"))
 	apiTree.Register(TreeService)
-	apiTree.Router.Use(middleware.SessionsAuth)
-	apiTree.Router.Use(middleware.AccessAuth)
 	apiTree.Handle(new(api.TreeApi))
 
 	// 合同管理
@@ -88,55 +63,10 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiContract.Register(TreeService)
 	apiContract.Register(ContractService)
 	// 中间件
-	apiContract.Router.Use(middleware.SessionsAuth)
-	apiContract.Router.Use(middleware.AccessAuth)
 	apiContract.Handle(new(api.ContractApi))
 
 	// oss相关
 	apiOss := mvc.New(b.Party("/api/oss"))
-	apiOss.Router.Use(middleware.SessionsAuth)
-	apiOss.Router.Use(middleware.AccessAuth)
 	apiOss.Handle(new(api.OssApi))
 
-	// rpc相关
-	// rpc := mvc.New(b.Party("/api/rpc/test"))
-	// rpc.Register(RpcService)
-	// rpc.Router.Use(middleware.SessionsAuth)
-	// rpc.Router.Use(middleware.AccessAuth)
-	// rpc.Handle(new(api.RpcApi))
-
-	// safe
-
-	// rule
-	apiRule := mvc.New(b.Party("/api/rule"))
-	apiRule.Register(RuleService)
-	apiRule.Router.Use(middleware.SessionsAuth)
-	apiRule.Router.Use(middleware.AccessAuth)
-	apiRule.Handle(new(api.RuleApi))
-
-	// file
-	apiAnnex := mvc.New(b.Party("/api/file"))
-	apiAnnex.Register(AnnexService)
-	apiAnnex.Router.Use(middleware.SessionsAuth)
-	apiAnnex.Router.Use(middleware.AccessAuth)
-	apiAnnex.Handle(new(api.AnnexApi))
-
-	// 后台相关
-	backstageCM := mvc.New(b.Party("/backstage/login"))
-	backstageCM.Register(backstageService)
-	backstageCM.Handle(new(backstage.LoginBs))
-
-	backstageProjectCM := mvc.New(b.Party("/backstage/project"))
-	backstageProjectCM.Register(ProjectService)
-	backstageProjectCM.Register(backstageService)
-	backstageProjectCM.Router.Use(middleware.SessionsBackstageAuth)
-	backstageProjectCM.Handle(new(backstage.ProjectBs))
-
-	backstageAccountCM := mvc.New(b.Party("/backstage/account"))
-	backstageAccountCM.Register(ProjectAccountService)
-	backstageAccountCM.Register(ProjectService)
-	backstageAccountCM.Register(BidAccountService)
-	backstageAccountCM.Register(backstageService)
-	backstageAccountCM.Router.Use(middleware.SessionsBackstageAuth)
-	backstageAccountCM.Handle(new(backstage.ProjectAccountBs))
 }

+ 7 - 8
web/viewmodels/login.go

@@ -9,17 +9,16 @@ package viewmodels
 import validation "github.com/go-ozzo/ozzo-validation/v3"
 
 type Login struct {
-	Code     string `form:"code" json:"code"`
+	// Code     string `form:"code" json:"code"`
 	Account  string `form:"account" json:"account"`
 	Password string `form:"password" json:"password"`
-	Csrf     string `form:"csrf" json:"csrf"`
+	// Csrf     string `form:"csrf" json:"csrf"`
 }
 
 func (l Login) Validate() error {
-	return validation.ValidateStruct(&l,
-		// Code cannot be empty, and the length must between 5 and 50
-		validation.Field(&l.Code, validation.Required.Error("项目编号不能为空"), validation.Length(3, 50).Error("项目编号最少要输入 3 个字符")),
-		validation.Field(&l.Account, validation.Required.Error("账号不能为空"), validation.Length(2, 50).Error("账号最少要输入 3 个字符")),
-		validation.Field(&l.Password, validation.Required.Error("密码不能为空"), validation.Length(6, 50).Error("密码最少要输入 6 个字符")),
-	)
+	return validation.ValidateStruct(&l)// Code cannot be empty, and the length must between 5 and 50
+	// validation.Field(&l.Code, validation.Required.Error("项目编号不能为空"), validation.Length(3, 50).Error("项目编号最少要输入 3 个字符")),
+	// validation.Field(&l.Account, validation.Required.Error("账号不能为空"), validation.Length(2, 50).Error("账号最少要输入 3 个字符")),
+	// validation.Field(&l.Password, validation.Required.Error("密码不能为空"), validation.Length(6, 50).Error("密码最少要输入 6 个字符")),
+
 }