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()"
/>