浏览代码

新增文件夹

caipin 4 年之前
父节点
当前提交
b2664be7c9
共有 35 个文件被更改,包括 13159 次插入289 次删除
  1. 10 9
      comm/functions.go
  2. 15 0
      models/cm_folder.go
  3. 2 2
      models/cm_maintain.go
  4. 1 1
      models/cm_manager.go
  5. 2 2
      models/cm_permission.go
  6. 0 6
      models/cm_project_account.go
  7. 30 0
      models/cm_tender.go
  8. 115 0
      services/folder_service.go
  9. 5 1
      services/login_service.go
  10. 4 1
      services/project_account_service.go
  11. 32 0
      web/controllers/contract.go
  12. 7 0
      web/controllers/project.go
  13. 23 4
      web/controllers/project_bidsection.go
  14. 38 0
      web/controllers/project_folder.go
  15. 9 1
      web/middleware/sessions.go
  16. 11 0
      web/public/static/css/bootstrap/bootstrapValidator.min.css
  17. 13 0
      web/public/static/js/bootstrap/validator/bootstrapValidator.min.js
  18. 357 0
      web/public/static/js/bootstrap/validator/zh_CN.js
  19. 4 0
      web/public/static/js/jquery/jquery.validate.min.js
  20. 4 0
      web/public/static/js/jquery/messages_zh.min.js
  21. 11965 0
      web/public/static/vue/vue.js
  22. 1 0
      web/public/static/vue/vuelidate.min.js
  23. 13 5
      web/routes/routes.go
  24. 26 0
      web/viewmodels/folder.go
  25. 1 1
      web/viewmodels/project_account.go
  26. 113 0
      web/views/contract/index.html
  27. 17 0
      web/views/contract/layout.html
  28. 1 4
      web/views/head/comm_foot_js.html
  29. 10 3
      web/views/head/comm_head.html
  30. 21 8
      web/views/head/comm_nav.html
  31. 3 5
      web/views/project/account/setting.html
  32. 283 226
      web/views/project/bidsection/manage.html
  33. 9 5
      web/views/project/index.html
  34. 1 0
      web/views/project/layout.html
  35. 13 5
      web/views/project/menu.html

+ 10 - 9
comm/functions.go

@@ -72,10 +72,10 @@ func CreateSign(str string) string {
 }
 
 // 对一个字符串进行加密
-func Encrypt(key, text []byte) ([]byte, error) {
+func Encrypt(key, text []byte) (string, error) {
 	block, err := aes.NewCipher(key)
 	if err != nil {
-		return nil, err
+		return "", err
 	}
 	b := base64.StdEncoding.EncodeToString(text)
 	ciphertext := make([]byte, aes.BlockSize+len(b))
@@ -85,7 +85,8 @@ func Encrypt(key, text []byte) ([]byte, error) {
 	//}
 	cfb := cipher.NewCFBEncrypter(block, iv)
 	cfb.XORKeyStream(ciphertext[aes.BlockSize:], []byte(b))
-	return ciphertext, nil
+
+	return base64.RawURLEncoding.EncodeToString(ciphertext), nil
 }
 
 // 对一个字符串进行解密
@@ -109,7 +110,7 @@ func Decrypt(key, text []byte) ([]byte, error) {
 }
 
 // 加密
-func AesEncrypt(orig string, key string) string {
+func AesEncrypt(orig string, key string) (string, error) {
 	// 转成字节数组
 	origData := []byte(orig)
 	k := []byte(key)
@@ -117,7 +118,7 @@ func AesEncrypt(orig string, key string) string {
 	// 分组秘钥
 	block, err := aes.NewCipher(k)
 	if err != nil {
-		panic(fmt.Sprintf("key 长度必须 16/24/32长度: %s", err.Error()))
+		return "", err
 	}
 	// 获取秘钥块的长度
 	blockSize := block.BlockSize()
@@ -131,12 +132,12 @@ func AesEncrypt(orig string, key string) string {
 	blockMode.CryptBlocks(cryted, origData)
 	//使用RawURLEncoding 不要使用StdEncoding
 	//不要使用StdEncoding  放在url参数中回导致错误
-	return base64.RawURLEncoding.EncodeToString(cryted)
+	return base64.RawURLEncoding.EncodeToString(cryted), nil
 
 }
 
 // 解密
-func AesDecrypt(cryted string, key string) string {
+func AesDecrypt(cryted string, key string) (string, error) {
 	//使用RawURLEncoding 不要使用StdEncoding
 	//不要使用StdEncoding  放在url参数中回导致错误
 	crytedByte, _ := base64.RawURLEncoding.DecodeString(cryted)
@@ -145,7 +146,7 @@ func AesDecrypt(cryted string, key string) string {
 	// 分组秘钥
 	block, err := aes.NewCipher(k)
 	if err != nil {
-		panic(fmt.Sprintf("key 长度必须 16/24/32长度: %s", err.Error()))
+		return "", err
 	}
 	// 获取秘钥块的长度
 	blockSize := block.BlockSize()
@@ -157,7 +158,7 @@ func AesDecrypt(cryted string, key string) string {
 	blockMode.CryptBlocks(orig, crytedByte)
 	// 去补全码
 	orig = PKCS7UnPadding(orig)
-	return string(orig)
+	return string(orig), nil
 }
 
 //补码

+ 15 - 0
models/cm_folder.go

@@ -0,0 +1,15 @@
+package models
+
+import (
+	"time"
+)
+
+type CmFolder struct {
+	Id         int       `xorm:"not null pk autoincr comment('自增ID') INT(11)"`
+	Name       string    `xorm:"not null comment('名称') VARCHAR(64)"`
+	ProjectId  int       `xorm:"comment('项目ID') INT(11)"`
+	TenderId   int       `xorm:"comment('标段ID') INT(11)"`
+	ParentId   int       `xorm:"not null default 0 comment('父级ID') INT(11)"`
+	CreateTime time.Time `xorm:"comment('创建时间') DATETIME"`
+	UpdateTime time.Time `xorm:"not null default 'CURRENT_TIMESTAMP' comment('更新时间') TIMESTAMP"`
+}

+ 2 - 2
models/cm_maintain.go

@@ -3,7 +3,7 @@ package models
 type CmMaintain struct {
 	Id           int    `xorm:"not null pk autoincr INT(11)"`
 	MaintainTime string `xorm:"not null comment('维护时间') VARCHAR(32)"`
-	Duration     int    `xorm:"not null comment('维护时长') TINYINT(4)"`
+	Duration     int    `xorm:"not null default 2 comment('维护时长') TINYINT(4)"`
 	Msg          string `xorm:"not null comment('维护内容') VARCHAR(255)"`
-	Status       int    `xorm:"not null comment('维护状态,0:未设置,1:未开始,2:进行中') TINYINT(4)"`
+	Status       int    `xorm:"not null default 0 comment('维护状态,0:未设置,1:未开始,2:进行中') TINYINT(4)"`
 }

+ 1 - 1
models/cm_manager.go

@@ -14,7 +14,7 @@ type CmManager struct {
 	Telephone  string    `xorm:"comment('联系电话(CLD字段)') VARCHAR(11)"`
 	LoginIp    string    `xorm:"comment('登录ip') VARCHAR(12)"`
 	Token      string    `xorm:"not null comment('随机token') VARCHAR(32)"`
-	CanLogin   int       `xorm:"default 1 comment('是否可登录') TINYINT(4)"`
+	CanLogin   int       `xorm:"default 1 comment('是否可登录') TINYINT(1)"`
 	Office     int       `xorm:"default 12 comment('办事处id(CLD字段)') INT(11)"`
 	Category   string    `xorm:"comment('办事处名称(CLD字段)') VARCHAR(32)"`
 	Email      string    `xorm:"comment('邮箱(CLD字段)') VARCHAR(255)"`

+ 2 - 2
models/cm_permission.go

@@ -1,12 +1,12 @@
 package models
 
 type CmPermission struct {
-	Id         int    `xorm:"not null pk autoincr INT(11)"`
+	Id         int    `xorm:"not null pk INT(11)"`
 	Name       string `xorm:"not null comment('权限名称') VARCHAR(32)"`
 	Controller string `xorm:"comment('控制器名称') VARCHAR(32)"`
 	Action     string `xorm:"comment('action名称') VARCHAR(32)"`
 	Pid        int    `xorm:"not null comment('父ID') INT(11)"`
 	IconClass  string `xorm:"comment('图标类名') VARCHAR(32)"`
-	Isshow     int    `xorm:"not null comment('是否展示该权限') TINYINT(4)"`
 	CreateTime int    `xorm:"comment('创建时间') INT(11)"`
+	Isshow     int    `xorm:"not null default 1 comment('是否展示该权限') TINYINT(4)"`
 }

+ 0 - 6
models/cm_project_account.go

@@ -1,9 +1,3 @@
-/*
- * @description:
- * @Author: CP
- * @Date: 2020-08-31 15:51:48
- * @FilePath: \construction_management\models\cm_project_account.go
- */
 package models
 
 import (

+ 30 - 0
models/cm_tender.go

@@ -0,0 +1,30 @@
+package models
+
+import (
+	"time"
+)
+
+type CmTender struct {
+	Id           int       `xorm:"not null pk autoincr comment('自增ID') INT(11)"`
+	Name         string    `xorm:"comment('名称') VARCHAR(128)"`
+	Status       int       `xorm:"comment('状态') TINYINT(1)"`
+	ProjectId    int       `xorm:"comment('项目id') INT(11)"`
+	UserId       int       `xorm:"comment('用户id') INT(11)"`
+	CreateTime   time.Time `xorm:"comment('创建时间') DATETIME"`
+	Category     string    `xorm:"comment('分类属性') VARCHAR(1024)"`
+	Type         int       `xorm:"comment('标段类型') TINYINT(2)"`
+	LedgerTimes  int       `xorm:"not null default 0 comment('台账审批次数') TINYINT(4)"`
+	LedgerStatus int       `xorm:"not null default 1 comment('台账审批状态') TINYINT(4)"`
+	MRule        string    `xorm:"VARCHAR(1024)"`
+	Times        int       `xorm:"comment('审批次数') TINYINT(4)"`
+	CRule        string    `xorm:"comment('变更令-规则') VARCHAR(1024)"`
+	CConnector   int       `xorm:"comment('变更令-连接符') TINYINT(4)"`
+	CRuleFirst   int       `xorm:"comment('变更令规则第一次出现') TINYINT(1)"`
+	MeasureType  string    `xorm:"VARCHAR(11)"`
+	SImType      string    `xorm:"comment('期,中间计量,模式') VARCHAR(11)"`
+	Cooperation  string    `xorm:"comment('协作人员和功能列表') TEXT"`
+	Valuation    int       `xorm:"comment('计价规范') TINYINT(4)"`
+	TotalPrice   string    `xorm:"comment('0号台账 -- 金额') DECIMAL(12,2)"`
+	DealTp       string    `xorm:"comment('签约 -- 金额') DECIMAL(12,2)"`
+	Uuid         string    `xorm:"comment('更新时间') VARCHAR(64)"`
+}

+ 115 - 0
services/folder_service.go

@@ -0,0 +1,115 @@
+/*
+ * @description:层级文件夹数据操作相关
+ * @Author: CP
+ * @Date: 2020-09-11 14:43:58
+ * @FilePath: \construction_management\services\folder_service.go
+ */
+package services
+
+import (
+	"log"
+	"strconv"
+	"time"
+
+	"github.com/kataras/iris/v12"
+	"go.mod/comm"
+	"go.mod/conf"
+	"go.mod/dao"
+	"go.mod/datasource"
+	"go.mod/models"
+	"go.mod/web/viewmodels"
+)
+
+//定义项目Service接口
+type FoldertService interface {
+	//ValidManager(code string, account string, password string) error
+	ValidRule(ctx iris.Context) (viewmodels.Folder, error)
+	Create(data viewmodels.Folder) error
+	GetAllProject(int) []viewmodels.Folder
+}
+
+//返回service操作类
+type foldertService struct {
+	dao *dao.FolderDao
+}
+
+//创建项目service
+func NewFoldertService() FoldertService {
+	return &foldertService{
+		dao: dao.NewFolderDao(datasource.InstanceDbMaster()),
+	}
+}
+
+// 文件夹规则验证
+func (s *foldertService) ValidRule(ctx iris.Context) (viewmodels.Folder, error) {
+	folderVaild := viewmodels.Folder{}
+	err := ctx.ReadForm(&folderVaild)
+	if err != nil {
+		log.Println("folder-ValidRule-ReadForm转换异常, error=", err)
+		return folderVaild, err
+	}
+
+	err = folderVaild.Validate()
+	if err != nil {
+		log.Println("文件夹验证, error=", err)
+		return folderVaild, err
+	}
+
+	return folderVaild, nil
+}
+
+// 获得项目文件夹相关
+func (s *foldertService) GetAllProject(projectId int) []viewmodels.Folder {
+
+	datalist := s.dao.GetAllProject(projectId)
+	folderlist := make([]viewmodels.Folder, 0)
+
+	for _, data := range datalist {
+		folder := viewmodels.Folder{}
+		//folder.Id = comm.Encrypt([]byte(conf.SignSecret), []byte(strconv.Itoa(data.Id)))
+		id, _ := comm.AesEncrypt(strconv.Itoa(data.Id), conf.SignSecret)
+		parentId, _ := comm.AesEncrypt(strconv.Itoa(data.ParentId), conf.SignSecret)
+		projectId, _ := comm.AesEncrypt(strconv.Itoa(data.ProjectId), conf.SignSecret)
+		folder.Id = id
+		folder.Name = data.Name
+		folder.ParentId = parentId
+		folder.ProjectId = projectId
+		folderlist = append(folderlist, folder)
+	}
+
+	return folderlist
+}
+
+// 新增一个文件夹
+func (s *foldertService) Create(data viewmodels.Folder) error {
+	//now := comm.NowUnix()
+	//comm.FormatFromUnixTime(now)
+	folder := models.CmFolder{}
+	folder.Name = data.Name
+	ProjectId, err := strconv.Atoi(data.ProjectId)
+	if err != nil {
+		return err
+	}
+
+	ParentIdInt := 0
+	if data.ParentId != "" {
+		ParentId, err := comm.AesDecrypt(data.ParentId, conf.SignSecret)
+		if err != nil {
+			return err
+		}
+		ParentIdInt, err = strconv.Atoi(ParentId)
+		if err != nil {
+			ParentIdInt = 0
+		}
+	}
+
+	folder.ProjectId = ProjectId
+	folder.ParentId = ParentIdInt
+	folder.CreateTime = time.Now()
+	folder.UpdateTime = time.Now()
+	err = s.dao.Create(&folder)
+	if err != nil {
+		return err
+	}
+	return nil
+}

+ 5 - 1
services/login_service.go

@@ -81,8 +81,12 @@ func (s *loginService) ValidProjectAccount(loginData viewmodels.Login, writer ht
 		return err
 	}
 	// 加密用户标识 生成数字证书
-	identity := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
+	identity, err := comm.AesEncrypt(strconv.Itoa(projectAccountInfo.Id), conf.CookieSecret)
+	if err != nil {
+		return err
+	}
 	digitalToken := comm.CreateSign(conf.CookieSecret + strconv.Itoa(projectAccountInfo.Id))
+
 	// 设置cookie
 	maxAge := 60 * 60 * 24 * 7
 	params := url.Values{}

+ 4 - 1
services/project_account_service.go

@@ -47,8 +47,11 @@ func (s *projectAccountService) Get(id int) *viewmodels.ProjectAccount {
 		viewAccountData.Id = "0"
 		return &viewAccountData
 	}
-	aesId := comm.AesEncrypt(strconv.Itoa(modelsAccount.Id), conf.SignSecret)
+
+	aesId, _ := comm.AesEncrypt(strconv.Itoa(modelsAccount.Id), conf.SignSecret)
+	aesProjectId, _ := comm.AesEncrypt(strconv.Itoa(modelsAccount.ProjectId), conf.SignSecret)
 	viewAccountData.Id = aesId
+	viewAccountData.ProjectId = aesProjectId
 	viewAccountData.Account = modelsAccount.Account
 	viewAccountData.Name = modelsAccount.Name
 	viewAccountData.Company = modelsAccount.Company

+ 32 - 0
web/controllers/contract.go

@@ -0,0 +1,32 @@
+/*
+ * @description:合同管理相关
+ * @Author: CP
+ * @Date: 2020-09-09 17:50:48
+ * @FilePath: \construction_management\web\controllers\contract.go
+ */
+package controllers
+
+import (
+	"github.com/kataras/iris/v12"
+	"github.com/kataras/iris/v12/mvc"
+)
+
+type ContractController struct {
+	//框架-web应用上下文环境
+	Ctx iris.Context
+	// 需要用的service
+	//ServiceProject services.ProjectService
+}
+
+// 标段首页
+func (c *ContractController) Get() mvc.Result {
+	return mvc.View{
+		Name: "contract/index.html",
+		Data: iris.Map{
+			"Title":   "合同管理",
+			"Channel": "contract",
+			"Action":  "contract",
+		},
+		Layout: "contract/layout.html",
+	}
+}

+ 7 - 0
web/controllers/project.go

@@ -1,3 +1,9 @@
+/*
+ * @description:
+ * @Author: CP
+ * @Date: 2020-09-04 14:54:24
+ * @FilePath: \construction_management\web\controllers\project.go
+ */
 package controllers
 
 import (
@@ -11,6 +17,7 @@ type ProjectController struct {
 	Ctx iris.Context
 	// 需要用的service
 	ServiceProject services.ProjectService
+	ServiceFolder  services.FoldertService
 }
 
 // 项目信息设置

+ 23 - 4
web/controllers/project_bidsection.go

@@ -1,3 +1,9 @@
+/*
+ * @description:项目-标段相关
+ * @Author: CP
+ * @Date: 2020-09-09 17:34:56
+ * @FilePath: \construction_management\web\controllers\project_bidsection.go
+ */
 package controllers
 
 import (
@@ -7,13 +13,26 @@ import (
 
 // 项目-标段管理
 func (c *ProjectController) GetBidsectionManage() mvc.Result {
+
+	// 获得层级文件夹
+	projectId, err := c.Ctx.Values().GetInt("projectId")
+	if err != nil {
+		projectId = 0
+	}
+
+	FolderData := c.ServiceFolder.GetAllProject(projectId)
+	// 获得标段
+
+	// 层级文件夹
+
 	return mvc.View{
 		Name: "project/bidsection/manage.html",
 		Data: iris.Map{
-			"Title":   "标段管理",
-			"Channel": "project",
-			"Action":  "project",
-			"Menu":    "bidsectionManage",
+			"Title":      "标段管理",
+			"Channel":    "project",
+			"Action":     "/project/bidsection/",
+			"Menu":       "bidsectionManage",
+			"FolderData": FolderData,
 		},
 		Layout: "project/layout.html",
 	}

+ 38 - 0
web/controllers/project_folder.go

@@ -0,0 +1,38 @@
+/*
+ * @description:标段-文件夹相关
+ * @Author: CP
+ * @Date: 2020-09-09 17:34:56
+ * @FilePath: \construction_management\web\controllers\project_folder.go
+ */
+package controllers
+
+import (
+	"strconv"
+
+	"go.mod/comm"
+	"go.mod/web/utils"
+)
+
+// 标段-添加文件夹
+func (c *ProjectController) PostBidsectionFolderAdd() {
+	ErrMsg := ""
+	// 验证内容
+	FolderData, err := c.ServiceFolder.ValidRule(c.Ctx)
+	if err != nil {
+		ErrMsg = utils.FormValidError(err)
+		comm.Redirect(c.Ctx.ResponseWriter(), "/project/bidsection/manage?errMsg="+ErrMsg)
+	} else {
+		// 设置项目ID
+		projectId, err := c.Ctx.Values().GetInt("projectId")
+		if err != nil {
+			comm.Redirect(c.Ctx.ResponseWriter(), "/project/bidsection/manage?errMsg=项目不存在")
+		}
+		FolderData.ProjectId = strconv.Itoa(projectId)
+		// 新增文件夹
+		err = c.ServiceFolder.Create(FolderData)
+		if err != nil {
+			comm.Redirect(c.Ctx.ResponseWriter(), "/project/bidsection/manage?errMsg="+ErrMsg)
+		}
+		comm.Redirect(c.Ctx.ResponseWriter(), "/project/bidsection/manage?success=新增成功")
+	}
+}

+ 9 - 1
web/middleware/sessions.go

@@ -29,7 +29,10 @@ func SessionsAuth(ctx iris.Context) {
 	}
 
 	// 解密用户标识
-	identity := comm.AesDecrypt(params.Get("identity"), conf.CookieSecret)
+	identity, err := comm.AesDecrypt(params.Get("identity"), conf.CookieSecret)
+	if err != nil {
+		comm.Redirect(ctx.ResponseWriter(), "/login")
+	}
 	digitalToken := comm.CreateSign(conf.CookieSecret + identity)
 
 	// 获得用户信息--TODO 存放redis
@@ -43,6 +46,11 @@ func SessionsAuth(ctx iris.Context) {
 		comm.Redirect(ctx.ResponseWriter(), "/login")
 	}
 	ctx.Values().Set("accountId", identity)
+	projectId, err := comm.AesDecrypt(accountInfo.ProjectId, conf.SignSecret)
+	if err != nil {
+		comm.Redirect(ctx.ResponseWriter(), "/login")
+	}
+	ctx.Values().Set("projectId", projectId)
 	// 设置viewData
 	ctx.ViewData("Account", accountInfo)
 	// npaDao := dao.NewProjectAccountDao(datasource.InstanceDbMaster())

+ 11 - 0
web/public/static/css/bootstrap/bootstrapValidator.min.css

@@ -0,0 +1,11 @@
+/*!
+ * BootstrapValidator (http://bootstrapvalidator.com)
+ * The best jQuery plugin to validate form fields. Designed to use with Bootstrap 3
+ *
+ * @version     v0.5.2, built on 2014-09-25 4:01:07 PM
+ * @author      https://twitter.com/nghuuphuoc
+ * @copyright   (c) 2013 - 2014 Nguyen Huu Phuoc
+ * @license     MIT
+ */
+
+.bv-form .help-block{margin-bottom:0}.bv-form .tooltip-inner{text-align:left}.nav-tabs li.bv-tab-success>a{color:#3c763d}.nav-tabs li.bv-tab-error>a{color:#a94442}.bv-form .bv-icon-no-label{top:0}.bv-form .bv-icon-input-group{top:0;z-index:100}

文件差异内容过多而无法显示
+ 13 - 0
web/public/static/js/bootstrap/validator/bootstrapValidator.min.js


+ 357 - 0
web/public/static/js/bootstrap/validator/zh_CN.js

@@ -0,0 +1,357 @@
+(function ($) {
+    /**
+     * Simplified Chinese language package
+     * Translated by @shamiao
+     */
+    $.fn.bootstrapValidator.i18n = $.extend(true, $.fn.bootstrapValidator.i18n, {
+        base64: {
+            'default': '请输入有效的Base64编码'
+        },
+        between: {
+            'default': '请输入在 %s 和 %s 之间的数值',
+            notInclusive: '请输入在 %s 和 %s 之间(不含两端)的数值'
+        },
+        callback: {
+            'default': '请输入有效的值'
+        },
+        choice: {
+            'default': '请输入有效的值',
+            less: '请至少选中 %s 个选项',
+            more: '最多只能选中 %s 个选项',
+            between: '请选择 %s 至 %s 个选项'
+        },
+        creditCard: {
+            'default': '请输入有效的信用卡号码'
+        },
+        cusip: {
+            'default': '请输入有效的美国CUSIP代码'
+        },
+        cvv: {
+            'default': '请输入有效的CVV代码'
+        },
+        date: {
+            'default': '请输入有效的日期'
+        },
+        different: {
+            'default': '请输入不同的值'
+        },
+        digits: {
+            'default': '请输入有效的数字'
+        },
+        ean: {
+            'default': '请输入有效的EAN商品编码'
+        },
+        emailAddress: {
+            'default': '请输入有效的邮件地址'
+        },
+        file: {
+            'default': '请选择有效的文件'
+        },
+        greaterThan: {
+            'default': '请输入大于等于 %s 的数值',
+            notInclusive: '请输入大于 %s 的数值'
+        },
+        grid: {
+            'default': '请输入有效的GRId编码'
+        },
+        hex: {
+            'default': '请输入有效的16进制数'
+        },
+        hexColor: {
+            'default': '请输入有效的16进制颜色值'
+        },
+        iban: {
+            'default': '请输入有效的IBAN(国际银行账户)号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的IBAN(国际银行账户)号码',
+            countries: {
+                AD: '安道​​尔',
+                AE: '阿联酋',
+                AL: '阿尔巴尼亚',
+                AO: '安哥拉',
+                AT: '奥地利',
+                AZ: '阿塞拜疆',
+                BA: '波斯尼亚和黑塞哥维那',
+                BE: '比利时',
+                BF: '布基纳法索',
+                BG: '保加利亚',
+                BH: '巴林',
+                BI: '布隆迪',
+                BJ: '贝宁',
+                BR: '巴西',
+                CH: '瑞士',
+                CI: '科特迪瓦',
+                CM: '喀麦隆',
+                CR: '哥斯达黎加',
+                CV: '佛得角',
+                CY: '塞浦路斯',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                DO: '多米尼加共和国',
+                DZ: '阿尔及利亚',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                FO: '法罗群岛',
+                FR: '法国',
+                GB: '英国',
+                GE: '格鲁吉亚',
+                GI: '直布罗陀',
+                GL: '格陵兰岛',
+                GR: '希腊',
+                GT: '危地马拉',
+                HR: '克罗地亚',
+                HU: '匈牙利',
+                IE: '爱尔兰',
+                IL: '以色列',
+                IR: '伊朗',
+                IS: '冰岛',
+                IT: '意大利',
+                JO: '约旦',
+                KW: '科威特',
+                KZ: '哈萨克斯坦',
+                LB: '黎巴嫩',
+                LI: '列支敦士登',
+                LT: '立陶宛',
+                LU: '卢森堡',
+                LV: '拉脱维亚',
+                MC: '摩纳哥',
+                MD: '摩尔多瓦',
+                ME: '黑山',
+                MG: '马达加斯加',
+                MK: '马其顿',
+                ML: '马里',
+                MR: '毛里塔尼亚',
+                MT: '马耳他',
+                MU: '毛里求斯',
+                MZ: '莫桑比克',
+                NL: '荷兰',
+                NO: '挪威',
+                PK: '巴基斯坦',
+                PL: '波兰',
+                PS: '巴勒斯坦',
+                PT: '葡萄牙',
+                QA: '卡塔尔',
+                RO: '罗马尼亚',
+                RS: '塞尔维亚',
+                SA: '沙特阿拉伯',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                SM: '圣马力诺',
+                SN: '塞内加尔',
+                TN: '突尼斯',
+                TR: '土耳其',
+                VG: '英属维尔京群岛'
+            }
+        },
+        id: {
+            'default': '请输入有效的身份证件号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的身份证件号码',
+            countries: {
+                BA: '波黑',
+                BG: '保加利亚',
+                BR: '巴西',
+                CH: '瑞士',
+                CL: '智利',
+                CN: '中国',
+                CZ: '捷克共和国',
+                DK: '丹麦',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                HR: '克罗地亚',
+                IE: '爱尔兰',
+                IS: '冰岛',
+                LT: '立陶宛',
+                LV: '拉脱维亚',
+                ME: '黑山',
+                MK: '马其顿',
+                NL: '荷兰',
+                RO: '罗马尼亚',
+                RS: '塞尔维亚',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                SM: '圣马力诺',
+                TH: '泰国',
+                ZA: '南非'
+            }
+        },
+        identical: {
+            'default': '请输入相同的值'
+        },
+        imei: {
+            'default': '请输入有效的IMEI(手机串号)'
+        },
+        imo: {
+            'default': '请输入有效的国际海事组织(IMO)号码'
+        },
+        integer: {
+            'default': '请输入有效的整数值'
+        },
+        ip: {
+            'default': '请输入有效的IP地址',
+            ipv4: '请输入有效的IPv4地址',
+            ipv6: '请输入有效的IPv6地址'
+        },
+        isbn: {
+            'default': '请输入有效的ISBN(国际标准书号)'
+        },
+        isin: {
+            'default': '请输入有效的ISIN(国际证券编码)'
+        },
+        ismn: {
+            'default': '请输入有效的ISMN(印刷音乐作品编码)'
+        },
+        issn: {
+            'default': '请输入有效的ISSN(国际标准杂志书号)'
+        },
+        lessThan: {
+            'default': '请输入小于等于 %s 的数值',
+            notInclusive: '请输入小于 %s 的数值'
+        },
+        mac: {
+            'default': '请输入有效的MAC物理地址'
+        },
+        meid: {
+            'default': '请输入有效的MEID(移动设备识别码)'
+        },
+        notEmpty: {
+            'default': '请填写必填项目'
+        },
+        numeric: {
+            'default': '请输入有效的数值,允许小数'
+        },
+        phone: {
+            'default': '请输入有效的电话号码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的电话号码',
+            countries: {
+                BR: '巴西',
+                CN: '中国',
+                CZ: '捷克共和国',
+                DK: '丹麦',
+                ES: '西班牙',
+                FR: '法国',
+                GB: '英国',
+                MA: '摩洛哥',
+                PK: '巴基斯坦',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                SK: '斯洛伐克',
+                TH: '泰国',
+                US: '美国',
+                VE: '委内瑞拉'
+            }
+        },
+        regexp: {
+            'default': '请输入符合正则表达式限制的值'
+        },
+        remote: {
+            'default': '请输入有效的值'
+        },
+        rtn: {
+            'default': '请输入有效的RTN号码'
+        },
+        sedol: {
+            'default': '请输入有效的SEDOL代码'
+        },
+        siren: {
+            'default': '请输入有效的SIREN号码'
+        },
+        siret: {
+            'default': '请输入有效的SIRET号码'
+        },
+        step: {
+            'default': '请输入在基础值上,增加 %s 的整数倍的数值'
+        },
+        stringCase: {
+            'default': '只能输入小写字母',
+            upper: '只能输入大写字母'
+        },
+        stringLength: {
+            'default': '请输入符合长度限制的值',
+            less: '最多只能输入 %s 个字符',
+            more: '需要输入至少 %s 个字符',
+            between: '请输入 %s 至 %s 个字符'
+        },
+        uri: {
+            'default': '请输入一个有效的URL地址'
+        },
+        uuid: {
+            'default': '请输入有效的UUID',
+            version: '请输入版本 %s 的UUID'
+        },
+        vat: {
+            'default': '请输入有效的VAT(税号)',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的VAT(税号)',
+            countries: {
+                AT: '奥地利',
+                BE: '比利时',
+                BG: '保加利亚',
+                BR: '巴西',
+                CH: '瑞士',
+                CY: '塞浦路斯',
+                CZ: '捷克共和国',
+                DE: '德国',
+                DK: '丹麦',
+                EE: '爱沙尼亚',
+                ES: '西班牙',
+                FI: '芬兰',
+                FR: '法语',
+                GB: '英国',
+                GR: '希腊',
+                EL: '希腊',
+                HU: '匈牙利',
+                HR: '克罗地亚',
+                IE: '爱尔兰',
+                IS: '冰岛',
+                IT: '意大利',
+                LT: '立陶宛',
+                LU: '卢森堡',
+                LV: '拉脱维亚',
+                MT: '马耳他',
+                NL: '荷兰',
+                NO: '挪威',
+                PL: '波兰',
+                PT: '葡萄牙',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                RS: '塞尔维亚',
+                SE: '瑞典',
+                SI: '斯洛文尼亚',
+                SK: '斯洛伐克',
+                VE: '委内瑞拉',
+                ZA: '南非'
+            }
+        },
+        vin: {
+            'default': '请输入有效的VIN(美国车辆识别号码)'
+        },
+        zipCode: {
+            'default': '请输入有效的邮政编码',
+            countryNotSupported: '不支持 %s 国家或地区',
+            country: '请输入有效的 %s 国家或地区的邮政编码',
+            countries: {
+                BR: '巴西',
+                CA: '加拿大',
+                CZ: '捷克共和国',
+                DK: '丹麦',
+                GB: '英国',
+                IT: '意大利',
+                MA: '摩洛哥',
+                NL: '荷兰',
+                RO: '罗马尼亚',
+                RU: '俄罗斯',
+                SE: '瑞典',
+                SG: '新加坡',
+                SK: '斯洛伐克',
+                US: '美国'
+            }
+        }
+    });
+}(window.jQuery));

文件差异内容过多而无法显示
+ 4 - 0
web/public/static/js/jquery/jquery.validate.min.js


文件差异内容过多而无法显示
+ 4 - 0
web/public/static/js/jquery/messages_zh.min.js


文件差异内容过多而无法显示
+ 11965 - 0
web/public/static/vue/vue.js


文件差异内容过多而无法显示
+ 1 - 0
web/public/static/vue/vuelidate.min.js


+ 13 - 5
web/routes/routes.go

@@ -19,6 +19,7 @@ func Configure(b *bootstrap.Bootstrapper) {
 	ProjectAccountService := services.NewProjectAccountService()
 	LoginService := services.NewLoginService()
 	ProjectService := services.NewProjectService()
+	FolderService := services.NewFoldertService()
 	//CSRF相关
 	b.Use(middleware.SetCsrf)
 
@@ -37,11 +38,11 @@ func Configure(b *bootstrap.Bootstrapper) {
 	todo.Router.Use(middleware.SessionsAuth)
 	todo.Handle(new(controllers.TodoController))
 
-	//标段相关
-	bidsection := mvc.New(b.Party("/bidsection"))
-	bidsection.Register(ProjectService)
-	bidsection.Router.Use(middleware.SessionsAuth)
-	bidsection.Handle(new(controllers.BidsectionController))
+	// 合同管理
+	contract := mvc.New(b.Party("/contract"))
+	contract.Router.Use(middleware.SessionsAuth)
+	contract.Handle(new(controllers.ContractController))
+	// 安全巡检
 
 	//用户相关
 	account := mvc.New(b.Party("/account"))
@@ -52,6 +53,13 @@ func Configure(b *bootstrap.Bootstrapper) {
 	// 项目相关
 	project := mvc.New(b.Party("/project"))
 	project.Router.Use(middleware.SessionsAuth)
+	project.Register(FolderService)
+	project.Register(ProjectService)
 	project.Handle(new(controllers.ProjectController))
 
+	//标段相关
+	bidsection := mvc.New(b.Party("/bidsection"))
+	bidsection.Register(ProjectService)
+	bidsection.Router.Use(middleware.SessionsAuth)
+	bidsection.Handle(new(controllers.BidsectionController))
 }

+ 26 - 0
web/viewmodels/folder.go

@@ -0,0 +1,26 @@
+/*
+ * @description: 视图层 文件夹 models
+ * @Author: CP
+ * @Date: 2020-09-11 15:12:43
+ * @FilePath: \construction_management\web\viewmodels\folder.go
+ */
+package viewmodels
+
+import validation "github.com/go-ozzo/ozzo-validation/v3"
+
+type Folder struct {
+	Id         string `form:"id"`
+	Name       string `form:"name"`
+	ProjectId  string `form:"projectId"`
+	TenderId   int    `form:"tenderId"`
+	ParentId   string `form:"parentId"`
+	CreateTime string `form:"createTime"`
+	UpdateTime string `form:"updateTime"`
+	Csrf       string `form:"csrf"`
+}
+
+func (l Folder) Validate() error {
+	return validation.ValidateStruct(&l,
+		validation.Field(&l.Name, validation.Required.Error("文件夹名称不能为空"), validation.Length(1, 15).Error("最多 15 个字符")),
+	)
+}

+ 1 - 1
web/viewmodels/project_account.go

@@ -10,7 +10,7 @@ import validation "github.com/go-ozzo/ozzo-validation/v3"
 
 type ProjectAccount struct {
 	Id        string `form:"id"`
-	ProjectId int    `form:"projectid"`
+	ProjectId string `form:"projectid"`
 	Account   string `form:"account"`
 	Name      string `form:"name"`
 	Company   string `form:"company"`

+ 113 - 0
web/views/contract/index.html

@@ -0,0 +1,113 @@
+<div class="main-panel">
+    <div class="panel-content">
+      <div class="panel-title fluid">
+        <div class="title-main  d-flex justify-content-between">
+          <div>
+            <div class="d-inline-block mr-2">
+              <!--展开/收起-->
+              <div class="btn-group">
+                <button type="button" class="btn btn-sm btn-light text-primary dropdown-toggle" data-toggle="dropdown"
+                  id="zhankai">展开/收起</button>
+                <div class="dropdown-menu" aria-labelledby="zhankai">
+                  <a class="dropdown-item" href="#">展开所有</a>
+                  <a class="dropdown-item" href="#">收起所有</a>
+                </div>
+              </div>
+            </div>
+          </div>
+          <div>
+
+          </div>
+        </div>
+      </div>
+      <div class="content-wrap">
+        <div class="sjs-height-0">
+          <div class="c-body">
+            <!--没有标段数据-->
+            <!-- <div class="jumbotron">
+              <h3 class="display-6">还没有标段数据</h3>
+            </div> -->
+            <!--标段概况-->
+            <table class="table table-hover table-bordered">
+              <thead class="text-center">
+                <th>名称</th>
+                <th>合同总数</th>
+                <th>收入合同金额</th>
+                <th>结算进度</th>
+                <th>支出合同金额</th>
+                <th>结算进度</th>
+              </thead>
+              <tr>
+                <td class="in-1"><span class="fold-switch mr-1" title="展开"><i class="fal fa-plus-square"></i></span><i
+                    class="fal fa-folder"></i>&nbsp;文件夹1</td>
+                <td class="text-right">20</td>
+                <td class="text-right">0.00</td>
+                <td class="text-center">0%</td>
+                <td class="text-right">0.00</td>
+                <td class="text-center">0%</td>
+              </tr>
+              <tr>
+                <td class="in-1"><span class="fold-switch mr-1" title="收起"><i
+                      class="fal fa-minus-square"></i></span><i class="fal fa-folder-open"></i>&nbsp;文件夹2</td>
+                <td class="text-right">30</td>
+                <td class="text-right">60000.00</td>
+                <td class="text-center">56%</td>
+                <td class="text-right">20000.00</td>
+                <td class="text-center">20%</td>
+              </tr>
+              <tr>
+                <td class="in-2"><span class="fold-switch mr-1" title="收起"><i
+                      class="fal fa-minus-square"></i></span><i class="fal fa-folder-open"></i>&nbsp;文件夹2.1</td>
+                <td class="text-right">20</td>
+                <td class="text-right">40000.00</td>
+                <td class="text-center">36%</td>
+                <td class="text-right">10000.00</td>
+                <td class="text-center">10%</td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">├</span><a href="hetong-list.html">WWUJ-1</a></td>
+                <td class="text-right">10</td>
+                <td class="text-right">30000.00</td>
+                <td class="text-center">16%</td>
+                <td class="text-right">7000.00</td>
+                <td class="text-center">4%</td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">└</span><a href="hetong-list.html">WWUJ-4</a></td>
+                <td class="text-right">10</td>
+                <td class="text-right">10000.00</td>
+                <td class="text-center">20%</td>
+                <td class="text-right">3000.00</td>
+                <td class="text-center">7%</td>
+              </tr>
+              <tr>
+                <td class="in-2"><span class="fold-switch mr-1" title="收起"><i
+                      class="fal fa-minus-square"></i></span><i class="fal fa-folder-open"></i>&nbsp;文件夹2.2</td>
+                <td class="text-right">20</td>
+                <td class="text-right">20000.00</td>
+                <td class="text-center">20%</td>
+                <td class="text-right">10000.00</td>
+                <td class="text-center">10%</td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">├</span><a href="hetong-list.html">WWUJ-2</a></td>
+                <td class="text-right">10</td>
+                <td class="text-right">15000.00</td>
+                <td class="text-center">15%</td>
+                <td class="text-right">1000.00</td>
+                <td class="text-center">1%</td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">└</span><a href="hetong-list.html">WWUJ-3</a></td>
+                <td class="text-right">10</td>
+                <td class="text-right">5000.00</td>
+                <td class="text-center">5%</td>
+                <td class="text-right">9000.00</td>
+                <td class="text-center">9%</td>
+              </tr>
+            </table>
+          </div>
+        </div>
+      </div>
+    </div>
+  </div>

+ 17 - 0
web/views/contract/layout.html

@@ -0,0 +1,17 @@
+
+{{ render "head/comm_head.html" }}
+<body>
+	<div class="main">
+    
+    {{ render "head/comm_nav.html" }}
+
+    {{ yield }}
+		
+  </div>
+  {{ part "body" }}
+ 
+  {{ render "head/comm_foot_js.html" }}
+
+</body>
+
+</html>

+ 1 - 4
web/views/head/comm_foot_js.html

@@ -1,7 +1,4 @@
 
-<!-- JS. -->
-<script src="/public/static/js/jquery/jquery-3.2.1.min.js"></script>
-<script src="/public/static/js/popper/popper.min.js"></script>
-<script src="/public/static/js/bootstrap/bootstrap.min.js"></script>
+
 <script src="/public/static/js/global.js"></script>
 <script type="text/javascript">  autoFlashHeight();</script>

+ 10 - 3
web/views/head/comm_head.html

@@ -1,5 +1,7 @@
+
 <!DOCTYPE html>
 <html lang="en">
+
 <head>
     <meta charset="utf-8">
     <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
@@ -8,7 +10,12 @@
     <link rel="stylesheet" href="/public/static/css/bootstrap/bootstrap.min.css">
     <link rel="stylesheet" href="/public/static/css/main.css">
     <link rel="stylesheet" href="/public/static/css/font-awesome/all.min.css">
-<style>
-html{height:100%;}
-</style>
+    <script src="/public/static/js/jquery/jquery-3.2.1.min.js"></script>
+    <script src="/public/static/js/popper/popper.min.js"></script>
+    <script src="/public/static/js/bootstrap/bootstrap.min.js"></script>
+    <style>
+        html {
+            height: 100%;
+        }
+    </style>
 </head>

+ 21 - 8
web/views/head/comm_nav.html

@@ -3,14 +3,27 @@
   <div class="nav-top">
     <ul class="nav nav-pills nav-stacked bg-nav">
       <!--系统维护信息-->
-      <li class="bg-danger" style="display: none;"><a class="text-white maintain-icon"><i class="fa fa-wrench "></i><span
-            class="bg-danger maintain-info">系统将于 2019年3月10日 14:09 开始停机维护,持续30分钟。</span></a></li>
+      <li class="bg-danger" style="display: none;"><a class="text-white maintain-icon"><i
+            class="fa fa-wrench "></i><span class="bg-danger maintain-info">系统将于 2019年3月10日 14:09
+            开始停机维护,持续30分钟。</span></a></li>
       <!--系统维护信息 end-->
-      <li {{if eq .Channel "todo"}}class="active"{{end}} >
+      <li {{if eq .Channel "todo"}}class="active" {{end}}>
         <a href="/todolist" data-toggle="tooltip" data-placement="right" title="" data-original-title="待办事项"><i
             class="fas fa-chalkboard"></i><span>待办</span></a>
       </li>
-      <li {{if eq .Channel "bidsection"}}class="active"{{end}}>
+
+      <li {{if eq .Channel "contract"}}class="active" {{end}}>
+        <a href="/contract" data-toggle="tooltip" data-placement="right" title="" data-original-title="合同管理"><i
+            class="fas fa-book-open"></i><span>合同管理</span></a>
+      </li>
+      
+      <li class=""><a href="anquan.html" data-toggle="tooltip" data-placement="right" title=""
+          data-original-title="安全巡检"><i class="fas fa-users-cog"></i><span>安全巡检</span></a></li>
+      <li class=""><a href="zhiliang.html" data-toggle="tooltip" data-placement="right" title=""
+          data-original-title="质量巡检"><i class="fas fa-toolbox"></i><span>质量巡检</span></a></li>
+
+
+      <li {{if eq .Channel "bidsection"}}class="active" {{end}}>
         <a href="/bidsection" data-toggle="tooltip" data-placement="right" title="" data-original-title="标段"><i
             class="fas fa-list-ul"></i><span>项目</span></a>
       </li>
@@ -18,10 +31,10 @@
   </div>
   <div class="nav-bottom mt-auto">
     <ul class="nav nav-pills nav-stacked bg-nav">
-      <li {{if eq .Channel "project"}}class="active"{{end}}>
-        <a href="/project" data-toggle="tooltip" data-placement="right" title=""
-          data-original-title="项目设置"><i class="fa fa-cogs"></i><span>项目设置</span></a>
-        </li>
+      <li {{if eq .Channel "project"}}class="active" {{end}}>
+        <a href="/project" data-toggle="tooltip" data-placement="right" title="" data-original-title="项目设置"><i
+            class="fa fa-cogs"></i><span>项目设置</span></a>
+      </li>
     </ul>
     <div class="dropright my-1 ml-1">
       <a href="" class="btn btn-sm btn-light" data-toggle="dropdown" aria-haspopup="false" aria-expanded="false">

+ 3 - 5
web/views/project/account/setting.html

@@ -1,11 +1,9 @@
 <div class="main-panel">
     <div class="panel-sidebar">
-      <div class="sidebar-title">项目设置</div>
-      <div class="scrollbar-auto">
-        <div class="nav-box">
+      
             {{ render "project/menu.html" }}
-        </div>
-      </div>
+        
+
     </div>
     <div class="panel-content">
       <div class="panel-title">

+ 283 - 226
web/views/project/bidsection/manage.html

@@ -1,266 +1,323 @@
+<script src="/public/static/js/jquery/jquery.validate.min.js"></script>
+<script src="/public/static/js/jquery/messages_zh.min.js"></script>
+
 <div class="main-panel">
-    <div class="panel-sidebar">
-        <div class="sidebar-title">项目设置</div>
-        <div class="scrollbar-auto">
-            <div class="nav-box">
-              {{ render "project/menu.html" }}
-            </div>
+  <div class="panel-sidebar">
+    {{ render "project/menu.html" }}
+  </div>
+  <div class="panel-content">
+    <div class="panel-title">
+      <div class="title-main  d-flex justify-content-between">
+        <div>
+
         </div>
-    </div>
-    <div class="panel-content">
-        <div class="panel-title">
-            <div class="title-main  d-flex justify-content-between">
-    <div>
-      项目信息
-    </div>
-    <div>
-        <a href="#add-folder" data-toggle="modal" data-target="#add-folder" class="btn btn-sm btn-primary pull-right"><i class="fas fa-folder"></i> 新建文件夹</a>
-        <a href="#add-bd" data-toggle="modal" data-target="#add-bd" class="btn btn-sm btn-primary pull-right">新建标段</a>
-    </div>
-            </div>
+        <div>
+          <a href="#add-folder" data-toggle="modal" data-target="#add-folder"
+            class="btn btn-sm btn-primary pull-right"><i class="fas fa-folder"></i> 新建文件夹</a>
+          <!-- <a href="#add-bd" data-toggle="modal" data-target="#add-bd" class="btn btn-sm btn-primary pull-right">新建标段</a> -->
         </div>
-        <div class="content-wrap">
-            <div class="c-body">
-    <div class="sjs-height-0">
-      <!--没有标段数据-->
-      <div class="jumbotron m-3">
-        <h3 class="display-6">没有标段数据</h3>
-      </div>
-      <div class="m-3">
-      <!--管理标段-->
-      <table class="table table-hover table-bordered">
-        <thead class="text-center">
-          <th>名称</th>
-          <th width="200">成员</th>
-          <th width="200">操作</th>
-        </thead>
-        <tr>
-          <td class="in-1"><span class="fold-switch mr-1" title="展开"><i class="fal fa-plus-square"></i></span><i class="fal fa-folder"></i>&nbsp;文件夹1</td>
-          <td></td>
-          <td></td>
-        </tr>
-        <tr>
-          <td class="in-1"><span class="fold-switch mr-1" title="收起"><i class="fal fa-minus-square"></i></span><i class="fal fa-folder-open"></i>&nbsp;文件夹2</td>
-          <td></td>
-          <td></td>
-        </tr>
-        <tr>
-          <td class="in-2"><span class="fold-switch mr-1" title="收起"><i class="fal fa-minus-square"></i></span><i class="fal fa-folder-open"></i>&nbsp;文件夹2.1</td>
-          <td></td>
-          <td><a href="#move-folder" data-toggle="modal" data-target="#move-folder" class="btn btn-outline-primary btn-sm"><i class="fas fa-exchange-alt fa-rotate-90"></i> 移动</a></td>
-        </tr>
-        <tr>
-          <td class="in-3"><span class="text-muted mr-2">├</span><a href="biaoduan-panel.html">WWUJ-1</a></td>
-            <td>3 成员 <a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
-            <td>
-              <a href="#add-bd" data-toggle="modal" data-target="#add-bd" class="btn btn-outline-primary btn-sm">编辑</a>
-              <button class="btn btn-outline-secondary btn-sm ml-1 disabled" data-toggle="tooltip" data-placement="top" title="请先移除所有数据">删除</button>
-            </td>
-        </tr>
-        <tr>
-          <td class="in-3"><span class="text-muted mr-2">└</span><a href="biaoduan-panel.html">WWUJ-4</a></td>
-            <td>3 成员 <a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
-            <td>
-              <a href="#add-bd" data-toggle="modal" data-target="#add-bd" class="btn btn-outline-primary btn-sm">编辑</a>
-              <button class="btn btn-outline-secondary btn-sm ml-1 disabled" data-toggle="tooltip" data-placement="top" title="请先移除所有数据">删除</button>
-            </td>
-        </tr>
-        <tr>
-          <td class="in-2"><span class="fold-switch mr-1" title="收起"><i class="fal fa-minus-square"></i></span><i class="fal fa-folder-open"></i>&nbsp;文件夹2.2</td>
-          <td></td>
-          <td><a href="#move-folder" data-toggle="modal" data-target="#move-folder" class="btn btn-outline-primary btn-sm"><i class="fas fa-exchange-alt fa-rotate-90"></i> 移动</a></td>
-        </tr>
-        <tr>
-          <td class="in-3"><span class="text-muted mr-2">├</span><a href="#">WWUJ-2</a></td>
-            <td>1 成员 <a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
-            <td>
-              <a href="#add-bd" data-toggle="modal" data-target="#add-bd" class="btn btn-outline-primary btn-sm">编辑</a>
-              <button class="btn btn-outline-secondary btn-sm ml-1 disabled" data-toggle="tooltip" data-placement="top" title="请先移除所有数据">删除</button>
-            </td>
-        </tr>
-        <tr>
-          <td class="in-3"><span class="text-muted mr-2">└</span><a href="biaoduan-panel.html">WWUJ-3</a></td>
-            <td><a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
-            <td>
-              <a href="#add-bd" data-toggle="modal" data-target="#add-bd" class="btn btn-outline-primary btn-sm">编辑</a>
-              <a href="#del-bd" data-toggle="modal" data-target="#del-bd" class="btn btn-outline-danger btn-sm ml-1">删除</a>
-            </td>
-        </tr>
-        <tr>
-          <td class="in-3"><span class="text-muted mr-2">└</span><a href="biaoduan-panel.html">WWUJ-5</a></td>
-            <td><a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
-            <td>
-              <a href="#add-bd" data-toggle="modal" data-target="#add-bd" class="btn btn-outline-primary btn-sm">编辑</a>
-              <a href="#del-bd2" data-toggle="modal" data-target="#del-bd2" class="btn btn-outline-danger btn-sm ml-1">删除</a>
-            </td>
-        </tr>
-      </table>
       </div>
     </div>
-            </div>
+    <div class="content-wrap">
+      <div class="c-body">
+        <div class="sjs-height-0">
+          <!--没有标段数据-->
+
+          <!-- <div class="jumbotron m-3">
+            <h3 class="display-6">没有标段数据</h3>
+          </div> -->
+
+          <div class="m-3">
+            <!--管理标段-->
+            <table class="table table-hover table-bordered">
+              <thead class="text-center">
+                <th>名称</th>
+                <th width="200">成员</th>
+                <th width="200">操作</th>
+              </thead>
+
+              {{range $i, $data := .FolderData}}
+              <tr>
+                <td class="in-1"><span class="fold-switch mr-1" title="展开"><i class="fal fa-plus-square"></i></span><i
+                    class="fal fa-folder"></i>&nbsp;{{$data.Name}}</td>
+                <td></td>
+                <td>
+                  <a href="#add-folder" data-ParentId="{{$data.Id}}" data-toggle="modal" data-target="#add-folder"
+                    class="btn btn-sm btn-primary pull-right">
+                    新建文件夹</a>
+                  <a href="#add-bd" data-toggle="modal" data-target="#add-bd"
+                    class="btn btn-sm btn-primary pull-right">新建标段</a>
+                </td>
+              </tr>
+              {{end}}
+              <!-- <tr>
+                <td class="in-1"><span class="fold-switch mr-1" title="收起"><i class="fal fa-minus-square"></i></span><i
+                    class="fal fa-folder-open"></i>&nbsp;文件夹2</td>
+                <td></td>
+                <td></td>
+              </tr>
+              <tr>
+                <td class="in-2"><span class="fold-switch mr-1" title="收起"><i class="fal fa-minus-square"></i></span><i
+                    class="fal fa-folder-open"></i>&nbsp;文件夹2.1</td>
+                <td></td>
+                <td><a href="#move-folder" data-toggle="modal" data-target="#move-folder"
+                    class="btn btn-outline-primary btn-sm"><i class="fas fa-exchange-alt fa-rotate-90"></i> 移动</a></td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">├</span><a href="biaoduan-panel.html">WWUJ-1</a></td>
+                <td>3 成员 <a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
+                <td>
+                  <a href="#add-bd" data-toggle="modal" data-target="#add-bd"
+                    class="btn btn-outline-primary btn-sm">编辑</a>
+                  <button class="btn btn-outline-secondary btn-sm ml-1 disabled" data-toggle="tooltip"
+                    data-placement="top" title="请先移除所有数据">删除</button>
+                </td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">└</span><a href="biaoduan-panel.html">WWUJ-4</a></td>
+                <td>3 成员 <a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
+                <td>
+                  <a href="#add-bd" data-toggle="modal" data-target="#add-bd"
+                    class="btn btn-outline-primary btn-sm">编辑</a>
+                  <button class="btn btn-outline-secondary btn-sm ml-1 disabled" data-toggle="tooltip"
+                    data-placement="top" title="请先移除所有数据">删除</button>
+                </td>
+              </tr>
+              <tr>
+                <td class="in-2"><span class="fold-switch mr-1" title="收起"><i class="fal fa-minus-square"></i></span><i
+                    class="fal fa-folder-open"></i>&nbsp;文件夹2.2</td>
+                <td></td>
+                <td><a href="#move-folder" data-toggle="modal" data-target="#move-folder"
+                    class="btn btn-outline-primary btn-sm"><i class="fas fa-exchange-alt fa-rotate-90"></i> 移动</a></td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">├</span><a href="#">WWUJ-2</a></td>
+                <td>1 成员 <a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
+                <td>
+                  <a href="#add-bd" data-toggle="modal" data-target="#add-bd"
+                    class="btn btn-outline-primary btn-sm">编辑</a>
+                  <button class="btn btn-outline-secondary btn-sm ml-1 disabled" data-toggle="tooltip"
+                    data-placement="top" title="请先移除所有数据">删除</button>
+                </td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">└</span><a href="biaoduan-panel.html">WWUJ-3</a></td>
+                <td><a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
+                <td>
+                  <a href="#add-bd" data-toggle="modal" data-target="#add-bd"
+                    class="btn btn-outline-primary btn-sm">编辑</a>
+                  <a href="#del-bd" data-toggle="modal" data-target="#del-bd"
+                    class="btn btn-outline-danger btn-sm ml-1">删除</a>
+                </td>
+              </tr>
+              <tr>
+                <td class="in-3"><span class="text-muted mr-2">└</span><a href="biaoduan-panel.html">WWUJ-5</a></td>
+                <td><a href="settings-data-member.html" class="btn btn-outline-primary btn-sm">成员管理</a></td>
+                <td>
+                  <a href="#add-bd" data-toggle="modal" data-target="#add-bd"
+                    class="btn btn-outline-primary btn-sm">编辑</a>
+                  <a href="#del-bd2" data-toggle="modal" data-target="#del-bd2"
+                    class="btn btn-outline-danger btn-sm ml-1">删除</a>
+                </td>
+              </tr> -->
+            </table>
+          </div>
+
+
         </div>
+      </div>
     </div>
+  </div>
 </div>
 
 
-{{ define "bidsection/manage/index-body"}}
-<!--弹出添加标段-->
+
+{{ define "project/bidsection/manage-body"}}
 <div class="modal fade" id="add-folder" data-backdrop="static">
+  <form action="{{.Action}}folder/add" id="formValid" method="post">
+    {{.csrfField}}
+    <input name="parentId" value="0" type="hidden">
     <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">新建文件夹</h5>
-            </div>
-            <div class="modal-body">
-              <div class="form-group">
-                <label>文件夹父级</label>
-                <input class="form-control form-control-sm"  placeholder="选择文件夹父级" type="text"  data-toggle="dropdown" >
-                <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
-                    <div class="modal-height-300">
-                  <form class="p-2">
-                       <ul id="treeDemo3" class="ztree"></ul>
-                  </form>
-                    </div>
-                </div>
-              </div>
-              <div class="form-group">
-                <label>文件夹名称<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm"  placeholder="输入文件夹名称" type="text">
-              </div>
-              <div class="form-group">
-                <label>文件夹名称<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm is-invalid"  placeholder="输入文件夹名称" type="text" value="名称超过100个字">
-                <div class="invalid-feedback">
-                  名称超过30个字,请缩减名称。
-                </div>
-              </div>
+      <div class="modal-content">
+        <div class="modal-header">
+          <h5 class="modal-title">新建文件夹</h5>
+        </div>
+        <div class="modal-body">
+          <!-- <div class="form-group">
+          <label>文件夹父级</label>
+          <input class="form-control form-control-sm" placeholder="选择文件夹父级" type="text" data-toggle="dropdown">
+          <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+            <div class="modal-height-300">
+                <ul id="treeDemo3" class="ztree"></ul>
             </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-              <button type="button" class="btn btn-sm btn-primary">确定添加</button>
+          </div>
+        </div> -->
+          <div class="form-group">
+            <label>文件夹名称<b class="text-danger">*</b></label>
+            <input name="name" class="form-control form-control-sm" placeholder="输入文件夹名称" type="text">
+          </div>
+          <!-- <div class="form-group">
+            <label>文件夹名称<b class="text-danger">*</b></label>
+            <input class="form-control form-control-sm is-invalid" placeholder="输入文件夹名称" type="text" value="名称超过100个字">
+            <div class="invalid-feedback">
+              名称超过30个字,请缩减名称。
             </div>
+          </div> -->
         </div>
+        <div class="modal-footer">
+          <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+          <input type="submit" value="确定添加" class="btn btn-sm btn-primary">
+        </div>
+      </div>
     </div>
+  </form>
 </div>
+
 <!--弹出添加标段-->
 <div class="modal fade" id="add-bd" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">添加新标段</h5>
-            </div>
-            <div class="modal-body">
-              <div class="form-group">
-                <label>文件夹<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm"  placeholder="选择文件夹目录" type="text"  data-toggle="dropdown" >
-                <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
-                    <div class="modal-height-300">
-                  <form class="p-2">
-                       <ul id="treeDemo3" class="ztree"></ul>
-                  </form>
-                    </div>
-                </div>
-              </div>
-              <div class="form-group">
-                <label>标段名称<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm"  placeholder="输入标段名称" type="text">
-              </div>
-              <div class="form-group">
-                <label>标段名称<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm is-invalid"  placeholder="输入标段名称" type="text" value="名称超过100个字">
-                <div class="invalid-feedback">
-                  名称超过100个字,请缩减名称。
-                </div>
-              </div>
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-              <button type="button" class="btn btn-sm btn-primary">确定添加</button>
+  <div class="modal-dialog" role="document">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h5 class="modal-title">添加新标段</h5>
+      </div>
+      <div class="modal-body">
+        <div class="form-group">
+          <label>文件夹<b class="text-danger">*</b></label>
+          <input class="form-control form-control-sm" placeholder="选择文件夹目录" type="text" data-toggle="dropdown">
+          <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+            <div class="modal-height-300">
+              <form class="p-2">
+                <ul id="treeDemo3" class="ztree"></ul>
+              </form>
             </div>
+          </div>
+        </div>
+        <div class="form-group">
+          <label>标段名称<b class="text-danger">*</b></label>
+          <input class="form-control form-control-sm" placeholder="输入标段名称" type="text">
         </div>
+        <div class="form-group">
+          <label>标段名称<b class="text-danger">*</b></label>
+          <input class="form-control form-control-sm is-invalid" placeholder="输入标段名称" type="text" value="名称超过100个字">
+          <div class="invalid-feedback">
+            名称超过100个字,请缩减名称。
+          </div>
+        </div>
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+        <button type="button" class="btn btn-sm btn-primary">确定添加</button>
+      </div>
     </div>
+  </div>
 </div>
 <!--弹出编辑标段-->
 <div class="modal fade" id="add-bd" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">编辑标段</h5>
-            </div>
-            <div class="modal-body">
-              <div class="form-group">
-                <label>文件夹父级<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm"  placeholder="选择文件夹父级录" type="text"  data-toggle="dropdown" >
-                <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
-                    <div class="modal-height-300">
-                  <form class="p-2">
-                       <ul id="treeDemo3" class="ztree"></ul>
-                  </form>
-                    </div>
-                </div>
-              </div>
-              <div class="form-group">
-                <label>标段名称<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm"  placeholder="输入标段名称" type="text">
-              </div>
-              <div class="form-group">
-                <label>标段名称<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm is-invalid"  placeholder="输入标段名称" type="text" value="名称超过100个字">
-                <div class="invalid-feedback">
-                  名称超过100个字,请缩减名称。
-                </div>
-              </div>
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-              <button type="button" class="btn btn-primary">确定修改</button>
+  <div class="modal-dialog" role="document">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h5 class="modal-title">编辑标段</h5>
+      </div>
+      <div class="modal-body">
+        <div class="form-group">
+          <label>文件夹父级<b class="text-danger">*</b></label>
+          <input class="form-control form-control-sm" placeholder="选择文件夹父级录" type="text" data-toggle="dropdown">
+          <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+            <div class="modal-height-300">
+              <form class="p-2">
+                <ul id="treeDemo3" class="ztree"></ul>
+              </form>
             </div>
+          </div>
         </div>
+        <div class="form-group">
+          <label>标段名称<b class="text-danger">*</b></label>
+          <input class="form-control form-control-sm" placeholder="输入标段名称" type="text">
+        </div>
+        <div class="form-group">
+          <label>标段名称<b class="text-danger">*</b></label>
+          <input class="form-control form-control-sm is-invalid" placeholder="输入标段名称" type="text" value="名称超过100个字">
+          <div class="invalid-feedback">
+            名称超过100个字,请缩减名称。
+          </div>
+        </div>
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+        <button type="button" class="btn btn-primary">确定修改</button>
+      </div>
     </div>
+  </div>
 </div>
 <!--删除标段-->
 <div class="modal fade" id="del-bd" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">删除标段</h5>
-            </div>
-            <div class="modal-body">
-              <h6>确认删除「WWUJ-3」?</h6>
-              <h6>删除后,数据无法恢复,请谨慎操作。</h6>
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
-              <button type="button" class="btn btn-sm btn-danger">确定删除</button>
-            </div>
-        </div>
+  <div class="modal-dialog" role="document">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h5 class="modal-title">删除标段</h5>
+      </div>
+      <div class="modal-body">
+        <h6>确认删除「WWUJ-3」?</h6>
+        <h6>删除后,数据无法恢复,请谨慎操作。</h6>
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-sm btn-secondary" data-dismiss="modal">取消</button>
+        <button type="button" class="btn btn-sm btn-danger">确定删除</button>
+      </div>
     </div>
+  </div>
 </div>
 <!--弹出移动文件夹-->
 <div class="modal fade" id="move-folder" data-backdrop="static">
-    <div class="modal-dialog" role="document">
-        <div class="modal-content">
-            <div class="modal-header">
-                <h5 class="modal-title">移动文件夹</h5>
-            </div>
-            <div class="modal-body">
-              <div class="form-group">
-                <label>文件夹父级<b class="text-danger">*</b></label>
-                <input class="form-control form-control-sm"  placeholder="选择文件夹父级录" type="text"  data-toggle="dropdown" >
-                <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
-                    <div class="modal-height-300">
-                  <form class="p-2">
-                       <ul id="treeDemo3" class="ztree"></ul>
-                  </form>
-                    </div>
-                </div>
-              </div>
-            </div>
-            <div class="modal-footer">
-              <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
-              <button type="button" class="btn btn-primary">确定修改</button>
+  <div class="modal-dialog" role="document">
+    <div class="modal-content">
+      <div class="modal-header">
+        <h5 class="modal-title">移动文件夹</h5>
+      </div>
+      <div class="modal-body">
+        <div class="form-group">
+          <label>文件夹父级<b class="text-danger">*</b></label>
+          <input class="form-control form-control-sm" placeholder="选择文件夹父级录" type="text" data-toggle="dropdown">
+          <div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
+            <div class="modal-height-300">
+              <form class="p-2">
+                <ul id="treeDemo3" class="ztree"></ul>
+              </form>
             </div>
+          </div>
         </div>
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-secondary" data-dismiss="modal">取消</button>
+        <button type="button" class="btn btn-primary">确定修改</button>
+      </div>
     </div>
+  </div>
 </div>
+
+<script type="text/javascript">
+
+  $().ready(function () {
+    $("#formValid").validate({
+      rules: {
+        name: {
+          required: true,
+          maxlength: 15,
+        },
+      },
+    });
+  });
+
+  $(function () {
+
+    $('a[data-target="#add-folder"]').click(function () {
+      var parentId=$(this).attr("data-ParentId");
+      $('input[name="parentId"]').val(parentId);
+    });
+
+  })
+
+
+</script>
+
 {{ end }}

+ 9 - 5
web/views/project/index.html

@@ -1,11 +1,15 @@
+<!--
+ * @description: 
+ * @Author: CP
+ * @Date: 2020-09-09 16:50:39
+ * @FilePath: \construction_management\web\views\project\index.html
+-->
 <div class="main-panel">
     <div class="panel-sidebar">
-      <div class="sidebar-title">项目设置</div>
-      <div class="scrollbar-auto">
-        <div class="nav-box">
+      
+     
             {{ render "project/menu.html" }}
-        </div>
-      </div>
+        
     </div>
     <div class="panel-content">
       <div class="panel-title">

+ 1 - 0
web/views/project/layout.html

@@ -1,6 +1,7 @@
 
 {{ render "head/comm_head.html" }}
 <body>
+
 	<div class="main">
     
     {{ render "head/comm_nav.html" }}

+ 13 - 5
web/views/project/menu.html

@@ -1,6 +1,14 @@
 
-<ul class="nav-list list-unstyled">
-    <li {{if eq .Menu "projectInfo"}} class="active" {{end}}><a href="/project"><span>项目信息</span></a></li>
-    <li {{if eq .Menu "accountSetting"}} class="active" {{end}}><a href="/project/account/setting"><span>账号设置</span></a></li>
-    <li {{if eq .Menu "bidsectionManage"}} class="active" {{end}}><a href="/project/bidsection/manage"><span>标段管理</span></a></li>
-  </ul>
+
+
+
+  <div class="sidebar-title">{{.Title}}</div>
+    <div class="scrollbar-auto">
+      <div class="nav-box">
+        <ul class="nav-list list-unstyled">
+          <li {{if eq .Menu "projectInfo"}} class="active" {{end}}><a href="/project"><span>项目信息</span></a></li>
+          <li {{if eq .Menu "accountSetting"}} class="active" {{end}}><a href="/project/account/setting"><span>账号设置</span></a></li>
+          <li {{if eq .Menu "bidsectionManage"}} class="active" {{end}}><a href="/project/bidsection/manage"><span>标段管理</span></a></li>
+        </ul>
+      </div>
+    </div>