知识库增加租户隔离
This commit is contained in:
@@ -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{}{
|
||||
|
||||
@@ -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{}{
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
})
|
||||
|
||||
Reference in New Issue
Block a user