diff --git a/cfg/cfg.go b/cfg/cfg.go index 008580d..5a74951 100644 --- a/cfg/cfg.go +++ b/cfg/cfg.go @@ -55,7 +55,7 @@ var Global = &Options{ DB: config.Database{ Type: "mysql", Prefix: "vb_", - DSN: "root:123456@tcp(127.0.0.1:3306)/vbase?charset=utf8&parseTime=True&loc=Local", + DSN: "root:123456@tcp(127.0.0.1:3306)/vbase?charset=utf8mb4&parseTime=True&loc=Local", }, Redis: config.Redis{ Addr: "memory", diff --git a/ui/langs.json b/ui/langs.json index ccb71cd..787db75 100644 --- a/ui/langs.json +++ b/ui/langs.json @@ -90,13 +90,46 @@ "oauth.provider.enabled": "Enabled", "oauth.provider.name": "Name", "oauth.provider.redirect_uri": "Redirect URI", + "common.close": "Close", + "common.detail": "Detail", + "common.remove": "Remove", + "org.created": "Created successfully", + "org.deleted": "Deleted successfully", + "org.required_fields": "Please fill in required fields", + "org.updated": "Updated successfully", + "permission.level.admin": "Admin", + "permission.level.create": "Create", + "permission.level.read": "Read", + "permission.level.rw": "Read+Write", + "permission.level.write": "Write", + "role.add_permission": "Add Permission", + "role.add_user": "Add User", "role.code": "Role Code", "role.create": "Create Role", "role.delete_confirm": "Are you sure you want to delete this role?", "role.description": "Description", + "role.detail": "Role Detail", "role.edit": "Edit Role", "role.name": "Role Name", + "role.no_available_permissions": "No available permissions", + "role.no_available_users": "No available users", + "role.no_permissions": "No permissions assigned", + "role.no_users": "No users assigned", + "role.permission_removed": "Permission removed", + "role.permissions": "Permissions", + "role.permissions_desc": "Manage permissions for this role", + "role.permissions_updated": "Permissions updated", + "role.remove_permission_confirm": "Remove this permission?", + "role.remove_user_confirm": "Remove this user from role?", + "role.search_permissions": "Search permissions...", "role.search_placeholder": "Search roles...", + "role.search_users": "Search users...", + "role.search_users_placeholder": "Search by username or nickname...", + "role.select_permissions": "Select Permissions", + "role.select_users": "Select Users", + "role.user_removed": "User removed", + "role.users": "Users", + "role.users_updated": "Users updated", "settings.app.id": "App ID", "settings.app.id_desc": "Unique identifier for the application", "settings.app.name": "App Name", @@ -236,9 +269,12 @@ "auth.welcome_back": "欢迎回来!", "common.actions": "操作", "common.cancel": "取消", + "common.close": "关闭", "common.create": "创建", "common.delete": "删除", + "common.detail": "详情", "common.edit": "编辑", + "common.remove": "移除", "common.forbidden": "禁止访问", "common.not_found": "页面未找到", "common.processing": "处理中...", @@ -266,14 +302,43 @@ "oauth.provider.redirect_uri": "回调地址", "oauth.create": "创建", "oauth.create_app": "创建应用", - "org.created": "组织已创建", + "org.created": "创建成功", + "org.deleted": "删除成功", + "org.required_fields": "请填写必填字段", + "org.updated": "更新成功", + "permission.level.admin": "管理", + "permission.level.create": "创建", + "permission.level.read": "读取", + "permission.level.rw": "读写", + "permission.level.write": "写入", + "role.add_permission": "添加权限", + "role.add_user": "添加用户", "role.code": "角色代码", "role.create": "创建角色", "role.delete_confirm": "确定要删除该角色吗?", "role.description": "描述", + "role.detail": "角色详情", "role.edit": "编辑角色", "role.name": "角色名称", + "role.no_available_permissions": "没有可用权限", + "role.no_available_users": "没有可用用户", + "role.no_permissions": "未分配权限", + "role.no_users": "未分配用户", + "role.permission_removed": "权限已移除", + "role.permissions": "权限管理", + "role.permissions_desc": "管理此角色的权限", + "role.permissions_updated": "权限已更新", + "role.remove_permission_confirm": "确定移除该权限?", + "role.remove_user_confirm": "确定将该用户从角色中移除?", + "role.search_permissions": "搜索权限...", "role.search_placeholder": "搜索角色...", + "role.search_users": "搜索用户...", + "role.search_users_placeholder": "搜索用户名或昵称...", + "role.select_permissions": "选择权限", + "role.select_users": "选择用户", + "role.user_removed": "用户已移除", + "role.users": "用户管理", + "role.users_updated": "用户已更新", "settings.app.id": "应用标识", "settings.app.id_desc": "应用的唯一标识符", "settings.app.name": "应用名称", diff --git a/ui/page/sys/role/index.html b/ui/page/sys/role/index.html index d99822a..ea8bcf1 100644 --- a/ui/page/sys/role/index.html +++ b/ui/page/sys/role/index.html @@ -116,6 +116,126 @@ background-color: color-mix(in srgb, var(--text-color-disabled), transparent 85%); color: var(--text-color-secondary); } + + /* Tab Styles */ + .tab, .tab-active { + padding: 12px 20px; + cursor: pointer; + border-bottom: 2px solid transparent; + transition: all var(--transition-base); + display: flex; + align-items: center; + gap: 8px; + font-weight: 500; + } + + .tab { + color: var(--text-color-secondary); + } + + .tab:hover { + color: var(--text-color); + } + + .tab-active { + color: var(--color-primary); + border-bottom-color: var(--color-primary); + } + + /* Permission List */ + .permission-list, .user-list, .available-permission-list, .available-user-list { + max-height: 400px; + overflow-y: auto; + display: flex; + flex-direction: column; + gap: 8px; + } + + .permission-item, .user-item, .available-permission-item, .available-user-item { + display: flex; + align-items: center; + gap: 12px; + padding: 12px; + background: var(--bg-color-tertiary); + border-radius: var(--radius-md); + transition: background var(--transition-base); + } + + .permission-item:hover, .user-item:hover { + background: var(--border-color); + } + + .permission-info, .user-info { + flex: 1; + min-width: 0; + } + + .permission-id, .user-name { + font-weight: 500; + color: var(--text-color); + } + + .permission-scope, .user-username { + font-size: var(--font-size-sm); + color: var(--text-color-secondary); + } + + .permission-level { + flex-shrink: 0; + } + + .level-badge { + display: inline-block; + padding: 2px 8px; + border-radius: var(--radius-full); + font-size: var(--font-size-xs); + font-weight: 500; + } + + .level-1 { background: color-mix(in srgb, var(--color-info), transparent 85%); color: var(--color-info); } + .level-2 { background: color-mix(in srgb, var(--color-success), transparent 85%); color: var(--color-success); } + .level-4 { background: color-mix(in srgb, var(--color-warning), transparent 85%); color: var(--color-warning); } + .level-6 { background: color-mix(in srgb, var(--color-warning), transparent 70%); color: var(--color-warning); } + .level-7 { background: color-mix(in srgb, var(--color-danger), transparent 85%); color: var(--color-danger); } + + /* User Avatar */ + .user-avatar, .user-avatar-sm { + border-radius: var(--radius-full); + object-fit: cover; + } + + .user-avatar { + width: 40px; + height: 40px; + } + + .user-avatar-sm { + width: 32px; + height: 32px; + } + + /* Empty State */ + .empty-state { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + padding: 40px; + color: var(--text-color-secondary); + gap: 12px; + } + + .empty-state p { + margin: 0; + } + + /* Checkbox styling */ + input[type="checkbox"] { + width: 18px; + height: 18px; + cursor: pointer; + accent-color: var(--color-primary); + } @@ -168,6 +288,9 @@
+ + + @@ -196,8 +319,145 @@
+ + + +
+ +
+
+ {{ $t('role.permissions') }} +
+
+ {{ $t('role.users') }} +
+
+ + +
+
+ + {{ $t('role.permissions_desc') }} + + + {{ $t('role.add_permission') }} + +
+
+
+
+
{{ p.permission_id }}
+
{{ p.scope }}
+
+
+ {{ formatLevel(p.level) }} +
+ + + +
+
+ +

{{ $t('role.no_permissions') }}

+
+
+
+ + +
+
+ + + {{ $t('role.add_user') }} + +
+
+
+ + + + + +
+
+ +

{{ $t('role.no_users') }}

+
+
+
+
+
+ {{ $t('common.close') }} +
+
+ + + +
+ +
+
+ +
+
{{ p.permission_id }}
+
{{ p.scope }}
+
+
+
+

{{ $t('role.no_available_permissions') }}

+
+
+
+
+ {{ $t('common.cancel') }} + {{ $t('common.save') }} +
+
+ + + +
+ +
+
+ + + +
+
+

{{ $t('role.no_available_users') }}

+
+
+
+
+ {{ $t('common.cancel') }} + {{ $t('common.save') }} +
+