Pārlūkot izejas kodu

“合并子分支到主分支”

xuwenhao 2 gadi atpakaļ
vecāks
revīzija
d37cecc7d5
100 mainītis faili ar 4782 papildinājumiem un 1507 dzēšanām
  1. 1071 0
      lc_finance.sql
  2. 94 0
      server/api/v1/admin/constructor.go
  3. 145 0
      server/api/v1/admin/department.go
  4. 19 0
      server/api/v1/admin/enter.go
  5. 104 0
      server/api/v1/admin/file.go
  6. 376 0
      server/api/v1/admin/finance.go
  7. 695 0
      server/api/v1/admin/project.go
  8. 4 2
      server/api/v1/enter.go
  9. 1 3
      server/api/v1/example/enter.go
  10. 5 5
      server/api/v1/example/exa_breakpoint_continue.go
  11. 0 176
      server/api/v1/example/exa_customer.go
  12. 8 8
      server/api/v1/example/exa_file_upload_download.go
  13. 1 10
      server/api/v1/system/enter.go
  14. 10 10
      server/api/v1/system/sys_api.go
  15. 10 45
      server/api/v1/system/sys_authority.go
  16. 3 3
      server/api/v1/system/sys_authority_btn.go
  17. 0 335
      server/api/v1/system/sys_auto_code.go
  18. 0 115
      server/api/v1/system/sys_auto_code_history.go
  19. 3 3
      server/api/v1/system/sys_captcha.go
  20. 5 5
      server/api/v1/system/sys_casbin.go
  21. 7 7
      server/api/v1/system/sys_dictionary.go
  22. 9 9
      server/api/v1/system/sys_dictionary_detail.go
  23. 0 257
      server/api/v1/system/sys_export_template.go
  24. 0 59
      server/api/v1/system/sys_initdb.go
  25. 5 5
      server/api/v1/system/sys_jwt_blacklist.go
  26. 10 10
      server/api/v1/system/sys_menu.go
  27. 9 9
      server/api/v1/system/sys_operation_record.go
  28. 0 88
      server/api/v1/system/sys_system.go
  29. 29 23
      server/api/v1/system/sys_user.go
  30. 2 0
      server/build.bat
  31. 1 1
      server/config.yaml
  32. 0 18
      server/config/auto_code.go
  33. 0 2
      server/config/config.go
  34. 1 1
      server/core/internal/file_rotatelogs.go
  35. 1 1
      server/core/internal/zap.go
  36. 4 14
      server/core/server.go
  37. 3 6
      server/core/viper.go
  38. 3 3
      server/core/zap.go
  39. 68 0
      server/dao/borrowing.go
  40. 63 0
      server/dao/collection.go
  41. 52 0
      server/dao/constructor.go
  42. 114 0
      server/dao/dailyExpenses.go
  43. 31 0
      server/dao/dailyFeeDetails.go
  44. 53 0
      server/dao/dailyFile.go
  45. 63 0
      server/dao/department.go
  46. 62 0
      server/dao/exa_file_upload_download.go
  47. 41 0
      server/dao/expensesGenre.go
  48. 38 0
      server/dao/feeDetails.go
  49. 50 0
      server/dao/fileGenre.go
  50. 103 0
      server/dao/project.go
  51. 75 0
      server/dao/projectFile.go
  52. 48 0
      server/dao/projectState.go
  53. 107 0
      server/dao/projectWorkingHours.go
  54. 51 0
      server/dao/purchase.go
  55. 109 0
      server/dao/reimbursement.go
  56. 113 0
      server/dao/sys_api.go
  57. 60 0
      server/dao/sys_authority.go
  58. 62 0
      server/dao/sys_authority_btn.go
  59. 39 0
      server/dao/sys_authority_menu.go
  60. 137 0
      server/dao/sys_base_menu.go
  61. 70 0
      server/dao/sys_dictionary.go
  62. 101 0
      server/dao/sys_dictionary_detail.go
  63. 21 0
      server/dao/sys_jwt_blacklist.go
  64. 2 2
      server/model/system/sys_menu_btn.go
  65. 76 0
      server/dao/sys_operation_record.go
  66. 169 0
      server/dao/sys_user.go
  67. 1 1
      server/model/system/sys_user_authority.go
  68. 2 2
      server/global/global.go
  69. 6 13
      server/go.mod
  70. 10 34
      server/go.sum
  71. 2 2
      server/initialize/db_list.go
  72. 0 105
      server/initialize/ensure_tables.go
  73. 30 22
      server/initialize/gorm.go
  74. 5 5
      server/initialize/gorm_mssql.go
  75. 3 3
      server/initialize/gorm_mysql.go
  76. 3 3
      server/initialize/gorm_oracle.go
  77. 3 3
      server/initialize/gorm_pgsql.go
  78. 3 3
      server/initialize/gorm_sqlite.go
  79. 1 1
      server/initialize/internal/gorm.go
  80. 1 1
      server/initialize/internal/logger.go
  81. 3 3
      server/initialize/mongo.go
  82. 2 2
      server/initialize/other.go
  83. 4 4
      server/initialize/plugin.go
  84. 1 1
      server/initialize/redis.go
  85. 0 5
      server/initialize/register_init.go
  86. 12 11
      server/initialize/router.go
  87. 2 2
      server/initialize/timer.go
  88. 1 1
      server/initialize/validator.go
  89. 3 3
      server/main.go
  90. 4 4
      server/middleware/casbin_rbac.go
  91. 2 2
      server/middleware/cors.go
  92. 6 6
      server/middleware/email.go
  93. 1 1
      server/middleware/error.go
  94. 6 6
      server/middleware/jwt.go
  95. 2 2
      server/middleware/limit_ip.go
  96. 5 5
      server/middleware/operation.go
  97. 41 0
      server/model/common/request/common.go
  98. 1 1
      server/model/example/exa_breakpoint_continue.go
  99. 0 15
      server/model/example/exa_customer.go
  100. 0 0
      server/model/example/exa_file_upload_download.go

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 1071 - 0
lc_finance.sql


+ 94 - 0
server/api/v1/admin/constructor.go

@@ -0,0 +1,94 @@
+package admin
+
+import (
+	"github.com/gin-gonic/gin"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+)
+
+type ConstructorApi struct{}
+
+func (ca *ConstructorApi) QueryConstructorList(c *gin.Context) {
+	var info request.SearchProject
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryConstructorList ====== " + err.Error())
+		return
+	}
+	list, total, err := constructorService.QueryConstructorList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryConstructorList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (ca *ConstructorApi) QueryConstructor(c *gin.Context) {
+	constructors, err := constructorService.QueryConstructor()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateConstructor ====== " + err.Error())
+		return
+	}
+	response.OkWithData(constructors, c)
+}
+
+func (ca *ConstructorApi) CreateConstructor(c *gin.Context) {
+	var constructor dao.Constructor
+	err := c.ShouldBindJSON(&constructor)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateConstructor ====== " + err.Error())
+		return
+	}
+	err = constructorService.CreateConstructor(constructor)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateConstructor ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (ca *ConstructorApi) UpdateConstructor(c *gin.Context) {
+	var constructor dao.Constructor
+	err := c.ShouldBindJSON(&constructor)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateConstructor ====== " + err.Error())
+		return
+	}
+	err = constructorService.UpdateConstructor(constructor)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateConstructor ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (ca *ConstructorApi) DeleteConstructor(c *gin.Context) {
+	var constructor dao.Constructor
+	err := c.ShouldBindJSON(&constructor)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteConstructor ====== " + err.Error())
+		return
+	}
+	err = constructorService.DeleteConstructor(constructor)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteConstructor ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}

+ 145 - 0
server/api/v1/admin/department.go

@@ -0,0 +1,145 @@
+package admin
+
+import (
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	"strconv"
+)
+
+type DepartmentApi struct {
+}
+
+func (da *DepartmentApi) QueryAllDep(c *gin.Context) {
+	deps, err := departmentService.QueryAllDep()
+	if err != nil {
+		response.FailWithMessage("查询失败", c)
+		global.GVA_LOG.Error("QueryAllDep ==" + err.Error())
+		return
+	}
+	response.OkWithData(deps, c)
+}
+
+func (da *DepartmentApi) QueryDepByStart(c *gin.Context) {
+	deps, err := departmentService.QueryDepByStart()
+	if err != nil {
+		response.FailWithMessage("查询失败", c)
+		global.GVA_LOG.Error("QueryDepByStart ==" + err.Error())
+		return
+	}
+	response.OkWithData(deps, c)
+}
+
+func (da *DepartmentApi) CreateDep(c *gin.Context) {
+	department := dao.Department{}
+	err := c.ShouldBindJSON(&department)
+	if err != nil {
+		global.GVA_LOG.Error("CreateDep ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	err = departmentService.CreateDep(department)
+	if err != nil {
+		global.GVA_LOG.Error("CreateDep ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	response.OkWithMessage("创建成功", c)
+}
+
+func (da *DepartmentApi) UpdateDep(c *gin.Context) {
+	department := dao.Department{}
+	err := c.ShouldBindJSON(&department)
+	if err != nil {
+		global.GVA_LOG.Error("UpdateDep ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	err = departmentService.UpdateDep(department)
+	if err != nil {
+		global.GVA_LOG.Error("UpdateDep ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (da *DepartmentApi) UpdateDepStatus(c *gin.Context) {
+	department := dao.Department{}
+	err := c.ShouldBindJSON(&department)
+	if err != nil {
+		global.GVA_LOG.Error("UpdateDepStatus ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	err = departmentService.UpdateDepStatus(department.Id, department.IsStart)
+	if err != nil {
+		global.GVA_LOG.Error("UpdateDepStatus ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (da *DepartmentApi) UpdateUserDep(c *gin.Context) {
+	ids := request.Ids{}
+	err := c.ShouldBindJSON(&ids)
+	if err != nil {
+		global.GVA_LOG.Error("UpdateUserDep ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	err = departmentService.UpdateUserDep(ids.Ids, ids.Id)
+	if err != nil {
+		global.GVA_LOG.Error("UpdateUserDep ==" + err.Error())
+		response.FailWithMessage("错误", c)
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (da *DepartmentApi) DeleteDep(c *gin.Context) {
+	id := c.Param("depId")
+	depId, _ := strconv.Atoi(id)
+	err := departmentService.DeleteDep(depId)
+	if err != nil {
+		global.GVA_LOG.Error("DeleteDep ==" + err.Error())
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+// FilesUpload 文件上传
+func (da *DepartmentApi) FilesUpload(c *gin.Context) {
+	form, err := c.MultipartForm()
+	files := form.File["file"]
+	fmt.Println(files)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		//ignore
+		return
+	}
+	cs := c.PostForm("cs")
+
+	fmt.Println(cs)
+	for _, file := range files {
+		dst := file.Filename
+		// gin 简单做了封装,拷贝了文件流
+		if err := c.SaveUploadedFile(file, "./uploads/file/"+dst); err != nil {
+			// ignore
+		}
+	}
+	response.Ok(c)
+}
+
+func (da *DepartmentApi) XiaZai(c *gin.Context) {
+	c.Header("Content-Type", "application/octet-stream")              // 表示是文件流,唤起浏览器下载,一般设置了这个,就要设置文件名
+	c.Header("Content-Disposition", "attachment; filename="+"牛逼.png") // 用来指定下载下来的文件名
+	c.Header("Content-Transfer-Encoding", "binary")                   // 表示传输过程中的编码形式,乱码问题可能就是因为它
+	c.File("uploads/file/04-原理篇.zip")
+	response.Ok(c)
+}

+ 19 - 0
server/api/v1/admin/enter.go

@@ -0,0 +1,19 @@
+package admin
+
+import "server/service"
+
+type ApiGroup struct {
+	DepartmentApi
+	ProjectApi
+	FileApi
+	FinanceApi
+	ConstructorApi
+}
+
+var (
+	departmentService  = service.ServiceGroupApp.AdminServiceGroup.DepartmentService
+	projectService     = service.ServiceGroupApp.AdminServiceGroup.ProjectService
+	fileService        = service.ServiceGroupApp.AdminServiceGroup.FileService
+	financeService     = service.ServiceGroupApp.AdminServiceGroup.FinanceService
+	constructorService = service.ServiceGroupApp.AdminServiceGroup.ConstructorService
+)

+ 104 - 0
server/api/v1/admin/file.go

@@ -0,0 +1,104 @@
+package admin
+
+import (
+	"github.com/gin-gonic/gin"
+	"log"
+	"net/http"
+	"os"
+	"server/dao"
+	"server/global"
+	"server/model/common/response"
+	"strings"
+)
+
+type FileApi struct{}
+
+func (fa *FileApi) QueryFileGenre(c *gin.Context) {
+	genre, err := fileService.QueryFileGenre()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryFileGenre ======= " + err.Error())
+		return
+	}
+	response.OkWithData(genre, c)
+}
+
+func (fa *FileApi) CreateFileGenre(c *gin.Context) {
+	var fileGenre dao.FileGenre
+	err := c.ShouldBindJSON(&fileGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateFileGenre ====== " + err.Error())
+		return
+	}
+	err = fileService.CreateFileGenre(fileGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateFileGenre ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (fa *FileApi) UpdateFileGenre(c *gin.Context) {
+	var fileGenre dao.FileGenre
+	err := c.ShouldBindJSON(&fileGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateFileGenre ====== " + err.Error())
+		return
+	}
+	err = fileService.UpdateFileGenre(fileGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateFileGenre ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("修改成功", c)
+}
+
+func (fa *FileApi) DeleteFileGenre(c *gin.Context) {
+	var fileGenre dao.FileGenre
+	err := c.ShouldBindJSON(&fileGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteFileGenre ====== " + err.Error())
+		return
+	}
+	err = fileService.DeleteFileGenre(fileGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteFileGenre ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (fa *FileApi) FileDownload(c *gin.Context) {
+	path := c.Query("path")
+	name := c.Query("name")
+
+	// 验证或清理文件路径(这里只是一个简单的示例)
+	if strings.Contains(path, "..") {
+		response.FailWithMessage("无效的路径", c)
+		log.Println("检测到可能的路径遍历攻击尝试")
+		return
+	}
+
+	_, err := os.Stat(path)
+	if err != nil {
+		// 如果出现错误,可能是文件或目录不存在
+		if os.IsNotExist(err) {
+			c.JSON(http.StatusNotFound, gin.H{"error": "文件不存在"})
+			return
+		}
+		// 其他错误处理
+		c.AbortWithError(http.StatusInternalServerError, err)
+		return
+	}
+
+	c.Header("Content-Type", "application/octet-stream")          // 表示是文件流,唤起浏览器下载,一般设置了这个,就要设置文件名
+	c.Header("Content-Disposition", "attachment; filename="+name) // 用来指定下载下来的文件名
+	c.Header("Content-Transfer-Encoding", "binary")               // 表示传输过程中的编码形式,乱码问题可能就是因为它
+	c.File(path)
+}

+ 376 - 0
server/api/v1/admin/finance.go

@@ -0,0 +1,376 @@
+package admin
+
+import (
+	"github.com/gin-gonic/gin"
+	"os"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	"strconv"
+)
+
+type FinanceApi struct{}
+
+func (fa *FinanceApi) QueryDailyExpensesList(c *gin.Context) {
+	var info request.SearchProject
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryDailyExpensesList ====== " + err.Error())
+		return
+	}
+	list, total, err := financeService.QueryDailyExpensesList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryDailyExpensesList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (fa *FinanceApi) QueryDailyExpenses(c *gin.Context) {
+	v := c.Query("id")
+	id, err := strconv.Atoi(v)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryDailyExpenses ====== " + err.Error())
+		return
+	}
+
+	expenses, err := financeService.QueryDailyExpenses(id)
+	if err != nil {
+	}
+	details, err := dao.QueryDailyFeeDetails(int(expenses.ID))
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryDailyExpenses ====== " + err.Error())
+		return
+	}
+	response.OkWithData(details, c)
+}
+
+func (fa *FinanceApi) QueryExpensesGenre(c *gin.Context) {
+	genre, err := financeService.QueryExpensesGenre()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryExpensesGenre ====== " + err.Error())
+		return
+	}
+	response.OkWithData(genre, c)
+}
+
+func (fa *FinanceApi) QueryBorrowingList(c *gin.Context) {
+	var info request.SearchProject
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryBorrowingList ====== " + err.Error())
+		return
+	}
+	list, total, err := financeService.QueryBorrowingList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryBorrowingList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (fa *FinanceApi) QueryBorrowing(c *gin.Context) {
+	v := c.Query("id")
+	id, err := strconv.Atoi(v)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryBorrowing ====== " + err.Error())
+		return
+	}
+	borrowing, err := financeService.QueryBorrowing(id)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryBorrowing ====== " + err.Error())
+		return
+	}
+	response.OkWithData(borrowing, c)
+}
+
+func (fa *FinanceApi) QueryDailyFileList(c *gin.Context) {
+	var info request.SearchIdNameGenre
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryDailyFileList ====== " + err.Error())
+		return
+	}
+	list, total, err := financeService.QueryDailyFileList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryDailyFileList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (fa *FinanceApi) QueryProjectFinance(c *gin.Context) {
+	code := c.Query("code")
+	finance, err := financeService.QueryProjectFinance(code)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryProjectFinance ====== " + err.Error())
+		return
+	}
+	response.OkWithData(finance, c)
+}
+
+func (fa *FinanceApi) CreateDailyExpenses(c *gin.Context) {
+	var expenses dao.DailyExpenses
+	err := c.ShouldBindJSON(&expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateDailyExpenses ====== " + err.Error())
+		return
+	}
+	err = financeService.CreateDailyExpenses(expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateDailyExpenses ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (fa *FinanceApi) CreateExpensesGenre(c *gin.Context) {
+	var expensesGenre dao.ExpensesGenre
+	err := c.ShouldBindJSON(&expensesGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateExpensesGenre ====== " + err.Error())
+		return
+	}
+	err = financeService.CreateExpensesGenre(expensesGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateExpensesGenre ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (fa *FinanceApi) CreateBorrowing(c *gin.Context) {
+	var borrowing dao.Borrowing
+	err := c.ShouldBindJSON(&borrowing)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateBorrowing ====== " + err.Error())
+		return
+	}
+	err = financeService.CreateBorrowing(borrowing)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateBorrowing ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (fa *FinanceApi) CreateDailyFile(c *gin.Context) {
+	form, err := c.MultipartForm()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		return
+	}
+	files := form.File["file"]
+
+	genre := c.PostForm("genre")
+
+	if len(genre) <= 0 {
+		response.FailWithMessage("类型为空", c)
+		return
+	}
+
+	id := c.PostForm("id")
+	genreId, err := strconv.Atoi(genre)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("CreateDailyFile ====== " + err.Error())
+		return
+	}
+	userId, err := strconv.Atoi(id)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("CreateDailyFile ====== " + err.Error())
+		return
+	}
+	fileGenre, err := fileService.QueryFileGenreById(genreId)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("CreateDailyFile ====== " + err.Error())
+		return
+	}
+	for _, file := range files {
+		dst := file.Filename
+		var path = "./uploads/file/" + id + "/" + fileGenre.Name + "/" + dst
+		dailFile := dao.DailyFile{
+			UserId: userId,
+			Name:   dst,
+			Genre:  genreId,
+			Path:   path,
+		}
+
+		// gin 简单做了封装,拷贝了文件流
+		if err := c.SaveUploadedFile(file, path); err != nil {
+			response.FailWithMessage("上传失败", c)
+			return
+		}
+		err = financeService.CreateDailyFile(dailFile)
+		if err != nil {
+			response.FailWithMessage("上传失败", c)
+			return
+		}
+	}
+
+	response.OkWithMessage("上传成功", c)
+}
+
+func (fa *FinanceApi) UpdateDailyExpenses(c *gin.Context) {
+	var expenses dao.DailyExpenses
+	err := c.ShouldBindJSON(&expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateDailyExpenses ====== " + err.Error())
+		return
+	}
+	err = financeService.UpdateDailyExpenses(expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateDailyExpenses ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (fa *FinanceApi) UpdateExpensesGenre(c *gin.Context) {
+	var expensesGenre dao.ExpensesGenre
+	err := c.ShouldBindJSON(&expensesGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateExpensesGenre ====== " + err.Error())
+		return
+	}
+	err = financeService.UpdateExpensesGenre(expensesGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateExpensesGenre ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (fa *FinanceApi) UpdateBorrowing(c *gin.Context) {
+	var borrowing dao.Borrowing
+	err := c.ShouldBindJSON(&borrowing)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateBorrowing ====== " + err.Error())
+		return
+	}
+	err = financeService.UpdateBorrowing(borrowing)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateBorrowing ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (fa *FinanceApi) DeleteDailyExpenses(c *gin.Context) {
+	var expenses dao.DailyExpenses
+	err := c.ShouldBindJSON(&expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteDailyExpenses ====== " + err.Error())
+		return
+	}
+	err = financeService.DeleteDailyExpenses(expenses)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteDailyExpenses ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (fa *FinanceApi) DeleteExpensesGenre(c *gin.Context) {
+	var expensesGenre dao.ExpensesGenre
+	err := c.ShouldBindJSON(&expensesGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteExpensesGenre ====== " + err.Error())
+		return
+	}
+	err = financeService.DeleteExpensesGenre(expensesGenre)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteExpensesGenre ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (fa *FinanceApi) DeleteBorrowing(c *gin.Context) {
+	var borrowing dao.Borrowing
+	err := c.ShouldBindJSON(&borrowing)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteBorrowing ====== " + err.Error())
+		return
+	}
+	err = financeService.DeleteBorrowing(borrowing)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteBorrowing ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (fa *FinanceApi) DeleteDailyFile(c *gin.Context) {
+	var dailyFile dao.DailyFile
+	err := c.ShouldBindJSON(&dailyFile)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteDailyFile ====== " + err.Error())
+		return
+	}
+
+	err = os.Remove(dailyFile.Path)
+	if err != nil {
+		// 如果发生错误,打印错误信息
+		response.FailWithMessage("删除文件时发生错误", c)
+		global.GVA_LOG.Error("删除文件时发生错误: " + err.Error())
+		return
+	}
+
+	err = financeService.DeleteDailyFile(dailyFile)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteDailyFile ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}

+ 695 - 0
server/api/v1/admin/project.go

@@ -0,0 +1,695 @@
+package admin
+
+import (
+	"archive/zip"
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"github.com/gin-gonic/gin"
+	"io"
+	"net/http"
+	"os"
+	"path/filepath"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	"strconv"
+)
+
+type ProjectApi struct{}
+
+func (pa *ProjectApi) QueryProjectList(c *gin.Context) {
+	var search request.SearchProject
+	err := c.ShouldBindJSON(&search)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryProjectList ====== " + err.Error())
+		return
+	}
+
+	list, total, err := projectService.QueryProjectList(search)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryProjectList ====== " + err.Error())
+		return
+	}
+
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     search.PageInfo.Page,
+		PageSize: search.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (pa *ProjectApi) QueryProjectByCode(c *gin.Context) {
+	code := c.Query("code")
+	if code == "" {
+		response.FailWithMessage("编号不能为空", c)
+		return
+	}
+	project, err := projectService.QueryProjectByCode(code)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryProjectByCode ====== " + err.Error())
+		return
+	}
+	response.OkWithData(project, c)
+}
+
+func (pa *ProjectApi) QueryFileList(c *gin.Context) {
+	var info request.SearchProjectFileList
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("QueryFileList ====== " + err.Error())
+		return
+	}
+	list, total, err := projectService.QueryFileList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryFileList ====== " + err.Error())
+		return
+	}
+
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (pa *ProjectApi) QueryAllProject(c *gin.Context) {
+	projects, err := projectService.QueryAllProject()
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithData(projects, c)
+}
+
+func (pa *ProjectApi) QueryProjectsInfo(c *gin.Context) {
+	sum, totalProject, completeProject, unCompleteProject, err := projectService.QueryProjectsInfo()
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithData(gin.H{
+		"sum":               sum,
+		"totalProject":      totalProject,
+		"completeProject":   completeProject,
+		"unCompleteProject": unCompleteProject,
+	}, c)
+}
+
+func (pa *ProjectApi) QueryProjectState(c *gin.Context) {
+	states, err := projectService.QueryProjectState()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryProjectState ====== " + err.Error())
+		return
+	}
+	response.OkWithData(states, c)
+}
+
+func (pa *ProjectApi) QueryWorkingHours(c *gin.Context) {
+	code := c.Query("code")
+	hours, err := projectService.QueryWorkingHours(code)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithData(hours, c)
+}
+
+func (pa *ProjectApi) QueryWorkingHoursList(c *gin.Context) {
+	var info request.SearchWorkingHours
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryWorkingHoursList ====== " + err.Error())
+		return
+	}
+	list, total, err := projectService.QueryWorkingHoursList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryWorkingHoursList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (pa *ProjectApi) QueryWorkingHoursSum(c *gin.Context) {
+	var info request.SearchWorkingHours
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryWorkingHoursSum ====== " + err.Error())
+		return
+	}
+	list, total, err := projectService.QueryWorkingHoursSum(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryWorkingHoursSum ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (pa *ProjectApi) QueryCollections(c *gin.Context) {
+	code := c.Query("code")
+	collections, err := projectService.QueryCollections(code)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryCollections ====== " + err.Error())
+		return
+	}
+	response.OkWithData(collections, c)
+}
+
+func (pa *ProjectApi) QueryCollectionList(c *gin.Context) {
+	var info request.SearchProjectList
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryCollectionList ====== " + err.Error())
+		return
+	}
+	list, total, err := projectService.QueryCollectionList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryCollectionList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (pa *ProjectApi) QueryReimbursementList(c *gin.Context) {
+	var info request.SearchProjectList
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryReimbursementList ====== " + err.Error())
+		return
+	}
+	list, total, err := projectService.QueryReimbursementList(info)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryReimbursementList ====== " + err.Error())
+		return
+	}
+	response.OkWithDetailed(response.PageResult{
+		List:     list,
+		Total:    total,
+		Page:     info.PageInfo.Page,
+		PageSize: info.PageInfo.PageSize,
+	}, "获取成功", c)
+}
+
+func (pa *ProjectApi) QueryReimbursement(c *gin.Context) {
+	code := c.Query("code")
+	reimbursement, err := projectService.QueryReimbursement(code)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("QueryReimbursement ====== " + err.Error())
+		return
+	}
+	response.OkWithData(reimbursement, c)
+}
+
+func (pa *ProjectApi) CreateProject(c *gin.Context) {
+	form, err := c.MultipartForm()
+	files := form.File["file"]
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		return
+	}
+	projectJson := c.PostForm("project")
+
+	var project dao.Project
+	err = json.Unmarshal([]byte(projectJson), &project)
+	if err != nil {
+		response.FailWithMessage("JSON失败", c)
+		return
+	}
+	for _, file := range files {
+		dst := file.Filename
+		var path = "./uploads/file/" + project.Code + "/立项" + "/" + dst
+		projectFile := dao.ProjectFile{
+			ProjectCode: project.Code,
+			Name:        dst,
+			Path:        path,
+			Genre:       1,
+		}
+
+		project.Files = append(project.Files, projectFile)
+
+		// gin 简单做了封装,拷贝了文件流
+		if err := c.SaveUploadedFile(file, path); err != nil {
+			response.FailWithMessage("上传失败", c)
+			return
+		}
+	}
+	err = projectService.CreateProject(project)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	response.OkWithMessage("创建成功", c)
+}
+
+func (pa *ProjectApi) CreateProjectFile(c *gin.Context) {
+	form, err := c.MultipartForm()
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		return
+	}
+	files := form.File["file"]
+
+	genre := c.PostForm("genre")
+
+	if len(genre) <= 0 {
+		response.FailWithMessage("类型为空", c)
+		return
+	}
+
+	code := c.PostForm("code")
+	genreId, err := strconv.Atoi(genre)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
+		return
+	}
+	fileGenre, err := fileService.QueryFileGenreById(genreId)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("CreateProjectFile ====== " + err.Error())
+		return
+	}
+	for _, file := range files {
+		dst := file.Filename
+		var path = "./uploads/file/" + code + "/" + fileGenre.Name + "/" + dst
+		projectFile := dao.ProjectFile{
+			ProjectCode: code,
+			Name:        dst,
+			Path:        path,
+			Genre:       genreId,
+		}
+
+		// gin 简单做了封装,拷贝了文件流
+		if err := c.SaveUploadedFile(file, path); err != nil {
+			response.FailWithMessage("上传失败", c)
+			return
+		}
+		err = projectService.CreateProjectFile(projectFile)
+		if err != nil {
+			response.FailWithMessage("上传失败", c)
+			return
+		}
+	}
+
+	response.OkWithMessage("上传成功", c)
+}
+
+func (pa *ProjectApi) CreateProjectState(c *gin.Context) {
+	var projectState dao.ProjectState
+	err := c.ShouldBindJSON(&projectState)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateProjectState ====== " + err.Error())
+		return
+	}
+	err = projectService.CreateProjectState(projectState)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateProjectState ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新增成功", c)
+}
+
+func (pa *ProjectApi) CreateWorkingHours(c *gin.Context) {
+	var working dao.ProjectWorkingHours
+	err := c.ShouldBindJSON(&working)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = projectService.CreateOrUpdateWorkingHours(working)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (pa *ProjectApi) CreateCollection(c *gin.Context) {
+	var collection dao.Collection
+	err := c.ShouldBindJSON(&collection)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
+		return
+	}
+	err = projectService.CreateCollection(collection)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("CreateCollection ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("创建成功", c)
+}
+
+func (pa *ProjectApi) CreateReimbursement(c *gin.Context) {
+	var reimbursement dao.Reimbursement
+	err := c.ShouldBindJSON(&reimbursement)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
+		return
+	}
+	err = projectService.CreateReimbursement(reimbursement)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("CreateReimbursement ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("新建成功", c)
+}
+
+func (pa *ProjectApi) UpdateProject(c *gin.Context) {
+	var project dao.Project
+	err := c.ShouldBindJSON(&project)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = projectService.UpdateProject(project)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (pa *ProjectApi) UpdateProjectState(c *gin.Context) {
+	var projectState dao.ProjectState
+	err := c.ShouldBindJSON(&projectState)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateProjectState ====== " + err.Error())
+		return
+	}
+	err = projectService.UpdateProjectState(projectState)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateProjectState ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (pa *ProjectApi) UpdateWorkingHours(c *gin.Context) {
+	var working dao.ProjectWorkingHours
+	err := c.ShouldBindJSON(&working)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = projectService.UpdateWorkingHours(working)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("更新成功", c)
+}
+
+func (pa *ProjectApi) UpdateCollection(c *gin.Context) {
+	var collection dao.Collection
+	err := c.ShouldBindJSON(&collection)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
+		return
+	}
+	err = projectService.UpdateCollection(collection)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("UpdateCollection ====== " + err.Error())
+	}
+	response.OkWithMessage("修改成功", c)
+}
+
+func (pa *ProjectApi) UpdateReimbursement(c *gin.Context) {
+	var reimbursement dao.Reimbursement
+	err := c.ShouldBindJSON(&reimbursement)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
+		return
+	}
+	err = projectService.UpdateReimbursement(reimbursement)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("UpdateReimbursement ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("修改成功", c)
+}
+
+func (pa *ProjectApi) DeleteProject(c *gin.Context) {
+	code := c.Query("code")
+	if code == "" {
+		response.FailWithMessage("编号不能为空", c)
+		return
+	}
+	err := projectService.DeleteProject(code)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (pa *ProjectApi) DeleteProjectFile(c *gin.Context) {
+	id := c.Query("id")
+	path := c.Query("path")
+	i, err := strconv.Atoi(id)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+
+	err = os.Remove(path)
+	if err != nil {
+		// 如果发生错误,打印错误信息
+		response.FailWithMessage("删除文件时发生错误", c)
+		global.GVA_LOG.Error("删除文件时发生错误: " + err.Error())
+		return
+	}
+
+	err = projectService.DeleteProjectFile(uint(i))
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (pa *ProjectApi) DeleteProjectFiles(c *gin.Context) {
+	var info request.SearchProjectFileList
+	err := c.ShouldBindJSON(&info)
+	fmt.Println(info)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	files, err := projectService.QueryFilesByNameOrGenre(info)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
+		return
+	}
+
+	fmt.Println(files)
+	for _, file := range files {
+		err = os.Remove(file.Path)
+		if err != nil {
+			// 如果发生错误,打印错误信息
+			response.FailWithMessage("删除文件时发生错误", c)
+			global.GVA_LOG.Error("删除文件时发生错误: " + err.Error())
+			return
+		}
+
+		err = projectService.DeleteProjectFile(file.ID)
+		if err != nil {
+			response.FailWithMessage(err.Error(), c)
+			return
+		}
+	}
+
+	response.OkWithMessage("删除成功", c)
+}
+
+func (pa *ProjectApi) DeleteProjectState(c *gin.Context) {
+	var projectState dao.ProjectState
+	err := c.ShouldBindJSON(&projectState)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteProjectState ====== " + err.Error())
+		return
+	}
+	err = projectService.DeleteProjectState(projectState)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteProjectState ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (pa *ProjectApi) DeleteWorkingHours(c *gin.Context) {
+	var working dao.ProjectWorkingHours
+	err := c.ShouldBindJSON(&working)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	err = projectService.DeleteWorkingHours(working)
+	if err != nil {
+		response.FailWithMessage(err.Error(), c)
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (pa *ProjectApi) DeleteCollection(c *gin.Context) {
+	var collection dao.Collection
+	err := c.ShouldBindJSON(&collection)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
+		return
+	}
+	err = projectService.DeleteCollection(collection)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("DeleteCollection ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (pa *ProjectApi) DeleteReimbursement(c *gin.Context) {
+	var reimbursement dao.Reimbursement
+	err := c.ShouldBindJSON(&reimbursement)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
+		return
+	}
+	err = projectService.DeleteReimbursement(reimbursement)
+	if err != nil {
+		response.FailWithMessage("失败", c)
+		global.GVA_LOG.Error("DeleteReimbursement ====== " + err.Error())
+		return
+	}
+	response.OkWithMessage("删除成功", c)
+}
+
+func (pa *ProjectApi) ProjectFilesDownload(c *gin.Context) {
+	var info request.SearchProjectFileList
+	err := c.ShouldBindJSON(&info)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
+		return
+	}
+	files, err := projectService.QueryFilesByNameOrGenre(info)
+	if err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
+		return
+	}
+
+	zipBuffer := &bytes.Buffer{}
+	zipWriter := zip.NewWriter(zipBuffer)
+
+	for _, file := range files {
+		err := addFileToZip(zipWriter, file.Path)
+		if err != nil {
+			response.FailWithMessage("错误", c)
+			global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
+			return
+		}
+	}
+	// 确保所有文件都被写入
+	if err := zipWriter.Close(); err != nil {
+		response.FailWithMessage("错误", c)
+		global.GVA_LOG.Error("ProjectFilesDownload ====== " + err.Error())
+		return
+	}
+	// 设置响应头
+	c.Header("Content-Description", "File Transfer")
+	c.Header("Content-Type", "application/zip")
+	c.Header("Content-Transfer-Encoding", "binary")
+	c.Header("Content-Disposition", "filename=files.zip")
+	c.Header("Cache-Control", "must-revalidate")
+	c.Header("Pragma", "public")
+	// 发送文件
+	c.Data(http.StatusOK, "application/zip", zipBuffer.Bytes())
+}
+
+// 添加文件道zip中
+func addFileToZip(w *zip.Writer, filename string) error {
+	// 打开文件
+	f, err := os.Open(filename)
+	if err != nil {
+		return err
+	}
+	defer f.Close()
+
+	// 获取文件信息
+	fileInfo, err := f.Stat()
+	if err != nil {
+		return err
+	}
+
+	header, err := zip.FileInfoHeader(fileInfo)
+	if err != nil {
+		return err
+	}
+
+	// 使用文件的实际文件名
+	header.Name = filepath.Base(filename)
+
+	// 写入文件到zip
+	writer, err := w.CreateHeader(header)
+	if err != nil {
+		return err
+	}
+
+	_, err = io.Copy(writer, f)
+	if err != nil {
+		return err
+	}
+	return err
+}

+ 4 - 2
server/api/v1/enter.go

@@ -1,13 +1,15 @@
 package v1
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/api/v1/example"
-	"github.com/flipped-aurora/gin-vue-admin/server/api/v1/system"
+	"server/api/v1/admin"
+	"server/api/v1/example"
+	"server/api/v1/system"
 )
 
 type ApiGroup struct {
 	SystemApiGroup  system.ApiGroup
 	ExampleApiGroup example.ApiGroup
+	AdminApiGroup   admin.ApiGroup
 }
 
 var ApiGroupApp = new(ApiGroup)

+ 1 - 3
server/api/v1/example/enter.go

@@ -1,13 +1,11 @@
 package example
 
-import "github.com/flipped-aurora/gin-vue-admin/server/service"
+import "server/service"
 
 type ApiGroup struct {
-	CustomerApi
 	FileUploadAndDownloadApi
 }
 
 var (
-	customerService              = service.ServiceGroupApp.ExampleServiceGroup.CustomerService
 	fileUploadAndDownloadService = service.ServiceGroupApp.ExampleServiceGroup.FileUploadAndDownloadService
 )

+ 5 - 5
server/api/v1/example/exa_breakpoint_continue.go

@@ -6,14 +6,14 @@ import (
 	"mime/multipart"
 	"strconv"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/model/example"
+	"server/model/example"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	exampleRes "github.com/flipped-aurora/gin-vue-admin/server/model/example/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/global"
+	"server/model/common/response"
+	exampleRes "server/model/example/response"
+	"server/utils"
 )
 
 // BreakpointContinue

+ 0 - 176
server/api/v1/example/exa_customer.go

@@ -1,176 +0,0 @@
-package example
-
-import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/example"
-	exampleRes "github.com/flipped-aurora/gin-vue-admin/server/model/example/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
-	"github.com/gin-gonic/gin"
-	"go.uber.org/zap"
-)
-
-type CustomerApi struct{}
-
-// CreateExaCustomer
-// @Tags      ExaCustomer
-// @Summary   创建客户
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      example.ExaCustomer            true  "客户用户名, 客户手机号码"
-// @Success   200   {object}  response.Response{msg=string}  "创建客户"
-// @Router    /customer/customer [post]
-func (e *CustomerApi) CreateExaCustomer(c *gin.Context) {
-	var customer example.ExaCustomer
-	err := c.ShouldBindJSON(&customer)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(customer, utils.CustomerVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	customer.SysUserID = utils.GetUserID(c)
-	customer.SysUserAuthorityID = utils.GetUserAuthorityId(c)
-	err = customerService.CreateExaCustomer(customer)
-	if err != nil {
-		global.GVA_LOG.Error("创建失败!", zap.Error(err))
-		response.FailWithMessage("创建失败", c)
-		return
-	}
-	response.OkWithMessage("创建成功", c)
-}
-
-// DeleteExaCustomer
-// @Tags      ExaCustomer
-// @Summary   删除客户
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      example.ExaCustomer            true  "客户ID"
-// @Success   200   {object}  response.Response{msg=string}  "删除客户"
-// @Router    /customer/customer [delete]
-func (e *CustomerApi) DeleteExaCustomer(c *gin.Context) {
-	var customer example.ExaCustomer
-	err := c.ShouldBindJSON(&customer)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(customer.GVA_MODEL, utils.IdVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = customerService.DeleteExaCustomer(customer)
-	if err != nil {
-		global.GVA_LOG.Error("删除失败!", zap.Error(err))
-		response.FailWithMessage("删除失败", c)
-		return
-	}
-	response.OkWithMessage("删除成功", c)
-}
-
-// UpdateExaCustomer
-// @Tags      ExaCustomer
-// @Summary   更新客户信息
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      example.ExaCustomer            true  "客户ID, 客户信息"
-// @Success   200   {object}  response.Response{msg=string}  "更新客户信息"
-// @Router    /customer/customer [put]
-func (e *CustomerApi) UpdateExaCustomer(c *gin.Context) {
-	var customer example.ExaCustomer
-	err := c.ShouldBindJSON(&customer)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(customer.GVA_MODEL, utils.IdVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(customer, utils.CustomerVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = customerService.UpdateExaCustomer(&customer)
-	if err != nil {
-		global.GVA_LOG.Error("更新失败!", zap.Error(err))
-		response.FailWithMessage("更新失败", c)
-		return
-	}
-	response.OkWithMessage("更新成功", c)
-}
-
-// GetExaCustomer
-// @Tags      ExaCustomer
-// @Summary   获取单一客户信息
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  query     example.ExaCustomer                                                true  "客户ID"
-// @Success   200   {object}  response.Response{data=exampleRes.ExaCustomerResponse,msg=string}  "获取单一客户信息,返回包括客户详情"
-// @Router    /customer/customer [get]
-func (e *CustomerApi) GetExaCustomer(c *gin.Context) {
-	var customer example.ExaCustomer
-	err := c.ShouldBindQuery(&customer)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(customer.GVA_MODEL, utils.IdVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	data, err := customerService.GetExaCustomer(customer.ID)
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-		return
-	}
-	response.OkWithDetailed(exampleRes.ExaCustomerResponse{Customer: data}, "获取成功", c)
-}
-
-// GetExaCustomerList
-// @Tags      ExaCustomer
-// @Summary   分页获取权限客户列表
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  query     request.PageInfo                                        true  "页码, 每页大小"
-// @Success   200   {object}  response.Response{data=response.PageResult,msg=string}  "分页获取权限客户列表,返回包括列表,总数,页码,每页数量"
-// @Router    /customer/customerList [get]
-func (e *CustomerApi) GetExaCustomerList(c *gin.Context) {
-	var pageInfo request.PageInfo
-	err := c.ShouldBindQuery(&pageInfo)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(pageInfo, utils.PageInfoVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	customerList, total, err := customerService.GetCustomerInfoList(utils.GetUserAuthorityId(c), pageInfo)
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败"+err.Error(), c)
-		return
-	}
-	response.OkWithDetailed(response.PageResult{
-		List:     customerList,
-		Total:    total,
-		Page:     pageInfo.Page,
-		PageSize: pageInfo.PageSize,
-	}, "获取成功", c)
-}

+ 8 - 8
server/api/v1/example/exa_file_upload_download.go

@@ -1,13 +1,13 @@
 package example
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/example"
-	exampleRes "github.com/flipped-aurora/gin-vue-admin/server/model/example/response"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	exampleRes "server/model/example/response"
 )
 
 type FileUploadAndDownloadApi struct{}
@@ -22,7 +22,7 @@ type FileUploadAndDownloadApi struct{}
 // @Success   200   {object}  response.Response{data=exampleRes.ExaFileResponse,msg=string}  "上传文件示例,返回包括文件详情"
 // @Router    /fileUploadAndDownload/upload [post]
 func (b *FileUploadAndDownloadApi) UploadFile(c *gin.Context) {
-	var file example.ExaFileUploadAndDownload
+	var file dao.ExaFileUploadAndDownload
 	noSave := c.DefaultQuery("noSave", "0")
 	_, header, err := c.Request.FormFile("file")
 	if err != nil {
@@ -41,7 +41,7 @@ func (b *FileUploadAndDownloadApi) UploadFile(c *gin.Context) {
 
 // EditFileName 编辑文件名或者备注
 func (b *FileUploadAndDownloadApi) EditFileName(c *gin.Context) {
-	var file example.ExaFileUploadAndDownload
+	var file dao.ExaFileUploadAndDownload
 	err := c.ShouldBindJSON(&file)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -65,7 +65,7 @@ func (b *FileUploadAndDownloadApi) EditFileName(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}     "删除文件"
 // @Router    /fileUploadAndDownload/deleteFile [post]
 func (b *FileUploadAndDownloadApi) DeleteFile(c *gin.Context) {
-	var file example.ExaFileUploadAndDownload
+	var file dao.ExaFileUploadAndDownload
 	err := c.ShouldBindJSON(&file)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)

+ 1 - 10
server/api/v1/system/enter.go

@@ -1,23 +1,18 @@
 package system
 
-import "github.com/flipped-aurora/gin-vue-admin/server/service"
+import "server/service"
 
 type ApiGroup struct {
-	DBApi
 	JwtApi
 	BaseApi
-	SystemApi
 	CasbinApi
-	AutoCodeApi
 	SystemApiApi
 	AuthorityApi
 	DictionaryApi
 	AuthorityMenuApi
 	OperationRecordApi
-	AutoCodeHistoryApi
 	DictionaryDetailApi
 	AuthorityBtnApi
-	SysExportTemplateApi
 }
 
 var (
@@ -25,15 +20,11 @@ var (
 	jwtService              = service.ServiceGroupApp.SystemServiceGroup.JwtService
 	menuService             = service.ServiceGroupApp.SystemServiceGroup.MenuService
 	userService             = service.ServiceGroupApp.SystemServiceGroup.UserService
-	initDBService           = service.ServiceGroupApp.SystemServiceGroup.InitDBService
 	casbinService           = service.ServiceGroupApp.SystemServiceGroup.CasbinService
-	autoCodeService         = service.ServiceGroupApp.SystemServiceGroup.AutoCodeService
 	baseMenuService         = service.ServiceGroupApp.SystemServiceGroup.BaseMenuService
 	authorityService        = service.ServiceGroupApp.SystemServiceGroup.AuthorityService
 	dictionaryService       = service.ServiceGroupApp.SystemServiceGroup.DictionaryService
-	systemConfigService     = service.ServiceGroupApp.SystemServiceGroup.SystemConfigService
 	operationRecordService  = service.ServiceGroupApp.SystemServiceGroup.OperationRecordService
-	autoCodeHistoryService  = service.ServiceGroupApp.SystemServiceGroup.AutoCodeHistoryService
 	dictionaryDetailService = service.ServiceGroupApp.SystemServiceGroup.DictionaryDetailService
 	authorityBtnService     = service.ServiceGroupApp.SystemServiceGroup.AuthorityBtnService
 )

+ 10 - 10
server/api/v1/system/sys_api.go

@@ -1,13 +1,13 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	systemReq "server/model/system/request"
+	systemRes "server/model/system/response"
+	"server/utils"
 
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
@@ -25,7 +25,7 @@ type SystemApiApi struct{}
 // @Success   200   {object}  response.Response{msg=string}  "创建基础api"
 // @Router    /api/createApi [post]
 func (s *SystemApiApi) CreateApi(c *gin.Context) {
-	var api system.SysApi
+	var api dao.SysApi
 	err := c.ShouldBindJSON(&api)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -55,7 +55,7 @@ func (s *SystemApiApi) CreateApi(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "删除api"
 // @Router    /api/deleteApi [post]
 func (s *SystemApiApi) DeleteApi(c *gin.Context) {
-	var api system.SysApi
+	var api dao.SysApi
 	err := c.ShouldBindJSON(&api)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -150,7 +150,7 @@ func (s *SystemApiApi) GetApiById(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "修改基础api"
 // @Router    /api/updateApi [post]
 func (s *SystemApiApi) UpdateApi(c *gin.Context) {
-	var api system.SysApi
+	var api dao.SysApi
 	err := c.ShouldBindJSON(&api)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)

+ 10 - 45
server/api/v1/system/sys_authority.go

@@ -1,12 +1,12 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	systemRes "server/model/system/response"
+	"server/utils"
 
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
@@ -24,7 +24,7 @@ type AuthorityApi struct{}
 // @Success   200   {object}  response.Response{data=systemRes.SysAuthorityResponse,msg=string}  "创建角色,返回包括系统角色详情"
 // @Router    /authority/createAuthority [post]
 func (a *AuthorityApi) CreateAuthority(c *gin.Context) {
-	var authority, authBack system.SysAuthority
+	var authority, authBack dao.SysAuthority
 	var err error
 
 	if err = c.ShouldBindJSON(&authority); err != nil {
@@ -51,41 +51,6 @@ func (a *AuthorityApi) CreateAuthority(c *gin.Context) {
 	response.OkWithDetailed(systemRes.SysAuthorityResponse{Authority: authBack}, "创建成功", c)
 }
 
-// CopyAuthority
-// @Tags      Authority
-// @Summary   拷贝角色
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      response.SysAuthorityCopyResponse                                  true  "旧角色id, 新权限id, 新权限名, 新父角色id"
-// @Success   200   {object}  response.Response{data=systemRes.SysAuthorityResponse,msg=string}  "拷贝角色,返回包括系统角色详情"
-// @Router    /authority/copyAuthority [post]
-func (a *AuthorityApi) CopyAuthority(c *gin.Context) {
-	var copyInfo systemRes.SysAuthorityCopyResponse
-	err := c.ShouldBindJSON(&copyInfo)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(copyInfo, utils.OldAuthorityVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = utils.Verify(copyInfo.Authority, utils.AuthorityVerify)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	authBack, err := authorityService.CopyAuthority(copyInfo)
-	if err != nil {
-		global.GVA_LOG.Error("拷贝失败!", zap.Error(err))
-		response.FailWithMessage("拷贝失败"+err.Error(), c)
-		return
-	}
-	response.OkWithDetailed(systemRes.SysAuthorityResponse{Authority: authBack}, "拷贝成功", c)
-}
-
 // DeleteAuthority
 // @Tags      Authority
 // @Summary   删除角色
@@ -96,7 +61,7 @@ func (a *AuthorityApi) CopyAuthority(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "删除角色"
 // @Router    /authority/deleteAuthority [post]
 func (a *AuthorityApi) DeleteAuthority(c *gin.Context) {
-	var authority system.SysAuthority
+	var authority dao.SysAuthority
 	var err error
 	if err = c.ShouldBindJSON(&authority); err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -126,7 +91,7 @@ func (a *AuthorityApi) DeleteAuthority(c *gin.Context) {
 // @Success   200   {object}  response.Response{data=systemRes.SysAuthorityResponse,msg=string}  "更新角色信息,返回包括系统角色详情"
 // @Router    /authority/updateAuthority [post]
 func (a *AuthorityApi) UpdateAuthority(c *gin.Context) {
-	var auth system.SysAuthority
+	var auth dao.SysAuthority
 	err := c.ShouldBindJSON(&auth)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -191,7 +156,7 @@ func (a *AuthorityApi) GetAuthorityList(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "设置角色资源权限"
 // @Router    /authority/setDataAuthority [post]
 func (a *AuthorityApi) SetDataAuthority(c *gin.Context) {
-	var auth system.SysAuthority
+	var auth dao.SysAuthority
 	err := c.ShouldBindJSON(&auth)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)

+ 3 - 3
server/api/v1/system/sys_authority_btn.go

@@ -1,11 +1,11 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/global"
+	"server/model/common/response"
+	"server/model/system/request"
 )
 
 type AuthorityBtnApi struct{}

+ 0 - 335
server/api/v1/system/sys_auto_code.go

@@ -1,335 +0,0 @@
-package system
-
-import (
-	"errors"
-	"fmt"
-	"net/url"
-	"os"
-	"strings"
-
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
-
-	"github.com/gin-gonic/gin"
-	"go.uber.org/zap"
-)
-
-type AutoCodeApi struct{}
-
-// PreviewTemp
-// @Tags      AutoCode
-// @Summary   预览创建后的代码
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      system.AutoCodeStruct                                      true  "预览创建代码"
-// @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "预览创建后的代码"
-// @Router    /autoCode/preview [post]
-func (autoApi *AutoCodeApi) PreviewTemp(c *gin.Context) {
-	var a system.AutoCodeStruct
-	_ = c.ShouldBindJSON(&a)
-	if err := utils.Verify(a, utils.AutoCodeVerify); err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	a.Pretreatment() // 处理go关键字
-	a.PackageT = utils.FirstUpper(a.Package)
-	autoCode, err := autoCodeService.PreviewTemp(a)
-	if err != nil {
-		global.GVA_LOG.Error("预览失败!", zap.Error(err))
-		response.FailWithMessage("预览失败", c)
-	} else {
-		response.OkWithDetailed(gin.H{"autoCode": autoCode}, "预览成功", c)
-	}
-}
-
-// CreateTemp
-// @Tags      AutoCode
-// @Summary   自动代码模板
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      system.AutoCodeStruct  true  "创建自动代码"
-// @Success   200   {string}  string                 "{"success":true,"data":{},"msg":"创建成功"}"
-// @Router    /autoCode/createTemp [post]
-func (autoApi *AutoCodeApi) CreateTemp(c *gin.Context) {
-	var a system.AutoCodeStruct
-	_ = c.ShouldBindJSON(&a)
-	if err := utils.Verify(a, utils.AutoCodeVerify); err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	a.Pretreatment()
-	var apiIds []uint
-	var menuId uint
-	if a.AutoCreateApiToSql {
-		if ids, err := autoCodeService.AutoCreateApi(&a); err != nil {
-			global.GVA_LOG.Error("自动化创建失败!请自行清空垃圾数据!", zap.Error(err))
-			c.Writer.Header().Add("success", "false")
-			c.Writer.Header().Add("msg", url.QueryEscape("自动化创建失败!请自行清空垃圾数据!"))
-			return
-		} else {
-			apiIds = ids
-		}
-	}
-	if a.AutoCreateMenuToSql {
-		if id, err := autoCodeService.AutoCreateMenu(&a); err != nil {
-			global.GVA_LOG.Error("自动化创建失败!请自行清空垃圾数据!", zap.Error(err))
-			c.Writer.Header().Add("success", "false")
-			c.Writer.Header().Add("msg", url.QueryEscape("自动化创建失败!请自行清空垃圾数据!"))
-		} else {
-			menuId = id
-		}
-	}
-	a.PackageT = utils.FirstUpper(a.Package)
-	err := autoCodeService.CreateTemp(a, menuId, apiIds...)
-	if err != nil {
-		if errors.Is(err, system.ErrAutoMove) {
-			c.Writer.Header().Add("success", "true")
-			c.Writer.Header().Add("msg", url.QueryEscape(err.Error()))
-		} else {
-			c.Writer.Header().Add("success", "false")
-			c.Writer.Header().Add("msg", url.QueryEscape(err.Error()))
-			_ = os.Remove("./ginvueadmin.zip")
-		}
-	} else {
-		c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", "ginvueadmin.zip")) // fmt.Sprintf("attachment; filename=%s", filename)对下载的文件重命名
-		c.Writer.Header().Add("Content-Type", "application/json")
-		c.Writer.Header().Add("success", "true")
-		c.File("./ginvueadmin.zip")
-		_ = os.Remove("./ginvueadmin.zip")
-	}
-}
-
-// GetDB
-// @Tags      AutoCode
-// @Summary   获取当前所有数据库
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Success   200  {object}  response.Response{data=map[string]interface{},msg=string}  "获取当前所有数据库"
-// @Router    /autoCode/getDatabase [get]
-func (autoApi *AutoCodeApi) GetDB(c *gin.Context) {
-	businessDB := c.Query("businessDB")
-	dbs, err := autoCodeService.Database(businessDB).GetDB(businessDB)
-	var dbList []map[string]interface{}
-	for _, db := range global.GVA_CONFIG.DBList {
-		var item = make(map[string]interface{})
-		item["aliasName"] = db.AliasName
-		item["dbName"] = db.Dbname
-		item["disable"] = db.Disable
-		item["dbtype"] = db.Type
-		dbList = append(dbList, item)
-	}
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-	} else {
-		response.OkWithDetailed(gin.H{"dbs": dbs, "dbList": dbList}, "获取成功", c)
-	}
-}
-
-// GetTables
-// @Tags      AutoCode
-// @Summary   获取当前数据库所有表
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Success   200  {object}  response.Response{data=map[string]interface{},msg=string}  "获取当前数据库所有表"
-// @Router    /autoCode/getTables [get]
-func (autoApi *AutoCodeApi) GetTables(c *gin.Context) {
-	dbName := c.DefaultQuery("dbName", global.GVA_CONFIG.Mysql.Dbname)
-	businessDB := c.Query("businessDB")
-	tables, err := autoCodeService.Database(businessDB).GetTables(businessDB, dbName)
-	if err != nil {
-		global.GVA_LOG.Error("查询table失败!", zap.Error(err))
-		response.FailWithMessage("查询table失败", c)
-	} else {
-		response.OkWithDetailed(gin.H{"tables": tables}, "获取成功", c)
-	}
-}
-
-// GetColumn
-// @Tags      AutoCode
-// @Summary   获取当前表所有字段
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Success   200  {object}  response.Response{data=map[string]interface{},msg=string}  "获取当前表所有字段"
-// @Router    /autoCode/getColumn [get]
-func (autoApi *AutoCodeApi) GetColumn(c *gin.Context) {
-	businessDB := c.Query("businessDB")
-	dbName := c.DefaultQuery("dbName", global.GVA_CONFIG.Mysql.Dbname)
-	tableName := c.Query("tableName")
-	columns, err := autoCodeService.Database(businessDB).GetColumn(businessDB, tableName, dbName)
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-	} else {
-		response.OkWithDetailed(gin.H{"columns": columns}, "获取成功", c)
-	}
-}
-
-// CreatePackage
-// @Tags      AutoCode
-// @Summary   创建package
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      system.SysAutoCode                                         true  "创建package"
-// @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "创建package成功"
-// @Router    /autoCode/createPackage [post]
-func (autoApi *AutoCodeApi) CreatePackage(c *gin.Context) {
-	var a system.SysAutoCode
-	_ = c.ShouldBindJSON(&a)
-	if err := utils.Verify(a, utils.AutoPackageVerify); err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	// PackageName可能导致路径穿越的问题 / 和 \ 都要防止
-	if strings.Contains(a.PackageName, "\\") || strings.Contains(a.PackageName, "/") || strings.Contains(a.PackageName, "..") {
-		response.FailWithMessage("包名不合法", c)
-		return
-	}
-
-	err := autoCodeService.CreateAutoCode(&a)
-	if err != nil {
-
-		global.GVA_LOG.Error("创建失败!", zap.Error(err))
-		response.FailWithMessage("创建失败", c)
-	} else {
-		response.OkWithMessage("创建成功", c)
-	}
-}
-
-// GetPackage
-// @Tags      AutoCode
-// @Summary   获取package
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Success   200  {object}  response.Response{data=map[string]interface{},msg=string}  "创建package成功"
-// @Router    /autoCode/getPackage [post]
-func (autoApi *AutoCodeApi) GetPackage(c *gin.Context) {
-	pkgs, err := autoCodeService.GetPackage()
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-	} else {
-		response.OkWithDetailed(gin.H{"pkgs": pkgs}, "获取成功", c)
-	}
-}
-
-// DelPackage
-// @Tags      AutoCode
-// @Summary   删除package
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      system.SysAutoCode                                         true  "创建package"
-// @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "删除package成功"
-// @Router    /autoCode/delPackage [post]
-func (autoApi *AutoCodeApi) DelPackage(c *gin.Context) {
-	var a system.SysAutoCode
-	_ = c.ShouldBindJSON(&a)
-	err := autoCodeService.DelPackage(a)
-	if err != nil {
-		global.GVA_LOG.Error("删除失败!", zap.Error(err))
-		response.FailWithMessage("删除失败", c)
-	} else {
-		response.OkWithMessage("删除成功", c)
-	}
-}
-
-// AutoPlug
-// @Tags      AutoCode
-// @Summary   创建插件模板
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      system.SysAutoCode                                         true  "创建插件模板"
-// @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "创建插件模板成功"
-// @Router    /autoCode/createPlug [post]
-func (autoApi *AutoCodeApi) AutoPlug(c *gin.Context) {
-	var a system.AutoPlugReq
-	err := c.ShouldBindJSON(&a)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	if strings.Contains(a.PlugName, "\\") || strings.Contains(a.PlugName, "/") || strings.Contains(a.PlugName, "..") {
-		response.FailWithMessage("插件名称不合法", c)
-		return
-	}
-
-	a.Snake = strings.ToLower(a.PlugName)
-	a.NeedModel = a.HasRequest || a.HasResponse
-	err = autoCodeService.CreatePlug(a)
-	if err != nil {
-		global.GVA_LOG.Error("预览失败!", zap.Error(err))
-		response.FailWithMessage("预览失败", c)
-		return
-	}
-	response.Ok(c)
-}
-
-// InstallPlugin
-// @Tags      AutoCode
-// @Summary   安装插件
-// @Security  ApiKeyAuth
-// @accept    multipart/form-data
-// @Produce   application/json
-// @Param     plug  formData  file                                              true  "this is a test file"
-// @Success   200   {object}  response.Response{data=[]interface{},msg=string}  "安装插件成功"
-// @Router    /autoCode/installPlugin [post]
-func (autoApi *AutoCodeApi) InstallPlugin(c *gin.Context) {
-	header, err := c.FormFile("plug")
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	web, server, err := autoCodeService.InstallPlugin(header)
-	webStr := "web插件安装成功"
-	serverStr := "server插件安装成功"
-	if web == -1 {
-		webStr = "web端插件未成功安装,请按照文档自行解压安装,如果为纯后端插件请忽略此条提示"
-	}
-	if server == -1 {
-		serverStr = "server端插件未成功安装,请按照文档自行解压安装,如果为纯前端插件请忽略此条提示"
-	}
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	response.OkWithData([]interface{}{
-		gin.H{
-			"code": web,
-			"msg":  webStr,
-		},
-		gin.H{
-			"code": server,
-			"msg":  serverStr,
-		}}, c)
-}
-
-// PubPlug
-// @Tags      AutoCode
-// @Summary   打包插件
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      system.SysAutoCode                                         true  "打包插件"
-// @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "打包插件成功"
-// @Router    /autoCode/pubPlug [get]
-func (autoApi *AutoCodeApi) PubPlug(c *gin.Context) {
-	plugName := c.Query("plugName")
-	zipPath, err := autoCodeService.PubPlug(plugName)
-	if err != nil {
-		global.GVA_LOG.Error("打包失败!", zap.Error(err))
-		response.FailWithMessage("打包失败"+err.Error(), c)
-		return
-	}
-	response.OkWithMessage(fmt.Sprintf("打包成功,文件路径为:%s", zipPath), c)
-}

+ 0 - 115
server/api/v1/system/sys_auto_code_history.go

@@ -1,115 +0,0 @@
-package system
-
-import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	"github.com/gin-gonic/gin"
-	"go.uber.org/zap"
-)
-
-type AutoCodeHistoryApi struct{}
-
-// First
-// @Tags      AutoCode
-// @Summary   获取meta信息
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      request.GetById                                            true  "请求参数"
-// @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "获取meta信息"
-// @Router    /autoCode/getMeta [post]
-func (a *AutoCodeHistoryApi) First(c *gin.Context) {
-	var info request.GetById
-	err := c.ShouldBindJSON(&info)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	data, err := autoCodeHistoryService.First(&info)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	response.OkWithDetailed(gin.H{"meta": data}, "获取成功", c)
-}
-
-// Delete
-// @Tags      AutoCode
-// @Summary   删除回滚记录
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      request.GetById                true  "请求参数"
-// @Success   200   {object}  response.Response{msg=string}  "删除回滚记录"
-// @Router    /autoCode/delSysHistory [post]
-func (a *AutoCodeHistoryApi) Delete(c *gin.Context) {
-	var info request.GetById
-	err := c.ShouldBindJSON(&info)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = autoCodeHistoryService.Delete(&info)
-	if err != nil {
-		global.GVA_LOG.Error("删除失败!", zap.Error(err))
-		response.FailWithMessage("删除失败", c)
-		return
-	}
-	response.OkWithMessage("删除成功", c)
-}
-
-// RollBack
-// @Tags      AutoCode
-// @Summary   回滚自动生成代码
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      systemReq.RollBack             true  "请求参数"
-// @Success   200   {object}  response.Response{msg=string}  "回滚自动生成代码"
-// @Router    /autoCode/rollback [post]
-func (a *AutoCodeHistoryApi) RollBack(c *gin.Context) {
-	var info systemReq.RollBack
-	err := c.ShouldBindJSON(&info)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = autoCodeHistoryService.RollBack(&info)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	response.OkWithMessage("回滚成功", c)
-}
-
-// GetList
-// @Tags      AutoCode
-// @Summary   查询回滚记录
-// @Security  ApiKeyAuth
-// @accept    application/json
-// @Produce   application/json
-// @Param     data  body      systemReq.SysAutoHistory                                true  "请求参数"
-// @Success   200   {object}  response.Response{data=response.PageResult,msg=string}  "查询回滚记录,返回包括列表,总数,页码,每页数量"
-// @Router    /autoCode/getSysHistory [post]
-func (a *AutoCodeHistoryApi) GetList(c *gin.Context) {
-	var search systemReq.SysAutoHistory
-	err := c.ShouldBindJSON(&search)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	list, total, err := autoCodeHistoryService.GetList(search.PageInfo)
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-		return
-	}
-	response.OkWithDetailed(response.PageResult{
-		List:     list,
-		Total:    total,
-		Page:     search.Page,
-		PageSize: search.PageSize,
-	}, "获取成功", c)
-}

+ 3 - 3
server/api/v1/system/sys_captcha.go

@@ -3,12 +3,12 @@ package system
 import (
 	"time"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
 	"github.com/gin-gonic/gin"
 	"github.com/mojocn/base64Captcha"
 	"go.uber.org/zap"
+	"server/global"
+	"server/model/common/response"
+	systemRes "server/model/system/response"
 )
 
 // 当开启多服务器部署时,替换下面的配置,使用redis共享存储验证码

+ 5 - 5
server/api/v1/system/sys_casbin.go

@@ -1,13 +1,13 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/global"
+	"server/model/common/response"
+	"server/model/system/request"
+	systemRes "server/model/system/response"
+	"server/utils"
 )
 
 type CasbinApi struct{}

+ 7 - 7
server/api/v1/system/sys_dictionary.go

@@ -1,11 +1,11 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/dao"
+	"server/global"
+	"server/model/common/response"
 )
 
 type DictionaryApi struct{}
@@ -20,7 +20,7 @@ type DictionaryApi struct{}
 // @Success   200   {object}  response.Response{msg=string}  "创建SysDictionary"
 // @Router    /sysDictionary/createSysDictionary [post]
 func (s *DictionaryApi) CreateSysDictionary(c *gin.Context) {
-	var dictionary system.SysDictionary
+	var dictionary dao.SysDictionary
 	err := c.ShouldBindJSON(&dictionary)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -45,7 +45,7 @@ func (s *DictionaryApi) CreateSysDictionary(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "删除SysDictionary"
 // @Router    /sysDictionary/deleteSysDictionary [delete]
 func (s *DictionaryApi) DeleteSysDictionary(c *gin.Context) {
-	var dictionary system.SysDictionary
+	var dictionary dao.SysDictionary
 	err := c.ShouldBindJSON(&dictionary)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -70,7 +70,7 @@ func (s *DictionaryApi) DeleteSysDictionary(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "更新SysDictionary"
 // @Router    /sysDictionary/updateSysDictionary [put]
 func (s *DictionaryApi) UpdateSysDictionary(c *gin.Context) {
-	var dictionary system.SysDictionary
+	var dictionary dao.SysDictionary
 	err := c.ShouldBindJSON(&dictionary)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -95,7 +95,7 @@ func (s *DictionaryApi) UpdateSysDictionary(c *gin.Context) {
 // @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "用id查询SysDictionary"
 // @Router    /sysDictionary/findSysDictionary [get]
 func (s *DictionaryApi) FindSysDictionary(c *gin.Context) {
-	var dictionary system.SysDictionary
+	var dictionary dao.SysDictionary
 	err := c.ShouldBindQuery(&dictionary)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)

+ 9 - 9
server/api/v1/system/sys_dictionary_detail.go

@@ -1,13 +1,13 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/dao"
+	"server/global"
+	"server/model/common/response"
+	"server/model/system/request"
+	"server/utils"
 )
 
 type DictionaryDetailApi struct{}
@@ -22,7 +22,7 @@ type DictionaryDetailApi struct{}
 // @Success   200   {object}  response.Response{msg=string}  "创建SysDictionaryDetail"
 // @Router    /sysDictionaryDetail/createSysDictionaryDetail [post]
 func (s *DictionaryDetailApi) CreateSysDictionaryDetail(c *gin.Context) {
-	var detail system.SysDictionaryDetail
+	var detail dao.SysDictionaryDetail
 	err := c.ShouldBindJSON(&detail)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -47,7 +47,7 @@ func (s *DictionaryDetailApi) CreateSysDictionaryDetail(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "删除SysDictionaryDetail"
 // @Router    /sysDictionaryDetail/deleteSysDictionaryDetail [delete]
 func (s *DictionaryDetailApi) DeleteSysDictionaryDetail(c *gin.Context) {
-	var detail system.SysDictionaryDetail
+	var detail dao.SysDictionaryDetail
 	err := c.ShouldBindJSON(&detail)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -72,7 +72,7 @@ func (s *DictionaryDetailApi) DeleteSysDictionaryDetail(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "更新SysDictionaryDetail"
 // @Router    /sysDictionaryDetail/updateSysDictionaryDetail [put]
 func (s *DictionaryDetailApi) UpdateSysDictionaryDetail(c *gin.Context) {
-	var detail system.SysDictionaryDetail
+	var detail dao.SysDictionaryDetail
 	err := c.ShouldBindJSON(&detail)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -97,7 +97,7 @@ func (s *DictionaryDetailApi) UpdateSysDictionaryDetail(c *gin.Context) {
 // @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "用id查询SysDictionaryDetail"
 // @Router    /sysDictionaryDetail/findSysDictionaryDetail [get]
 func (s *DictionaryDetailApi) FindSysDictionaryDetail(c *gin.Context) {
-	var detail system.SysDictionaryDetail
+	var detail dao.SysDictionaryDetail
 	err := c.ShouldBindQuery(&detail)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)

+ 0 - 257
server/api/v1/system/sys_export_template.go

@@ -1,257 +0,0 @@
-package system
-
-import (
-	"fmt"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/service"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
-	"github.com/gin-gonic/gin"
-	"go.uber.org/zap"
-	"net/http"
-)
-
-type SysExportTemplateApi struct {
-}
-
-var sysExportTemplateService = service.ServiceGroupApp.SystemServiceGroup.SysExportTemplateService
-
-// CreateSysExportTemplate 创建导出模板
-// @Tags SysExportTemplate
-// @Summary 创建导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body system.SysExportTemplate true "创建导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
-// @Router /sysExportTemplate/createSysExportTemplate [post]
-func (sysExportTemplateApi *SysExportTemplateApi) CreateSysExportTemplate(c *gin.Context) {
-	var sysExportTemplate system.SysExportTemplate
-	err := c.ShouldBindJSON(&sysExportTemplate)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	verify := utils.Rules{
-		"Name": {utils.NotEmpty()},
-	}
-	if err := utils.Verify(sysExportTemplate, verify); err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	if err := sysExportTemplateService.CreateSysExportTemplate(&sysExportTemplate); err != nil {
-		global.GVA_LOG.Error("创建失败!", zap.Error(err))
-		response.FailWithMessage("创建失败", c)
-	} else {
-		response.OkWithMessage("创建成功", c)
-	}
-}
-
-// DeleteSysExportTemplate 删除导出模板
-// @Tags SysExportTemplate
-// @Summary 删除导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body system.SysExportTemplate true "删除导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
-// @Router /sysExportTemplate/deleteSysExportTemplate [delete]
-func (sysExportTemplateApi *SysExportTemplateApi) DeleteSysExportTemplate(c *gin.Context) {
-	var sysExportTemplate system.SysExportTemplate
-	err := c.ShouldBindJSON(&sysExportTemplate)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	if err := sysExportTemplateService.DeleteSysExportTemplate(sysExportTemplate); err != nil {
-		global.GVA_LOG.Error("删除失败!", zap.Error(err))
-		response.FailWithMessage("删除失败", c)
-	} else {
-		response.OkWithMessage("删除成功", c)
-	}
-}
-
-// DeleteSysExportTemplateByIds 批量删除导出模板
-// @Tags SysExportTemplate
-// @Summary 批量删除导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body request.IdsReq true "批量删除导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"批量删除成功"}"
-// @Router /sysExportTemplate/deleteSysExportTemplateByIds [delete]
-func (sysExportTemplateApi *SysExportTemplateApi) DeleteSysExportTemplateByIds(c *gin.Context) {
-	var IDS request.IdsReq
-	err := c.ShouldBindJSON(&IDS)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	if err := sysExportTemplateService.DeleteSysExportTemplateByIds(IDS); err != nil {
-		global.GVA_LOG.Error("批量删除失败!", zap.Error(err))
-		response.FailWithMessage("批量删除失败", c)
-	} else {
-		response.OkWithMessage("批量删除成功", c)
-	}
-}
-
-// UpdateSysExportTemplate 更新导出模板
-// @Tags SysExportTemplate
-// @Summary 更新导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data body system.SysExportTemplate true "更新导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}"
-// @Router /sysExportTemplate/updateSysExportTemplate [put]
-func (sysExportTemplateApi *SysExportTemplateApi) UpdateSysExportTemplate(c *gin.Context) {
-	var sysExportTemplate system.SysExportTemplate
-	err := c.ShouldBindJSON(&sysExportTemplate)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	verify := utils.Rules{
-		"Name": {utils.NotEmpty()},
-	}
-	if err := utils.Verify(sysExportTemplate, verify); err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	if err := sysExportTemplateService.UpdateSysExportTemplate(sysExportTemplate); err != nil {
-		global.GVA_LOG.Error("更新失败!", zap.Error(err))
-		response.FailWithMessage("更新失败", c)
-	} else {
-		response.OkWithMessage("更新成功", c)
-	}
-}
-
-// FindSysExportTemplate 用id查询导出模板
-// @Tags SysExportTemplate
-// @Summary 用id查询导出模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data query system.SysExportTemplate true "用id查询导出模板"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
-// @Router /sysExportTemplate/findSysExportTemplate [get]
-func (sysExportTemplateApi *SysExportTemplateApi) FindSysExportTemplate(c *gin.Context) {
-	var sysExportTemplate system.SysExportTemplate
-	err := c.ShouldBindQuery(&sysExportTemplate)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	if resysExportTemplate, err := sysExportTemplateService.GetSysExportTemplate(sysExportTemplate.ID); err != nil {
-		global.GVA_LOG.Error("查询失败!", zap.Error(err))
-		response.FailWithMessage("查询失败", c)
-	} else {
-		response.OkWithData(gin.H{"resysExportTemplate": resysExportTemplate}, c)
-	}
-}
-
-// GetSysExportTemplateList 分页获取导出模板列表
-// @Tags SysExportTemplate
-// @Summary 分页获取导出模板列表
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Param data query systemReq.SysExportTemplateSearch true "分页获取导出模板列表"
-// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
-// @Router /sysExportTemplate/getSysExportTemplateList [get]
-func (sysExportTemplateApi *SysExportTemplateApi) GetSysExportTemplateList(c *gin.Context) {
-	var pageInfo systemReq.SysExportTemplateSearch
-	err := c.ShouldBindQuery(&pageInfo)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	if list, total, err := sysExportTemplateService.GetSysExportTemplateInfoList(pageInfo); err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-	} else {
-		response.OkWithDetailed(response.PageResult{
-			List:     list,
-			Total:    total,
-			Page:     pageInfo.Page,
-			PageSize: pageInfo.PageSize,
-		}, "获取成功", c)
-	}
-}
-
-// ExportExcel 导出表格
-// @Tags SysExportTemplate
-// @Summary 导出表格
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Router /sysExportTemplate/exportExcel [get]
-func (sysExportTemplateApi *SysExportTemplateApi) ExportExcel(c *gin.Context) {
-	templateID := c.Query("templateID")
-	queryParams := c.Request.URL.Query()
-	if templateID == "" {
-		response.FailWithMessage("模板ID不能为空", c)
-		return
-	}
-	if file, name, err := sysExportTemplateService.ExportExcel(templateID, queryParams); err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-	} else {
-		c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", name+utils.RandomString(6)+".xlsx")) // 对下载的文件重命名
-		c.Header("success", "true")
-		c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", file.Bytes())
-	}
-}
-
-// ExportExcel 导出表格模板
-// @Tags SysExportTemplate
-// @Summary 导出表格模板
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Router /sysExportTemplate/exportExcel [get]
-func (sysExportTemplateApi *SysExportTemplateApi) ExportTemplate(c *gin.Context) {
-	templateID := c.Query("templateID")
-	if templateID == "" {
-		response.FailWithMessage("模板ID不能为空", c)
-		return
-	}
-	if file, name, err := sysExportTemplateService.ExportTemplate(templateID); err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-	} else {
-		c.Header("Content-Disposition", fmt.Sprintf("attachment; filename=%s", name+"模板.xlsx")) // 对下载的文件重命名
-		c.Header("success", "true")
-		c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", file.Bytes())
-	}
-}
-
-// ExportExcel 导入表格
-// @Tags SysImportTemplate
-// @Summary 导入表格
-// @Security ApiKeyAuth
-// @accept application/json
-// @Produce application/json
-// @Router /sysExportTemplate/importExcel [post]
-func (sysExportTemplateApi *SysExportTemplateApi) ImportExcel(c *gin.Context) {
-	templateID := c.Query("templateID")
-	if templateID == "" {
-		response.FailWithMessage("模板ID不能为空", c)
-		return
-	}
-	file, err := c.FormFile("file")
-	if err != nil {
-		global.GVA_LOG.Error("文件获取失败!", zap.Error(err))
-		response.FailWithMessage("文件获取失败", c)
-		return
-	}
-	if err := sysExportTemplateService.ImportExcel(templateID, file); err != nil {
-		global.GVA_LOG.Error(err.Error(), zap.Error(err))
-		response.FailWithMessage(err.Error(), c)
-	} else {
-		response.OkWithMessage("导入成功", c)
-	}
-}

+ 0 - 59
server/api/v1/system/sys_initdb.go

@@ -1,59 +0,0 @@
-package system
-
-import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	"go.uber.org/zap"
-
-	"github.com/gin-gonic/gin"
-)
-
-type DBApi struct{}
-
-// InitDB
-// @Tags     InitDB
-// @Summary  初始化用户数据库
-// @Produce  application/json
-// @Param    data  body      request.InitDB                  true  "初始化数据库参数"
-// @Success  200   {object}  response.Response{data=string}  "初始化用户数据库"
-// @Router   /init/initdb [post]
-func (i *DBApi) InitDB(c *gin.Context) {
-	if global.GVA_DB != nil {
-		global.GVA_LOG.Error("已存在数据库配置!")
-		response.FailWithMessage("已存在数据库配置", c)
-		return
-	}
-	var dbInfo request.InitDB
-	if err := c.ShouldBindJSON(&dbInfo); err != nil {
-		global.GVA_LOG.Error("参数校验不通过!", zap.Error(err))
-		response.FailWithMessage("参数校验不通过", c)
-		return
-	}
-	if err := initDBService.InitDB(dbInfo); err != nil {
-		global.GVA_LOG.Error("自动创建数据库失败!", zap.Error(err))
-		response.FailWithMessage("自动创建数据库失败,请查看后台日志,检查后在进行初始化", c)
-		return
-	}
-	response.OkWithMessage("自动创建数据库成功", c)
-}
-
-// CheckDB
-// @Tags     CheckDB
-// @Summary  初始化用户数据库
-// @Produce  application/json
-// @Success  200  {object}  response.Response{data=map[string]interface{},msg=string}  "初始化用户数据库"
-// @Router   /init/checkdb [post]
-func (i *DBApi) CheckDB(c *gin.Context) {
-	var (
-		message  = "前往初始化数据库"
-		needInit = true
-	)
-
-	if global.GVA_DB != nil {
-		message = "数据库无需初始化"
-		needInit = false
-	}
-	global.GVA_LOG.Info(message)
-	response.OkWithDetailed(gin.H{"needInit": needInit}, message, c)
-}

+ 5 - 5
server/api/v1/system/sys_jwt_blacklist.go

@@ -1,12 +1,12 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/dao"
+	"server/global"
+	"server/model/common/response"
+	"server/utils"
 )
 
 type JwtApi struct{}
@@ -21,7 +21,7 @@ type JwtApi struct{}
 // @Router    /jwt/jsonInBlacklist [post]
 func (j *JwtApi) JsonInBlacklist(c *gin.Context) {
 	token := utils.GetToken(c)
-	jwt := system.JwtBlacklist{Jwt: token}
+	jwt := dao.JwtBlacklist{Jwt: token}
 	err := jwtService.JsonInBlacklist(jwt)
 	if err != nil {
 		global.GVA_LOG.Error("jwt作废失败!", zap.Error(err))

+ 10 - 10
server/api/v1/system/sys_menu.go

@@ -1,13 +1,13 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	systemReq "server/model/system/request"
+	systemRes "server/model/system/response"
+	"server/utils"
 
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
@@ -31,7 +31,7 @@ func (a *AuthorityMenuApi) GetMenu(c *gin.Context) {
 		return
 	}
 	if menus == nil {
-		menus = []system.SysMenu{}
+		menus = []dao.SysMenu{}
 	}
 	response.OkWithDetailed(systemRes.SysMenusResponse{Menus: menus}, "获取成功", c)
 }
@@ -122,7 +122,7 @@ func (a *AuthorityMenuApi) GetMenuAuthority(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "新增菜单"
 // @Router    /menu/addBaseMenu [post]
 func (a *AuthorityMenuApi) AddBaseMenu(c *gin.Context) {
-	var menu system.SysBaseMenu
+	var menu dao.SysBaseMenu
 	err := c.ShouldBindJSON(&menu)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -187,7 +187,7 @@ func (a *AuthorityMenuApi) DeleteBaseMenu(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "更新菜单"
 // @Router    /menu/updateBaseMenu [post]
 func (a *AuthorityMenuApi) UpdateBaseMenu(c *gin.Context) {
-	var menu system.SysBaseMenu
+	var menu dao.SysBaseMenu
 	err := c.ShouldBindJSON(&menu)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)

+ 9 - 9
server/api/v1/system/sys_operation_record.go

@@ -1,14 +1,14 @@
 package system
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/dao"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	systemReq "server/model/system/request"
+	"server/utils"
 )
 
 type OperationRecordApi struct{}
@@ -23,7 +23,7 @@ type OperationRecordApi struct{}
 // @Success   200   {object}  response.Response{msg=string}  "创建SysOperationRecord"
 // @Router    /sysOperationRecord/createSysOperationRecord [post]
 func (s *OperationRecordApi) CreateSysOperationRecord(c *gin.Context) {
-	var sysOperationRecord system.SysOperationRecord
+	var sysOperationRecord dao.SysOperationRecord
 	err := c.ShouldBindJSON(&sysOperationRecord)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -48,7 +48,7 @@ func (s *OperationRecordApi) CreateSysOperationRecord(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "删除SysOperationRecord"
 // @Router    /sysOperationRecord/deleteSysOperationRecord [delete]
 func (s *OperationRecordApi) DeleteSysOperationRecord(c *gin.Context) {
-	var sysOperationRecord system.SysOperationRecord
+	var sysOperationRecord dao.SysOperationRecord
 	err := c.ShouldBindJSON(&sysOperationRecord)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -98,7 +98,7 @@ func (s *OperationRecordApi) DeleteSysOperationRecordByIds(c *gin.Context) {
 // @Success   200   {object}  response.Response{data=map[string]interface{},msg=string}  "用id查询SysOperationRecord"
 // @Router    /sysOperationRecord/findSysOperationRecord [get]
 func (s *OperationRecordApi) FindSysOperationRecord(c *gin.Context) {
-	var sysOperationRecord system.SysOperationRecord
+	var sysOperationRecord dao.SysOperationRecord
 	err := c.ShouldBindQuery(&sysOperationRecord)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)

+ 0 - 88
server/api/v1/system/sys_system.go

@@ -1,88 +0,0 @@
-package system
-
-import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
-	"github.com/gin-gonic/gin"
-	"go.uber.org/zap"
-)
-
-type SystemApi struct{}
-
-// GetSystemConfig
-// @Tags      System
-// @Summary   获取配置文件内容
-// @Security  ApiKeyAuth
-// @Produce   application/json
-// @Success   200  {object}  response.Response{data=systemRes.SysConfigResponse,msg=string}  "获取配置文件内容,返回包括系统配置"
-// @Router    /system/getSystemConfig [post]
-func (s *SystemApi) GetSystemConfig(c *gin.Context) {
-	config, err := systemConfigService.GetSystemConfig()
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-		return
-	}
-	response.OkWithDetailed(systemRes.SysConfigResponse{Config: config}, "获取成功", c)
-}
-
-// SetSystemConfig
-// @Tags      System
-// @Summary   设置配置文件内容
-// @Security  ApiKeyAuth
-// @Produce   application/json
-// @Param     data  body      system.System                   true  "设置配置文件内容"
-// @Success   200   {object}  response.Response{data=string}  "设置配置文件内容"
-// @Router    /system/setSystemConfig [post]
-func (s *SystemApi) SetSystemConfig(c *gin.Context) {
-	var sys system.System
-	err := c.ShouldBindJSON(&sys)
-	if err != nil {
-		response.FailWithMessage(err.Error(), c)
-		return
-	}
-	err = systemConfigService.SetSystemConfig(sys)
-	if err != nil {
-		global.GVA_LOG.Error("设置失败!", zap.Error(err))
-		response.FailWithMessage("设置失败", c)
-		return
-	}
-	response.OkWithMessage("设置成功", c)
-}
-
-// ReloadSystem
-// @Tags      System
-// @Summary   重启系统
-// @Security  ApiKeyAuth
-// @Produce   application/json
-// @Success   200  {object}  response.Response{msg=string}  "重启系统"
-// @Router    /system/reloadSystem [post]
-func (s *SystemApi) ReloadSystem(c *gin.Context) {
-	err := utils.Reload()
-	if err != nil {
-		global.GVA_LOG.Error("重启系统失败!", zap.Error(err))
-		response.FailWithMessage("重启系统失败", c)
-		return
-	}
-	response.OkWithMessage("重启系统成功", c)
-}
-
-// GetServerInfo
-// @Tags      System
-// @Summary   获取服务器信息
-// @Security  ApiKeyAuth
-// @Produce   application/json
-// @Success   200  {object}  response.Response{data=map[string]interface{},msg=string}  "获取服务器信息"
-// @Router    /system/getServerInfo [post]
-func (s *SystemApi) GetServerInfo(c *gin.Context) {
-	server, err := systemConfigService.GetServerInfo()
-	if err != nil {
-		global.GVA_LOG.Error("获取失败!", zap.Error(err))
-		response.FailWithMessage("获取失败", c)
-		return
-	}
-	response.OkWithDetailed(gin.H{"server": server}, "获取成功", c)
-}

+ 29 - 23
server/api/v1/system/sys_user.go

@@ -1,16 +1,16 @@
 package system
 
 import (
+	"server/dao"
 	"strconv"
 	"time"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/request"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	systemReq "github.com/flipped-aurora/gin-vue-admin/server/model/system/request"
-	systemRes "github.com/flipped-aurora/gin-vue-admin/server/model/system/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"server/global"
+	"server/model/common/request"
+	"server/model/common/response"
+	systemReq "server/model/system/request"
+	systemRes "server/model/system/response"
+	"server/utils"
 
 	"github.com/gin-gonic/gin"
 	"github.com/redis/go-redis/v9"
@@ -62,7 +62,7 @@ func (b *BaseApi) Login(c *gin.Context) {
 	l.Password = rsa.Encryption(l.Password)
 
 	if !oc || (l.CaptchaId != "" && l.Captcha != "" && store.Verify(l.CaptchaId, l.Captcha, true)) {
-		u := &system.SysUser{Username: l.Username, Password: l.Password}
+		u := &dao.SysUser{Username: l.Username, Password: l.Password}
 		user, err := userService.Login(u)
 		if err != nil {
 			global.GVA_LOG.Error("登陆失败! 用户名不存在或者密码错误!", zap.Error(err))
@@ -87,7 +87,7 @@ func (b *BaseApi) Login(c *gin.Context) {
 }
 
 // TokenNext 登录以后签发jwt
-func (b *BaseApi) TokenNext(c *gin.Context, user system.SysUser) {
+func (b *BaseApi) TokenNext(c *gin.Context, user dao.SysUser) {
 	j := &utils.JWT{SigningKey: []byte(global.GVA_CONFIG.JWT.SigningKey)} // 唯一签名
 	claims := j.CreateClaims(systemReq.BaseClaims{
 		UUID:        user.UUID,
@@ -128,7 +128,7 @@ func (b *BaseApi) TokenNext(c *gin.Context, user system.SysUser) {
 		global.GVA_LOG.Error("设置登录状态失败!", zap.Error(err))
 		response.FailWithMessage("设置登录状态失败", c)
 	} else {
-		var blackJWT system.JwtBlacklist
+		var blackJWT dao.JwtBlacklist
 		blackJWT.Jwt = jwtStr
 		if err := jwtService.JsonInBlacklist(blackJWT); err != nil {
 			response.FailWithMessage("jwt作废失败", c)
@@ -166,13 +166,8 @@ func (b *BaseApi) Register(c *gin.Context) {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	var authorities []system.SysAuthority
-	for _, v := range r.AuthorityIds {
-		authorities = append(authorities, system.SysAuthority{
-			AuthorityId: v,
-		})
-	}
-	user := &system.SysUser{Username: r.Username, NickName: r.NickName, Password: r.Password, HeaderImg: r.HeaderImg, AuthorityId: r.AuthorityId, Authorities: authorities, Enable: r.Enable, Phone: r.Phone, Email: r.Email}
+
+	user := &dao.SysUser{Username: r.Username, NickName: r.NickName, Password: r.Password, HeaderImg: r.HeaderImg, AuthorityId: r.AuthorityId, Enable: r.Enable, Phone: r.Phone, Email: r.Email}
 	userReturn, err := userService.Register(*user)
 	if err != nil {
 		global.GVA_LOG.Error("注册失败!", zap.Error(err))
@@ -203,7 +198,7 @@ func (b *BaseApi) ChangePassword(c *gin.Context) {
 		return
 	}
 	uid := utils.GetUserID(c)
-	u := &system.SysUser{GVA_MODEL: global.GVA_MODEL{ID: uid}, Password: req.Password}
+	u := &dao.SysUser{GVA_MODEL: global.GVA_MODEL{ID: uid}, Password: req.Password}
 	_, err = userService.ChangePassword(u, req.NewPassword)
 	if err != nil {
 		global.GVA_LOG.Error("修改失败!", zap.Error(err))
@@ -305,7 +300,7 @@ func (b *BaseApi) SetUserAuthorities(c *gin.Context) {
 		response.FailWithMessage(err.Error(), c)
 		return
 	}
-	err = userService.SetUserAuthorities(sua.ID, sua.AuthorityIds)
+	err = userService.SetUserAuthorities(sua.ID, sua.AuthorityId)
 	if err != nil {
 		global.GVA_LOG.Error("修改失败!", zap.Error(err))
 		response.FailWithMessage("修改失败", c)
@@ -371,7 +366,7 @@ func (b *BaseApi) SetUserInfo(c *gin.Context) {
 		return
 	}
 
-	if len(user.AuthorityIds) != 0 {
+	if user.AuthorityIds != 0 {
 		err = userService.SetUserAuthorities(user.ID, user.AuthorityIds)
 		if err != nil {
 			global.GVA_LOG.Error("设置失败!", zap.Error(err))
@@ -379,7 +374,7 @@ func (b *BaseApi) SetUserInfo(c *gin.Context) {
 			return
 		}
 	}
-	err = userService.SetUserInfo(system.SysUser{
+	err = userService.SetUserInfo(dao.SysUser{
 		GVA_MODEL: global.GVA_MODEL{
 			ID: user.ID,
 		},
@@ -415,7 +410,7 @@ func (b *BaseApi) SetSelfInfo(c *gin.Context) {
 		return
 	}
 	user.ID = utils.GetUserID(c)
-	err = userService.SetSelfInfo(system.SysUser{
+	err = userService.SetSelfInfo(dao.SysUser{
 		GVA_MODEL: global.GVA_MODEL{
 			ID: user.ID,
 		},
@@ -462,7 +457,7 @@ func (b *BaseApi) GetUserInfo(c *gin.Context) {
 // @Success   200   {object}  response.Response{msg=string}  "重置用户密码"
 // @Router    /user/resetPassword [post]
 func (b *BaseApi) ResetPassword(c *gin.Context) {
-	var user system.SysUser
+	var user dao.SysUser
 	err := c.ShouldBindJSON(&user)
 	if err != nil {
 		response.FailWithMessage(err.Error(), c)
@@ -476,3 +471,14 @@ func (b *BaseApi) ResetPassword(c *gin.Context) {
 	}
 	response.OkWithMessage("重置成功", c)
 }
+
+// QueryAllUsers 查询所有用户
+func (b *BaseApi) QueryAllUsers(c *gin.Context) {
+	users, err := userService.QueryAllUsers()
+	if err != nil {
+		global.GVA_LOG.Error("查询失败!", zap.Error(err))
+		response.FailWithMessage("查询失败", c)
+		return
+	}
+	response.OkWithDetailed(users, "查询成功", c)
+}

+ 2 - 0
server/build.bat

@@ -0,0 +1,2 @@
+%此脚本需要在命令窗口执行,不能直接运行%
+go env -w CGO_ENABLED=0 GOOS=linux GOARCH=amd64 && go build -o build/lc_finance ./

+ 1 - 1
server/config.yaml

@@ -196,7 +196,7 @@ system:
     db-type: mysql
     oss-type: local
     router-prefix: ""
-    addr: 8888
+    addr: 8220
     iplimit-count: 15000
     iplimit-time: 3600
     use-multipoint: false

+ 0 - 18
server/config/auto_code.go

@@ -1,18 +0,0 @@
-package config
-
-type Autocode struct {
-	SModel          string `mapstructure:"server-model" json:"server-model" yaml:"server-model"`
-	SRouter         string `mapstructure:"server-router" json:"server-router" yaml:"server-router"`
-	Server          string `mapstructure:"server" json:"server" yaml:"server"`
-	SApi            string `mapstructure:"server-api" json:"server-api" yaml:"server-api"`
-	SPlug           string `mapstructure:"server-plug" json:"server-plug" yaml:"server-plug"`
-	SInitialize     string `mapstructure:"server-initialize" json:"server-initialize" yaml:"server-initialize"`
-	Root            string `mapstructure:"root" json:"root" yaml:"root"`
-	WTable          string `mapstructure:"web-table" json:"web-table" yaml:"web-table"`
-	Web             string `mapstructure:"web" json:"web" yaml:"web"`
-	SService        string `mapstructure:"server-service" json:"server-service" yaml:"server-service"`
-	SRequest        string `mapstructure:"server-request" json:"server-request"  yaml:"server-request"`
-	WApi            string `mapstructure:"web-api" json:"web-api" yaml:"web-api"`
-	WForm           string `mapstructure:"web-form" json:"web-form" yaml:"web-form"`
-	TransferRestart bool   `mapstructure:"transfer-restart" json:"transfer-restart" yaml:"transfer-restart"`
-}

+ 0 - 2
server/config/config.go

@@ -8,8 +8,6 @@ type Server struct {
 	Email   Email   `mapstructure:"email" json:"email" yaml:"email"`
 	System  System  `mapstructure:"system" json:"system" yaml:"system"`
 	Captcha Captcha `mapstructure:"captcha" json:"captcha" yaml:"captcha"`
-	// auto
-	AutoCode Autocode `mapstructure:"autocode" json:"autocode" yaml:"autocode"`
 	// gorm
 	Mysql  Mysql           `mapstructure:"mysql" json:"mysql" yaml:"mysql"`
 	Mssql  Mssql           `mapstructure:"mssql" json:"mssql" yaml:"mssql"`

+ 1 - 1
server/core/internal/file_rotatelogs.go

@@ -1,9 +1,9 @@
 package internal
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
 	"go.uber.org/zap/zapcore"
 	"os"
+	"server/global"
 )
 
 var FileRotatelogs = new(fileRotatelogs)

+ 1 - 1
server/core/internal/zap.go

@@ -1,9 +1,9 @@
 package internal
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
+	"server/global"
 	"time"
 )
 

+ 4 - 14
server/core/server.go

@@ -2,10 +2,10 @@ package core
 
 import (
 	"fmt"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize"
-	"github.com/flipped-aurora/gin-vue-admin/server/service/system"
 	"go.uber.org/zap"
+	"server/global"
+	"server/initialize"
+	"server/service/system"
 )
 
 type server interface {
@@ -35,16 +35,6 @@ func RunWindowsServer() {
 	s := initServer(address, Router)
 
 	global.GVA_LOG.Info("server run success on ", zap.String("address", address))
-
-	fmt.Printf(`
-	欢迎使用 gin-vue-admin
-	当前版本:v2.6.3
-    加群方式:微信号:shouzi_1994 QQ群:470239250
-	插件市场:https://plugin.gin-vue-admin.com
-	GVA讨论社区:https://support.qq.com/products/371961
-	默认自动化文档地址:http://127.0.0.1%s/swagger/index.html
-	默认前端文件运行地址:http://127.0.0.1:8080
-	如果项目让您获得了收益,希望您能请团队喝杯可乐:https://www.gin-vue-admin.com/coffee/index.html
-`, address)
+	fmt.Println("龙弛")
 	global.GVA_LOG.Error(s.ListenAndServe().Error())
 }

+ 3 - 6
server/core/viper.go

@@ -3,16 +3,15 @@ package core
 import (
 	"flag"
 	"fmt"
-	"github.com/flipped-aurora/gin-vue-admin/server/core/internal"
 	"github.com/gin-gonic/gin"
 	"os"
-	"path/filepath"
+	"server/core/internal"
 
 	"github.com/fsnotify/fsnotify"
 	"github.com/spf13/viper"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	_ "github.com/flipped-aurora/gin-vue-admin/server/packfile"
+	"server/global"
+	_ "server/packfile"
 )
 
 // Viper //
@@ -68,7 +67,5 @@ func Viper(path ...string) *viper.Viper {
 		panic(err)
 	}
 
-	// root 适配性 根据root位置去找到对应迁移位置,保证root路径有效
-	global.GVA_CONFIG.AutoCode.Root, _ = filepath.Abs("..")
 	return v
 }

+ 3 - 3
server/core/zap.go

@@ -2,12 +2,12 @@ package core
 
 import (
 	"fmt"
-	"github.com/flipped-aurora/gin-vue-admin/server/core/internal"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"go.uber.org/zap"
 	"go.uber.org/zap/zapcore"
 	"os"
+	"server/core/internal"
+	"server/global"
+	"server/utils"
 )
 
 // Zap 获取 zap.Logger

+ 68 - 0
server/dao/borrowing.go

@@ -0,0 +1,68 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"server/global"
+)
+
+type Borrowing struct {
+	global.GVA_MODEL
+	Name            string          `json:"name" form:"name" gorm:"comment:支借名称"`
+	Applicant       string          `json:"applicant" form:"applicant" gorm:"comment:申请人"`
+	ApplicationTime string          `json:"applicationTime" form:"applicationTime" gorm:"comment:申请日期"`
+	Charge          int             `json:"charge" form:"charge" gorm:"comment:负责人"`
+	User            SysUser         `json:"user" form:"user" gorm:"foreignKey:Charge;references:id;"`
+	Price           decimal.Decimal `json:"price" form:"price" gorm:"comment:支借金额;type:decimal(10,2)"`
+}
+
+func (Borrowing) TableName() string {
+	return "borrowing"
+}
+
+// TODO:支借查询
+
+// QueryBorrowingList 查询支借列表
+func QueryBorrowingList(limit, offset int, name, time string) (borrowing []Borrowing, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&Borrowing{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if name != "" {
+		db = db.Where("name LIKE ?", "%"+name+"%")
+	}
+	if time != "" {
+		db = db.Where("DATE_FORMAT(application_time, '%Y-%m-%d') = ?", time)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("User").Find(&borrowing).Error
+	return borrowing, total, err
+}
+
+// QueryBorrowing 查询支借
+func QueryBorrowing(id int) (borrowing Borrowing, err error) {
+	err = global.GVA_DB.Model(&Borrowing{}).Where("id = ?", id).Preload("User").First(&borrowing).Error
+	return borrowing, err
+}
+
+// TODO:支借新增
+
+// CreateBorrowing 新增支借
+func (b Borrowing) CreateBorrowing() error {
+	return global.GVA_DB.Create(&b).Error
+}
+
+// TODO:支借修改
+
+// UpdateBorrowing 更新支借
+func (b Borrowing) UpdateBorrowing() error {
+	return global.GVA_DB.Model(&b).Updates(&b).Error
+}
+
+// TODO:支借删除
+
+// DeleteBorrowing 删除支借
+func (b Borrowing) DeleteBorrowing() error {
+	return global.GVA_DB.Unscoped().Delete(&b).Error
+}

+ 63 - 0
server/dao/collection.go

@@ -0,0 +1,63 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"server/global"
+)
+
+type Collection struct {
+	global.GVA_MODEL
+	ProjectCode    string          `json:"projectCode" from:"projectCode" gorm:"comment:项目编码"`
+	Price          decimal.Decimal `json:"price" from:"price" gorm:"type:decimal(10,2);not null;comment:收款金额"`
+	Remarks        string          `json:"remarks" from:"remarks" gorm:"comment:备注"`
+	CollectionTime string          `json:"collectionTime" from:"collectionTime" gorm:"comment:收款日期;type:datetime"`
+}
+
+func (Collection) TableName() string {
+	return "collection"
+}
+
+// TODO:收款查询
+
+// QueryCollection 查询收款
+func QueryCollection(code string) (collection []Collection, err error) {
+	err = global.GVA_DB.Model(&Collection{}).Where("project_code = ?", code).Find(&collection).Error
+	return collection, err
+}
+
+// QueryCollectionList 查询报销列表
+func QueryCollectionList(limit, offset int, code, time string) (collection []Collection, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&Collection{}).Where("project_code = ?", code)
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if time != "" {
+		db = db.Where("DATE_FORMAT(collection_time, '%Y-%m') = ?", time)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Find(&collection).Error
+	return collection, total, err
+}
+
+// TODO:收款新增
+
+// CreateCollection 新增收款
+func (c Collection) CreateCollection() error {
+	return global.GVA_DB.Create(&c).Error
+}
+
+// TODO:收款修改
+
+// UpdateCollection 修改收款
+func (c Collection) UpdateCollection() error {
+	return global.GVA_DB.Model(&c).Updates(&c).Error
+}
+
+// TODO:收款删除
+
+// DeleteCollection 删除收款
+func (c Collection) DeleteCollection() error {
+	return global.GVA_DB.Unscoped().Delete(&c).Error
+}

+ 52 - 0
server/dao/constructor.go

@@ -0,0 +1,52 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"server/global"
+)
+
+type Constructor struct {
+	global.GVA_MODEL
+	Name  string          `json:"name" form:"name" gorm:"comment:施工人员姓名"`
+	Price decimal.Decimal `json:"price" form:"price" gorm:"type:decimal(10,2);not null;comment:人天单价"`
+}
+
+func (Constructor) TableName() string {
+	return "constructor"
+}
+
+// QueryConstructorList 查询施工人员列表
+func QueryConstructorList(limit, offset int, name string) (constructors []Constructor, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&Constructor{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if name != "" {
+		db = db.Where("people LIKE ?", "%"+name+"%")
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Find(&constructors).Error
+	return constructors, total, err
+}
+
+func QueryConstructor() (constructors []Constructor, err error) {
+	err = global.GVA_DB.Model(&Constructor{}).Find(&constructors).Error
+	return
+}
+
+// CreateConstructor 新增施工人员
+func (c Constructor) CreateConstructor() error {
+	return global.GVA_DB.Create(&c).Error
+}
+
+// UpdateConstructor 修改施工人员
+func (c Constructor) UpdateConstructor() error {
+	return global.GVA_DB.Model(&c).Updates(&c).Error
+}
+
+// DeleteConstructor 删除施工人员
+func (c Constructor) DeleteConstructor() error {
+	return global.GVA_DB.Unscoped().Delete(&c).Error
+}

+ 114 - 0
server/dao/dailyExpenses.go

@@ -0,0 +1,114 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"server/global"
+)
+
+type DailyExpenses struct {
+	global.GVA_MODEL
+	Name            string            `json:"name" form:"name" gorm:"comment:名称"`
+	Genre           int               `json:"genre" form:"genre" gorm:"comment:费用类型"`
+	ExpensesGenre   ExpensesGenre     `json:"expensesGenre" form:"expensesGenre" gorm:"foreignKey:Genre;references:id;"`
+	Applicant       string            `json:"applicant" form:"applicant" gorm:"comment:申请人"`
+	ApplicationTime string            `json:"applicationTime" form:"applicationTime" gorm:"comment:申请日期"`
+	Charge          int               `json:"charge" form:"charge" gorm:"comment:负责人"`
+	User            SysUser           `json:"user" form:"user" gorm:"foreignKey:Charge;references:id;"`
+	TotalAmount     decimal.Decimal   `json:"totalAmount" form:"totalAmount" gorm:"type:decimal(10,2);comment:总金额"`
+	DailyFeeDetails []DailyFeeDetails `json:"dailyFeeDetails" form:"dailyFeeDetails" gorm:"-"`
+}
+
+func (DailyExpenses) TableName() string {
+	return "daily_expenses"
+}
+
+// TODO:日常费用查询
+
+// QueryDailyExpensesList 查询日常费用列表
+func QueryDailyExpensesList(limit, offset, genre int, name, time string) (dailyExpenses []DailyExpenses, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&DailyExpenses{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if genre != 0 {
+		db = db.Where("genre = ?", genre)
+	}
+	if name != "" {
+		db = db.Where("name LIKE ?", "%"+name+"%")
+	}
+	if time != "" {
+		db = db.Where("DATE_FORMAT(application_time, '%Y-%m-%d') = ?", time)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("ExpensesGenre").Preload("User").Find(&dailyExpenses).Error
+	return dailyExpenses, total, err
+}
+
+// QueryDailyExpenses 查询日常费用详情
+func QueryDailyExpenses(id int) (dailyExpenses DailyExpenses, err error) {
+	err = global.GVA_DB.Model(&DailyExpenses{}).Where("id = ?", id).Preload("ExpensesGenre").Preload("User").First(&dailyExpenses).Error
+	return dailyExpenses, err
+}
+
+// TODO:日常费用新增
+
+// CreateDailyExpenses 新增日常费用
+func (de DailyExpenses) CreateDailyExpenses() error {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Create(&de).Error
+		if txErr != nil {
+			return txErr
+		}
+		for _, dailyFeeDetail := range de.DailyFeeDetails {
+			dailyFeeDetail.DailyFeeId = de.ID
+
+			txErr := tx.Create(&dailyFeeDetail).Error
+			if txErr != nil {
+				return txErr
+			}
+		}
+		return txErr
+	})
+}
+
+// TODO:日常费用修改
+
+// UpdateDailyExpenses 修改日常费用
+func (de DailyExpenses) UpdateDailyExpenses() error {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Unscoped().Where("daily_fee_id = ?", de.ID).Delete(&DailyFeeDetails{}).Error
+		if txErr != nil {
+			return txErr
+		}
+		txErr = tx.Model(&de).Updates(&de).Error
+		if txErr != nil {
+			return txErr
+		}
+		for _, dailyFeeDetail := range de.DailyFeeDetails {
+			txErr := tx.Create(&dailyFeeDetail).Error
+			if txErr != nil {
+				return txErr
+			}
+		}
+		return txErr
+	})
+}
+
+// TODO:日常费用删除
+
+func (de DailyExpenses) DeleteDailyExpenses() error {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Unscoped().Where("daily_fee_id = ?", de.ID).Delete(&DailyFeeDetails{}).Error
+		if txErr != nil {
+			return txErr
+		}
+		txErr = tx.Unscoped().Delete(&de).Error
+		if txErr != nil {
+			return txErr
+		}
+		return txErr
+	})
+}

+ 31 - 0
server/dao/dailyFeeDetails.go

@@ -0,0 +1,31 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"server/global"
+)
+
+type DailyFeeDetails struct {
+	global.GVA_MODEL
+	DailyFeeId uint            `json:"dailyFeeId" form:"dailyFeeId" gorm:"comment:日常费用id"`
+	FeeTime    string          `json:"feeTime" form:"feeTime" gorm:"comment:日常费用期"`
+	Illustrate string          `json:"illustrate" form:"illustrate" gorm:"comment:费用说明"`
+	Price      decimal.Decimal `json:"price" form:"price" gorm:"type:decimal(10,2);comment:报销金额"`
+}
+
+func (DailyFeeDetails) TableName() string {
+	return "daily_fee_details"
+}
+
+// TODO:日常费用详情查询
+
+// QueryDailyFeeDetails 查询日常费用详情
+func QueryDailyFeeDetails(id int) (dailyFeeDetails []DailyFeeDetails, err error) {
+	err = global.GVA_DB.Model(&DailyFeeDetails{}).Where("daily_fee_id = ?", id).Find(&dailyFeeDetails).Error
+	return dailyFeeDetails, err
+}
+
+// TODO:日常费用详情新增
+
+// TODO:日常费用详情修改
+// TODO:日常费用详情删除

+ 53 - 0
server/dao/dailyFile.go

@@ -0,0 +1,53 @@
+package dao
+
+import "server/global"
+
+type DailyFile struct {
+	global.GVA_MODEL
+	UserId    int       `json:"userId" form:"userId" gorm:"comment:用户编号"`
+	Name      string    `json:"name" from:"name" gorm:"comment:文件名称"`
+	Genre     int       `json:"genre" form:"genre" gorm:"comment:文件类型"`
+	FileGenre FileGenre `json:"fileGenre" form:"fileGenre" gorm:"foreignKey:genre;references:id;"`
+	Path      string    `json:"path" from:"path" gorm:"comment:路径"`
+}
+
+func (DailyFile) TableName() string {
+	return "daily_file"
+}
+
+// TODO:日常文件查询
+
+// QueryDailyFileList 查询日常文件列表
+func QueryDailyFileList(limit, offset, userId, genre int, name string) (dailyFiles []DailyFile, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&DailyFile{}).Where("user_id=?", userId)
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if genre != 0 {
+		db = db.Where("genre = ?", genre)
+	}
+	if name != "" {
+		db = db.Where("name LIKE ?", "%"+name+"%")
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("FileGenre").Find(&dailyFiles).Error
+	return dailyFiles, total, err
+}
+
+// TODO:日常文件新增
+
+// CreateDailyFile 新增日常文件
+func (df DailyFile) CreateDailyFile() error {
+	return global.GVA_DB.Create(&df).Error
+}
+
+// TODO:日常文件修改
+
+// TODO:日常文件删除
+
+// DeleteDailyFile 删除日常文件
+func (df DailyFile) DeleteDailyFile() error {
+	return global.GVA_DB.Unscoped().Delete(&df).Error
+}

+ 63 - 0
server/dao/department.go

@@ -0,0 +1,63 @@
+package dao
+
+import "server/global"
+
+type Department struct {
+	Id            int       `gorm:"primarykey" from:"id" json:"ID"`
+	Name          string    `json:"name" from:"name" gorm:"comment:部门名称"`
+	Desc          string    `json:"desc" from:"desc" gorm:"comment:部门描述"`
+	PrincipalId   int       `json:"principalId" from:"principal_id" gorm:"comment:负责人id"`
+	PrincipalName string    `json:"principalName" from:"principal_name" gorm:"comment:负责人姓名"`
+	Users         []SysUser `json:"users" gorm:"-"`
+	IsStart       bool      `json:"isStart" from:"is_start" gorm:"comment:是否启用"`
+}
+
+func (Department) TableName() string {
+	return "department"
+}
+
+// TODO:部门查询
+
+// QueryAllDep 查询所有部门
+func QueryAllDep() (deps []Department, err error) {
+	err = global.GVA_DB.Model(&Department{}).Find(&deps).Error
+	return deps, err
+}
+
+// QueryDepByStart 查询启用部门
+func QueryDepByStart() (deps []Department, err error) {
+	err = global.GVA_DB.Model(&Department{}).Where("is_start = ?", true).Find(&deps).Error
+	return deps, err
+}
+
+// QueryUsersByDepId 查询部门下的用户
+func QueryUsersByDepId(depId int) (users []SysUser, err error) {
+	err = global.GVA_DB.Model(&SysUser{}).Where("department_id =?", depId).Find(&users).Error
+	return users, err
+}
+
+// TODO:部门新增
+
+// CreateDep 创建部门
+func (d Department) CreateDep() error {
+	return global.GVA_DB.Create(&d).Error
+}
+
+// TODO:部门修改
+
+// UpdateDep 修改部门
+func (d Department) UpdateDep() error {
+	return global.GVA_DB.Model(&d).Updates(d).Error
+}
+
+// UpdateDepStatus 修改部门状态
+func UpdateDepStatus(depId int, isStart bool) error {
+	return global.GVA_DB.Model(&Department{}).Where("id = ?", depId).Update("is_start", isStart).Error
+}
+
+// TODO:部门删除
+
+// DeleteDep 删除部门
+func DeleteDep(depId int) error {
+	return global.GVA_DB.Where("id = ?", depId).Delete(&Department{}).Error
+}

+ 62 - 0
server/dao/exa_file_upload_download.go

@@ -0,0 +1,62 @@
+package dao
+
+import (
+	"server/global"
+)
+
+type ExaFileUploadAndDownload struct {
+	global.GVA_MODEL
+	Name string `json:"name" gorm:"comment:文件名"` // 文件名
+	Url  string `json:"url" gorm:"comment:文件地址"` // 文件地址
+	Tag  string `json:"tag" gorm:"comment:文件标签"` // 文件标签
+	Key  string `json:"key" gorm:"comment:编号"`   // 编号
+}
+
+func (ExaFileUploadAndDownload) TableName() string {
+	return "exa_file_upload_and_downloads"
+}
+
+// TODO:文件查询
+
+// QueryFileById 查询文件 按id
+func QueryFileById(id uint) (exaFileUploadAndDownload ExaFileUploadAndDownload, err error) {
+	err = global.GVA_DB.Where("id = ?", id).First(&exaFileUploadAndDownload).Error
+	return exaFileUploadAndDownload, err
+}
+
+// GetFileRecordInfoList 分页获取数据
+func GetFileRecordInfoList(limit, offset int, keyword string) (fileLists []ExaFileUploadAndDownload, total int64, err error) {
+
+	db := global.GVA_DB.Model(&ExaFileUploadAndDownload{})
+	if len(keyword) > 0 {
+		db = db.Where("name LIKE ?", "%"+keyword+"%")
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Limit(limit).Offset(offset).Order("updated_at desc").Find(&fileLists).Error
+	return fileLists, total, err
+}
+
+// TODO:文件新增
+
+// CreateFile 创建文件
+func (e ExaFileUploadAndDownload) CreateFile() error {
+	return global.GVA_DB.Create(&e).Error
+}
+
+// TODO:文件修改
+
+// EditFileName 编辑文件名或者备注
+func (e ExaFileUploadAndDownload) EditFileName() (fileFromDb ExaFileUploadAndDownload, err error) {
+	err = global.GVA_DB.Where("id = ?", e.ID).First(&fileFromDb).Update("name", e.Name).Error
+	return
+}
+
+// TODO:文件删除
+
+// DeleteFile 删除文件
+func (e ExaFileUploadAndDownload) DeleteFile() error {
+	return global.GVA_DB.Where("id = ?", e.ID).Unscoped().Delete(&e).Error
+}

+ 41 - 0
server/dao/expensesGenre.go

@@ -0,0 +1,41 @@
+package dao
+
+import "server/global"
+
+type ExpensesGenre struct {
+	global.GVA_MODEL
+	Name string `json:"name" form:"name" gorm:"comment:费用类型名称"`
+}
+
+func (ExpensesGenre) TableName() string {
+	return "expenses_genre"
+}
+
+// TODO:费用类型查询
+
+// QueryExpensesGenre 查询费用类型
+func QueryExpensesGenre() (expensesGenre []ExpensesGenre, err error) {
+	err = global.GVA_DB.Model(&ExpensesGenre{}).Find(&expensesGenre).Error
+	return expensesGenre, err
+}
+
+// TODO:费用类型新增
+
+// CreateExpensesGenre 新增费用类型
+func (eg ExpensesGenre) CreateExpensesGenre() error {
+	return global.GVA_DB.Create(&eg).Error
+}
+
+// TODO:费用类型修改
+
+// UpdateExpensesGenre 修改费用类型
+func (eg ExpensesGenre) UpdateExpensesGenre() error {
+	return global.GVA_DB.Model(&eg).Updates(&eg).Error
+}
+
+// TODO:费用类型删除
+
+// DeleteExpensesGenre 删除费用类型
+func (eg ExpensesGenre) DeleteExpensesGenre() error {
+	return global.GVA_DB.Unscoped().Delete(&eg).Error
+}

+ 38 - 0
server/dao/feeDetails.go

@@ -0,0 +1,38 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"server/global"
+)
+
+type FeeDetails struct {
+	global.GVA_MODEL
+	ReimbursementId uint            `json:"reimbursementId" form:"reimbursementId" gorm:"comment:报销id"`
+	Genre           string          `json:"genre" form:"genre" gorm:"comment:项目类型"`
+	Subject         string          `json:"subject" form:"subject" gorm:"comment:科目"`
+	Remarks         string          `json:"remarks" form:"remarks" gorm:"comment:备注"`
+	Price           decimal.Decimal `json:"price" form:"price" gorm:"comment:报销金额;type:decimal(10,2)"`
+}
+
+func (FeeDetails) TableName() string {
+	return "fee_details"
+}
+
+// TODO:费用详情查询
+
+// QueryFeeDetails 查询费用详情
+func QueryFeeDetails(id int) (feeDetails []FeeDetails, err error) {
+	err = global.GVA_DB.Model(&FeeDetails{}).Where("reimbursement_id = ?", id).Find(&feeDetails).Error
+	return feeDetails, err
+}
+
+// TODO:费用详情新增
+
+// TODO:费用详情修改
+
+// TODO:费用详情删除
+
+// DeleteFeeDetails 删除费用详情
+func DeleteFeeDetails(id uint) error {
+	return global.GVA_DB.Unscoped().Where("reimbursement_id = ?", id).Delete(&FeeDetails{}).Error
+}

+ 50 - 0
server/dao/fileGenre.go

@@ -0,0 +1,50 @@
+package dao
+
+import (
+	"server/global"
+)
+
+type FileGenre struct {
+	global.GVA_MODEL
+	Name    string `json:"name" form:"name" gorm:"comment:文件类型名称"`
+	Remarks string `json:"remarks" form:"remarks" gorm:"comment:备注"`
+}
+
+func (FileGenre) TableName() string {
+	return "file_genre"
+}
+
+// TODO:文件类型查询
+
+// QueryFileGenre 查询文件类型
+func QueryFileGenre() (fileGenres []FileGenre, err error) {
+	err = global.GVA_DB.Model(&FileGenre{}).Find(&fileGenres).Error
+	return fileGenres, err
+}
+
+// QueryFileGenreById 查询文件类型 按id
+func QueryFileGenreById(id int) (fileGenre FileGenre, err error) {
+	err = global.GVA_DB.Model(&FileGenre{}).Where("id = ?", id).First(&fileGenre).Error
+	return fileGenre, err
+}
+
+// TODO:文件类型新增
+
+// CreateFileGenre 新增文件类型
+func (fg FileGenre) CreateFileGenre() error {
+	return global.GVA_DB.Create(&fg).Error
+}
+
+// TODO:文件类型修改
+
+// UpdateFileGenre 修改文件类型
+func (fg FileGenre) UpdateFileGenre() error {
+	return global.GVA_DB.Model(&fg).Updates(&fg).Error
+}
+
+// TODO:文件类型删除
+
+// DeleteFileGenre 删除文件类型
+func (fg FileGenre) DeleteFileGenre() error {
+	return global.GVA_DB.Unscoped().Delete(&fg).Error
+}

+ 103 - 0
server/dao/project.go

@@ -0,0 +1,103 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"server/global"
+)
+
+type Project struct {
+	global.GVA_MODEL
+	Code               string                `json:"code" form:"code" gorm:"comment:项目编号"`
+	Name               string                `json:"name" form:"name" gorm:"comment:项目名称"`
+	Principal          string                `json:"principal" form:"principal" gorm:"comment:负责人"`
+	Price              decimal.Decimal       `json:"price" form:"price" gorm:"type:decimal(10,2);not null"`
+	Level              int                   `json:"level" form:"level" gorm:"级别"`
+	Customer           string                `json:"customer" form:"customer" gorm:"相关客户"`
+	Illustrate         string                `json:"illustrate" form:"illustrate" gorm:"comment:说明;type:varchar(200)"`
+	State              int                   `json:"state" form:"state" gorm:"comment:状态"`
+	ProjectState       ProjectState          `json:"projectState" form:"projectState" gorm:"foreignKey:State;references:id;"`
+	CollectionTime     string                `json:"collectionTime" form:"collectionTime" gorm:"comment:收款时间"`
+	EndTime            string                `json:"endTime" form:"endTime" gorm:"comment:结束时间"`
+	Files              []ProjectFile         `json:"files" form:"files" gorm:"-"`
+	WorkingHours       []ProjectWorkingHours `json:"workingHours" form:"workingHours" gorm:"-"`
+	WorkingHoursTotal  int64                 `json:"workingHoursTotal" form:"workingHoursTotal" gorm:"-"`
+	Collection         []Collection          `json:"collection" form:"collection" gorm:"-"`
+	CollectionTotal    int64                 `json:"collectionTotal" form:"collectionTotal" gorm:"-"`
+	Reimbursement      []Reimbursement       `json:"reimbursement" form:"reimbursement" gorm:"-"`
+	ReimbursementTotal int64                 `json:"reimbursementTotal" form:"reimbursementTotal" gorm:"-"`
+}
+
+func (Project) TableName() string {
+	return "project"
+}
+
+// TODO:项目查询
+
+// QueryProjectList 查询项目列表
+func QueryProjectList(limit, offset, state int, name, time string) (project []Project, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&Project{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if state != 0 {
+		db = db.Where("state = ?", state)
+	}
+	if name != "" {
+		db = db.Where("name LIKE ?", "%"+name+"%")
+	}
+	if time != "" {
+		db = db.Where("DATE_FORMAT(created_at, '%Y-%m') = ?", time)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("ProjectState").Find(&project).Error
+	return project, total, err
+}
+
+// QueryProjectByCode 查询单个项目  按编号
+func QueryProjectByCode(code string) (project Project, err error) {
+	err = global.GVA_DB.Model(&Project{}).Where("code = ?", code).Preload("ProjectState").First(&project).Error
+	return
+}
+
+// QueryAllProject 查询所以项目
+func QueryAllProject() (projects []Project, err error) {
+	err = global.GVA_DB.Model(&Project{}).Find(&projects).Error
+	return projects, err
+}
+
+// TODO:项目新增
+
+// CreateProject 新增项目
+func (p Project) CreateProject() error {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Model(&Project{}).Create(&p).Error
+		if txErr != nil {
+			return txErr
+		}
+
+		for _, file := range p.Files {
+			txErr := tx.Model(&ProjectFile{}).Create(&file).Error
+			if txErr != nil {
+				return txErr
+			}
+		}
+		return txErr
+	})
+}
+
+// TODO:项目修改
+
+// UpdateProject 修改项目
+func (p Project) UpdateProject() error {
+	return global.GVA_DB.Model(&p).Updates(p).Error
+}
+
+// TODO:项目删除
+
+// DeleteProject 删除项目
+func DeleteProject(code string) error {
+	return global.GVA_DB.Unscoped().Where("code = ?", code).Delete(&Project{}).Error
+}

+ 75 - 0
server/dao/projectFile.go

@@ -0,0 +1,75 @@
+package dao
+
+import (
+	"server/global"
+)
+
+type ProjectFile struct {
+	global.GVA_MODEL
+	ProjectCode string    `json:"projectCode" from:"projectCode" gorm:"comment:项目编号"`
+	Name        string    `json:"name" from:"name" gorm:"comment:文件名称"`
+	Genre       int       `json:"genre" form:"genre" gorm:"comment:项目类型"`
+	FileGenre   FileGenre `json:"fileGenre" form:"fileGenre" gorm:"foreignKey:genre;references:id;"`
+	Path        string    `json:"path" from:"path" gorm:"comment:路径"`
+}
+
+func (ProjectFile) TableName() string {
+	return "project_file"
+}
+
+// TODO:项目文件查询
+
+// QueryFilesByCode 查询项目文件 按项目code
+func QueryFilesByCode(code string) (files []ProjectFile, err error) {
+	err = global.GVA_DB.Model(&ProjectFile{}).Where("project_code = ?", code).Preload("FileGenre").Find(&files).Error
+	return files, err
+}
+
+// QueryFileList 查询项目文件列表
+func QueryFileList(limit, offset, genre int, code, name string) (files []ProjectFile, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&ProjectFile{}).Where("project_code = ?", code)
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if genre != 0 {
+		db = db.Where("genre = ?", genre)
+	}
+	if name != "" {
+		db = db.Where("name LIKE ?", "%"+name+"%")
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Find(&files).Error
+	return files, total, err
+}
+
+// QueryFilesByNameOrGenre 查询项目文件 按名称或类型
+func QueryFilesByNameOrGenre(genre int, code, name string) (files []ProjectFile, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&ProjectFile{}).Where("project_code = ?", code)
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if genre != 0 {
+		db = db.Where("genre = ?", genre)
+	}
+	if name != "" {
+		db = db.Where("name LIKE ?", "%"+name+"%")
+	}
+	err = db.Order("id desc").Find(&files).Error
+	return files, err
+}
+
+// TODO:项目文件新增
+
+// CreateFile 新增文件
+func (pf ProjectFile) CreateFile() error {
+	return global.GVA_DB.Create(&pf).Error
+}
+
+// TODO:项目文件修改
+// TODO:项目文件删除
+
+// DeleteFile 删除文件
+func DeleteFile(id uint) error {
+	return global.GVA_DB.Unscoped().Where("id = ?", id).Delete(&ProjectFile{}).Error
+}

+ 48 - 0
server/dao/projectState.go

@@ -0,0 +1,48 @@
+package dao
+
+import "server/global"
+
+type ProjectState struct {
+	global.GVA_MODEL
+	Name    string `json:"name" form:"name" gorm:"comment:项目状态名称"`
+	Remarks string `json:"remarks" form:"remarks" gorm:"comment:备注"`
+}
+
+func (ProjectState) TableName() string {
+	return "project_state"
+}
+
+// TODO:文件类型查询
+
+// QueryProjectState 查询项目类型
+func QueryProjectState() (fileGenres []ProjectState, err error) {
+	err = global.GVA_DB.Model(&ProjectState{}).Find(&fileGenres).Error
+	return fileGenres, err
+}
+
+// QueryProjectStateById 查询项目类型 按id
+func QueryProjectStateById(id int) (fileGenre ProjectState, err error) {
+	err = global.GVA_DB.Model(&ProjectState{}).Where("id = ?", id).First(&fileGenre).Error
+	return fileGenre, err
+}
+
+// TODO:文件类型新增
+
+// CreateProjectState 新增项目类型
+func (ps ProjectState) CreateProjectState() error {
+	return global.GVA_DB.Create(&ps).Error
+}
+
+// TODO:文件类型修改
+
+// UpdateProjectState 修改文件类型
+func (ps ProjectState) UpdateProjectState() error {
+	return global.GVA_DB.Model(&ps).Updates(&ps).Error
+}
+
+// TODO:文件类型删除
+
+// DeleteProjectState 删除文件类型
+func (ps ProjectState) DeleteProjectState() error {
+	return global.GVA_DB.Unscoped().Delete(&ps).Error
+}

+ 107 - 0
server/dao/projectWorkingHours.go

@@ -0,0 +1,107 @@
+package dao
+
+import (
+	"server/global"
+)
+
+type ProjectWorkingHours struct {
+	global.GVA_MODEL
+	ProjectCode string      `json:"projectCode" form:"projectCode" gorm:"comment:项目编号"`
+	People      int         `json:"people" form:"people" gorm:"comment:报工人"`
+	Constructor Constructor `json:"constructor" form:"constructor" gorm:"foreignKey:People;references:id;"`
+	Days        float64     `json:"days" form:"days" gorm:"type:double(5,1);not null;comment:天数"`
+	PeopleTime  string      `json:"peopleTime" form:"peopleTime" gorm:"comment:报工时间"`
+}
+
+func (ProjectWorkingHours) TableName() string {
+	return "project_working_hours"
+}
+
+// TODO:工时查询
+
+// QueryWorkingHoursList 查询工时详情列表
+func QueryWorkingHoursList(limit, offset, people int, code, time, yearTime string) (projectWorkingHours []ProjectWorkingHours, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&ProjectWorkingHours{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if code != "" {
+		db = db.Where("project_code like ?", "%"+code+"%")
+	}
+	if people != 0 {
+		db = db.Where("people = ?", people)
+	}
+	if time != "" {
+		db = db.Where("DATE_FORMAT(people_time, '%Y-%m') = ?", time)
+	}
+	if yearTime != "" {
+		db = db.Where("DATE_FORMAT(people_time, '%Y') = ?", yearTime)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("Constructor").Find(&projectWorkingHours).Error
+	return projectWorkingHours, total, err
+}
+
+func QueryWorkingHoursSum(limit, offset, people int, code, time, yearTime string) (list interface{}, total int64, err error) {
+	type Result struct {
+		People   uint
+		Name     string
+		SumDay   float64
+		PriceSum float64
+	}
+
+	var results []Result
+	db := global.GVA_DB.Model(&ProjectWorkingHours{}).Select("people,constructor.`name`,SUM(days) as sum_day,(SUM(days) * price) as price_sum").
+		Joins("JOIN constructor ON project_working_hours.people = constructor.id")
+
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if code != "" {
+		db = db.Where("project_code = ?", "%"+code+"%")
+	}
+	if people != 0 {
+		db = db.Where("people = ?", people)
+	}
+	if time != "" {
+		db = db.Where("DATE_FORMAT(people_time, '%Y-%m') = ?", time)
+	}
+	if yearTime != "" {
+		db = db.Where("DATE_FORMAT(people_time, '%Y') = ?", yearTime)
+	}
+	err = db.Group("people").Limit(limit).Offset(offset).Preload("Constructor").Count(&total).Scan(&results).Error
+	return results, total, err
+}
+
+// QueryWorkingHours 查询工时
+func QueryWorkingHours(code string) (workingHours []ProjectWorkingHours, err error) {
+	err = global.GVA_DB.Model(&ProjectWorkingHours{}).Where("project_code = ?", code).Preload("Constructor").Find(&workingHours).Error
+	return workingHours, err
+}
+
+// QueryWorkingHoursByCode 查询单个工时 按id
+func QueryWorkingHoursByCode(code string, people int) (workingHours ProjectWorkingHours, err error) {
+	err = global.GVA_DB.Model(&ProjectWorkingHours{}).Where("code = ? and people = ?", code, people).Preload("Constructor").First(&workingHours).Error
+	return workingHours, err
+}
+
+// TODO:工时新增
+
+// CreateWorkingHours 创建工时
+func (pwh ProjectWorkingHours) CreateWorkingHours() error {
+	return global.GVA_DB.Create(&pwh).Error
+}
+
+// TODO:工时修改
+
+// UpdateWorkingHours 修改工时
+func (pwh ProjectWorkingHours) UpdateWorkingHours() error {
+	return global.GVA_DB.Model(&ProjectWorkingHours{}).Where("id = ?", pwh.ID).Updates(&pwh).Error
+}
+
+// TODO:工时删除
+
+// DeleteWorkingHours 删除工时
+func (pwh ProjectWorkingHours) DeleteWorkingHours() error {
+	return global.GVA_DB.Model(&ProjectWorkingHours{}).Unscoped().Delete(&pwh).Error
+}

+ 51 - 0
server/dao/purchase.go

@@ -0,0 +1,51 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"server/global"
+)
+
+type Purchase struct {
+	global.GVA_MODEL
+	ProjectCode string          `json:"projectCode" form:"projectCode" gorm:"comment:项目编码"`
+	Name        string          `json:"name" form:"name" gorm:"comment:名称"`
+	Quantity    int             `json:"quantity" form:"quantity" gorm:"comment:数量"`
+	Company     string          `json:"company" form:"company" gorm:"comment:规格(单位)"`
+	Origin      string          `json:"origin" form:"origin" gorm:"comment:产地"`
+	Price       decimal.Decimal `json:"price" form:"price" gorm:"type:decimal(10,2);not null;"`
+	Amount      decimal.Decimal `json:"amount" form:"amount" gorm:"type:decimal(10,2);not null;"`
+	Method      string          `json:"method" form:"method" gorm:"comment:付款方式"`
+}
+
+func (Purchase) TableName() string {
+	return "purchase"
+}
+
+// TODO:采购查询
+
+// QueryPurchase 查询采购
+func QueryPurchase(code string) (purchase []Purchase, err error) {
+	err = global.GVA_DB.Model(&Purchase{}).Where("project_code = ?", code).Find(&purchase).Error
+	return purchase, err
+}
+
+// TODO:采购新增
+
+// CreatePurchase 新建采购
+func (p Purchase) CreatePurchase() error {
+	return global.GVA_DB.Create(&p).Error
+}
+
+// TODO:采购修改
+
+// UpdatePurchase 修改采购
+func (p Purchase) UpdatePurchase() error {
+	return global.GVA_DB.Model(&p).Updates(&p).Error
+}
+
+// TODO:采购删除
+
+// DeletePurchase 删除采购
+func (p Purchase) DeletePurchase() error {
+	return global.GVA_DB.Unscoped().Delete(&p).Error
+}

+ 109 - 0
server/dao/reimbursement.go

@@ -0,0 +1,109 @@
+package dao
+
+import (
+	"github.com/shopspring/decimal"
+	"gorm.io/gorm"
+	"server/global"
+)
+
+type Reimbursement struct {
+	global.GVA_MODEL
+	ProjectCode     string          `json:"projectCode" form:"projectCode" gorm:"comment:项目编号"`
+	Name            string          `json:"name" form:"name" gorm:"comment:项目名称"`
+	Applicant       string          `json:"applicant" form:"applicant" gorm:"comment:报销申请人"`
+	ApplicationTime string          `json:"applicationTime" form:"applicationTime" gorm:"comment:申请日期"`
+	Approval        int             `json:"approval" form:"approval" gorm:"comment:报销审批人"`
+	User            SysUser         `json:"user" form:"user" gorm:"foreignKey:Approval;references:id;"`
+	Price           decimal.Decimal `json:"price" form:"price" gorm:"comment:项目金额;type:decimal(10,2)"`
+	Genre           string          `json:"genre" form:"genre" gorm:"comment:费用类型"`
+	FeeDetails      []FeeDetails    `json:"feeDetails" form:"feeDetails" gorm:"-"`
+}
+
+func (Reimbursement) TableName() string {
+	return "reimbursement"
+}
+
+// TODO:报销查询
+
+// QueryReimbursementList 查询报销列表
+func QueryReimbursementList(limit, offset int, code, name, time string) (reimbursement []Reimbursement, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&Reimbursement{}).Where("project_code = ?", code)
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if name != "" {
+		db = db.Where("name LIKE ?", "%"+name+"%")
+	}
+	if time != "" {
+		db = db.Where("DATE_FORMAT(application_time, '%Y-%m') = ?", time)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("User").Find(&reimbursement).Error
+	return reimbursement, total, err
+}
+
+func QueryReimbursement(code string) (reimbursement []Reimbursement, err error) {
+	err = global.GVA_DB.Model(&Reimbursement{}).Where("project_code = ?", code).Preload("User").Find(&reimbursement).Error
+	return reimbursement, err
+}
+
+// TODO:报销新增
+
+// CreateReimbursement 新增报销单
+func (r Reimbursement) CreateReimbursement() error {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Create(&r).Error
+		if txErr != nil {
+			return txErr
+		}
+		for _, feeDetail := range r.FeeDetails {
+			txErr := tx.Create(&feeDetail).Error
+			if txErr != nil {
+				return txErr
+			}
+		}
+		return txErr
+	})
+}
+
+// TODO:报销修改
+
+// UpdateReimbursement 修改报销单
+func (r Reimbursement) UpdateReimbursement() error {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Unscoped().Where("reimbursement_id = ?", r.ID).Delete(&FeeDetails{}).Error
+		if txErr != nil {
+			return txErr
+		}
+		txErr = tx.Model(&r).Updates(&r).Error
+		if txErr != nil {
+			return txErr
+		}
+		for _, feeDetail := range r.FeeDetails {
+			txErr := tx.Create(&feeDetail).Error
+			if txErr != nil {
+				return txErr
+			}
+		}
+		return txErr
+	})
+}
+
+// TODO:报销删除
+
+// DeleteReimbursement 删除报销单
+func (r Reimbursement) DeleteReimbursement() error {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		txErr := tx.Unscoped().Where("reimbursement_id = ?", r.ID).Delete(&FeeDetails{}).Error
+		if txErr != nil {
+			return txErr
+		}
+		txErr = tx.Unscoped().Delete(&r).Error
+		if txErr != nil {
+			return txErr
+		}
+		return txErr
+	})
+}

+ 113 - 0
server/dao/sys_api.go

@@ -0,0 +1,113 @@
+package dao
+
+import (
+	"fmt"
+	"server/global"
+)
+
+type SysApi struct {
+	global.GVA_MODEL
+	Path        string `json:"path" gorm:"comment:api路径"`             // api路径
+	Description string `json:"description" gorm:"comment:api中文描述"`    // api中文描述
+	ApiGroup    string `json:"apiGroup" gorm:"comment:api组"`          // api组
+	Method      string `json:"method" gorm:"default:POST;comment:方法"` // 方法:创建POST(默认)|查看GET|更新PUT|删除DELETE
+}
+
+func (SysApi) TableName() string {
+	return "sys_apis"
+}
+
+// TODO:Api查询
+
+// QueryApiByPathMethod 查询api 按路径和方法
+func QueryApiByPathMethod(path, method string) (sysApi SysApi, err error) {
+	err = global.GVA_DB.Where("path = ? AND method = ?", path, method).First(&sysApi).Error
+	return
+}
+
+// QueryApiById 查询api 按id
+func QueryApiById(id uint) (sysApi SysApi, err error) {
+	err = global.GVA_DB.First(&sysApi, "id = ?", id).Error
+	return
+}
+
+//@author: [piexlmax](https://github.com/piexlmax)
+//@function: GetAPIInfoList
+//@description: 分页获取数据,
+//@param: api model.SysApi, info request.PageInfo, order string, desc bool
+//@return: list interface{}, total int64, err error
+
+func (api SysApi) GetAPIInfoList(limit, offset int, order string, desc bool) (apiList []SysApi, total int64, err error) {
+
+	db := global.GVA_DB.Model(&SysApi{})
+
+	if api.Path != "" {
+		db = db.Where("path LIKE ?", "%"+api.Path+"%")
+	}
+
+	if api.Description != "" {
+		db = db.Where("description LIKE ?", "%"+api.Description+"%")
+	}
+
+	if api.Method != "" {
+		db = db.Where("method = ?", api.Method)
+	}
+
+	if api.ApiGroup != "" {
+		db = db.Where("api_group = ?", api.ApiGroup)
+	}
+
+	err = db.Count(&total).Error
+
+	if err != nil {
+		return apiList, total, err
+	}
+
+	db = db.Limit(limit).Offset(offset)
+	OrderStr := "id desc"
+	if order != "" {
+		orderMap := make(map[string]bool, 5)
+		orderMap["id"] = true
+		orderMap["path"] = true
+		orderMap["api_group"] = true
+		orderMap["description"] = true
+		orderMap["method"] = true
+		if !orderMap[order] {
+			err = fmt.Errorf("非法的排序字段: %v", order)
+			return apiList, total, err
+		}
+		OrderStr = order
+		if desc {
+			OrderStr = order + " desc"
+		}
+	}
+	err = db.Order(OrderStr).Find(&apiList).Error
+	return apiList, total, err
+}
+
+// GetAllApis 查询所有api
+func GetAllApis() (apis []SysApi, err error) {
+	err = global.GVA_DB.Find(&apis).Error
+	return
+}
+
+// TODO:Api新增
+
+// CreateApi 新增api
+func (api SysApi) CreateApi() error {
+	return global.GVA_DB.Create(&api).Error
+}
+
+// TODO:Api修改
+
+// SaveApi 更新api
+func (api SysApi) SaveApi() error {
+	return global.GVA_DB.Save(&api).Error
+}
+
+// TODO:Api删除
+
+// DeleteApi 删除api
+func (api SysApi) DeleteApi() error {
+	return global.GVA_DB.Delete(&api).Error
+}

+ 60 - 0
server/dao/sys_authority.go

@@ -0,0 +1,60 @@
+package dao
+
+import (
+	"server/global"
+	"time"
+)
+
+type SysAuthority struct {
+	CreatedAt       time.Time       // 创建时间
+	UpdatedAt       time.Time       // 更新时间
+	DeletedAt       *time.Time      `sql:"index"`
+	AuthorityId     uint            `json:"authorityId" gorm:"not null;unique;primary_key;comment:角色ID;size:90"` // 角色ID
+	AuthorityName   string          `json:"authorityName" gorm:"comment:角色名"`                                    // 角色名
+	ParentId        *uint           `json:"parentId" gorm:"comment:父角色ID"`                                       // 父角色ID
+	DataAuthorityId []*SysAuthority `json:"dataAuthorityId" gorm:"many2many:sys_data_authority_id;"`
+	Children        []SysAuthority  `json:"children" gorm:"-"`
+	SysBaseMenus    []SysBaseMenu   `json:"menus" gorm:"many2many:sys_authority_menus;"`
+	Users           []SysUser       `json:"-" gorm:"many2many:sys_user_authority;"`
+	DefaultRouter   string          `json:"defaultRouter" gorm:"comment:默认菜单;default:dashboard"` // 默认菜单(默认dashboard)
+}
+
+func (SysAuthority) TableName() string {
+	return "sys_authorities"
+}
+
+// TODO:角色查询
+
+// QueryAuthorityById 查询角色 按id
+func QueryAuthorityById(authorityId uint) (sysAuthority SysAuthority, err error) {
+	err = global.GVA_DB.Where("authority_id = ?", authorityId).First(&sysAuthority).Error
+	return
+}
+
+// GetAuthorityInfoList 分页获取角色列表
+func GetAuthorityInfoList(limit, offset int) (sysAuthority []SysAuthority, total int64, err error) {
+	db := global.GVA_DB.Model(&SysAuthority{})
+	if err = db.Where("parent_id = ?", "0").Count(&total).Error; total == 0 || err != nil {
+		return
+	}
+	var authority []SysAuthority
+	err = db.Limit(limit).Offset(offset).Preload("DataAuthorityId").Where("parent_id = ?", "0").Find(&authority).Error
+
+	return authority, total, err
+}
+
+// GetAuthorityInfo 获取所有角色信息
+func (sa SysAuthority) GetAuthorityInfo() (sysAuthority SysAuthority, err error) {
+	err = global.GVA_DB.Preload("DataAuthorityId").Where("authority_id = ?", sa.AuthorityId).First(&sysAuthority).Error
+	return sysAuthority, err
+}
+
+// TODO:角色新增
+// TODO:角色修改
+
+// UpdateAuthority 修改角色
+func (sa SysAuthority) UpdateAuthority() error {
+	return global.GVA_DB.Model(&SysAuthority{}).Updates(&sa).Error
+}
+
+// TODO:角色删除

+ 62 - 0
server/dao/sys_authority_btn.go

@@ -0,0 +1,62 @@
+package dao
+
+import (
+	"gorm.io/gorm"
+	"server/global"
+)
+
+type SysAuthorityBtn struct {
+	AuthorityId      uint           `gorm:"comment:角色ID"`
+	SysMenuID        uint           `gorm:"comment:菜单ID"`
+	SysBaseMenuBtnID uint           `gorm:"comment:菜单按钮ID"`
+	SysBaseMenuBtn   SysBaseMenuBtn ` gorm:"comment:按钮详情"`
+}
+
+// TODO:按钮查询
+
+// QueryAuthorityBtnAndSysBaseMenuBtnById 查询角色按钮和菜单按钮 按id
+func QueryAuthorityBtnAndSysBaseMenuBtnById(authorityId uint) (btns []SysAuthorityBtn, err error) {
+	err = global.GVA_DB.Where("authority_id = ?", authorityId).Preload("SysBaseMenuBtn").Find(&btns).Error
+	return btns, err
+}
+
+// QueryAuthorityBtnByAuthorityIdMenuId 查询角色按钮 按角色id和菜单id
+func QueryAuthorityBtnByAuthorityIdMenuId(authorityId, sysMenuId uint) (authorityBtn []SysAuthorityBtn, err error) {
+	err = global.GVA_DB.Find(&authorityBtn, "authority_id = ? and sys_menu_id = ?", authorityId, sysMenuId).Error
+	return
+}
+
+// QueryAuthorityBtn 查询角色按钮 按菜单按钮id global.GVA_DB.First(&dao.SysAuthorityBtn{}, "sys_base_menu_btn_id = ?", ID).Error
+func QueryAuthorityBtn(Id string) (sysAuthorityBtn SysAuthorityBtn, err error) {
+	err = global.GVA_DB.Model(&SysAuthorityBtn{}).First(sysAuthorityBtn, "sys_base_menu_btn_id =?", Id).Error
+	return
+}
+
+// TODO:按钮新增
+// TODO:按钮修改
+
+func SetAuthorityBtn(menuId, authorityId uint, selected []uint) (err error) {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		var authorityBtn []SysAuthorityBtn
+		err = tx.Delete(&[]SysAuthorityBtn{}, "authority_id = ? and sys_menu_id = ?", authorityId, menuId).Error
+		if err != nil {
+			return err
+		}
+		for _, v := range selected {
+			authorityBtn = append(authorityBtn, SysAuthorityBtn{
+				AuthorityId:      authorityId,
+				SysMenuID:        menuId,
+				SysBaseMenuBtnID: v,
+			})
+		}
+		if len(authorityBtn) > 0 {
+			err = tx.Create(&authorityBtn).Error
+		}
+		if err != nil {
+			return err
+		}
+		return err
+	})
+}
+
+// TODO:按钮删除

+ 39 - 0
server/dao/sys_authority_menu.go

@@ -0,0 +1,39 @@
+package dao
+
+import "server/global"
+
+type SysMenu struct {
+	SysBaseMenu
+	MenuId      uint                   `json:"menuId" gorm:"comment:菜单ID"`
+	AuthorityId uint                   `json:"-" gorm:"comment:角色ID"`
+	Children    []SysMenu              `json:"children" gorm:"-"`
+	Parameters  []SysBaseMenuParameter `json:"parameters" gorm:"foreignKey:SysBaseMenuID;references:MenuId"`
+	Btns        map[string]uint        `json:"btns" gorm:"-"`
+}
+
+type SysAuthorityMenu struct {
+	MenuId      string `json:"menuId" gorm:"comment:菜单ID;column:sys_base_menu_id"`
+	AuthorityId string `json:"-" gorm:"comment:角色ID;column:sys_authority_authority_id"`
+}
+
+func (s SysAuthorityMenu) TableName() string {
+	return "sys_authority_menus"
+}
+
+// TODO:菜单查询
+
+// QueryAuthorityMenuByAuthorityId 查询角色菜单 按角色id
+func QueryAuthorityMenuByAuthorityId(authorityId uint) (SysAuthorityMenus []SysAuthorityMenu, err error) {
+	err = global.GVA_DB.Where("sys_authority_authority_id = ?", authorityId).Find(&SysAuthorityMenus).Error
+	return SysAuthorityMenus, err
+}
+
+// QuerySysBaseMenuIdById 查询菜单id 按角色id
+func QuerySysBaseMenuIdById(authorityId uint) (menuIds []string, err error) {
+	err = global.GVA_DB.Model(&SysAuthorityMenu{}).Where("sys_authority_authority_id = ?", authorityId).Pluck("sys_base_menu_id", &menuIds).Error
+	return
+}
+
+// TODO:菜单新增
+// TODO:菜单修改
+// TODO:菜单删除

+ 137 - 0
server/dao/sys_base_menu.go

@@ -0,0 +1,137 @@
+package dao
+
+import (
+	"errors"
+	"gorm.io/gorm"
+	"server/global"
+)
+
+type SysBaseMenu struct {
+	global.GVA_MODEL
+	MenuLevel     uint                                       `json:"-"`
+	ParentId      uint                                       `json:"parentId" gorm:"comment:父菜单ID"`     // 父菜单ID
+	Path          string                                     `json:"path" gorm:"comment:路由path"`        // 路由path
+	Name          string                                     `json:"name" gorm:"comment:路由name"`        // 路由name
+	Hidden        bool                                       `json:"hidden" gorm:"comment:是否在列表隐藏"`     // 是否在列表隐藏
+	Component     string                                     `json:"component" gorm:"comment:对应前端文件路径"` // 对应前端文件路径
+	Sort          int                                        `json:"sort" gorm:"comment:排序标记"`          // 排序标记
+	Meta          `json:"meta" gorm:"embedded;comment:附加属性"` // 附加属性
+	SysAuthoritys []SysAuthority                             `json:"authoritys" gorm:"many2many:sys_authority_menus;"`
+	Children      []SysBaseMenu                              `json:"children" gorm:"-"`
+	Parameters    []SysBaseMenuParameter                     `json:"parameters"`
+	MenuBtn       []SysBaseMenuBtn                           `json:"menuBtn"`
+}
+
+type Meta struct {
+	ActiveName  string `json:"activeName" gorm:"comment:高亮菜单"`
+	KeepAlive   bool   `json:"keepAlive" gorm:"comment:是否缓存"`           // 是否缓存
+	DefaultMenu bool   `json:"defaultMenu" gorm:"comment:是否是基础路由(开发中)"` // 是否是基础路由(开发中)
+	Title       string `json:"title" gorm:"comment:菜单名"`                // 菜单名
+	Icon        string `json:"icon" gorm:"comment:菜单图标"`                // 菜单图标
+	CloseTab    bool   `json:"closeTab" gorm:"comment:自动关闭tab"`         // 自动关闭tab
+}
+
+type SysBaseMenuParameter struct {
+	global.GVA_MODEL
+	SysBaseMenuID uint
+	Type          string `json:"type" gorm:"comment:地址栏携带参数为params还是query"` // 地址栏携带参数为params还是query
+	Key           string `json:"key" gorm:"comment:地址栏携带参数的key"`            // 地址栏携带参数的key
+	Value         string `json:"value" gorm:"comment:地址栏携带参数的值"`            // 地址栏携带参数的值
+}
+
+func (SysBaseMenu) TableName() string {
+	return "sys_base_menus"
+}
+
+// TODO:菜单查询
+
+// QueryBaseMenuAndParametersByMenuId 查询菜单和参数 按菜单id
+func QueryBaseMenuAndParametersByMenuId(menuIds []string) (baseMenu []SysBaseMenu, err error) {
+	err = global.GVA_DB.Where("id in (?)", menuIds).Order("sort").Preload("Parameters").Find(&baseMenu).Error
+	return
+}
+
+// QueryBaseMenuByName 查询菜单 按名字
+func QueryBaseMenuByName(name string) (baseMenu SysBaseMenu, err error) {
+	err = global.GVA_DB.Where("name = ?", name).First(&baseMenu).Error
+	return
+}
+
+// QueryBaseMenuAndMenuBtnAndParameters 查询菜单和菜单按钮和参数
+func QueryBaseMenuAndMenuBtnAndParameters() (allMenus []SysBaseMenu, err error) {
+	err = global.GVA_DB.Order("sort").Preload("MenuBtn").Preload("Parameters").Find(&allMenus).Error
+	return
+}
+
+// QueryBaseMenuByIdAndDefaultRouter 查询菜单 按菜单id和默认路由
+func QueryBaseMenuByIdAndDefaultRouter(defaultRouter string, menuIds []string) (allMenus []SysBaseMenu, err error) {
+	err = global.GVA_DB.First(&allMenus, "name = ? and id in (?)", defaultRouter, menuIds).Error
+	return
+}
+
+func QueryBaseMenuAndMenuBtnAndParameterById(id int) (menu SysBaseMenu, err error) {
+	err = global.GVA_DB.Preload("MenuBtn").Preload("Parameters").Where("id = ?", id).First(&menu).Error
+	return
+}
+
+// TODO:菜单新增
+
+// CreateBaseMenu 创建菜单
+func (bm SysBaseMenu) CreateBaseMenu() error {
+	return global.GVA_DB.Create(&bm).Error
+}
+
+// TODO:菜单修改
+
+func (bm SysBaseMenu) UpdateBaseMenu() (err error) {
+	var oldMenu SysBaseMenu
+	err = global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		tx.Where("id = ?", bm.ID).Find(&oldMenu)
+		if oldMenu.Name != bm.Name {
+			if !errors.Is(tx.Where("id <> ? AND name = ?", bm.ID, bm.Name).First(&SysBaseMenu{}).Error, gorm.ErrRecordNotFound) {
+				global.GVA_LOG.Debug("存在相同name修改失败")
+				return errors.New("存在相同name修改失败")
+			}
+		}
+		txErr := tx.Unscoped().Delete(&SysBaseMenuParameter{}, "sys_base_menu_id = ?", bm.ID).Error
+		if txErr != nil {
+			global.GVA_LOG.Debug(txErr.Error())
+			return txErr
+		}
+		txErr = tx.Unscoped().Delete(&SysBaseMenuBtn{}, "sys_base_menu_id = ?", bm.ID).Error
+		if txErr != nil {
+			global.GVA_LOG.Debug(txErr.Error())
+			return txErr
+		}
+		if len(bm.Parameters) > 0 {
+			for k := range bm.Parameters {
+				bm.Parameters[k].SysBaseMenuID = bm.ID
+			}
+			txErr = tx.Create(&bm.Parameters).Error
+			if txErr != nil {
+				global.GVA_LOG.Debug(txErr.Error())
+				return txErr
+			}
+		}
+
+		if len(bm.MenuBtn) > 0 {
+			for k := range bm.MenuBtn {
+				bm.MenuBtn[k].SysBaseMenuID = bm.ID
+			}
+			txErr = tx.Create(&bm.MenuBtn).Error
+			if txErr != nil {
+				global.GVA_LOG.Debug(txErr.Error())
+				return txErr
+			}
+		}
+		txErr = tx.Model(&oldMenu).Select("*").Updates(bm).Error
+		if txErr != nil {
+			global.GVA_LOG.Debug(txErr.Error())
+			return txErr
+		}
+		return nil
+	})
+	return err
+}
+
+// TODO:菜单删除

+ 70 - 0
server/dao/sys_dictionary.go

@@ -0,0 +1,70 @@
+// 自动生成模板SysDictionary
+package dao
+
+import (
+	"gorm.io/gorm"
+	"server/global"
+)
+
+// SysDictionary 如果含有time.Time 请自行import time包
+type SysDictionary struct {
+	global.GVA_MODEL
+	Name                 string                `json:"name" form:"name" gorm:"column:name;comment:字典名(中)"`   // 字典名(中)
+	Type                 string                `json:"type" form:"type" gorm:"column:type;comment:字典名(英)"`   // 字典名(英)
+	Status               *bool                 `json:"status" form:"status" gorm:"column:status;comment:状态"` // 状态
+	Desc                 string                `json:"desc" form:"desc" gorm:"column:desc;comment:描述"`       // 描述
+	SysDictionaryDetails []SysDictionaryDetail `json:"sysDictionaryDetails" form:"sysDictionaryDetails"`
+}
+
+func (SysDictionary) TableName() string {
+	return "sys_dictionaries"
+}
+
+// TODO:字典查询
+
+// QueryDictionaryByType 查询字典 按类型
+func QueryDictionaryByType(t string) (sysDictionary SysDictionary, err error) {
+	err = global.GVA_DB.First(&SysDictionary{}, "type = ?", t).Error
+	return sysDictionary, err
+}
+
+// QueryDictionaryAndDetailsById 查询字典和详情 按字典id
+func QueryDictionaryAndDetailsById(id uint) (sysDictionary SysDictionary, err error) {
+	err = global.GVA_DB.Where("id =?", id).Preload("SysDictionaryDetails").First(&sysDictionary).Error
+	return sysDictionary, err
+}
+
+// GetSysDictionary 根据id或者type获取字典单条数据
+func GetSysDictionary(Type string, Id uint, flag bool) (sysDictionary SysDictionary, err error) {
+	err = global.GVA_DB.Where("(type = ? OR id = ?) and status = ?", Type, Id, flag).Preload("SysDictionaryDetails", func(db *gorm.DB) *gorm.DB {
+		return db.Where("status = ?", true).Order("sort")
+	}).First(&sysDictionary).Error
+	return
+}
+
+// GetSysDictionaryInfoList 分页获取字典列表
+func GetSysDictionaryInfoList() (sysDictionaries []SysDictionary, err error) {
+	err = global.GVA_DB.Find(&sysDictionaries).Error
+	return
+}
+
+// TODO:字典新增
+
+// CreateDictionary 创建字典
+func (sd SysDictionary) CreateDictionary() error {
+	return global.GVA_DB.Create(&sd).Error
+}
+
+// TODO:字典修改
+
+// UpdateDictionary 修改字典
+func (sd SysDictionary) UpdateDictionary() error {
+	return global.GVA_DB.Model(&SysDictionary{}).Updates(&sd).Error
+}
+
+// TODO:字典删除
+
+// DeleteDictionary 删除字典
+func (sd SysDictionary) DeleteDictionary() error {
+	return global.GVA_DB.Delete(&sd).Error
+}

+ 101 - 0
server/dao/sys_dictionary_detail.go

@@ -0,0 +1,101 @@
+// 自动生成模板SysDictionaryDetail
+package dao
+
+import (
+	"server/global"
+)
+
+// 如果含有time.Time 请自行import time包
+type SysDictionaryDetail struct {
+	global.GVA_MODEL
+	Label           string `json:"label" form:"label" gorm:"column:label;comment:展示值"`                                  // 展示值
+	Value           string `json:"value" form:"value" gorm:"column:value;comment:字典值"`                                  // 字典值
+	Extend          string `json:"extend" form:"extend" gorm:"column:extend;comment:扩展值"`                               // 扩展值
+	Status          *bool  `json:"status" form:"status" gorm:"column:status;comment:启用状态"`                              // 启用状态
+	Sort            int    `json:"sort" form:"sort" gorm:"column:sort;comment:排序标记"`                                    // 排序标记
+	SysDictionaryID int    `json:"sysDictionaryID" form:"sysDictionaryID" gorm:"column:sys_dictionary_id;comment:关联标记"` // 关联标记
+}
+
+func (SysDictionaryDetail) TableName() string {
+	return "sys_dictionary_details"
+}
+
+// TODO:字典详情查询
+
+// GetSysDictionaryDetailById 查询字典详情 按id
+func GetSysDictionaryDetailById(id uint) (sysDictionaryDetail SysDictionaryDetail, err error) {
+	err = global.GVA_DB.Where("id = ?", id).First(&sysDictionaryDetail).Error
+	return sysDictionaryDetail, err
+}
+
+// GetSysDictionaryDetailInfoList 分页获取字典详情列表
+func (sdd SysDictionaryDetail) GetSysDictionaryDetailInfoList(limit, offset int) (sysDictionaryDetails []SysDictionaryDetail, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&SysDictionaryDetail{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if sdd.Label != "" {
+		db = db.Where("label LIKE ?", "%"+sdd.Label+"%")
+	}
+	if sdd.Value != "" {
+		db = db.Where("value = ?", sdd.Value)
+	}
+	if sdd.Status != nil {
+		db = db.Where("status = ?", sdd.Status)
+	}
+	if sdd.SysDictionaryID != 0 {
+		db = db.Where("sys_dictionary_id = ?", sdd.SysDictionaryID)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Limit(limit).Offset(offset).Order("sort").Find(&sysDictionaryDetails).Error
+	return sysDictionaryDetails, total, err
+}
+
+// GetDictionaryListByDictionaryId 查询字典列表 按字典id
+func GetDictionaryListByDictionaryId(dictionaryID uint) (sysDictionaryDetails []SysDictionaryDetail, err error) {
+	err = global.GVA_DB.Find(&sysDictionaryDetails, "sys_dictionary_id = ?", dictionaryID).Error
+	return sysDictionaryDetails, err
+}
+
+// GetDictionaryListByType 查询字典列表 按字典类型
+func GetDictionaryListByType(t string) (sysDictionaryDetails []SysDictionaryDetail, err error) {
+	db := global.GVA_DB.Model(&SysDictionaryDetail{}).Joins("JOIN sys_dictionaries ON sys_dictionaries.id = sys_dictionary_details.sys_dictionary_id")
+	err = db.Debug().Find(&sysDictionaryDetails, "type = ?", t).Error
+	return sysDictionaryDetails, err
+}
+
+// GetDictionaryInfoByValue 查询字典列表 按字典内容
+func GetDictionaryInfoByValue(dictionaryID uint, value uint) (sysDictionaryDetail SysDictionaryDetail, err error) {
+	err = global.GVA_DB.First(&sysDictionaryDetail, "sys_dictionary_id = ? and value = ?", dictionaryID, value).Error
+	return sysDictionaryDetail, err
+}
+
+// GetDictionaryInfoByTypeValue 查询字典列表 按字典类型和字典内容
+func GetDictionaryInfoByTypeValue(t string, value uint) (sysDictionaryDetail SysDictionaryDetail, err error) {
+	db := global.GVA_DB.Model(&SysDictionaryDetail{}).Joins("JOIN sys_dictionaries ON sys_dictionaries.id = sys_dictionary_details.sys_dictionary_id")
+	err = db.First(&sysDictionaryDetail, "sys_dictionaries.type = ? and sys_dictionary_details.value = ?", t, value).Error
+	return sysDictionaryDetail, err
+}
+
+// TODO:字典详情新增
+
+// CreateSysDictionaryDetail 创建字典详情数据
+func (sdd SysDictionaryDetail) CreateSysDictionaryDetail() error {
+	return global.GVA_DB.Create(&sdd).Error
+}
+
+// TODO:字典详情修改
+
+// UpdateSysDictionaryDetail 更新字典数据
+func (sdd SysDictionaryDetail) UpdateSysDictionaryDetail() error {
+	return global.GVA_DB.Save(&sdd).Error
+}
+
+// TODO:字典详情删除
+
+// DeleteSysDictionaryDetail 删除字典详情
+func (sdd SysDictionaryDetail) DeleteSysDictionaryDetail() error {
+	return global.GVA_DB.Delete(&sdd).Error
+}

+ 21 - 0
server/dao/sys_jwt_blacklist.go

@@ -0,0 +1,21 @@
+package dao
+
+import (
+	"server/global"
+)
+
+type JwtBlacklist struct {
+	global.GVA_MODEL
+	Jwt string `gorm:"type:text;comment:jwt"`
+}
+
+// TODO:JwtBlack查询
+// TODO:JwtBlack新增
+
+// CreateJwtBlack 创建jwt黑名单
+func (jbl JwtBlacklist) CreateJwtBlack() error {
+	return global.GVA_DB.Create(&jbl).Error
+}
+
+// TODO:JwtBlack修改
+// TODO:JwtBlack删除

+ 2 - 2
server/model/system/sys_menu_btn.go

@@ -1,6 +1,6 @@
-package system
+package dao
 
-import "github.com/flipped-aurora/gin-vue-admin/server/global"
+import "server/global"
 
 type SysBaseMenuBtn struct {
 	global.GVA_MODEL

+ 76 - 0
server/dao/sys_operation_record.go

@@ -0,0 +1,76 @@
+// 自动生成模板SysOperationRecord
+package dao
+
+import (
+	"time"
+
+	"server/global"
+)
+
+// 如果含有time.Time 请自行import time包
+type SysOperationRecord struct {
+	global.GVA_MODEL
+	Ip           string        `json:"ip" form:"ip" gorm:"column:ip;comment:请求ip"`                                   // 请求ip
+	Method       string        `json:"method" form:"method" gorm:"column:method;comment:请求方法"`                       // 请求方法
+	Path         string        `json:"path" form:"path" gorm:"column:path;comment:请求路径"`                             // 请求路径
+	Status       int           `json:"status" form:"status" gorm:"column:status;comment:请求状态"`                       // 请求状态
+	Latency      time.Duration `json:"latency" form:"latency" gorm:"column:latency;comment:延迟" swaggertype:"string"` // 延迟
+	Agent        string        `json:"agent" form:"agent" gorm:"type:text;column:agent;comment:代理"`                  // 代理
+	ErrorMessage string        `json:"error_message" form:"error_message" gorm:"column:error_message;comment:错误信息"`  // 错误信息
+	Body         string        `json:"body" form:"body" gorm:"type:text;column:body;comment:请求Body"`                 // 请求Body
+	Resp         string        `json:"resp" form:"resp" gorm:"type:text;column:resp;comment:响应Body"`                 // 响应Body
+	UserID       int           `json:"user_id" form:"user_id" gorm:"column:user_id;comment:用户id"`                    // 用户id
+	User         SysUser       `json:"user"`
+}
+
+// TODO:操作查询
+
+// GetSysOperationRecord 根据id获取单条操作记录
+func GetSysOperationRecord(id uint) (sysOperationRecord SysOperationRecord, err error) {
+	err = global.GVA_DB.Where("id = ?", id).First(&sysOperationRecord).Error
+	return
+}
+
+// GetSysOperationRecordInfoList 分页获取操作记录列表
+func (sor SysOperationRecord) GetSysOperationRecordInfoList(limit, offset int) (sysOperationRecords []SysOperationRecord, total int64, err error) {
+	// 创建db
+	db := global.GVA_DB.Model(&SysOperationRecord{})
+	// 如果有条件搜索 下方会自动创建搜索语句
+	if sor.Method != "" {
+		db = db.Where("method = ?", sor.Method)
+	}
+	if sor.Path != "" {
+		db = db.Where("path LIKE ?", "%"+sor.Path+"%")
+	}
+	if sor.Status != 0 {
+		db = db.Where("status = ?", sor.Status)
+	}
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Order("id desc").Limit(limit).Offset(offset).Preload("User").Find(&sysOperationRecords).Error
+	return sysOperationRecords, total, err
+}
+
+// TODO:操作新增
+
+func (sor SysOperationRecord) CreateSysOperationRecord() error {
+	return global.GVA_DB.Create(&sor).Error
+}
+
+// TODO:操作修改
+
+// TODO:操作删除
+
+// DeleteSysOperationRecordByIds 删除操作记录按id
+func DeleteSysOperationRecordByIds(ids []int) (err error) {
+	err = global.GVA_DB.Delete(&[]SysOperationRecord{}, "id in (?)", ids).Error
+	return err
+}
+
+// DeleteSysOperationRecord 删除操作记录
+func (sor SysOperationRecord) DeleteSysOperationRecord() (err error) {
+	err = global.GVA_DB.Delete(&sor).Error
+	return err
+}

+ 169 - 0
server/dao/sys_user.go

@@ -0,0 +1,169 @@
+package dao
+
+import (
+	"errors"
+	"github.com/gofrs/uuid/v5"
+	"gorm.io/gorm"
+	"server/global"
+)
+
+type SysUser struct {
+	global.GVA_MODEL
+	UUID         uuid.UUID    `json:"uuid" gorm:"index;comment:用户UUID"`                                                     // 用户UUID
+	Username     string       `json:"userName" gorm:"index;comment:用户登录名"`                                                  // 用户登录名
+	Password     string       `json:"-"  gorm:"comment:用户登录密码"`                                                             // 用户登录密码
+	NickName     string       `json:"nickName" gorm:"default:系统用户;comment:用户昵称"`                                            // 用户昵称
+	SideMode     string       `json:"sideMode" gorm:"default:dark;comment:用户侧边主题"`                                          // 用户侧边主题
+	HeaderImg    string       `json:"headerImg" gorm:"default:https://qmplusimg.henrongyi.top/gva_header.jpg;comment:用户头像"` // 用户头像
+	BaseColor    string       `json:"baseColor" gorm:"default:#fff;comment:基础颜色"`                                           // 基础颜色
+	ActiveColor  string       `json:"activeColor" gorm:"default:#1890ff;comment:活跃颜色"`                                      // 活跃颜色
+	AuthorityId  uint         `json:"authorityId" gorm:"default:888;comment:用户角色ID"`                                        // 用户角色ID
+	Authority    SysAuthority `json:"authority" gorm:"foreignKey:AuthorityId;references:AuthorityId;comment:用户角色"`
+	Phone        string       `json:"phone"  gorm:"comment:用户手机号"`                     // 用户手机号
+	Email        string       `json:"email"  gorm:"comment:用户邮箱"`                      // 用户邮箱
+	Enable       int          `json:"enable" gorm:"default:1;comment:用户是否被冻结 1正常 2冻结"` //用户是否被冻结 1正常 2冻结
+	DepartmentId int          `json:"departmentId" gorm:"comment:部门id"`
+}
+
+func (SysUser) TableName() string {
+	return "sys_users"
+}
+
+// TODO:查询
+// TODO:新增
+// TODO:修改
+// TODO:删除
+
+// TODO: 用户查询
+
+// QueryUserByUserName  按用户名查询用户
+func QueryUserByUserName(userName string) (SysUser, error) {
+	var user SysUser
+	err := global.GVA_DB.Where("username =?", userName).First(&user).Error
+	return user, err
+}
+
+// QueryUserByUserId  按用户Id查询用户
+func QueryUserByUserId(id uint) (SysUser, error) {
+	var user SysUser
+	err := global.GVA_DB.Where("id =?", id).First(&user).Error
+	return user, err
+}
+
+// QueryUserAndAuthorityByUserName 按用户名查询用户和角色
+func QueryUserAndAuthorityByUserName(userName string) (user SysUser, err error) {
+	err = global.GVA_DB.Where("username = ?", userName).Preload("Authority").First(&user).Error
+	return
+}
+
+// QueryUserInfoList 条件查询用户信息列表
+func QueryUserInfoList(limit, offset int) (userList []SysUser, total int64, err error) {
+	db := global.GVA_DB.Model(&SysUser{})
+	err = db.Count(&total).Error
+	if err != nil {
+		return
+	}
+	err = db.Limit(limit).Offset(offset).Preload("Authority").Find(&userList).Error
+	return
+}
+
+// QueryUserAuthority 查询用户角色
+func QueryUserAuthority(id, authorityId uint) (authority SysAuthority, err error) {
+	err = global.GVA_DB.Where("sys_user_id = ? AND sys_authority_authority_id = ?", id, authorityId).First(&authority).Error
+	return
+}
+
+// GetUserInfoByUUID 获取用户信息 按UUID
+func GetUserInfoByUUID(uuid uuid.UUID) (user SysUser, err error) {
+	err = global.GVA_DB.Preload("Authority").First(&user, "uuid = ?", uuid).Error
+	return user, err
+}
+
+// QueryAllUsers 查询所有用户
+func QueryAllUsers() (users []SysUser, err error) {
+	err = global.GVA_DB.Model(&SysUser{}).Find(&users).Error
+	return users, err
+}
+
+// TODO: 用户新增
+
+// CreateUser 创建用户
+func (u SysUser) CreateUser() error {
+	return global.GVA_DB.Create(&u).Error
+}
+
+// TODO: 用户修改
+
+// UpdateUser 修改用户
+func (u SysUser) UpdateUser() error {
+	return global.GVA_DB.Save(&u).Error
+}
+
+// UpdateUserAuthority 修改用户权限
+func UpdateUserAuthority(id, authorityId uint) error {
+	return global.GVA_DB.Model(&SysUser{}).Where("id = ?", id).Update("authority_id", authorityId).Error
+}
+
+// SetUserAuthorities 设置用户权限
+func SetUserAuthorities(id uint, authorityId uint) (err error) {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		var user SysUser
+		TxErr := tx.Where("id = ?", id).First(&user).Error
+		if TxErr != nil {
+			global.GVA_LOG.Debug(TxErr.Error())
+			return errors.New("查询用户数据失败")
+		}
+		TxErr = tx.Delete(&[]SysUserAuthority{}, "sys_user_id = ?", id).Error
+		if TxErr != nil {
+			return TxErr
+		}
+
+		useAuthority := SysUserAuthority{
+			SysUserId: id, SysAuthorityAuthorityId: authorityId,
+		}
+		TxErr = tx.Create(&useAuthority).Error
+		if TxErr != nil {
+			return TxErr
+		}
+		TxErr = tx.Model(&user).Update("authority_id", authorityId).Error
+		if TxErr != nil {
+			return TxErr
+		}
+		// 返回 nil 提交事务
+		return nil
+	})
+}
+
+// SetUserInfo 修改用户信息
+func (u SysUser) SetUserInfo() error {
+	return global.GVA_DB.Model(&SysUser{}).Updates(&u).Error
+}
+
+// SetUserInfoById 修改用户信息 按id
+func (u SysUser) SetUserInfoById() error {
+	return global.GVA_DB.Model(&SysUser{}).
+		Where("id=?", u.ID).
+		Updates(&u).Error
+}
+
+// UpdateUserDep 修改用户部门
+func UpdateUserDep(ids []int, depId int) error {
+	return global.GVA_DB.Model(&SysUser{}).
+		Where("id in (?)", ids).
+		Update("department_id", depId).Error
+}
+
+// TODO: 用户删除
+
+// DeleteUser 删除用户
+func DeleteUser(id int) (err error) {
+	return global.GVA_DB.Transaction(func(tx *gorm.DB) error {
+		if err := tx.Where("id = ?", id).Delete(&SysUser{}).Error; err != nil {
+			return err
+		}
+		if err := tx.Delete(&[]SysUserAuthority{}, "sys_user_id = ?", id).Error; err != nil {
+			return err
+		}
+		return nil
+	})
+}

+ 1 - 1
server/model/system/sys_user_authority.go

@@ -1,4 +1,4 @@
-package system
+package dao
 
 // SysUserAuthority 是 sysUser 和 sysAuthority 的连接表
 type SysUserAuthority struct {

+ 2 - 2
server/global/global.go

@@ -4,14 +4,14 @@ import (
 	"github.com/qiniu/qmgo"
 	"sync"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/utils/timer"
 	"github.com/songzhibin97/gkit/cache/local_cache"
+	"server/utils/timer"
 
 	"golang.org/x/sync/singleflight"
 
 	"go.uber.org/zap"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
+	"server/config"
 
 	"github.com/redis/go-redis/v9"
 	"github.com/spf13/viper"

+ 6 - 13
server/go.mod

@@ -1,4 +1,4 @@
-module github.com/flipped-aurora/gin-vue-admin/server
+module server
 
 go 1.22
 
@@ -7,6 +7,7 @@ require (
 	github.com/aws/aws-sdk-go v1.44.307
 	github.com/casbin/casbin/v2 v2.87.1
 	github.com/casbin/gorm-adapter/v3 v3.18.0
+	github.com/flipped-aurora/gin-vue-admin/server v0.0.0-20240703013134-eebd8771bdd1
 	github.com/flipped-aurora/ws v1.0.2
 	github.com/fsnotify/fsnotify v1.6.0
 	github.com/fvbock/endless v0.0.0-20170109170031-447134032cb6
@@ -15,17 +16,16 @@ require (
 	github.com/go-sql-driver/mysql v1.7.1
 	github.com/gofrs/uuid/v5 v5.0.0
 	github.com/golang-jwt/jwt/v4 v4.5.0
-	github.com/gookit/color v1.5.4
 	github.com/huaweicloud/huaweicloud-sdk-go-obs v3.21.8+incompatible
 	github.com/jordan-wright/email v0.0.0-20200824153738-3f5bafa1cd84
 	github.com/mojocn/base64Captcha v1.3.6
-	github.com/otiai10/copy v1.7.0
 	github.com/pkg/errors v0.9.1
 	github.com/qiniu/api.v7/v7 v7.4.1
 	github.com/qiniu/qmgo v1.1.8
 	github.com/redis/go-redis/v9 v9.0.5
 	github.com/robfig/cron/v3 v3.0.1
 	github.com/shirou/gopsutil/v3 v3.23.6
+	github.com/shopspring/decimal v1.4.0
 	github.com/songzhibin97/gkit v1.2.11
 	github.com/spf13/viper v1.16.0
 	github.com/stretchr/testify v1.8.4
@@ -34,7 +34,6 @@ require (
 	github.com/swaggo/swag v1.16.2
 	github.com/tencentyun/cos-go-sdk-v5 v0.7.42
 	github.com/unrolled/secure v1.13.0
-	github.com/xuri/excelize/v2 v2.8.0
 	go.mongodb.org/mongo-driver v1.12.1
 	go.uber.org/automaxprocs v1.5.3
 	go.uber.org/zap v1.24.0
@@ -44,7 +43,7 @@ require (
 	gorm.io/driver/mysql v1.5.6
 	gorm.io/driver/postgres v1.5.7
 	gorm.io/driver/sqlserver v1.5.1
-	gorm.io/gorm v1.25.9
+	gorm.io/gorm v1.25.10
 	nhooyr.io/websocket v1.8.7
 )
 
@@ -73,7 +72,7 @@ require (
 	github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
 	github.com/golang-sql/sqlexp v0.1.0 // indirect
 	github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 // indirect
-	github.com/golang/snappy v0.0.1 // indirect
+	github.com/golang/snappy v0.0.4 // indirect
 	github.com/google/go-querystring v1.0.0 // indirect
 	github.com/google/uuid v1.3.0 // indirect
 	github.com/hashicorp/hcl v1.0.0 // indirect
@@ -86,7 +85,7 @@ require (
 	github.com/jmespath/go-jmespath v0.4.0 // indirect
 	github.com/josharian/intern v1.0.0 // indirect
 	github.com/json-iterator/go v1.1.12 // indirect
-	github.com/klauspost/compress v1.13.6 // indirect
+	github.com/klauspost/compress v1.15.9 // indirect
 	github.com/klauspost/cpuid/v2 v2.2.4 // indirect
 	github.com/leodido/go-urn v1.2.4 // indirect
 	github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0 // indirect
@@ -97,15 +96,12 @@ require (
 	github.com/mitchellh/mapstructure v1.5.0 // indirect
 	github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
 	github.com/modern-go/reflect2 v1.0.2 // indirect
-	github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
 	github.com/montanaflynn/stats v0.7.0 // indirect
 	github.com/mozillazg/go-httpheader v0.2.1 // indirect
 	github.com/pelletier/go-toml/v2 v2.0.8 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c // indirect
 	github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
-	github.com/richardlehane/mscfb v1.0.4 // indirect
-	github.com/richardlehane/msoleps v1.0.3 // indirect
 	github.com/shoenig/go-m1cpu v0.1.6 // indirect
 	github.com/spf13/afero v1.9.5 // indirect
 	github.com/spf13/cast v1.5.1 // indirect
@@ -119,9 +115,6 @@ require (
 	github.com/xdg-go/pbkdf2 v1.0.0 // indirect
 	github.com/xdg-go/scram v1.1.2 // indirect
 	github.com/xdg-go/stringprep v1.0.4 // indirect
-	github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 // indirect
-	github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca // indirect
-	github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a // indirect
 	github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
 	github.com/yusufpapurcu/wmi v1.2.3 // indirect
 	go.uber.org/atomic v1.9.0 // indirect

+ 10 - 34
server/go.sum

@@ -95,6 +95,8 @@ github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1m
 github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
 github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
 github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
+github.com/flipped-aurora/gin-vue-admin/server v0.0.0-20240703013134-eebd8771bdd1 h1:tc9cWlmEfoKaBBlYzMiFyrZFV5UyEI6Lfbv/vpNJ5q8=
+github.com/flipped-aurora/gin-vue-admin/server v0.0.0-20240703013134-eebd8771bdd1/go.mod h1:DuaB1rq2m1vKjcOCBpuVjqppGOXSCbmPndxSRNSgqPQ=
 github.com/flipped-aurora/ws v1.0.2 h1:oEUz7sgrbPENvgli7Q4QpC0NIEbJucgR4yjcDMg/AjY=
 github.com/flipped-aurora/ws v1.0.2/go.mod h1:RdyM2Fnvxx7f7A6WSmU1aAhDrQIAVW7LS/0LsAUE5mE=
 github.com/frankban/quicktest v1.14.4 h1:g2rn0vABPOOXmZUj+vbmUp0lPoXEMuhTpIluN0XL9UY=
@@ -193,8 +195,9 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
 github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
 github.com/golang/protobuf v1.5.3 h1:KhyjKVUg7Usr/dYsdSqoFveMYd5ko72D+zANwlG1mmg=
 github.com/golang/protobuf v1.5.3/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
-github.com/golang/snappy v0.0.1 h1:Qgr9rKW7uDUkrbSmQeiDsGa8SjGyCOGtuasMWwvp2P4=
 github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
+github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
+github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
 github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
 github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
@@ -235,8 +238,6 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
 github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
 github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
 github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8/go.mod h1:dvDLG8qkwmyD9a/MJJN3XJcT3xFxOKAvTZGvuZmac9g=
-github.com/gookit/color v1.5.4 h1:FZmqs7XOyGgCAxmWyPslpiok1k05wmY3SJTytgvYFs0=
-github.com/gookit/color v1.5.4/go.mod h1:pZJOeOS8DM43rXbp4AZo1n9zCU2qjpcRko0b6/QJi9w=
 github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
 github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
 github.com/gorilla/websocket v1.4.1 h1:q7AeDBpnBk8AogcD4DSag/Ukw/KV+YhzLj2bP5HvKCM=
@@ -285,8 +286,9 @@ github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1
 github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
 github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
 github.com/klauspost/compress v1.10.3/go.mod h1:aoV0uJVorq1K+umq18yTdKaF57EivdYsUV+/s2qKfXs=
-github.com/klauspost/compress v1.13.6 h1:P76CopJELS0TiO2mebmnzgWaajssP/EszplttgQxcgc=
 github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk=
+github.com/klauspost/compress v1.15.9 h1:wKRjX6JRtDdrE9qwa4b/Cip7ACOshUI4smpCQanqjSY=
+github.com/klauspost/compress v1.15.9/go.mod h1:PhcZ0MbTNciWF3rruxRgKxI5NkcHHrHUDtV4Yw2GlzU=
 github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg=
 github.com/klauspost/cpuid/v2 v2.2.4 h1:acbojRNwl3o09bUq+yDCtZFc1aiwaAAxtcn8YkZXnvk=
 github.com/klauspost/cpuid/v2 v2.2.4/go.mod h1:RVVoqg1df56z8g3pUjL/3lE5UfnlrJX8tyFgg4nqhuY=
@@ -325,8 +327,6 @@ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lN
 github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M=
 github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
 github.com/modocache/gover v0.0.0-20171022184752-b58185e213c5/go.mod h1:caMODM3PzxT8aQXRPkAt8xlV/e7d7w8GM5g0fa5F0D8=
-github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 h1:RWengNIwukTxcDr9M+97sNutRR1RKhG96O6jWumTTnw=
-github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826/go.mod h1:TaXosZuwdSHYgviHp1DAtfrULt5eUgsSMsZf+YrPgl8=
 github.com/mojocn/base64Captcha v1.3.6 h1:gZEKu1nsKpttuIAQgWHO+4Mhhls8cAKyiV2Ew03H+Tw=
 github.com/mojocn/base64Captcha v1.3.6/go.mod h1:i5CtHvm+oMbj1UzEPXaA8IH/xHFZ3DGY3Wh3dBpZ28E=
 github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc=
@@ -334,13 +334,6 @@ github.com/montanaflynn/stats v0.7.0 h1:r3y12KyNxj/Sb/iOE46ws+3mS1+MZca1wlHQFPsY
 github.com/montanaflynn/stats v0.7.0/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow=
 github.com/mozillazg/go-httpheader v0.2.1 h1:geV7TrjbL8KXSyvghnFm+NyTux/hxwueTSrwhe88TQQ=
 github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
-github.com/otiai10/copy v1.7.0 h1:hVoPiN+t+7d2nzzwMiDHPSOogsWAStewq3TwU05+clE=
-github.com/otiai10/copy v1.7.0/go.mod h1:rmRl6QPdJj6EiUqXQ/4Nn2lLXoNQjFCQbbNrxgc/t3U=
-github.com/otiai10/curr v0.0.0-20150429015615-9b4961190c95/go.mod h1:9qAhocn7zKJG+0mI8eUu6xqkFDYS2kb2saOteoSB3cE=
-github.com/otiai10/curr v1.0.0/go.mod h1:LskTG5wDwr8Rs+nNQ+1LlxRjAtTZZjtJW4rMXl6j4vs=
-github.com/otiai10/mint v1.3.0/go.mod h1:F5AjcsTsWUqX+Na9fpHb52P8pcRX2CI6A3ctIT91xUo=
-github.com/otiai10/mint v1.3.3 h1:7JgpsBaN0uMkyju4tbYHu0mnM55hNKVYLsXmwr15NQI=
-github.com/otiai10/mint v1.3.3/go.mod h1:/yxELlJQ0ufhjUwhshSj+wFjZ78CnZ48/1wtmBH1OTc=
 github.com/pelletier/go-toml/v2 v2.0.8 h1:0ctb6s9mE31h0/lhu+J6OPmVeDxJn+kYnJc2jZR9tGQ=
 github.com/pelletier/go-toml/v2 v2.0.8/go.mod h1:vuYfssBdrU2XDZ9bYydBu6t+6a6PYNcZljzZR9VXg+4=
 github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI=
@@ -364,11 +357,6 @@ github.com/redis/go-redis/v9 v9.0.5/go.mod h1:WqMKv5vnQbRuZstUwxQI195wHy+t4PuXDO
 github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
 github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec/go.mod h1:qqbHyh8v60DhA7CoWK5oRCqLrMHRGoxYCSS9EjAz6Eo=
-github.com/richardlehane/mscfb v1.0.4 h1:WULscsljNPConisD5hR0+OyZjwK46Pfyr6mPu5ZawpM=
-github.com/richardlehane/mscfb v1.0.4/go.mod h1:YzVpcZg9czvAuhk9T+a3avCpcFPMUWm7gK3DypaEsUk=
-github.com/richardlehane/msoleps v1.0.1/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
-github.com/richardlehane/msoleps v1.0.3 h1:aznSZzrwYRl3rLKRT3gUk9am7T/mLNSnJINvN0AQoVM=
-github.com/richardlehane/msoleps v1.0.3/go.mod h1:BWev5JBpU9Ko2WAgmZEuiz4/u3ZYTKbjLycmwiWUfWg=
 github.com/robfig/cron/v3 v3.0.1 h1:WdRxkvbJztn8LMz/QEvLN5sBU+xKpSqwwUO1Pjr4qDs=
 github.com/robfig/cron/v3 v3.0.1/go.mod h1:eQICP3HwyT7UooqI/z+Ov+PtYAWygg1TEWWzGIFLtro=
 github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
@@ -380,6 +368,8 @@ github.com/shoenig/go-m1cpu v0.1.6 h1:nxdKQNcEB6vzgA2E2bvzKIYRuNj7XNJ4S/aRSwKzFt
 github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
 github.com/shoenig/test v0.6.4 h1:kVTaSd7WLz5WZ2IaoM0RSzRsUD+m8wRR+5qvntpn4LU=
 github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
+github.com/shopspring/decimal v1.4.0 h1:bxl37RwXBklmTi0C79JfXCEBD1cqqHt0bbgBAGFp81k=
+github.com/shopspring/decimal v1.4.0/go.mod h1:gawqmDU56v4yIKSwfBSFip1HdCCXN8/+DMd9qYNcwME=
 github.com/songzhibin97/gkit v1.2.11 h1:O8+l6eLMrZ2yNbT6Vohc6ggWnH5zt4P8/3ZEkf8jUL4=
 github.com/songzhibin97/gkit v1.2.11/go.mod h1:axjYsiJWnn/kf/uGiUr9JPHRlt2CQrqfq/fPZ3xIY+M=
 github.com/spf13/afero v1.9.5 h1:stMpOSZFs//0Lv29HduCmli3GUfpFoF3Y1Q/aXj/wVM=
@@ -442,14 +432,6 @@ github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3k
 github.com/xdg-go/stringprep v1.0.3/go.mod h1:W3f5j4i+9rC0kuIEJL0ky1VpHXQU3ocBgklLGvcBnW8=
 github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
 github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
-github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778 h1:QldyIu/L63oPpyvQmHgvgickp1Yw510KJOqX7H24mg8=
-github.com/xo/terminfo v0.0.0-20210125001918-ca9a967f8778/go.mod h1:2MuV+tbUrU1zIOPMxZ5EncGwgmMJsa+9ucAQZXxsObs=
-github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca h1:uvPMDVyP7PXMMioYdyPH+0O+Ta/UO1WFfNYMO3Wz0eg=
-github.com/xuri/efp v0.0.0-20230802181842-ad255f2331ca/go.mod h1:ybY/Jr0T0GTCnYjKqmdwxyxn2BQf2RcQIIvex5QldPI=
-github.com/xuri/excelize/v2 v2.8.0 h1:Vd4Qy809fupgp1v7X+nCS/MioeQmYVVzi495UCTqB7U=
-github.com/xuri/excelize/v2 v2.8.0/go.mod h1:6iA2edBTKxKbZAa7X5bDhcCg51xdOn1Ar5sfoXRGrQg=
-github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a h1:Mw2VNrNNNjDtw68VsEj2+st+oCSn4Uz7vZw6TbhcV1o=
-github.com/xuri/nfp v0.0.0-20230819163627-dc951e3ffe1a/go.mod h1:WwHg+CVyzlv/TX9xqBFXEZAuxOPxn2k1GNHwG41IIUQ=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA=
 github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA=
 github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
@@ -498,7 +480,6 @@ golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0
 golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58=
 golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
 golang.org/x/crypto v0.9.0/go.mod h1:yrmDGqONDYtNj3tH8X9dzUun2m2lzPa9ngI6/RUPGR0=
-golang.org/x/crypto v0.12.0/go.mod h1:NF0Gs7EO5K4qLn+Ylc+fih8BSTeIjAP05siRnAh98yw=
 golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
 golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
@@ -513,7 +494,6 @@ golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EH
 golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
 golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
 golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
-golang.org/x/image v0.11.0/go.mod h1:bglhjqbqVuEb9e9+eNR45Jfu7D+T4Qan+NhQk8Ck2P8=
 golang.org/x/image v0.13.0/go.mod h1:6mmbMOeV28HuMTgA6OSRkdXKYw/t5W9Uwn2Yv1r3Yxk=
 golang.org/x/image v0.15.0 h1:kOELfmgrmJlw4Cdb7g/QGuB3CvDrXbqEIww/pNtNBm8=
 golang.org/x/image v0.15.0/go.mod h1:HUYqC05R2ZcZ3ejNQsIHQDQiwWM4JBqmm6MKANTp4LE=
@@ -580,7 +560,6 @@ golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
 golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
 golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
-golang.org/x/net v0.14.0/go.mod h1:PpSgVXXLK0OxS0F31C1/tv6XNguvCrnXIDrFMspZIUI=
 golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4=
 golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
@@ -656,7 +635,6 @@ golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o=
 golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
@@ -665,7 +643,6 @@ golang.org/x/term v0.1.0/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
 golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
 golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
-golang.org/x/term v0.11.0/go.mod h1:zC9APTIj3jG3FdV/Ons+XE1riIZXG4aZ4GTHiPZJPIU=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -679,7 +656,6 @@ golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
 golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
 golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
-golang.org/x/text v0.12.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
 golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
 golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
@@ -864,8 +840,8 @@ gorm.io/gorm v1.23.8/go.mod h1:l2lP/RyAtc1ynaTjFksBde/O8v9oOGIApu2/xRitmZk=
 gorm.io/gorm v1.24.3/go.mod h1:DVrVomtaYTbqs7gB/x2uVvqnXzv0nqjB396B8cG4dBA=
 gorm.io/gorm v1.25.1/go.mod h1:L4uxeKpfBml98NYqVqwAdmV1a2nBtAec/cf3fpucW/k=
 gorm.io/gorm v1.25.7/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
-gorm.io/gorm v1.25.9 h1:wct0gxZIELDk8+ZqF/MVnHLkA1rvYlBWUMv2EdsK1g8=
-gorm.io/gorm v1.25.9/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
+gorm.io/gorm v1.25.10 h1:dQpO+33KalOA+aFYGlK+EfxcI5MbO7EP2yYygwh9h+s=
+gorm.io/gorm v1.25.10/go.mod h1:hbnx/Oo0ChWMn1BIhpy1oYozzpM15i4YPuHDmfYtwg8=
 gorm.io/plugin/dbresolver v1.4.1 h1:Ug4LcoPhrvqq71UhxtF346f+skTYoCa/nEsdjvHwEzk=
 gorm.io/plugin/dbresolver v1.4.1/go.mod h1:CTbCtMWhsjXSiJqiW2R8POvJ2cq18RVOl4WGyT5nhNc=
 honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=

+ 2 - 2
server/initialize/db_list.go

@@ -1,9 +1,9 @@
 package initialize
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
 	"gorm.io/gorm"
+	"server/config"
+	"server/global"
 )
 
 const sys = "system"

+ 0 - 105
server/initialize/ensure_tables.go

@@ -1,105 +0,0 @@
-package initialize
-
-import (
-	"context"
-	adapter "github.com/casbin/gorm-adapter/v3"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/example"
-	sysModel "github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	"github.com/flipped-aurora/gin-vue-admin/server/service/system"
-	"gorm.io/gorm"
-)
-
-const initOrderEnsureTables = system.InitOrderExternal - 1
-
-type ensureTables struct{}
-
-// auto run
-func init() {
-	system.RegisterInit(initOrderEnsureTables, &ensureTables{})
-}
-
-func (ensureTables) InitializerName() string {
-	return "ensure_tables_created"
-}
-func (e *ensureTables) InitializeData(ctx context.Context) (next context.Context, err error) {
-	return ctx, nil
-}
-
-func (e *ensureTables) DataInserted(ctx context.Context) bool {
-	return true
-}
-
-func (e *ensureTables) MigrateTable(ctx context.Context) (context.Context, error) {
-	db, ok := ctx.Value("db").(*gorm.DB)
-	if !ok {
-		return ctx, system.ErrMissingDBContext
-	}
-	tables := []interface{}{
-		sysModel.SysApi{},
-		sysModel.SysUser{},
-		sysModel.SysBaseMenu{},
-		sysModel.SysAuthority{},
-		sysModel.JwtBlacklist{},
-		sysModel.SysDictionary{},
-		sysModel.SysAutoCodeHistory{},
-		sysModel.SysOperationRecord{},
-		sysModel.SysDictionaryDetail{},
-		sysModel.SysBaseMenuParameter{},
-		sysModel.SysBaseMenuBtn{},
-		sysModel.SysAuthorityBtn{},
-		sysModel.SysAutoCode{},
-		sysModel.SysExportTemplate{},
-		sysModel.Condition{},
-		sysModel.JoinTemplate{},
-
-		adapter.CasbinRule{},
-
-		example.ExaFile{},
-		example.ExaCustomer{},
-		example.ExaFileChunk{},
-		example.ExaFileUploadAndDownload{},
-	}
-	for _, t := range tables {
-		_ = db.AutoMigrate(&t)
-		// 视图 authority_menu 会被当成表来创建,引发冲突错误(更新版本的gorm似乎不会)
-		// 由于 AutoMigrate() 基本无需考虑错误,因此显式忽略
-	}
-	return ctx, nil
-}
-
-func (e *ensureTables) TableCreated(ctx context.Context) bool {
-	db, ok := ctx.Value("db").(*gorm.DB)
-	if !ok {
-		return false
-	}
-	tables := []interface{}{
-		sysModel.SysApi{},
-		sysModel.SysUser{},
-		sysModel.SysBaseMenu{},
-		sysModel.SysAuthority{},
-		sysModel.JwtBlacklist{},
-		sysModel.SysDictionary{},
-		sysModel.SysAutoCodeHistory{},
-		sysModel.SysOperationRecord{},
-		sysModel.SysDictionaryDetail{},
-		sysModel.SysBaseMenuParameter{},
-		sysModel.SysBaseMenuBtn{},
-		sysModel.SysAuthorityBtn{},
-		sysModel.SysAutoCode{},
-		sysModel.SysExportTemplate{},
-		sysModel.Condition{},
-		sysModel.JoinTemplate{},
-
-		adapter.CasbinRule{},
-
-		example.ExaFile{},
-		example.ExaCustomer{},
-		example.ExaFileChunk{},
-		example.ExaFileUploadAndDownload{},
-	}
-	yes := true
-	for _, t := range tables {
-		yes = yes && db.Migrator().HasTable(t)
-	}
-	return yes
-}

+ 30 - 22
server/initialize/gorm.go

@@ -2,13 +2,12 @@ package initialize
 
 import (
 	"os"
-
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/example"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
+	"server/dao"
 
 	"go.uber.org/zap"
 	"gorm.io/gorm"
+	"server/global"
+	"server/model/example"
 )
 
 func Gorm() *gorm.DB {
@@ -32,27 +31,36 @@ func RegisterTables() {
 	db := global.GVA_DB
 	err := db.AutoMigrate(
 
-		system.SysApi{},
-		system.SysUser{},
-		system.SysBaseMenu{},
-		system.JwtBlacklist{},
-		system.SysAuthority{},
-		system.SysDictionary{},
-		system.SysOperationRecord{},
-		system.SysAutoCodeHistory{},
-		system.SysDictionaryDetail{},
-		system.SysBaseMenuParameter{},
-		system.SysBaseMenuBtn{},
-		system.SysAuthorityBtn{},
-		system.SysAutoCode{},
-		system.SysExportTemplate{},
-		system.Condition{},
-		system.JoinTemplate{},
+		dao.SysApi{},
+		dao.SysUser{},
+		dao.SysBaseMenu{},
+		dao.JwtBlacklist{},
+		dao.SysAuthority{},
+		dao.SysDictionary{},
+		dao.SysOperationRecord{},
+		dao.SysDictionaryDetail{},
+		dao.SysBaseMenuParameter{},
+		dao.SysBaseMenuBtn{},
+		dao.SysAuthorityBtn{},
 
 		example.ExaFile{},
-		example.ExaCustomer{},
 		example.ExaFileChunk{},
-		example.ExaFileUploadAndDownload{},
+		dao.ExaFileUploadAndDownload{},
+		dao.Department{},
+		dao.Project{},
+		dao.ProjectState{},
+		dao.ProjectFile{},
+		dao.FileGenre{},
+		dao.ProjectWorkingHours{},
+		dao.Collection{},
+		dao.Borrowing{},
+		dao.ExpensesGenre{},
+		dao.DailyExpenses{},
+		dao.DailyFeeDetails{},
+		dao.DailyFile{},
+		dao.Reimbursement{},
+		dao.FeeDetails{},
+		dao.Constructor{},
 	)
 	if err != nil {
 		global.GVA_LOG.Error("register table failed", zap.Error(err))

+ 5 - 5
server/initialize/gorm_mssql.go

@@ -9,11 +9,11 @@
 package initialize
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
 	"gorm.io/driver/sqlserver"
 	"gorm.io/gorm"
+	"server/config"
+	"server/global"
+	"server/initialize/internal"
 )
 
 // GormMssql 初始化Mssql数据库
@@ -44,8 +44,8 @@ func GormMssqlByConfig(m config.Mssql) *gorm.DB {
 		return nil
 	}
 	mssqlConfig := sqlserver.Config{
-		DSN:                       m.Dsn(), // DSN data source name
-		DefaultStringSize:         191,     // string 类型字段的默认长度
+		DSN:               m.Dsn(), // DSN data source name
+		DefaultStringSize: 191,     // string 类型字段的默认长度
 	}
 	if db, err := gorm.Open(sqlserver.New(mssqlConfig), internal.Gorm.Config(m.Prefix, m.Singular)); err != nil {
 		panic(err)

+ 3 - 3
server/initialize/gorm_mysql.go

@@ -1,12 +1,12 @@
 package initialize
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
 	_ "github.com/go-sql-driver/mysql"
 	"gorm.io/driver/mysql"
 	"gorm.io/gorm"
+	"server/config"
+	"server/global"
+	"server/initialize/internal"
 )
 
 // GormMysql 初始化Mysql数据库

+ 3 - 3
server/initialize/gorm_oracle.go

@@ -2,9 +2,9 @@ package initialize
 
 import (
 	//"github.com/dzwvip/oracle"
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
+	"server/config"
+	"server/global"
+	"server/initialize/internal"
 
 	//_ "github.com/godror/godror"
 	"gorm.io/driver/mysql"

+ 3 - 3
server/initialize/gorm_pgsql.go

@@ -1,11 +1,11 @@
 package initialize
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
 	"gorm.io/driver/postgres"
 	"gorm.io/gorm"
+	"server/config"
+	"server/global"
+	"server/initialize/internal"
 )
 
 // GormPgSql 初始化 Postgresql 数据库

+ 3 - 3
server/initialize/gorm_sqlite.go

@@ -1,11 +1,11 @@
 package initialize
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
 	"github.com/glebarez/sqlite"
 	"gorm.io/gorm"
+	"server/config"
+	"server/global"
+	"server/initialize/internal"
 )
 
 // GormSqlite 初始化Sqlite数据库

+ 1 - 1
server/initialize/internal/gorm.go

@@ -6,9 +6,9 @@ import (
 	"os"
 	"time"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
 	"gorm.io/gorm"
 	"gorm.io/gorm/logger"
+	"server/global"
 )
 
 type DBBASE interface {

+ 1 - 1
server/initialize/internal/logger.go

@@ -3,8 +3,8 @@ package internal
 import (
 	"fmt"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
 	"gorm.io/gorm/logger"
+	"server/global"
 )
 
 type writer struct {

+ 3 - 3
server/initialize/mongo.go

@@ -3,14 +3,14 @@ package initialize
 import (
 	"context"
 	"fmt"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize/internal"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/pkg/errors"
 	"github.com/qiniu/qmgo"
 	"github.com/qiniu/qmgo/options"
 	"go.mongodb.org/mongo-driver/bson"
 	option "go.mongodb.org/mongo-driver/mongo/options"
+	"server/global"
+	"server/initialize/internal"
+	"server/utils"
 	"sort"
 	"strings"
 )

+ 2 - 2
server/initialize/other.go

@@ -3,8 +3,8 @@ package initialize
 import (
 	"github.com/songzhibin97/gkit/cache/local_cache"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"server/global"
+	"server/utils"
 )
 
 func OtherInit() {

+ 4 - 4
server/initialize/plugin.go

@@ -3,11 +3,11 @@ package initialize
 import (
 	"fmt"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/middleware"
-	"github.com/flipped-aurora/gin-vue-admin/server/plugin/email"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils/plugin"
 	"github.com/gin-gonic/gin"
+	"server/global"
+	"server/middleware"
+	"server/plugin/email"
+	"server/utils/plugin"
 )
 
 func PluginInit(group *gin.RouterGroup, Plugin ...plugin.Plugin) {

+ 1 - 1
server/initialize/redis.go

@@ -3,7 +3,7 @@ package initialize
 import (
 	"context"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
+	"server/global"
 
 	"github.com/redis/go-redis/v9"
 	"go.uber.org/zap"

+ 0 - 5
server/initialize/register_init.go

@@ -1,10 +1,5 @@
 package initialize
 
-import (
-	_ "github.com/flipped-aurora/gin-vue-admin/server/source/example"
-	_ "github.com/flipped-aurora/gin-vue-admin/server/source/system"
-)
-
 func init() {
 	// do nothing,only import source package so that inits can be registered
 }

+ 12 - 11
server/initialize/router.go

@@ -1,15 +1,15 @@
 package initialize
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/docs"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/middleware"
-	"github.com/flipped-aurora/gin-vue-admin/server/router"
 	"github.com/gin-gonic/gin"
 	swaggerFiles "github.com/swaggo/files"
 	ginSwagger "github.com/swaggo/gin-swagger"
 	"net/http"
 	"os"
+	"server/docs"
+	"server/global"
+	"server/middleware"
+	"server/router"
 )
 
 type justFilesFilesystem struct {
@@ -42,6 +42,7 @@ func Routers() *gin.Engine {
 	InstallPlugin(Router) // 安装插件
 	systemRouter := router.RouterGroupApp.System
 	exampleRouter := router.RouterGroupApp.Example
+	adminRouter := router.RouterGroupApp.Admin
 	// 如果想要不使用nginx代理前端网页,可以修改 web/.env.production 下的
 	// VUE_APP_BASE_API = /
 	// VUE_APP_BASE_PATH = http://localhost
@@ -69,28 +70,28 @@ func Routers() *gin.Engine {
 	}
 	{
 		systemRouter.InitBaseRouter(PublicGroup) // 注册基础功能路由 不做鉴权
-		systemRouter.InitInitRouter(PublicGroup) // 自动初始化相关
 	}
 	PrivateGroup := Router.Group(global.GVA_CONFIG.System.RouterPrefix)
 	PrivateGroup.Use(middleware.JWTAuth()).Use(middleware.CasbinHandler())
 	{
 		systemRouter.InitApiRouter(PrivateGroup, PublicGroup)    // 注册功能api路由
 		systemRouter.InitJwtRouter(PrivateGroup)                 // jwt相关路由
-		systemRouter.InitUserRouter(PrivateGroup)                // 注册用户路由
+		systemRouter.InitUserRouter(PrivateGroup, PublicGroup)   // 注册用户路由
 		systemRouter.InitMenuRouter(PrivateGroup)                // 注册menu路由
-		systemRouter.InitSystemRouter(PrivateGroup)              // system相关路由
 		systemRouter.InitCasbinRouter(PrivateGroup)              // 权限相关路由
-		systemRouter.InitAutoCodeRouter(PrivateGroup)            // 创建自动化代码
 		systemRouter.InitAuthorityRouter(PrivateGroup)           // 注册角色路由
 		systemRouter.InitSysDictionaryRouter(PrivateGroup)       // 字典管理
-		systemRouter.InitAutoCodeHistoryRouter(PrivateGroup)     // 自动化代码历史
 		systemRouter.InitSysOperationRecordRouter(PrivateGroup)  // 操作记录
 		systemRouter.InitSysDictionaryDetailRouter(PrivateGroup) // 字典详情管理
 		systemRouter.InitAuthorityBtnRouterRouter(PrivateGroup)  // 字典详情管理
-		systemRouter.InitSysExportTemplateRouter(PrivateGroup)   // 导出模板
 
-		exampleRouter.InitCustomerRouter(PrivateGroup)
 		exampleRouter.InitFileUploadAndDownloadRouter(PrivateGroup)
+
+		adminRouter.InitDepartmentRouter(PublicGroup)
+		adminRouter.InitProjectRouter(PrivateGroup)
+		adminRouter.InitFileRouter(PrivateGroup)
+		adminRouter.InitFinanceRouter(PrivateGroup)
+		adminRouter.InitConstructorRouter(PrivateGroup)
 	}
 
 	global.GVA_LOG.Info("router register success")

+ 2 - 2
server/initialize/timer.go

@@ -2,11 +2,11 @@ package initialize
 
 import (
 	"fmt"
-	"github.com/flipped-aurora/gin-vue-admin/server/task"
+	"server/task"
 
 	"github.com/robfig/cron/v3"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
+	"server/global"
 )
 
 func Timer() {

+ 1 - 1
server/initialize/validator.go

@@ -1,6 +1,6 @@
 package initialize
 
-import "github.com/flipped-aurora/gin-vue-admin/server/utils"
+import "server/utils"
 
 func init() {
 	_ = utils.RegisterRule("PageVerify",

+ 3 - 3
server/main.go

@@ -4,9 +4,9 @@ import (
 	_ "go.uber.org/automaxprocs"
 	"go.uber.org/zap"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/core"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/initialize"
+	"server/core"
+	"server/global"
+	"server/initialize"
 )
 
 //go:generate go env -w GO111MODULE=on

+ 4 - 4
server/middleware/casbin_rbac.go

@@ -4,11 +4,11 @@ import (
 	"strconv"
 	"strings"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/service"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/gin-gonic/gin"
+	"server/global"
+	"server/model/common/response"
+	"server/service"
+	"server/utils"
 )
 
 var casbinService = service.ServiceGroupApp.SystemServiceGroup.CasbinService

+ 2 - 2
server/middleware/cors.go

@@ -1,10 +1,10 @@
 package middleware
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/config"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
 	"github.com/gin-gonic/gin"
 	"net/http"
+	"server/config"
+	"server/global"
 )
 
 // Cors 直接放行所有跨域请求并放行所有 OPTIONS 方法

+ 6 - 6
server/middleware/email.go

@@ -3,17 +3,17 @@ package middleware
 import (
 	"bytes"
 	"io"
+	"server/dao"
 	"strconv"
 	"time"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/plugin/email/utils"
-	utils2 "github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"server/plugin/email/utils"
+	utils2 "server/utils"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	"github.com/flipped-aurora/gin-vue-admin/server/service"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/global"
+	"server/service"
 )
 
 var userService = service.ServiceGroupApp.SystemServiceGroup.UserService
@@ -35,7 +35,7 @@ func ErrorToEmail() gin.HandlerFunc {
 		body, _ := io.ReadAll(c.Request.Body)
 		// 再重新写回请求体body中,ioutil.ReadAll会清空c.Request.Body中的数据
 		c.Request.Body = io.NopCloser(bytes.NewBuffer(body))
-		record := system.SysOperationRecord{
+		record := dao.SysOperationRecord{
 			Ip:     c.ClientIP(),
 			Method: c.Request.Method,
 			Path:   c.Request.URL.Path,

+ 1 - 1
server/middleware/error.go

@@ -8,9 +8,9 @@ import (
 	"runtime/debug"
 	"strings"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/global"
 )
 
 // GinRecovery recover掉项目可能出现的panic,并使用zap记录相关日志

+ 6 - 6
server/middleware/jwt.go

@@ -2,16 +2,16 @@ package middleware
 
 import (
 	"errors"
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
 	"github.com/golang-jwt/jwt/v4"
 	"go.uber.org/zap"
+	"server/dao"
+	"server/global"
+	"server/utils"
 	"strconv"
 	"time"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
-	"github.com/flipped-aurora/gin-vue-admin/server/service"
+	"server/model/common/response"
+	"server/service"
 
 	"github.com/gin-gonic/gin"
 )
@@ -71,7 +71,7 @@ func JWTAuth() gin.HandlerFunc {
 				if err != nil {
 					global.GVA_LOG.Error("get redis jwt failed", zap.Error(err))
 				} else { // 当之前的取成功时才进行拉黑操作
-					_ = jwtService.JsonInBlacklist(system.JwtBlacklist{Jwt: RedisJwtToken})
+					_ = jwtService.JsonInBlacklist(dao.JwtBlacklist{Jwt: RedisJwtToken})
 				}
 				// 无论如何都要记录当前的活跃状态
 				_ = jwtService.SetRedisJWT(newToken, newClaims.Username)

+ 2 - 2
server/middleware/limit_ip.go

@@ -8,9 +8,9 @@ import (
 
 	"go.uber.org/zap"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/common/response"
 	"github.com/gin-gonic/gin"
+	"server/global"
+	"server/model/common/response"
 )
 
 type LimitConfig struct {

+ 5 - 5
server/middleware/operation.go

@@ -6,18 +6,18 @@ import (
 	"io"
 	"net/http"
 	"net/url"
+	"server/dao"
 	"strconv"
 	"strings"
 	"sync"
 	"time"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/utils"
+	"server/utils"
 
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-	"github.com/flipped-aurora/gin-vue-admin/server/service"
 	"github.com/gin-gonic/gin"
 	"go.uber.org/zap"
+	"server/global"
+	"server/service"
 )
 
 var operationRecordService = service.ServiceGroupApp.SystemServiceGroup.OperationRecordService
@@ -66,7 +66,7 @@ func OperationRecord() gin.HandlerFunc {
 			}
 			userId = id
 		}
-		record := system.SysOperationRecord{
+		record := dao.SysOperationRecord{
 			Ip:     c.ClientIP(),
 			Method: c.Request.Method,
 			Path:   c.Request.URL.Path,

+ 41 - 0
server/model/common/request/common.go

@@ -25,4 +25,45 @@ type GetAuthorityId struct {
 	AuthorityId uint `json:"authorityId" form:"authorityId"` // 角色ID
 }
 
+type Ids struct {
+	Ids []int `json:"ids" form:"ids"`
+	Id  int   `json:"id" form:"id"`
+}
+
+type SearchProject struct {
+	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
+	Name     string   `json:"name" form:"name"`
+	Time     string   `json:"time" form:"time"`
+	State    int      `json:"state" form:"state"`
+}
+
+type SearchWorkingHours struct {
+	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
+	Code     string   `json:"name" form:"name"`
+	Time     string   `json:"time" form:"time"`
+	YearTime string   `json:"yearTime" form:"yearTime"`
+	People   int      `json:"people" form:"people"`
+}
+
+type SearchProjectList struct {
+	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
+	Code     string   `json:"code" form:"code"`
+	Name     string   `json:"name" form:"name"`
+	Time     string   `json:"time" form:"time"`
+}
+
+type SearchProjectFileList struct {
+	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
+	Code     string   `json:"code" form:"code"`
+	Name     string   `json:"name" form:"name"`
+	Genre    int      `json:"genre" form:"genre"`
+}
+
+type SearchIdNameGenre struct {
+	PageInfo PageInfo `json:"pageInfo" form:"pageInfo"`
+	Id       int      `json:"id" form:"id"`
+	Name     string   `json:"name" form:"name"`
+	Genre    int      `json:"genre" form:"genre"`
+}
+
 type Empty struct{}

+ 1 - 1
server/model/example/exa_breakpoint_continue.go

@@ -1,7 +1,7 @@
 package example
 
 import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
+	"server/global"
 )
 
 // file struct, 文件结构体

+ 0 - 15
server/model/example/exa_customer.go

@@ -1,15 +0,0 @@
-package example
-
-import (
-	"github.com/flipped-aurora/gin-vue-admin/server/global"
-	"github.com/flipped-aurora/gin-vue-admin/server/model/system"
-)
-
-type ExaCustomer struct {
-	global.GVA_MODEL
-	CustomerName       string         `json:"customerName" form:"customerName" gorm:"comment:客户名"`                // 客户名
-	CustomerPhoneData  string         `json:"customerPhoneData" form:"customerPhoneData" gorm:"comment:客户手机号"`    // 客户手机号
-	SysUserID          uint           `json:"sysUserId" form:"sysUserId" gorm:"comment:管理ID"`                     // 管理ID
-	SysUserAuthorityID uint           `json:"sysUserAuthorityID" form:"sysUserAuthorityID" gorm:"comment:管理角色ID"` // 管理角色ID
-	SysUser            system.SysUser `json:"sysUser" form:"sysUser" gorm:"comment:管理详情"`                         // 管理详情
-}

+ 0 - 0
server/model/example/exa_file_upload_download.go


Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels