diff --git a/apps/application/serializers/application.py b/apps/application/serializers/application.py index 7e5a73d9c..d260c9df3 100644 --- a/apps/application/serializers/application.py +++ b/apps/application/serializers/application.py @@ -40,7 +40,8 @@ from knowledge.serializers.knowledge import KnowledgeSerializer, KnowledgeModelS from maxkb.conf import PROJECT_DIR from models_provider.models import Model from models_provider.tools import get_model_instance_by_model_workspace_id -from system_manage.models import WorkspaceUserResourcePermission +from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType +from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer from tools.models import Tool, ToolScope from tools.serializers.tool import ToolModelSerializer from users.models import User @@ -430,9 +431,15 @@ class ApplicationSerializer(serializers.Serializer): def insert(self, instance: Dict): application_type = instance.get('type') if 'WORK_FLOW' == application_type: - return self.insert_workflow(instance) + r = self.insert_workflow(instance) else: - return self.insert_simple(instance) + r = self.insert_simple(instance) + UserResourcePermissionSerializer(data={ + 'workspace_id': self.data.get('workspace_id'), + 'user_id': self.data.get('user_id'), + 'auth_target_type': AuthTargetType.APPLICATION.value + }).auth_resource(str(r.get('id'))) + return r def insert_workflow(self, instance: Dict): self.is_valid(raise_exception=True) diff --git a/apps/knowledge/serializers/knowledge.py b/apps/knowledge/serializers/knowledge.py index ec5e662a4..72dd421a8 100644 --- a/apps/knowledge/serializers/knowledge.py +++ b/apps/knowledge/serializers/knowledge.py @@ -21,7 +21,7 @@ from rest_framework import serializers from application.models import ApplicationKnowledgeMapping from common.config.embedding_config import VectorStore from common.constants.cache_version import Cache_Version -from common.constants.permission_constants import ResourceAuthType, ResourcePermission +from common.constants.permission_constants import ResourceAuthType, ResourcePermission, ResourcePermissionRole from common.database_model_manage.database_model_manage import DatabaseModelManage from common.db.search import native_search, get_dynamics_model, native_page_search from common.db.sql_execute import select_list @@ -42,6 +42,7 @@ from knowledge.task.sync import sync_web_knowledge, sync_replace_web_knowledge from maxkb.conf import PROJECT_DIR from models_provider.models import Model from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType +from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer from users.serializers.user import is_workspace_manage @@ -553,21 +554,12 @@ class KnowledgeSerializer(serializers.Serializer): QuerySet(ProblemParagraphMapping).bulk_create( problem_paragraph_mapping_list ) if len(problem_paragraph_mapping_list) > 0 else None - - # 自动授权给创建者 - WorkspaceUserResourcePermission( - target=knowledge_id, - auth_target_type=AuthTargetType.KNOWLEDGE, - permission_list=[ResourcePermission.VIEW, ResourcePermission.MANAGE], - workspace_id=self.data.get('workspace_id'), - user_id=self.data.get('user_id'), - auth_type=ResourceAuthType.RESOURCE_PERMISSION_GROUP - ).save() - # 刷新缓存 - version = Cache_Version.PERMISSION_LIST.get_version() - key = Cache_Version.PERMISSION_LIST.get_key(user_id=self.data.get('user_id')) - cache.delete(key, version=version) - + # 自动资源给授权当前用户 + UserResourcePermissionSerializer(data={ + 'workspace_id': self.data.get('workspace_id'), + 'user_id': self.data.get('user_id'), + 'auth_target_type': AuthTargetType.KNOWLEDGE.value + }).auth_resource(str(knowledge_id)) return { **KnowledgeModelSerializer(knowledge).data, 'user_id': self.data.get('user_id'), diff --git a/apps/models_provider/serializers/model_serializer.py b/apps/models_provider/serializers/model_serializer.py index 545122371..b5020e04e 100644 --- a/apps/models_provider/serializers/model_serializer.py +++ b/apps/models_provider/serializers/model_serializer.py @@ -26,6 +26,7 @@ from models_provider.constants.model_provider_constants import ModelProvideConst from models_provider.models import Model, Status from models_provider.tools import get_model_credential from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType +from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer from users.serializers.user import is_workspace_manage @@ -326,19 +327,11 @@ class ModelSerializer(serializers.Serializer): model = Model(**model_data) try: model.save() - # 自动授权给创建者 - WorkspaceUserResourcePermission( - target=model.id, - auth_target_type=AuthTargetType.MODEL, - permission_list=[ResourcePermission.VIEW, ResourcePermission.MANAGE], - workspace_id=workspace_id, - user_id=self.data.get('user_id'), - auth_type=ResourceAuthType.RESOURCE_PERMISSION_GROUP - ).save() - # 刷新缓存 - version = Cache_Version.PERMISSION_LIST.get_version() - key = Cache_Version.PERMISSION_LIST.get_key(user_id=self.data.get('user_id')) - cache.delete(key, version=version) + UserResourcePermissionSerializer(data={ + 'workspace_id': self.data.get('workspace_id'), + 'user_id': self.data.get('user_id'), + 'auth_target_type': AuthTargetType.MODEL.value + }).auth_resource(str(model.id)) except Exception as save_error: # 可添加日志记录 raise AppApiException(500, _("Model saving failed")) from save_error diff --git a/apps/system_manage/serializers/user_resource_permission.py b/apps/system_manage/serializers/user_resource_permission.py index 9f366f3e7..8f7d95bb0 100644 --- a/apps/system_manage/serializers/user_resource_permission.py +++ b/apps/system_manage/serializers/user_resource_permission.py @@ -29,6 +29,7 @@ from maxkb.conf import PROJECT_DIR from models_provider.models import Model from system_manage.models import WorkspaceUserResourcePermission, AuthTargetType from tools.models import Tool +from users.serializers.user import is_workspace_manage class PermissionSerializer(serializers.Serializer): @@ -101,6 +102,33 @@ class UserResourcePermissionSerializer(serializers.Serializer): auth_target_type=self.data.get('auth_target_type')) } + def auth_resource(self, resource_id: str): + self.is_valid(raise_exception=True) + workspace_manage = is_workspace_manage(self.data.get('user_id'), self.data.get('workspace_id')) + if not workspace_manage: + auth_target_type = self.data.get('auth_target_type') + workspace_id = self.data.get('workspace_id') + user_id = self.data.get('user_id') + wurp = QuerySet(WorkspaceUserResourcePermission).filter(auth_target_type=auth_target_type, + workspace_id=workspace_id).first() + auth_type = wurp.auth_type if wurp else ResourceAuthType.RESOURCE_PERMISSION_GROUP + # 自动授权给创建者 + WorkspaceUserResourcePermission( + target=resource_id, + auth_target_type=auth_target_type, + permission_list=[ResourcePermission.VIEW, + ResourcePermission.MANAGE] if auth_type == ResourceAuthType.RESOURCE_PERMISSION_GROUP else [ + ResourcePermissionRole.ROLE], + workspace_id=workspace_id, + user_id=user_id, + auth_type=auth_type + ).save() + # 刷新缓存 + version = Cache_Version.PERMISSION_LIST.get_version() + key = Cache_Version.PERMISSION_LIST.get_key(user_id=user_id) + cache.delete(key, version=version) + return True + def list(self, user, with_valid=True): if with_valid: self.is_valid(raise_exception=True) diff --git a/apps/tools/serializers/tool.py b/apps/tools/serializers/tool.py index e9ec68b7e..ab50c73e4 100644 --- a/apps/tools/serializers/tool.py +++ b/apps/tools/serializers/tool.py @@ -29,6 +29,7 @@ from common.utils.tool_code import ToolExecutor from knowledge.models import File, FileSourceType from maxkb.const import CONFIG, PROJECT_DIR from system_manage.models import AuthTargetType, WorkspaceUserResourcePermission +from system_manage.serializers.user_resource_permission import UserResourcePermissionSerializer from tools.models import Tool, ToolScope, ToolFolder, ToolType from tools.serializers.tool_folder import ToolFolderFlatSerializer from users.serializers.user import is_workspace_manage @@ -219,20 +220,11 @@ class ToolSerializer(serializers.Serializer): ).save() # 自动授权给创建者 - WorkspaceUserResourcePermission( - target=tool_id, - auth_target_type=AuthTargetType.TOOL, - permission_list=[ResourcePermission.VIEW, ResourcePermission.MANAGE], - workspace_id=self.data.get('workspace_id'), - user_id=self.data.get('user_id'), - auth_type=ResourceAuthType.RESOURCE_PERMISSION_GROUP - ).save() - - # 刷新缓存 - version = Cache_Version.PERMISSION_LIST.get_version() - key = Cache_Version.PERMISSION_LIST.get_key(user_id=self.data.get('user_id')) - cache.delete(key, version=version) - + UserResourcePermissionSerializer(data={ + 'workspace_id': self.data.get('workspace_id'), + 'user_id': self.data.get('user_id'), + 'auth_target_type': AuthTargetType.TOOL.value + }).auth_resource(str(tool_id)) return ToolSerializer.Operate(data={ 'id': tool_id, 'workspace_id': self.data.get('workspace_id') }).one() diff --git a/ui/src/assets/chat/user-login-bg.png b/ui/src/assets/chat/user-login-bg.png new file mode 100644 index 000000000..261ae5054 Binary files /dev/null and b/ui/src/assets/chat/user-login-bg.png differ diff --git a/ui/src/layout/login-layout/UserLoginLayout.vue b/ui/src/layout/login-layout/UserLoginLayout.vue index f7222795f..1e2f4c713 100644 --- a/ui/src/layout/login-layout/UserLoginLayout.vue +++ b/ui/src/layout/login-layout/UserLoginLayout.vue @@ -11,6 +11,6 @@ diff --git a/ui/src/locales/lang/en-US/views/model.ts b/ui/src/locales/lang/en-US/views/model.ts index 2c8a648eb..2f4c70e28 100644 --- a/ui/src/locales/lang/en-US/views/model.ts +++ b/ui/src/locales/lang/en-US/views/model.ts @@ -5,8 +5,9 @@ export default { addModel: 'Add Model', delete: { - confirmTitle: 'Delete Model', - confirmMessage: 'Are you sure you want to delete the model:', + confirmTitle: 'Delete Model:', + confirmMessage: + 'Deleting the model will affect the resources currently using it. Please proceed with caution.', }, tip: { createSuccessMessage: 'Model created successfully', diff --git a/ui/src/locales/lang/en-US/views/tool.ts b/ui/src/locales/lang/en-US/views/tool.ts index aadccf95b..410150488 100644 --- a/ui/src/locales/lang/en-US/views/tool.ts +++ b/ui/src/locales/lang/en-US/views/tool.ts @@ -1,7 +1,5 @@ export default { title: 'Tool', - internalTitle: 'Internal Tool', - added: 'Added', createTool: 'Create Tool', editTool: 'Edit Tool', copyTool: 'Copy Tool', @@ -16,7 +14,7 @@ export default { image: 'Image', developer: 'Developer', communication: 'Communication', - searchResult: '{count} search results for' + searchResult: '{count} search results for', }, searchBar: { placeholder: 'Search by tool name', @@ -38,6 +36,7 @@ export default { form: { toolName: { label: 'Name', + name: 'Tool Name', placeholder: 'Please enter the tool name', requiredMessage: 'Please enter the tool name', }, diff --git a/ui/src/locales/lang/zh-CN/views/model.ts b/ui/src/locales/lang/zh-CN/views/model.ts index 16de7793a..413c82343 100644 --- a/ui/src/locales/lang/zh-CN/views/model.ts +++ b/ui/src/locales/lang/zh-CN/views/model.ts @@ -4,8 +4,8 @@ export default { providerPlaceholder: '选择供应商', addModel: '添加模型', delete: { - confirmTitle: '删除模型', - confirmMessage: '是否删除模型:', + confirmTitle: '是否删除:', + confirmMessage: '模型删除后将影响正在使用该模型的资源,请谨慎操作。', }, tip: { createSuccessMessage: '创建模型成功', diff --git a/ui/src/locales/lang/zh-CN/views/tool.ts b/ui/src/locales/lang/zh-CN/views/tool.ts index f07b18089..483aa157e 100644 --- a/ui/src/locales/lang/zh-CN/views/tool.ts +++ b/ui/src/locales/lang/zh-CN/views/tool.ts @@ -14,9 +14,12 @@ export default { image: '图像', developer: '开发者', communication: '通信', - searchResult: '的搜索结果 {count} 个' + searchResult: '的搜索结果 {count} 个', + }, + delete: { + confirmTitle: '是否刪除工具:', + confirmMessage: '删除后,引用了该工具的应用提问时会报错 ,请谨慎操作。', }, - enabled: '启用', disabled: { confirmTitle: '是否禁用工具:', confirmMessage: '禁用后,引用了该工具的应用提问时会报错 ,请谨慎操作。', diff --git a/ui/src/locales/lang/zh-Hant/views/model.ts b/ui/src/locales/lang/zh-Hant/views/model.ts index 8c3794099..d01f705a9 100644 --- a/ui/src/locales/lang/zh-Hant/views/model.ts +++ b/ui/src/locales/lang/zh-Hant/views/model.ts @@ -4,8 +4,8 @@ export default { providerPlaceholder: '選擇供應商', addModel: '新增模型', delete: { - confirmTitle: '刪除模型', - confirmMessage: '是否刪除模型:', + confirmTitle: '是否刪除: ', + confirmMessage: '模型刪除後將影響正在使用該模型的資源,請謹慎操作。', }, tip: { createSuccessMessage: '創建模型成功', diff --git a/ui/src/locales/lang/zh-Hant/views/tool.ts b/ui/src/locales/lang/zh-Hant/views/tool.ts index b7ef5cb98..cde32d1cd 100644 --- a/ui/src/locales/lang/zh-Hant/views/tool.ts +++ b/ui/src/locales/lang/zh-Hant/views/tool.ts @@ -1,7 +1,5 @@ export default { title: '工具', - internalTitle: '內置工具', - added: '已新增', createTool: '建立工具', editTool: '編輯工具', copyTool: '複製工具', @@ -16,7 +14,7 @@ export default { image: '圖像', developer: '開發者', communication: '通信', - searchResult: '的搜索結果 {count} 個' + searchResult: '的搜索結果 {count} 個', }, searchBar: { placeholder: '按工具名稱搜尋', @@ -26,7 +24,7 @@ export default { }, delete: { confirmTitle: '是否刪除工具:', - confirmMessage: '刪除後,引用該工具的應用在查詢時會報錯,請謹慎操作。', + confirmMessage: '刪除後,引用該函數的應用在查詢時會報錯,請謹慎操作。', }, disabled: { confirmTitle: '是否停用工具:', @@ -35,6 +33,7 @@ export default { form: { toolName: { label: '名稱', + name: '工具名稱', placeholder: '請輸入工具名稱', requiredMessage: '請輸入工具名稱', }, diff --git a/ui/src/styles/variables.scss b/ui/src/styles/variables.scss index fe19302da..321b1dde7 100644 --- a/ui/src/styles/variables.scss +++ b/ui/src/styles/variables.scss @@ -1,4 +1,3 @@ -$primary-color: #3370ff; :root { --app-base-px: 8px; --app-layout-bg-color: #f5f6f7; diff --git a/ui/src/views/application/component/CreateApplicationDialog.vue b/ui/src/views/application/component/CreateApplicationDialog.vue index c2efbdc72..79155af01 100644 --- a/ui/src/views/application/component/CreateApplicationDialog.vue +++ b/ui/src/views/application/component/CreateApplicationDialog.vue @@ -82,16 +82,17 @@