Browse Source

项目账号接口

caipin 4 years ago
parent
commit
e1661c8ba1

+ 67 - 0
dao/tree_dao.go

@@ -7,6 +7,10 @@
 package dao
 
 import (
+	"errors"
+	"strconv"
+	"strings"
+
 	"github.com/go-xorm/xorm"
 	"go.mod/models"
 )
@@ -36,6 +40,7 @@ func (d *TreeDao) Get(id int) *models.CmTree {
 	}
 }
 
+// 获得该目录下的标段
 func (d *TreeDao) GetBidsection(id int) []models.CmTree {
 	datalist := make([]models.CmTree, 0)
 	err := d.engine.
@@ -65,6 +70,68 @@ func (d *TreeDao) GetAllDepth(depth int, projectId int) []models.CmTree {
 	}
 }
 
+// 获得该目录下所有的目录和标段
+func (d *TreeDao) GetFolderAndBid(projectId int, attribution string) []models.CmTree {
+	datalist := make([]models.CmTree, 0)
+	err := d.engine.
+		Asc("serial").
+		Where("project_id=? and attribution like ?", projectId, attribution+"%").
+		Find(&datalist)
+	if err != nil {
+		return datalist
+	} else {
+		return datalist
+	}
+}
+
+// 删除目录以及下属目录所有数据
+func (d *TreeDao) DeleteFolderAndBid(id int, projectId int, attribution string) error {
+
+	session := d.engine.NewSession()
+	defer session.Close()
+	err := session.Begin()
+	if err != nil {
+		return errors.New("删除出错-db")
+	}
+
+	// 删除树结构中 目录和资源
+	data := &models.CmTree{Isdelete: 1}
+	_, err = session.
+		Where("id=? or (project_id=? and attribution like ?)", id, projectId, attribution+"%").
+		Update(data)
+	if err != nil {
+		session.Rollback()
+		return errors.New("删除目录出错")
+	}
+
+	// 获得已删除不是目录的资源
+	datalist := make([]models.CmTree, 0)
+	err = d.engine.
+		Where("project_id=? and isdelete=1 and isfolder=0", projectId).
+		Find(&datalist)
+	// 删除标段
+	if len(datalist) > 0 {
+		idList := []string{}
+		for _, bidData := range datalist {
+			idList = append(idList, strconv.Itoa(bidData.Id))
+		}
+		inId := strings.Join(idList, ",")
+		_, err = session.Exec("UPDATE from cm_tender SET `isdelete` = 1 where id in (?)", inId)
+		if err != nil {
+			session.Rollback()
+			return errors.New("删除标段出错")
+		}
+	}
+
+	err = session.Commit()
+	if err != nil {
+		session.Rollback()
+		return errors.New("删除出错-db")
+	}
+
+	return nil
+}
+
 // 获得项目文件夹
 func (d *TreeDao) GetAllTree(projectId int) []models.CmTree {
 	datalist := make([]models.CmTree, 0)

+ 1 - 0
models/cm_tree.go

@@ -14,6 +14,7 @@ type CmTree struct {
 	Isfolder    int       `xorm:"not null default 1 comment('是否文件夹 1文件夹 0其他') TINYINT(1)"`
 	TenderId    int       `xorm:"comment('标段ID') INT(11)"`
 	ParentId    int       `xorm:"not null default 0 comment('父级ID') INT(11)"`
+	Isdelete    int       `xorm:"not null default 0 comment('1删除') TINYINT(1)"`
 	CreateTime  time.Time `xorm:"comment('创建时间') DATETIME"`
 	UpdateTime  time.Time `xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') TIMESTAMP"`
 }

+ 1 - 1
services/login_service.go

@@ -103,7 +103,7 @@ func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer ht
 		"iss": "cm",
 		// 签发时间
 		"iat": time.Now().Unix(),
-		// 设定过期时间,便于测试,设置1分钟过期
+		// 设定过期时间,便于测试,设置7天过期
 		"exp": time.Now().Add(72 * time.Hour * time.Duration(1)).Unix(),
 	})
 

+ 53 - 9
services/tree_service.go

@@ -29,23 +29,25 @@ type TreeService interface {
 	ValidRule(ctx iris.Context) (viewmodels.Tree, error)
 	Create(data viewmodels.Tree) error
 	GetAllProject(int) *viewmodels.Tree
-	Rename(data viewmodels.Tree) error
+	Rename(viewmodels.Tree) error
+	GetFolderAndBid(string) ([]models.CmTree, error)
+	DeleteFolderAndBid(string) error
 }
 
 //返回service操作类
-type foldertService struct {
+type treeService struct {
 	dao *dao.TreeDao
 }
 
 //创建项目service
 func NewTreeService() TreeService {
-	return &foldertService{
+	return &treeService{
 		dao: dao.NewTreeDao(datasource.InstanceDbMaster()),
 	}
 }
 
 // 文件夹规则验证
-func (s *foldertService) ValidRule(ctx iris.Context) (viewmodels.Tree, error) {
+func (s *treeService) ValidRule(ctx iris.Context) (viewmodels.Tree, error) {
 	folderVaild := viewmodels.Tree{}
 	err := ctx.ReadForm(&folderVaild)
 	if err != nil {
@@ -62,8 +64,8 @@ func (s *foldertService) ValidRule(ctx iris.Context) (viewmodels.Tree, error) {
 	return folderVaild, nil
 }
 
-// 获得项目文件夹相关
-func (s *foldertService) GetAllProject(projectId int) *viewmodels.Tree {
+// 获得项目下 相关文件夹-整个树结构
+func (s *treeService) GetAllProject(projectId int) *viewmodels.Tree {
 
 	datalist := s.dao.GetAllTree(projectId)
 	folderlist := make([]viewmodels.Tree, 0)
@@ -109,7 +111,7 @@ func (s *foldertService) GetAllProject(projectId int) *viewmodels.Tree {
 }
 
 // 新增一个文件夹
-func (s *foldertService) Create(data viewmodels.Tree) error {
+func (s *treeService) Create(data viewmodels.Tree) error {
 	// 类型校验
 	folder := models.CmTree{}
 	folder.Name = data.Name
@@ -132,7 +134,6 @@ func (s *foldertService) Create(data viewmodels.Tree) error {
 	bidlist := s.dao.GetBidsection(IdInt)
 	if len(bidlist) > 0 {
 		return errors.New("该文件夹已存在标段,不能在新增目录")
-
 	}
 
 	// 获得该深度的文件夹最大序号
@@ -168,7 +169,7 @@ func (s *foldertService) Create(data viewmodels.Tree) error {
 }
 
 // 重命名
-func (s *foldertService) Rename(data viewmodels.Tree) error {
+func (s *treeService) Rename(data viewmodels.Tree) error {
 	// 获得该目录ID
 	Id, err := comm.AesDecrypt(data.Id, conf.SignSecret)
 	if err != nil {
@@ -189,6 +190,49 @@ func (s *foldertService) Rename(data viewmodels.Tree) error {
 	return nil
 }
 
+// 获得该目录下所有的目录和标段
+func (s *treeService) GetFolderAndBid(id string) ([]models.CmTree, error) {
+	// 获得该目录ID
+	id, err := comm.AesDecrypt(id, conf.SignSecret)
+	if err != nil {
+		return nil, errors.New("目录解析错误")
+	}
+	IdInt, err := strconv.Atoi(id)
+	if err != nil {
+		return nil, errors.New("目录解析错误")
+	}
+	// 获得该目录下所有数据
+	folder := s.dao.Get(IdInt)
+	attribution := fmt.Sprintf("%s%d-", folder.Attribution, folder.Serial)
+	// 获得目录归属
+	dataList := s.dao.GetFolderAndBid(folder.ProjectId, attribution)
+	return dataList, nil
+}
+
+// 删除该目录和所属的目录和标段
+func (s *treeService) DeleteFolderAndBid(id string) error {
+	// 获得该目录ID
+	id, err := comm.AesDecrypt(id, conf.SignSecret)
+	if err != nil {
+		return errors.New("目录解析错误")
+	}
+	IdInt, err := strconv.Atoi(id)
+	if err != nil {
+		return errors.New("目录解析错误")
+	}
+	// 获得该目录下 归属关系
+	folder := s.dao.Get(IdInt)
+	attribution := fmt.Sprintf("%s%d-", folder.Attribution, folder.Serial)
+	// --逻辑删除 目录和数据
+	err = s.dao.DeleteFolderAndBid(folder.Id, folder.ProjectId, attribution)
+	if err != nil {
+		return err
+	}
+	// TODO -加入堆栈 物理删除数据
+
+	return nil
+}
+
 // 创建一颗树
 func maketree(Data []*viewmodels.Tree, node *viewmodels.Tree) { //参数为父节点,添加父节点的子节点指针切片
 	childs, _ := havechild(Data, node) //判断节点是否有子节点并返回

+ 43 - 0
web/api/project_account_api.go

@@ -0,0 +1,43 @@
+/*
+ * @description: 项目账号相关
+ * @Author: CP
+ * @Date: 2020-09-25 14:42:31
+ * @FilePath: \construction_management\web\api\project_account_api.go
+ */
+package api
+
+import (
+	"github.com/kataras/iris/v12"
+	"go.mod/services"
+	"go.mod/web/utils"
+)
+
+type ProjectAccountApi struct {
+	//框架-web应用上下文环境
+	Ctx iris.Context
+	// 需要用的service
+	ServiceProjectAccount services.ProjectAccountService
+}
+
+// 获得项目账号相关信息
+func (c *ProjectAccountApi) Get() {
+
+	// 获得项目ID
+	projectAccountIdInt, err := utils.GetProjectAccountId(c.Ctx)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{
+			"code": -1,
+			"msg":  err,
+		})
+		return
+	}
+
+	// 获得层级文件夹
+	AccountData := c.ServiceProjectAccount.Get(projectAccountIdInt)
+
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "",
+		"data": AccountData,
+	})
+}

+ 30 - 6
web/api/tree_api.go

@@ -19,8 +19,7 @@ type TreeApi struct {
 	//框架-web应用上下文环境
 	Ctx iris.Context
 	// 需要用的service
-	ServiceProject services.ProjectService
-	ServiceTree    services.TreeService
+	ServiceTree services.TreeService
 }
 
 // 获得项目目录结构
@@ -100,7 +99,7 @@ func (c *TreeApi) PostRename() {
 		})
 		return
 	} else {
-		// 新增文件夹
+		// 重命名
 		err = c.ServiceTree.Rename(FolderData)
 		if err != nil {
 			c.Ctx.JSON(iris.Map{
@@ -117,10 +116,35 @@ func (c *TreeApi) PostRename() {
 }
 
 // 删除目录,需要删除树结构下的目录以及叶子
-func (c *TreeApi) DeleteDelete() {
+func (c *TreeApi) Delete() {
 	// 获得需要删除数据
+	// api/tree/{id:int min(1)}
+	//id := c.Ctx.Params().Get("id")
+	id := c.Ctx.URLParam("id")
+	// 获得该目录下所有的目录和标段
+	// treeData, err := c.ServiceTree.GetFolderAndBid(id)
+	// if err != nil {
+	// 	c.Ctx.JSON(iris.Map{
+	// 		"code": -1,
+	// 		"msg":  fmt.Sprintf("%s", err),
+	// 	})
+	// 	return
+	// }
+	// fmt.Println(treeData)
+	// 添加锁
 
-	// 逻辑删除
+	// 删除目录以及标段
+	err := c.ServiceTree.DeleteFolderAndBid(id)
+	if err != nil {
+		c.Ctx.JSON(iris.Map{
+			"code": -1,
+			"msg":  fmt.Sprintf("%s", err),
+		})
+		return
+	}
+	c.Ctx.JSON(iris.Map{
+		"code": 0,
+		"msg":  "删除成功",
+	})
 
-	// 加入删除任务堆栈,定时任务删除
 }

+ 6 - 1
web/routes/routes.go

@@ -75,7 +75,6 @@ func Configure(b *bootstrap.Bootstrapper) {
 	// TreeNode相关接口
 	apiTree := mvc.New(b.Party("/api/tree"))
 	apiTree.Register(TreeService)
-	apiTree.Register(ProjectService)
 	apiTree.Router.Use(middleware.JwtAuth().Serve)
 	apiTree.Handle(new(api.TreeApi))
 
@@ -84,4 +83,10 @@ func Configure(b *bootstrap.Bootstrapper) {
 	apiProject.Register(ProjectService)
 	apiProject.Router.Use(middleware.JwtAuth().Serve)
 	apiProject.Handle(new(api.ProjectApi))
+
+	// 项目账号相关接口
+	apiProjectAccount := mvc.New(b.Party("/api/projectAccount"))
+	apiProjectAccount.Register(ProjectAccountService)
+	apiProjectAccount.Router.Use(middleware.JwtAuth().Serve)
+	apiProjectAccount.Handle(new(api.ProjectAccountApi))
 }

+ 15 - 0
web/utils/utils.go

@@ -42,3 +42,18 @@ func GetProjectId(ctx iris.Context) (int, error) {
 	}
 	return projectIdInt, nil
 }
+
+// 获得项目账号ID
+func GetProjectAccountId(ctx iris.Context) (int, error) {
+	jwtInfo := ctx.Values().Get("jwt").(*jwt.Token)
+	identity := jwtInfo.Claims.(jwt.MapClaims)["identity"].(string)
+	identityId, err := comm.AesDecrypt(identity, conf.CookieSecret)
+	if err != nil {
+		return 0, errors.New("项目账号不存在")
+	}
+	identityIdInt, err := strconv.Atoi(identityId)
+	if err != nil {
+		return 0, errors.New("项目账号不存在")
+	}
+	return identityIdInt, nil
+}

+ 42 - 5
工程项目管理.postman_collection.json

@@ -135,7 +135,7 @@
 						"header": [
 							{
 								"key": "Authorization",
-								"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDA5Mjg2ODQsImlhdCI6MTYwMDY2OTQ4NCwiaWRlbnRpdHkiOiI1R0lWLVdIZm15aDNnUXhEU0VCVk5BIiwiaXNzIjoiY20iLCJwcm9qZWN0IjoiZG5sUE5sWjN6SFFVSHBQOVBUTXNldyJ9.emddRhE_urzFWi6I90Au919Ev30NQFKXLpdw6glyRSY",
+								"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDExOTIyMjIsImlhdCI6MTYwMDkzMzAyMiwiaWRlbnRpdHkiOiI1R0lWLVdIZm15aDNnUXhEU0VCVk5BIiwiaXNzIjoiY20iLCJwcm9qZWN0IjoiZG5sUE5sWjN6SFFVSHBQOVBUTXNldyJ9.EED4JZVPhbMesnFp8zYgXqSIoKLzAb64WZHQtOLiFIU",
 								"type": "text"
 							}
 						],
@@ -151,7 +151,7 @@
 							]
 						},
 						"url": {
-							"raw": "http://cm.com/api/tree/delete",
+							"raw": "http://cm.com/api/tree?id=kC6bASCprQcl27Xsssgqzw",
 							"protocol": "http",
 							"host": [
 								"cm",
@@ -159,8 +159,13 @@
 							],
 							"path": [
 								"api",
-								"tree",
-								"delete"
+								"tree"
+							],
+							"query": [
+								{
+									"key": "id",
+									"value": "kC6bASCprQcl27Xsssgqzw"
+								}
 							]
 						}
 					},
@@ -173,7 +178,7 @@
 			"name": "项目相关",
 			"item": [
 				{
-					"name": "获得项目相关信息",
+					"name": "获得一个项目相关信息",
 					"protocolProfileBehavior": {
 						"disableBodyPruning": true
 					},
@@ -253,6 +258,38 @@
 			"protocolProfileBehavior": {}
 		},
 		{
+			"name": "账号相关",
+			"item": [
+				{
+					"name": "获得一个账号信息",
+					"request": {
+						"method": "GET",
+						"header": [
+							{
+								"key": "Authorization",
+								"value": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2MDEyNzcxMDAsImlhdCI6MTYwMTAxNzkwMCwiaWRlbnRpdHkiOiI1R0lWLVdIZm15aDNnUXhEU0VCVk5BIiwiaXNzIjoiY20iLCJwcm9qZWN0IjoiZG5sUE5sWjN6SFFVSHBQOVBUTXNldyJ9.s8rmnOghfJoEZHhahR9SMGoX10bgaLZfMe5zd55pfh0",
+								"type": "text"
+							}
+						],
+						"url": {
+							"raw": "http://cm.com/api/projectAccount",
+							"protocol": "http",
+							"host": [
+								"cm",
+								"com"
+							],
+							"path": [
+								"api",
+								"projectAccount"
+							]
+						}
+					},
+					"response": []
+				}
+			],
+			"protocolProfileBehavior": {}
+		},
+		{
 			"name": "项目用户登陆",
 			"request": {
 				"method": "POST",