From 959bb1867ccbafb97a7e2417e488201cc02ec52c Mon Sep 17 00:00:00 2001 From: mizhexiaoxiao <1157861072@qq.com> Date: Fri, 2 Feb 2024 10:42:38 +0800 Subject: [PATCH 1/7] fix keepalive --- web/src/views/system/api/index.vue | 12 ++++++------ web/src/views/system/user/index.vue | 18 +++++++++--------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/web/src/views/system/api/index.vue b/web/src/views/system/api/index.vue index 00520fc..23c9cc5 100644 --- a/web/src/views/system/api/index.vue +++ b/web/src/views/system/api/index.vue @@ -13,7 +13,7 @@ import { useCRUD } from '@/composables' // import { loginTypeMap, loginTypeOptions } from '@/constant/data' import api from '@/api' -defineOptions({ name: 'Api列表' }) +defineOptions({ name: 'API管理' }) const $table = ref(null) const queryItems = ref({}) @@ -141,9 +141,9 @@ const columns = [ { default: () => '编辑', icon: renderIcon('material-symbols:edit', { size: 16 }), - }, + } ), - [[vPermission, 'post/api/v1/api/update']], + [[vPermission, 'post/api/v1/api/update']] ), h( NPopconfirm, @@ -163,12 +163,12 @@ const columns = [ { default: () => '删除', icon: renderIcon('material-symbols:delete-outline', { size: 16 }), - }, + } ), - [[vPermission, 'delete/api/v1/api/delete']], + [[vPermission, 'delete/api/v1/api/delete']] ), default: () => h('div', {}, '确定删除该API吗?'), - }, + } ), ] }, diff --git a/web/src/views/system/user/index.vue b/web/src/views/system/user/index.vue index f4d2b1d..e2f5427 100644 --- a/web/src/views/system/user/index.vue +++ b/web/src/views/system/user/index.vue @@ -26,7 +26,7 @@ import api from '@/api' import TheIcon from '@/components/icon/TheIcon.vue' import { useUserStore } from '@/store' -defineOptions({ name: '用户列表' }) +defineOptions({ name: '用户管理' }) const $table = ref(null) const queryItems = ref({}) @@ -99,7 +99,7 @@ const columns = [ const group = [] for (let i = 0; i < roles.length; i++) group.push( - h(NTag, { type: 'info', style: { margin: '2px 3px' } }, { default: () => roles[i].name }), + h(NTag, { type: 'info', style: { margin: '2px 3px' } }, { default: () => roles[i].name }) ) return h('span', group) }, @@ -113,7 +113,7 @@ const columns = [ return h( NTag, { type: 'info', style: { margin: '2px 3px' } }, - { default: () => (row.is_superuser ? '是' : '否') }, + { default: () => (row.is_superuser ? '是' : '否') } ) }, }, @@ -130,7 +130,7 @@ const columns = [ { default: () => (row.last_login !== null ? formatDate(row.last_login) : null), icon: renderIcon('mdi:update', { size: 16 }), - }, + } ) }, }, @@ -175,9 +175,9 @@ const columns = [ { default: () => '编辑', icon: renderIcon('material-symbols:edit', { size: 16 }), - }, + } ), - [[vPermission, 'post/api/v1/user/update']], + [[vPermission, 'post/api/v1/user/update']] ), h( NPopconfirm, @@ -197,12 +197,12 @@ const columns = [ { default: () => '删除', icon: renderIcon('material-symbols:delete-outline', { size: 16 }), - }, + } ), - [[vPermission, 'delete/api/v1/user/delete']], + [[vPermission, 'delete/api/v1/user/delete']] ), default: () => h('div', {}, '确定删除该用户吗?'), - }, + } ), ] }, From 5d751fe9dd6b29ec9e588ee5a14246432a03c207 Mon Sep 17 00:00:00 2001 From: mizhexiaoxiao <1157861072@qq.com> Date: Fri, 2 Feb 2024 11:06:07 +0800 Subject: [PATCH 2/7] Update i18n --- web/i18n/index.js | 8 ++++---- web/src/layout/components/header/components/Languages.vue | 3 +++ web/src/store/modules/app/index.js | 6 +++--- web/src/store/modules/tags/helpers.js | 6 +++--- web/src/store/modules/tags/index.js | 6 +++--- 5 files changed, 16 insertions(+), 13 deletions(-) diff --git a/web/i18n/index.js b/web/i18n/index.js index 791eaa2..b593e7c 100644 --- a/web/i18n/index.js +++ b/web/i18n/index.js @@ -1,15 +1,15 @@ import { createI18n } from 'vue-i18n' -import { sStorage } from '@/utils' +import { lStorage } from '@/utils' import messages from './messages' -const currentLocale = sStorage.get('locale') +const currentLocale = lStorage.get('locale') const i18n = createI18n({ legacy: false, globalInjection: true, - locale: currentLocale || 'en', - fallbackLocale: 'en', + locale: currentLocale || 'cn', + fallbackLocale: 'cn', messages: messages, }) diff --git a/web/src/layout/components/header/components/Languages.vue b/web/src/layout/components/header/components/Languages.vue index 02c4282..9b8362f 100644 --- a/web/src/layout/components/header/components/Languages.vue +++ b/web/src/layout/components/header/components/Languages.vue @@ -9,6 +9,7 @@ diff --git a/web/src/store/modules/app/index.js b/web/src/store/modules/app/index.js index 9b47bf0..02dfecd 100644 --- a/web/src/store/modules/app/index.js +++ b/web/src/store/modules/app/index.js @@ -1,9 +1,9 @@ import { defineStore } from 'pinia' import { useDark } from '@vueuse/core' -import { sStorage } from '@/utils' +import { lStorage } from '@/utils' import i18n from '~/i18n' -const currentLocale = sStorage.get('locale') +const currentLocale = lStorage.get('locale') const { locale } = i18n.global const isDark = useDark() @@ -54,7 +54,7 @@ export const useAppStore = defineStore('app', { setLocale(newLocale) { this.locale = newLocale locale.value = newLocale - sStorage.set('locale', newLocale) + lStorage.set('locale', newLocale) }, }, }) diff --git a/web/src/store/modules/tags/helpers.js b/web/src/store/modules/tags/helpers.js index d7c94c9..4178a2e 100644 --- a/web/src/store/modules/tags/helpers.js +++ b/web/src/store/modules/tags/helpers.js @@ -1,6 +1,6 @@ -import { sStorage } from '@/utils' +import { lStorage } from '@/utils' -export const activeTag = sStorage.get('activeTag') -export const tags = sStorage.get('tags') +export const activeTag = lStorage.get('activeTag') +export const tags = lStorage.get('tags') export const WITHOUT_TAG_PATHS = ['/404', '/login'] diff --git a/web/src/store/modules/tags/index.js b/web/src/store/modules/tags/index.js index 60c2264..cc78899 100644 --- a/web/src/store/modules/tags/index.js +++ b/web/src/store/modules/tags/index.js @@ -1,7 +1,7 @@ import { defineStore } from 'pinia' import { activeTag, tags, WITHOUT_TAG_PATHS } from './helpers' import { router } from '@/router' -import { sStorage } from '@/utils' +import { lStorage } from '@/utils' export const useTagsStore = defineStore('tag', { state() { @@ -18,11 +18,11 @@ export const useTagsStore = defineStore('tag', { actions: { setActiveTag(path) { this.activeTag = path - sStorage.set('activeTag', path) + lStorage.set('activeTag', path) }, setTags(tags) { this.tags = tags - sStorage.set('tags', tags) + lStorage.set('tags', tags) }, addTag(tag = {}) { this.setActiveTag(tag.path) From 8497d1ae9be8fd5aac567c974f9a73f9e21365c9 Mon Sep 17 00:00:00 2001 From: mizhexiaoxiao <1157861072@qq.com> Date: Fri, 2 Feb 2024 11:10:53 +0800 Subject: [PATCH 3/7] Update --- app/api/v1/users/users.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/app/api/v1/users/users.py b/app/api/v1/users/users.py index 241c1f0..fcce163 100644 --- a/app/api/v1/users/users.py +++ b/app/api/v1/users/users.py @@ -14,7 +14,7 @@ logger = logging.getLogger(__name__) router = APIRouter() -@router.get("/list", summary="查看用户列表", dependencies=[DependPermisson]) +@router.get("/list", summary="查看用户列表") async def list_user( page: int = Query(1, description="页码"), page_size: int = Query(10, description="每页数量"), @@ -32,7 +32,7 @@ async def list_user( return SuccessExtra(data=data, total=total, page=page, page_size=page_size) -@router.get("/get", summary="查看用户", dependencies=[DependPermisson]) +@router.get("/get", summary="查看用户") async def get_user( user_id: int = Query(..., description="用户ID"), ): @@ -42,7 +42,7 @@ async def get_user( return Success(data=user_dict) -@router.post("/create", summary="创建用户", dependencies=[DependPermisson]) +@router.post("/create", summary="创建用户") async def create_user( user_in: UserCreate, ): @@ -58,7 +58,7 @@ async def create_user( return Success(msg="Created Successfully") -@router.post("/update", summary="更新用户", dependencies=[DependPermisson]) +@router.post("/update", summary="更新用户") async def update_user( user_in: UserUpdate, ): @@ -68,7 +68,7 @@ async def update_user( return Success(msg="Updated Successfully") -@router.delete("/delete", summary="删除用户", dependencies=[DependPermisson]) +@router.delete("/delete", summary="删除用户") async def delete_user( user_id: int = Query(..., description="用户ID"), ): From 7cbcfb72ef2c863810c8048d6b76e7f32cbbc507 Mon Sep 17 00:00:00 2001 From: mizhexiaoxiao <1157861072@qq.com> Date: Tue, 20 Feb 2024 11:50:17 +0800 Subject: [PATCH 4/7] Update --- web/src/store/modules/user/index.js | 8 +++-- web/src/views/system/role/index.vue | 49 +++++++++++++++++------------ 2 files changed, 35 insertions(+), 22 deletions(-) diff --git a/web/src/store/modules/user/index.js b/web/src/store/modules/user/index.js index 4b10489..1dce1b8 100644 --- a/web/src/store/modules/user/index.js +++ b/web/src/store/modules/user/index.js @@ -37,11 +37,15 @@ export const useUserStore = defineStore('user', { async getUserInfo() { try { const res = await api.getUserInfo() + if (res.code === 401) { + this.logout() + return + } const { id, username, email, avatar, roles, is_superuser, is_active } = res.data this.userInfo = { id, username, email, avatar, roles, is_superuser, is_active } - return Promise.resolve(res.data) + return res.data } catch (error) { - return Promise.reject(error) + return error } }, async logout() { diff --git a/web/src/views/system/role/index.vue b/web/src/views/system/role/index.vue index 373a1fd..3388530 100644 --- a/web/src/views/system/role/index.vue +++ b/web/src/views/system/role/index.vue @@ -90,10 +90,6 @@ function buildApiTree(data) { onMounted(() => { $table.value?.handleSearch() - api.getMenus({ page: 1, page_size: 9999 }).then((res) => (menuOption.value = res.data)) - api - .getApis({ page: 1, page_size: 9999 }) - .then((res) => (apiOption.value = buildApiTree(res.data))) }) const columns = [ @@ -144,9 +140,9 @@ const columns = [ { default: () => '编辑', icon: renderIcon('material-symbols:edit-outline', { size: 16 }), - }, + } ), - [[vPermission, 'post/api/v1/role/update']], + [[vPermission, 'post/api/v1/role/update']] ), h( NPopconfirm, @@ -167,12 +163,12 @@ const columns = [ { default: () => '删除', icon: renderIcon('material-symbols:delete-outline', { size: 16 }), - }, + } ), - [[vPermission, 'delete/api/v1/role/delete']], + [[vPermission, 'delete/api/v1/role/delete']] ), default: () => h('div', {}, '确定删除该角色吗?'), - }, + } ), withDirectives( h( @@ -181,23 +177,36 @@ const columns = [ size: 'small', type: 'primary', onClick: async () => { - active.value = true - role_id.value = row.id - const result = await api.getRoleAuthorized({ id: row.id }) - menu_ids.value = result.data.menus.map((v) => { - return v.id - }) - api_ids.value = result.data.apis.map((v) => { - return v.method.toLowerCase() + v.path - }) + try { + // 使用 Promise.all 来同时发送所有请求 + const [menusResponse, apisResponse, roleAuthorizedResponse] = await Promise.all([ + api.getMenus({ page: 1, page_size: 9999 }), + api.getApis({ page: 1, page_size: 9999 }), + api.getRoleAuthorized({ id: row.id }), + ]) + + // 处理每个请求的响应 + menuOption.value = menusResponse.data + apiOption.value = buildApiTree(apisResponse.data) + menu_ids.value = roleAuthorizedResponse.data.menus.map((v) => v.id) + api_ids.value = roleAuthorizedResponse.data.apis.map( + (v) => v.method.toLowerCase() + v.path + ) + + active.value = true + role_id.value = row.id + } catch (error) { + // 错误处理 + console.error('Error loading data:', error) + } }, }, { default: () => '设置权限', icon: renderIcon('material-symbols:edit-outline', { size: 16 }), - }, + } ), - [[vPermission, 'get/api/v1/role/authorized']], + [[vPermission, 'get/api/v1/role/authorized']] ), ] }, From d8df2535595060d56ddb5e94ea14c019cb11d7d6 Mon Sep 17 00:00:00 2001 From: mizhexiaoxiao <1157861072@qq.com> Date: Tue, 5 Mar 2024 15:09:09 +0800 Subject: [PATCH 5/7] models auto import --- app/models/__init__.py | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/app/models/__init__.py b/app/models/__init__.py index 8b7705f..7f20b46 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -1,2 +1,15 @@ -# 新增model需要在这里导入 -from .admin import * +# 新增model自动导入 +import pkgutil +import importlib + +# 当前包名 +package_name = __name__ +# 遍历当前目录下的所有模块和包 +for _, name, is_pkg in pkgutil.iter_modules(__path__, prefix=package_name + '.'): + # 跳过包,只导入模块 + if not is_pkg: + # 动态导入模块 + module = importlib.import_module(name) + # 从导入的模块中导入所有符号到当前命名空间 + globals().update(vars(module)) + \ No newline at end of file From 4dc9d378ce48aeb0d497d33d58a273e98649a49e Mon Sep 17 00:00:00 2001 From: nicozhang <315393472@qq.com> Date: Thu, 30 Nov 2023 10:40:05 +0800 Subject: [PATCH 6/7] Create .dockerignore MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在本地化 build 镜像时,排除node_modules目录,已兼容在Linux Mac 和 Windows 打包前端 --- .dockerignore | 1 + 1 file changed, 1 insertion(+) create mode 100644 .dockerignore diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..a0ae8ea --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +web/node_modules From b9fa6d92ce5746757f815e50cb06c49426799b2a Mon Sep 17 00:00:00 2001 From: mizhexiaoxiao <1157861072@qq.com> Date: Tue, 5 Mar 2024 15:44:23 +0800 Subject: [PATCH 7/7] fix bug --- web/src/views/system/api/index.vue | 6 +++--- web/src/views/system/user/index.vue | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/web/src/views/system/api/index.vue b/web/src/views/system/api/index.vue index 23c9cc5..e8799ce 100644 --- a/web/src/views/system/api/index.vue +++ b/web/src/views/system/api/index.vue @@ -213,7 +213,7 @@ const columns = [ clearable type="text" placeholder="请输入API路径" - @keypress.enter="$table?.handleSearch" + @keypress.enter="$table?.handleSearch()" /> @@ -222,7 +222,7 @@ const columns = [ clearable type="text" placeholder="请输入API简介" - @keypress.enter="$table?.handleSearch" + @keypress.enter="$table?.handleSearch()" /> @@ -231,7 +231,7 @@ const columns = [ clearable type="text" placeholder="请输入API模块" - @keypress.enter="$table?.handleSearch" + @keypress.enter="$table?.handleSearch()" /> diff --git a/web/src/views/system/user/index.vue b/web/src/views/system/user/index.vue index e2f5427..099eeda 100644 --- a/web/src/views/system/user/index.vue +++ b/web/src/views/system/user/index.vue @@ -320,7 +320,7 @@ const validateAddUser = { clearable type="text" placeholder="请输入用户名称" - @keypress.enter="$table?.handleSearch" + @keypress.enter="$table?.handleSearch()" /> @@ -329,7 +329,7 @@ const validateAddUser = { clearable type="text" placeholder="请输入邮箱" - @keypress.enter="$table?.handleSearch" + @keypress.enter="$table?.handleSearch()" />