package permlib import ( "strings" "code.clickto.dev/weiym/permlib/pb" ) func (e *Engine) collectPerms() []*pb.PermItem { seen := make(map[string]bool) var perms []*pb.PermItem add := func(code, name string) { if seen[code] { return } seen[code] = true if name == "" { name = generatePermName(code) } perms = append(perms, &pb.PermItem{Code: code, Name: name}) } for _, decl := range e.staticPerms { add(decl.Code, decl.Name) dataCode := apiToDataCode(decl.Code) if dataCode != "" { add(dataCode, "") } } return perms } func apiToDataCode(apiCode string) string { if !strings.HasPrefix(apiCode, "api:") { return "" } return "data:" + apiCode[4:] } func generatePermName(code string) string { parts := strings.Split(code, ":") if len(parts) < 2 { return code } actionMap := map[string]string{ "read": "读取", "write": "写入", "create": "创建", "update": "更新", "delete": "删除", "list": "列表", "detail": "详情", } capitalize := func(s string) string { if len(s) == 0 { return s } return strings.ToUpper(s[:1]) + s[1:] } // 字段权限:data:model:field:read|write → "{Model} {field} 字段 [读取|写入]" if parts[0] == "data" && len(parts) == 4 { action := actionMap[parts[3]] if action == "" { action = parts[3] } return capitalize(parts[1]) + " " + parts[2] + " 字段" + action } // 接口/数据权限:api:model:action 或 data:model:action var result []string for i := 1; i < len(parts); i++ { p := parts[i] if mapped, ok := actionMap[p]; ok { result = append(result, mapped) } else { result = append(result, capitalize(p)) } } return strings.Join(result, " ") }