知识库增加租户隔离

This commit is contained in:
2025-11-05 17:50:02 +08:00
parent b00463cb14
commit 9c67793fc3
19 changed files with 473 additions and 87 deletions
+4 -2
View File
@@ -91,7 +91,8 @@ func (c *AuthController) Login() {
"avatar": user.Avatar,
"nickname": user.Nickname,
"tenant_id": user.TenantId,
"type": "user", // 标识是用户登录
"role": user.Role, // 角色ID
"type": "user", // 标识是用户登录
}
} else if employee != nil {
// 员工登录
@@ -107,7 +108,8 @@ func (c *AuthController) Login() {
"tenant_id": employee.TenantId,
"department_id": employee.DepartmentId,
"position_id": employee.PositionId,
"type": "employee", // 标识是员工登录
"role": employee.Role, // 角色ID
"type": "employee", // 标识是员工登录
}
} else {
c.Data["json"] = map[string]interface{}{
+55 -37
View File
@@ -61,18 +61,21 @@ func (c *EmployeeController) GetTenantEmployees() {
employeeList := make([]map[string]interface{}, 0)
for _, emp := range employees {
employeeList = append(employeeList, map[string]interface{}{
"id": emp.Id,
"tenant_id": emp.TenantId,
"employee_no": emp.EmployeeNo,
"name": emp.Name,
"phone": emp.Phone,
"email": emp.Email,
"id": emp.Id,
"tenant_id": emp.TenantId,
"employee_no": emp.EmployeeNo,
"name": emp.Name,
"phone": emp.Phone,
"email": emp.Email,
"department_id": emp.DepartmentId,
"position_id": emp.PositionId,
"bank_name": emp.BankName,
"bank_account": emp.BankAccount,
"status": emp.Status,
"create_time": emp.CreateTime,
"position_id": emp.PositionId,
"role": emp.Role,
"bank_name": emp.BankName,
"bank_account": emp.BankAccount,
"status": emp.Status,
"create_time": emp.CreateTime,
"last_login_time": emp.LastLoginTime,
"last_login_ip": emp.LastLoginIp,
})
}
@@ -109,24 +112,27 @@ func (c *EmployeeController) GetEmployeeInfo() {
return
}
c.Data["json"] = map[string]interface{}{
"code": 0,
"message": "获取员工信息成功",
"data": map[string]interface{}{
"id": employee.Id,
"tenant_id": employee.TenantId,
"employee_no": employee.EmployeeNo,
"name": employee.Name,
"phone": employee.Phone,
"email": employee.Email,
"department_id": employee.DepartmentId,
"position_id": employee.PositionId,
"bank_name": employee.BankName,
"bank_account": employee.BankAccount,
"status": employee.Status,
"create_time": employee.CreateTime,
},
}
c.Data["json"] = map[string]interface{}{
"code": 0,
"message": "获取员工信息成功",
"data": map[string]interface{}{
"id": employee.Id,
"tenant_id": employee.TenantId,
"employee_no": employee.EmployeeNo,
"name": employee.Name,
"phone": employee.Phone,
"email": employee.Email,
"department_id": employee.DepartmentId,
"position_id": employee.PositionId,
"role": employee.Role,
"bank_name": employee.BankName,
"bank_account": employee.BankAccount,
"status": employee.Status,
"create_time": employee.CreateTime,
"last_login_time": employee.LastLoginTime,
"last_login_ip": employee.LastLoginIp,
},
}
c.ServeJSON()
}
@@ -141,9 +147,10 @@ func (c *EmployeeController) AddEmployee() {
Email string `json:"email"`
DepartmentId int `json:"department_id"`
PositionId int `json:"position_id"`
Role int `json:"role"`
BankName string `json:"bank_name"`
BankAccount string `json:"bank_account"`
Status int8 `json:"status"`
Status int `json:"status"` // 使用int,前端传递number会自动转换
}
err := json.Unmarshal(c.Ctx.Input.RequestBody, &employeeData)
@@ -165,16 +172,25 @@ func (c *EmployeeController) AddEmployee() {
Email: employeeData.Email,
DepartmentId: employeeData.DepartmentId,
PositionId: employeeData.PositionId,
Role: employeeData.Role,
BankName: employeeData.BankName,
BankAccount: employeeData.BankAccount,
Status: employeeData.Status,
Status: int8(employeeData.Status), // 转换为int8
}
// 如果没有指定租户ID,从当前登录用户获取(需要JWT中间件支持)
// 这里暂时使用传入的tenant_id,如果为0则使用默认值
// 如果没有指定租户ID,从JWT token中获取
if employee.TenantId == 0 {
// 可以从JWT token中获取租户ID,这里暂时设为1作为默认值
employee.TenantId = 1
if tenantId, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantId > 0 {
employee.TenantId = tenantId
} else {
c.Data["json"] = map[string]interface{}{
"code": 1,
"message": "租户ID不能为空",
"data": nil,
}
c.ServeJSON()
return
}
}
// 默认密码
@@ -220,9 +236,10 @@ func (c *EmployeeController) UpdateEmployee() {
Email string `json:"email"`
DepartmentId int `json:"department_id"`
PositionId int `json:"position_id"`
Role int `json:"role"`
BankName string `json:"bank_name"`
BankAccount string `json:"bank_account"`
Status int8 `json:"status"`
Status int `json:"status"` // 使用int,前端传递number会自动转换
}
err = json.Unmarshal(c.Ctx.Input.RequestBody, &updateData)
@@ -254,9 +271,10 @@ func (c *EmployeeController) UpdateEmployee() {
employee.Email = updateData.Email
employee.DepartmentId = updateData.DepartmentId
employee.PositionId = updateData.PositionId
employee.Role = updateData.Role
employee.BankName = updateData.BankName
employee.BankAccount = updateData.BankAccount
employee.Status = updateData.Status
employee.Status = int8(updateData.Status) // 转换为int8
if err := models.UpdateEmployee(employee); err != nil {
c.Data["json"] = map[string]interface{}{
+84 -10
View File
@@ -23,9 +23,18 @@ func (c *KnowledgeController) List() {
categoryId, _ := c.GetInt("categoryId", 0)
share, _ := c.GetInt8("share", -1) // Default -1 to query all
keyword := c.GetString("keyword", "")
// 获取租户ID(如果是员工登录,从JWT token中获取)
tenantId := 0
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
tenantId = tenantIdVal
}
}
// Use share in the query
knowledges, total, err := models.GetAllKnowledge(page, pageSize, status, categoryId, share, keyword)
knowledges, total, err := models.GetAllKnowledge(page, pageSize, status, categoryId, share, keyword, tenantId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"code": 1,
@@ -62,8 +71,17 @@ func (c *KnowledgeController) Detail() {
c.ServeJSON()
return
}
// 获取租户ID(如果是员工登录,从JWT token中获取)
tenantId := 0
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
tenantId = tenantIdVal
}
}
knowledge, err := models.GetKnowledgeById(id)
knowledge, err := models.GetKnowledgeById(id, tenantId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"code": 1,
@@ -112,6 +130,14 @@ func (c *KnowledgeController) Create() {
// Add share parsing (default 0 for personal)
share, _ := c.GetInt8("share", 0)
knowledge.Share = share
// 获取租户ID(如果是员工登录,从JWT token中获取并设置)
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
knowledge.TenantId = tenantIdVal
}
}
id, err := models.AddKnowledge(&knowledge)
if err != nil {
@@ -158,12 +184,17 @@ func (c *KnowledgeController) Update() {
c.ServeJSON()
return
}
// 获取租户ID(如果是员工登录,从JWT token中获取)
tenantId := 0
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
tenantId = tenantIdVal
}
}
// Add share parsing
share, _ := c.GetInt8("share", 0) // Default 0 if not provided
knowledge.Share = share
err = models.UpdateKnowledge(knowledge.Id, &knowledge)
err = models.UpdateKnowledge(knowledge.Id, &knowledge, tenantId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"code": 1,
@@ -216,8 +247,17 @@ func (c *KnowledgeController) Delete() {
if deleteBy == "" {
deleteBy = "system" // 默认值
}
// 获取租户ID(如果是员工登录,从JWT token中获取)
tenantId := 0
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
tenantId = tenantIdVal
}
}
err = models.DeleteKnowledge(int(id), deleteBy)
err = models.DeleteKnowledge(int(id), deleteBy, tenantId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"code": 1,
@@ -239,7 +279,16 @@ func (c *KnowledgeController) Delete() {
// GetCategories 获取分类列表
// @router /api/knowledge/categories [get]
func (c *KnowledgeController) GetCategories() {
categories, err := models.GetAllCategories()
// 获取租户ID(如果是员工登录,从JWT token中获取)
tenantId := 0
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
tenantId = tenantIdVal
}
}
categories, err := models.GetAllCategories(tenantId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"code": 1,
@@ -275,7 +324,16 @@ func (c *KnowledgeController) GetCategories() {
// GetTags 获取标签列表
// @router /api/knowledge/tags [get]
func (c *KnowledgeController) GetTags() {
tags, err := models.GetAllTags()
// 获取租户ID(如果是员工登录,从JWT token中获取)
tenantId := 0
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
tenantId = tenantIdVal
}
}
tags, err := models.GetAllTags(tenantId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"code": 1,
@@ -322,6 +380,14 @@ func (c *KnowledgeController) AddCategory() {
c.ServeJSON()
return
}
// 获取租户ID(如果是员工登录,从JWT token中获取并设置)
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
category.TenantId = tenantIdVal
}
}
// 不处理id,直接添加,表自动递增
_, err = models.AddCategory(&category)
@@ -357,6 +423,14 @@ func (c *KnowledgeController) AddTag() {
c.ServeJSON()
return
}
// 获取租户ID(如果是员工登录,从JWT token中获取并设置)
if tenantIdVal, ok := c.Ctx.Input.GetData("tenantId").(int); ok && tenantIdVal > 0 {
// 检查是否是员工登录(type === "employee"
if userType, ok := c.Ctx.Input.GetData("userType").(string); ok && userType == "employee" {
tag.TenantId = tenantIdVal
}
}
// 判断是添加还是更新
if tag.TagId > 0 {
+32
View File
@@ -34,6 +34,38 @@ func (c *MenuController) GetAllMenus() {
c.ServeJSON()
}
// GetTenantMenus 根据角色获取租户菜单(只返回该角色有权限的菜单)
// @router /menus/tenant/:roleId [get]
func (c *MenuController) GetTenantMenus() {
roleId, err := c.GetInt(":roleId")
if err != nil || roleId <= 0 {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "角色ID无效",
"data": nil,
}
c.ServeJSON()
return
}
menus, err := models.GetTenantMenus(roleId)
if err != nil {
c.Data["json"] = map[string]interface{}{
"success": false,
"message": "获取菜单失败: " + err.Error(),
"data": nil,
}
} else {
c.Data["json"] = map[string]interface{}{
"success": true,
"message": "获取菜单成功",
"data": menus,
}
}
c.ServeJSON()
}
// CreateMenu 创建新菜单
func (c *MenuController) CreateMenu() {
var menu models.Menu
+2
View File
@@ -77,6 +77,8 @@ func (c *UserController) GetTenantUsers() {
"tenant_id": user.TenantId,
"status": user.Status,
"role": user.Role,
"department_id": user.DepartmentId,
"position_id": user.PositionId,
"last_login_time": user.LastLoginTime,
"last_login_ip": user.LastLoginIp,
})