Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
49 commits
Select commit Hold shift + click to select a range
de3eed6
update:后端apscheduler使用自定义scheduler
4linuxfun Jul 19, 2024
a2352c2
update:后端增加job相关接口
4linuxfun Jul 19, 2024
86d82ec
update:前端增加job页面
4linuxfun Jul 19, 2024
23d1d91
update:后端CRUD增加通过ID查询
4linuxfun Jul 19, 2024
253076b
update:其他配置更新
4linuxfun Jul 19, 2024
0c7eb3f
后端:修复hosts inventory错误
4linuxfun Jul 22, 2024
9e2cbf0
前端:更新ConfirmDel函数
4linuxfun Jul 22, 2024
0cbe6e9
前端:任务管理-更新实现
4linuxfun Jul 22, 2024
0001783
后端:rpyc执行日志写入redis和数据库
4linuxfun Jul 31, 2024
0ae3e14
后端:rpyc修改任务逻辑调整
4linuxfun Jul 31, 2024
80c38f3
alembic排除部分表
4linuxfun Jul 31, 2024
cda5580
后端:增加任务管理接口
4linuxfun Jul 31, 2024
c338dd1
后端:增加主机管理接口
4linuxfun Jul 31, 2024
f0c6d3b
前端:任务管理界面实现
4linuxfun Jul 31, 2024
f1773c3
后端:rpyc自定义jobstore
4linuxfun Jul 31, 2024
72c00f7
后端:主机管理、任务管理CRUD部分修改
4linuxfun Jul 31, 2024
c0de28e
前端:增加主机管理相关API
4linuxfun Jul 31, 2024
c8c8e78
前端:独立terminal组件,用于日志展示
4linuxfun Jul 31, 2024
9a426bd
前端:主机管理实现
4linuxfun Jul 31, 2024
0ddd9be
后端:更新统计值方式
4linuxfun Aug 1, 2024
1872ca3
后端:实现主机管理查询功能
4linuxfun Aug 1, 2024
81ed345
后端:修复主机管理分组查找逻辑
4linuxfun Aug 2, 2024
97d94db
前端:增加common函数
4linuxfun Aug 6, 2024
1f94a59
前端:主机管理相关页面功能实现
4linuxfun Aug 6, 2024
c1e7406
前端:增加更新主机分组接口
4linuxfun Aug 6, 2024
6adcc11
后端:更新host、user接口
4linuxfun Aug 6, 2024
1cb2281
前端:主机管理-分页点击查询位置调整
4linuxfun Aug 6, 2024
3eb2a87
后端:主机管理接口实现
4linuxfun Aug 6, 2024
a348e06
前端:任务管理-主机选择对话框功能实现
4linuxfun Aug 8, 2024
1bde445
前端:任务管理-主机选择列表功能实现
4linuxfun Aug 8, 2024
0229736
前端:hosts接口调整
4linuxfun Aug 8, 2024
d4cdd91
后端:主机管理增加多主机信息查询接口
4linuxfun Aug 8, 2024
4bc5ab7
前端:update package.json
4linuxfun Aug 8, 2024
9f4491e
前端:任务管理-用户手动输入模板名称
4linuxfun Aug 8, 2024
190cf9f
前端:任务管理-执行方式使用radio实现
4linuxfun Aug 8, 2024
0b2b127
前端:update
4linuxfun Aug 8, 2024
3a15622
后端:pydantic语法更新
4linuxfun Aug 8, 2024
3b310c8
前端:任务管理-任务日志:修复stats为null时异常报错
4linuxfun Aug 12, 2024
1df1880
scheduler:增加playbook业务逻辑实现
4linuxfun Aug 14, 2024
1c6d460
scheduler:增加注释
4linuxfun Aug 14, 2024
deb50aa
后端:增加playbook管理后端接口
4linuxfun Aug 14, 2024
9d8fe9a
后端:update
4linuxfun Aug 14, 2024
05723cc
前端:任务管理,修订module或playbook为null
4linuxfun Aug 14, 2024
42a5bae
前端:任务管理-脚本管理页面功能实现
4linuxfun Aug 14, 2024
98c5193
scheduler:修复ansible playbook传值为id
4linuxfun Aug 14, 2024
bd9a763
后端:playbook增加部分接口
4linuxfun Aug 14, 2024
4fc8a24
前端:任务管理页面调整,playbook传值改为id
4linuxfun Aug 14, 2024
d175f26
update README.md
4linuxfun Aug 14, 2024
ae12682
update:README.md
4linuxfun Aug 14, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
update:README.md
  • Loading branch information
4linuxfun committed Aug 14, 2024
commit ae1268285b0966a7fa3cfbc2d6da8b39043d7395
71 changes: 61 additions & 10 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,16 +1,22 @@
# Fastapi Admin

前后端分离项目实现的一个后端管理框架

* 前端:vue3 + element plus
* 后端:fastapi + sqlmodel
* 任务管理: rpyc+apscheduler

**个人学习项目,只会对明显的bug进行修复,不会进行过多新功能的更新**

常用分支说明:

* main:主分支,所有功能都会往这里合并
* test: 测试分支

## 测试环境服务启动

1. nginx添加配置:

```
server {
listen 80;
Expand Down Expand Up @@ -49,21 +55,36 @@
}

```

2. 前端启动:

```
进入www页面,执行:npm run serve
```

3. 后端启动

```
uvicorn server.main:app --reload
uvicorn --host 192.168.137.129 server.main:app --reload --reload-exclude www
```

4. 任务管理启动

```
cd /mnt/hgfs/simple_ams/rpyc_scheduler/&&python3 scheduler-server.py
```

## 生产环境部署

1. 前端执行打包命令

```
npm run build
```

2. 添加nginx配置

```
server {
listen 80;
Expand All @@ -85,33 +106,39 @@ server {
}
}
```

3. 启动后端服务
生产环境使用,建议通过gunicorn启动服务
生产环境使用,建议通过gunicorn启动服务

```
nohup gunicorn server.main:app -b 127.0.0.1:8000 -w 4 -k uvicorn.workers.UvicornWorker >gunicorn.log 2>&1&
```

## 约束

1. 后端数据库对于布尔值的传递统一数据库设置为tinyint,0为假,1为真
2. 前端所有bool都0为假,1为真

# 功能实现介绍

## 分页查询实现

### 前端

```js
<!-- 导入分页相关方法 -->
import usePagination from '@/composables/usePagination'

<!-- 定义一个搜索字段 -->
<
!--定义一个搜索字段-- >
const searchForm = {
name: null,
email: null,
enable: null
}
}

<!-- 传入查询相关字段信息 -->
const {
<!-- 传入查询相关字段信息 -->
const {
search,
tableData,
currentPage,
Expand All @@ -120,11 +147,13 @@ const searchForm = {
total,
freshCurrentPage,
handleSearch
} = usePagination('/api/users/search', searchForm)
} = usePagination('/api/users/search', searchForm)
```

### 后端

定义了一个分页模型

```python
from typing import Optional, Generic, TypeVar
from pydantic import BaseModel
Expand All @@ -140,13 +169,14 @@ class Pagination(BaseModel, Generic[T]):
```

使用

```python
@router.post('/dict/item/search', summary="字典列表查询", response_model=ApiResponse[SearchResponse[DictRead]])
async def search_items(search: Pagination[DictItemSearch], session: Session = Depends(get_session)):
# 需要定义一个filter_type,用于区分各个字段的匹配形式,可用为:l_like、r_like、like、eq、ne、lt、le、gt、ge
filter_type = DictItemSearchFilter(dict_id='eq', label='like', enable='eq', value='like')
total = crud.internal.dict_item.search_total(session, search.search, filter_type.dict())
items: List[DictRead] = crud.internal.dict_item.search(session, search, filter_type.dict())
total = crud.internal.dict_item.search_total(session, search.search, filter_type.model_dump())
items: List[DictRead] = crud.internal.dict_item.search(session, search, filter_type.model_dump())
# 转义下数据类型,不然在执行return的时候,会去获取外键、关联字段相关的内容,容易造成数据量过多等问题
item_list = [DictRead.from_orm(item) for item in items]
return ApiResponse(
Expand All @@ -159,21 +189,27 @@ async def search_items(search: Pagination[DictItemSearch], session: Session = De
```

## 权限管控

通过casbin实现简化的权限管控功能,思路如下:

1. 对于不需要token验证的,写入settings的APISettings.NO_VERIFY_URL中
2. 对于需要权限管控的接口,写入casbin中,并且对需要权限验证的接口使用casbin验证
3. 前端通过权限字段,进行显示
4. 只能对按钮级别的功能实现权限管控
5. 页面管控,只是后端返回菜单列表,前端根据菜单列表进行显示,后端没有对页面进行权限管控

### 前端

v-permission定义了权限标识,当拥有权限时,可以页面上能显示按钮,同时,后端也会进行权限的判断。

```js
<el-button v-permission="'role:update'" v-if="scope.row.name!='admin'" type="primary" size="small"
@click="handleEdit(scope.row)">编辑
</el-button>
@click = "handleEdit(scope.row)" > 编辑
< /el-button>
```

### 后端

```python
@router.put('/roles', summary="更新角色", response_model=ApiResponse[Role],
dependencies=[Depends(Authority('role:update'))])
Expand All @@ -192,21 +228,36 @@ async def update_roles(role_info: RoleUpdate, session: Session = Depends(get_ses
```

## 项目截图

### 系统登录

![登录页面](./images/login.png)

### 用户管理

![用户管理页面](./images/user.png)
![添加新用户](./images/user_add.png)

### 角色管理

![角色管理页面](./images/role.png)
![添加新角色](./images/role_add.png)

### 菜单管理

![菜单管理页面](./images/menu.png)
![添加新菜单](./images/menu_add.png)

### 数据字典管理

![数据字典管理](./images/dictonary.png)
![数据字典元素管理](./images/dictonary_items.png)

### 任务管理

![任务管理](./images/job_manage.png)
![脚本管理](./images/job_playbook.png)

### 参考项目:

* https://github.com/xingxingzaixian/FastAPI-MySQL-Tortoise-Casbin
Binary file added images/job_manage.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.