Merge remote-tracking branch 'origin/develop' into develop
This commit is contained in:
10
CHANGELOG.md
Normal file
10
CHANGELOG.md
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
# Django-Vue3-Admin 更新日志
|
||||||
|
|
||||||
|
## 正式发布v3.0.0版本
|
||||||
|
### 1.新增:列权限管理与授权;
|
||||||
|
### 2.新增:代码新版本发布后,进行升级提醒;
|
||||||
|
### 3.优化:角色管理中按钮权限的操作;
|
||||||
|
### 4.优化:websocket 连接状态显示;
|
||||||
|
### 5.优化:初始化获取系统配置与字典配置,进行动态渲染登录页面;
|
||||||
|
### 6.修复:登录页面中系统配置不生效问题;
|
||||||
|
### 7.其他优化
|
||||||
93
README.en.md
93
README.en.md
@@ -1,14 +1,14 @@
|
|||||||
# Django-Vue3-Admin
|
# Django-Vue3-Admin
|
||||||
|
|
||||||
[](https://gitee.com/liqianglog/django-vue-admin/blob/master/LICENSE) [](https://python.org/) [](https://docs.djangoproject.com/zh-hans/3.2/) [](https://nodejs.org/zh-cn/) [](https://gitee.com/liqianglog/django-vue-admin)
|
[](https://gitee.com/huge-dream/django-vue3-admin/blob/master/LICENSE) [](https://python.org/) [](https://docs.djangoproject.com/zh-hans/3.2/) [](https://nodejs.org/zh-cn/) [](https://gitee.com/huge-dream/django-vue3-admin)
|
||||||
|
|
||||||
[preview](https://demo.dvadmin.com) | [Official website document](https://www.django-vue-admin.com) | [qq group](https://qm.qq.com/cgi-bin/qm/qr?k=fOdnHhC8DJlRHGYSnyhoB8P5rgogA6Vs&jump_from=webapi) | [community](https://bbs.django-vue-admin.com) | [plugins market](https://bbs.django-vue-admin.com/plugMarket.html) | [Github](https://github.com/liqianglog/django-vue-admin)
|
[preview](https://demo.dvadmin.com) | [Official website document](https://www.django-vue-admin.com) | [qq group](https://qm.qq.com/cgi-bin/qm/qr?k=fOdnHhC8DJlRHGYSnyhoB8P5rgogA6Vs&jump_from=webapi) | [community](https://bbs.django-vue-admin.com) | [plugins market](https://bbs.django-vue-admin.com/plugMarket.html) | [Github](https://github.com/liqianglog/django-vue-admin)
|
||||||
|
|
||||||
💡 **「About」**
|
💡 **「About」**
|
||||||
|
|
||||||
We are a group of young people who love Code. In this hot era, we hope to calm down and bring some of our colors and colors through code.
|
It is a completely open-source rapid development platform, provided free for personal use and authorized for group use.
|
||||||
|
Django-Vue3-Admin is a comprehensive basic development platform based on the RBAC (Role-Based Access Control) model for permission control, with column-level granularity. It follows a frontend-backend separation architecture, with Django and Django Rest Framework used for the backend, and Vue3, Composition API, TypeScript, Vite, and Element Plus used for the frontend.
|
||||||
|
|
||||||
Because of love, so embrace the future
|
|
||||||
|
|
||||||
## framework introduction
|
## framework introduction
|
||||||
|
|
||||||
@@ -18,12 +18,13 @@ Because of love, so embrace the future
|
|||||||
* 👭The backend uses the Python language Django framework as well as the powerful[Django REST Framework](https://pypi.org/project/djangorestframework)。
|
* 👭The backend uses the Python language Django framework as well as the powerful[Django REST Framework](https://pypi.org/project/djangorestframework)。
|
||||||
* 👫Permission authentication use[Django REST Framework SimpleJWT](https://pypi.org/project/djangorestframework-simplejwt),Supports the multi-terminal authentication system.
|
* 👫Permission authentication use[Django REST Framework SimpleJWT](https://pypi.org/project/djangorestframework-simplejwt),Supports the multi-terminal authentication system.
|
||||||
* 👬Support loading dynamic permission menu, multi - way easy permission control.
|
* 👬Support loading dynamic permission menu, multi - way easy permission control.
|
||||||
* 💏 Special thanks: [vue-next-admin](https://lyt-top.gitee.io/vue-next-admin-doc-preview/).
|
* 👬Enhanced Column Permission Control, with granularity down to each column.
|
||||||
* 💡 💏 Special thanks:[jetbrains](https://www.jetbrains.com/) To provide a free IntelliJ IDEA license for this open source project.
|
* 💏Special thanks: [vue-next-admin](https://lyt-top.gitee.io/vue-next-admin-doc-preview/).
|
||||||
|
* 💡Special thanks:[jetbrains](https://www.jetbrains.com/) To provide a free IntelliJ IDEA license for this open source project.
|
||||||
|
|
||||||
## Online experience
|
## Online experience
|
||||||
|
|
||||||
👩👧👦👩👧👦 demo address:[http://demo.django-vue-admin.com](http://demo.django-vue-admin.com)
|
👩👧👦👩👧👦 demo address:[https://demo.dvadmin.com](https://demo.dvadmin.com)
|
||||||
|
|
||||||
* demo account:superadmin
|
* demo account:superadmin
|
||||||
|
|
||||||
@@ -39,57 +40,61 @@ Because of love, so embrace the future
|
|||||||
|
|
||||||
## source code url:
|
## source code url:
|
||||||
|
|
||||||
gitee(Main push):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin)👩👦👦
|
gitee(Main push):[https://gitee.com/huge-dream/django-vue3-admin](https://gitee.com/huge-dream/django-vue3-admin)👩👦👦
|
||||||
|
|
||||||
github:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin)👩👦👦
|
github:[https://github.com/huge-dream/django-vue3-admin](https://github.com/huge-dream/django-vue3-admin)👩👦👦
|
||||||
|
|
||||||
## core function
|
## core function
|
||||||
|
|
||||||
1. 👨⚕️ Menu management: Configure the system menu, operation permissions, button permissions, back-end interface permissions, etc.
|
1. 👨⚕️Menu Management: Configure system menus, operation permissions, button permission flags, backend interface permissions, etc.
|
||||||
2. 🧑⚕️ Department management: Configure the system organization (company, department, role).
|
2. 🧑⚕️Department Management: Configure system organizational structure (company, department, role).
|
||||||
3. 👩⚕️ Role management: role menu permission allocation, data permission allocation, set roles according to the department for data range permission division.
|
3. 👩⚕️Role Management: Role menu permission assignment, data permission assignment, set role-based data scope permissions by department.
|
||||||
4. 🧑🎓 Rights Specifies the rights of the authorization role.
|
4. 🧑🎓Button Permission Control: Authorize role-specific button permissions and interface permissions, enabling authorization of data scope for each interface.
|
||||||
5. 👨🎓 User management: The user is the system operator, this function mainly completes the system user configuration.
|
5. 🧑🎓Field Column Permission Control: Authorize page field display permissions, specifically for the display permissions of a certain column.
|
||||||
6. 👬 Interface whitelist: specifies the interface that does not need permission verification.
|
6. 👨🎓User Management: Users are system operators, and this function is mainly used for system user configuration.
|
||||||
7. 🧑🔧 Dictionary management: Maintenance of some fixed data frequently used in the system.
|
7. 👬API Whitelist: Configure interfaces that do not require permission verification.
|
||||||
8. 🧑🔧 Regional management: to manage provinces, cities, counties and regions.
|
8. 🧑🔧Dictionary Management: Maintain frequently used and relatively fixed data in the system.
|
||||||
9. 📁 Attachment management: Unified management of all files and pictures on the platform.
|
9. 🧑🔧Region Management: Manage provinces, cities, counties, and districts.
|
||||||
10. 🗓 ️operation logs: log and query the system normal operation; Log and query system exception information.
|
10. 📁File Management: Unified management of all files, images, etc., on the platform.
|
||||||
11.🔌 [plugins market] (<https://bbs.django-vue-admin.com/plugMarket.html>) : based on the Django framework - Vue - Admin application and plug-in development.
|
11. 🗓️Operation Logs: Record and query logs for normal system operations and exceptional system information.
|
||||||
|
12. 🔌[Plugin Market](https://bbs.django-vue-admin.com/plugMarket.html): Applications and plugins developed based on the Django-Vue-Admin framework.
|
||||||
|
|
||||||
## plugins market 🔌
|
## plugins market 🔌
|
||||||
|
|
||||||
* Celery Asynchronous task:[dvadmin-celery](https://gitee.com/huge-dream/dvadmin-celery)
|
Updating...
|
||||||
* Upgrade center backend:[dvadmin-upgrade-center](https://gitee.com/huge-dream/dvadmin-upgrade-center)
|
|
||||||
* Upgrade center front:[dvadmin-upgrade-center-web](https://gitee.com/huge-dream/dvadmin-upgrade-center-web)
|
## Repository Branch Explanation 💈
|
||||||
|
Main Branch: master (stable version)
|
||||||
|
Development Branch: develop
|
||||||
|
|
||||||
## before start project you need:
|
## before start project you need:
|
||||||
|
|
||||||
~~~
|
~~~
|
||||||
Python >= 3.8.0
|
Python >= 3.11.0 (Minimum version 3.9+)
|
||||||
nodejs >= 14.0
|
Node.js >= 16.0
|
||||||
Mysql >= 5.7.0 (Optional. The default database is sqlite3. 8.0 is recommended)
|
Mysql >= 8.0 (Optional, default database: SQLite3, supports 5.7+, recommended version: 8.0)
|
||||||
Redis(Optional, the latest edition)
|
Redis (Optional, latest version)
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
## frontend♝
|
## frontend♝
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# clone code
|
# clone code
|
||||||
git clone https://gitee.com/liqianglog/django-vue-admin.git
|
git clone https://gitee.com/huge-dream/django-vue3-admin.git
|
||||||
|
|
||||||
# enter code dir
|
# enter code dir
|
||||||
cd web
|
cd web
|
||||||
|
|
||||||
# install dependence
|
# install dependence
|
||||||
npm install --registry=https://registry.npm.taobao.org
|
npm install yarn
|
||||||
|
yarn install --registry=https://registry.npm.taobao.org
|
||||||
|
|
||||||
# Start service
|
# Start service
|
||||||
npm run dev
|
yarn run dev
|
||||||
# Visit http://localhost:8080 in your browser
|
# Visit http://localhost:8080 in your browser
|
||||||
# Parameters such as boot port can be configured in the #.env.development file
|
# Parameters such as boot port can be configured in the #.env.development file
|
||||||
# Build the production environment
|
# Build the production environment
|
||||||
# npm run build
|
# yarn run build
|
||||||
```
|
```
|
||||||
|
|
||||||
## backend💈
|
## backend💈
|
||||||
@@ -111,8 +116,8 @@ npm run dev
|
|||||||
python3 manage.py init_area
|
python3 manage.py init_area
|
||||||
8. start backend
|
8. start backend
|
||||||
python3 manage.py runserver 0.0.0.0:8000
|
python3 manage.py runserver 0.0.0.0:8000
|
||||||
or daphne :
|
or uvicorn :
|
||||||
daphne -b 0.0.0.0 -p 8000 application.asgi:application
|
uvicorn application.asgi:application --port 8000 --host 0.0.0.0 --workers 8
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
### visit backend swagger
|
### visit backend swagger
|
||||||
@@ -125,7 +130,7 @@ or daphne :
|
|||||||
~~~shell
|
~~~shell
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
# Initialize backend data (first execution only)
|
# Initialize backend data (first execution only)
|
||||||
docker exec -ti dvadmin-django bash
|
docker exec -ti dvadmin3-django bash
|
||||||
python manage.py makemigrations
|
python manage.py makemigrations
|
||||||
python manage.py migrate
|
python manage.py migrate
|
||||||
python manage.py init_area
|
python manage.py init_area
|
||||||
@@ -147,22 +152,24 @@ docker-compose up -d --build
|
|||||||
|
|
||||||
## Demo screenshot✅
|
## Demo screenshot✅
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|

|
||||||
|
|
||||||

|
|
||||||
|
|
||||||

|
|
||||||
|
|||||||
100
README.md
100
README.md
@@ -10,11 +10,14 @@
|
|||||||
|
|
||||||
我们是一群热爱代码的青年,在这个炙热的时代下,我们希望静下心来通过Code带来一点我们的色彩和颜色。
|
我们是一群热爱代码的青年,在这个炙热的时代下,我们希望静下心来通过Code带来一点我们的色彩和颜色。
|
||||||
|
|
||||||
因为热爱,所以拥抱未来
|
因为热爱,所以拥抱未来!
|
||||||
|
|
||||||
|
|
||||||
## 平台简介
|
## 平台简介
|
||||||
|
|
||||||
💡 [django-vue3-admin](https://gitee.com/huge-dream/django-vue3-admin.git) 是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
|
💡 [django-vue3-admin](https://gitee.com/huge-dream/django-vue3-admin.git) 是一套全部开源的快速开发平台,毫无保留给个人免费使用、团体授权使用。
|
||||||
|
django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台,权限粒度达到列级别,前后端分离,后端采用django + django-rest-framework,前端采用基于 vue3 + CompositionAPI + typescript + vite + element plus
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -22,20 +25,29 @@
|
|||||||
* 👭后端采用 Python 语言 Django 框架以及强大的 [Django REST Framework](https://pypi.org/project/djangorestframework)。
|
* 👭后端采用 Python 语言 Django 框架以及强大的 [Django REST Framework](https://pypi.org/project/djangorestframework)。
|
||||||
* 👫权限认证使用[Django REST Framework SimpleJWT](https://pypi.org/project/djangorestframework-simplejwt),支持多终端认证系统。
|
* 👫权限认证使用[Django REST Framework SimpleJWT](https://pypi.org/project/djangorestframework-simplejwt),支持多终端认证系统。
|
||||||
* 👬支持加载动态权限菜单,多方式轻松权限控制。
|
* 👬支持加载动态权限菜单,多方式轻松权限控制。
|
||||||
|
* 👬全新的列权限管控,粒度细化到每一列。
|
||||||
* 💏特别鸣谢:[vue-next-admin](https://lyt-top.gitee.io/vue-next-admin-doc-preview/)。
|
* 💏特别鸣谢:[vue-next-admin](https://lyt-top.gitee.io/vue-next-admin-doc-preview/)。
|
||||||
* 💡 特别感谢[jetbrains](https://www.jetbrains.com/) 为本开源项目提供免费的 IntelliJ IDEA 授权。
|
* 💡特别感谢[jetbrains](https://www.jetbrains.com/) 为本开源项目提供免费的 IntelliJ IDEA 授权。
|
||||||
|
|
||||||
|
#### 🏭 环境支持
|
||||||
|
|
||||||
|
| Edge | Firefox | Chrome | Safari |
|
||||||
|
| --------- | ------------ | ----------- | ----------- |
|
||||||
|
| Edge ≥ 79 | Firefox ≥ 78 | Chrome ≥ 64 | Safari ≥ 12 |
|
||||||
|
|
||||||
|
> 由于 Vue3 不再支持 IE11,故而 ElementPlus 也不支持 IE11 及之前版本。
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
## 在线体验
|
## 在线体验
|
||||||
|
|
||||||
👩👧👦演示地址:[http://demo.django-vue-admin.com](http://demo.django-vue-admin.com)
|
👩👧👦演示地址:[https://demo.dvadmin.com](https://demo.dvadmin.com)
|
||||||
|
|
||||||
- 账号:superadmin
|
- 账号:superadmin
|
||||||
|
|
||||||
- 密码:admin123456
|
- 密码:admin123456
|
||||||
|
|
||||||
👩👦👦文档地址:[https://django-vue-admin.com](https://django-vue-admin.com)
|
👩👦👦文档地址:[coding](https://dvadmin-private.coding.net/share/km/cec69f3d-30fe-47d5-bd97-e9e851f0b776/K-2)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -46,7 +58,8 @@
|
|||||||
- 插件市场:[戳我](https://bbs.django-vue-admin.com/plugMarket.html)👩👦👦
|
- 插件市场:[戳我](https://bbs.django-vue-admin.com/plugMarket.html)👩👦👦
|
||||||
|
|
||||||
- django-vue-admin交流01群(已满):812482043 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=aJVwjDvH-Es4MPJQuoO32N0SucK22TE5&jump_from=webapi)
|
- django-vue-admin交流01群(已满):812482043 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=aJVwjDvH-Es4MPJQuoO32N0SucK22TE5&jump_from=webapi)
|
||||||
- django-vue-admin交流02群:687252418 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=4jJN4IjWGfxJ8YJXbb_gTsuWjR34WLdc&jump_from=webapi)
|
- django-vue-admin交流02群(已满):687252418 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=4jJN4IjWGfxJ8YJXbb_gTsuWjR34WLdc&jump_from=webapi)
|
||||||
|
- django-vue-admin交流03群:442108213 [点击链接加入群聊](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=wsm5oSz3K8dElBYUDtLTcQSEPhINFkl8&authKey=M6sbER0z59ZakgBr5erFeZyFZU15CI52bErNZa%2FxSvvGIuVAbY0N5866v89hm%2FK4&noverify=0&group_code=442108213)
|
||||||
|
|
||||||
- 二维码
|
- 二维码
|
||||||
|
|
||||||
@@ -54,10 +67,9 @@
|
|||||||
|
|
||||||
## 源码地址
|
## 源码地址
|
||||||
|
|
||||||
gitee地址(主推):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin)👩👦👦
|
gitee地址(主推):[https://gitee.com/huge-dream/django-vue3-admin](https://gitee.com/huge-dream/django-vue3-admin)👩👦👦
|
||||||
|
|
||||||
github地址:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin)👩👦👦
|
|
||||||
|
|
||||||
|
github地址:[https://github.com/huge-dream/django-vue3-admin](https://github.com/huge-dream/django-vue3-admin)👩👦👦
|
||||||
|
|
||||||
|
|
||||||
## 内置功能
|
## 内置功能
|
||||||
@@ -65,47 +77,51 @@ github地址:[https://github.com/liqianglog/django-vue-admin](https://github.c
|
|||||||
1. 👨⚕️菜单管理:配置系统菜单,操作权限,按钮权限标识、后端接口权限等。
|
1. 👨⚕️菜单管理:配置系统菜单,操作权限,按钮权限标识、后端接口权限等。
|
||||||
2. 🧑⚕️部门管理:配置系统组织机构(公司、部门、角色)。
|
2. 🧑⚕️部门管理:配置系统组织机构(公司、部门、角色)。
|
||||||
3. 👩⚕️角色管理:角色菜单权限分配、数据权限分配、设置角色按部门进行数据范围权限划分。
|
3. 👩⚕️角色管理:角色菜单权限分配、数据权限分配、设置角色按部门进行数据范围权限划分。
|
||||||
4. 🧑🎓权限权限:授权角色的权限范围。
|
4. 🧑🎓按钮权限控制:授权角色的按钮权限和接口权限,可做到每一个接口都能授权数据范围。
|
||||||
5. 👨🎓用户管理:用户是系统操作者,该功能主要完成系统用户配置。
|
5. 🧑🎓字段列权限控制:授权页面的字段显示权限,具体到某一列的显示权限。
|
||||||
6. 👬接口白名单:配置不需要进行权限校验的接口。
|
7. 👨🎓用户管理:用户是系统操作者,该功能主要完成系统用户配置。
|
||||||
7. 🧑🔧字典管理:对系统中经常使用的一些较为固定的数据进行维护。
|
8. 👬接口白名单:配置不需要进行权限校验的接口。
|
||||||
8. 🧑🔧地区管理:对省市县区域进行管理。
|
9. 🧑🔧字典管理:对系统中经常使用的一些较为固定的数据进行维护。
|
||||||
9. 📁附件管理:对平台上所有文件、图片等进行统一管理。
|
10. 🧑🔧地区管理:对省市县区域进行管理。
|
||||||
10. 🗓️操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
|
11. 📁附件管理:对平台上所有文件、图片等进行统一管理。
|
||||||
11. 🔌[插件市场 ](https://bbs.django-vue-admin.com/plugMarket.html):基于Django-Vue-Admin框架开发的应用和插件。
|
12. 🗓️操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
|
||||||
|
13. 🔌[插件市场 ](https://bbs.django-vue-admin.com/plugMarket.html):基于Django-Vue-Admin框架开发的应用和插件。
|
||||||
|
|
||||||
## 插件市场 🔌
|
## 插件市场 🔌
|
||||||
|
更新中...
|
||||||
|
|
||||||
|
## 仓库分支说明 💈
|
||||||
|
主分支:master(稳定版本)
|
||||||
|
开发分支:develop
|
||||||
|
|
||||||
- Celery异步任务:[dvadmin-celery](https://gitee.com/huge-dream/dvadmin-celery)
|
|
||||||
- 升级中心后端:[dvadmin-upgrade-center](https://gitee.com/huge-dream/dvadmin-upgrade-center)
|
|
||||||
- 升级中心前端:[dvadmin-upgrade-center-web](https://gitee.com/huge-dream/dvadmin-upgrade-center-web)
|
|
||||||
|
|
||||||
## 准备工作
|
## 准备工作
|
||||||
~~~
|
~~~
|
||||||
Python >= 3.8.0 (推荐3.8+版本)
|
Python >= 3.11.0 (最低3.9+版本)
|
||||||
nodejs >= 14.0 (推荐最新)
|
nodejs >= 16.0
|
||||||
Mysql >= 5.7.0 (可选,默认数据库sqlite3,推荐8.0版本)
|
Mysql >= 8.0 (可选,默认数据库sqlite3,支持5.7+,推荐8.0版本)
|
||||||
Redis(可选,最新版)
|
Redis (可选,最新版)
|
||||||
~~~
|
~~~
|
||||||
|
|
||||||
## 前端♝
|
## 前端♝
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
# 克隆项目
|
# 克隆项目
|
||||||
git clone https://gitee.com/liqianglog/django-vue-admin.git
|
git clone https://gitee.com/huge-dream/django-vue3-admin.git
|
||||||
|
|
||||||
# 进入项目目录
|
# 进入项目目录
|
||||||
cd web
|
cd web
|
||||||
|
|
||||||
# 安装依赖
|
# 安装依赖
|
||||||
npm install --registry=https://registry.npm.taobao.org
|
npm install yarn
|
||||||
|
yarn install --registry=https://registry.npm.taobao.org
|
||||||
|
|
||||||
# 启动服务
|
# 启动服务
|
||||||
npm run dev
|
yarn build
|
||||||
# 浏览器访问 http://localhost:8080
|
# 浏览器访问 http://localhost:8080
|
||||||
# .env.development 文件中可配置启动端口等参数
|
# .env.development 文件中可配置启动端口等参数
|
||||||
# 构建生产环境
|
# 构建生产环境
|
||||||
# npm run build
|
# yarn run build
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
@@ -129,9 +145,11 @@ npm run dev
|
|||||||
python3 manage.py init_area
|
python3 manage.py init_area
|
||||||
8. 启动项目
|
8. 启动项目
|
||||||
python3 manage.py runserver 0.0.0.0:8000
|
python3 manage.py runserver 0.0.0.0:8000
|
||||||
或使用 daphne :
|
或使用 uvicorn :
|
||||||
daphne -b 0.0.0.0 -p 8000 application.asgi:application
|
uvicorn application.asgi:application --port 8000 --host 0.0.0.0 --workers 8
|
||||||
~~~
|
~~~
|
||||||
|
## 开发建议
|
||||||
|
前后端backend与web各自单独一个窗口打开进行开发
|
||||||
|
|
||||||
### 访问项目
|
### 访问项目
|
||||||
|
|
||||||
@@ -148,7 +166,7 @@ npm run dev
|
|||||||
# 先安装docker-compose (自行百度安装),执行此命令等待安装,如有使用celery插件请打开docker-compose.yml中celery 部分注释
|
# 先安装docker-compose (自行百度安装),执行此命令等待安装,如有使用celery插件请打开docker-compose.yml中celery 部分注释
|
||||||
docker-compose up -d
|
docker-compose up -d
|
||||||
# 初始化后端数据(第一次执行即可)
|
# 初始化后端数据(第一次执行即可)
|
||||||
docker exec -ti dvadmin-django bash
|
docker exec -ti dvadmin3-django bash
|
||||||
python manage.py makemigrations
|
python manage.py makemigrations
|
||||||
python manage.py migrate
|
python manage.py migrate
|
||||||
python manage.py init_area
|
python manage.py init_area
|
||||||
@@ -172,25 +190,25 @@ docker-compose up -d --build
|
|||||||
|
|
||||||
## 演示图✅
|
## 演示图✅
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -43,10 +43,8 @@ sys.path.insert(0, os.path.join(PLUGINS_PATH))
|
|||||||
DEBUG = locals().get("DEBUG", True)
|
DEBUG = locals().get("DEBUG", True)
|
||||||
ALLOWED_HOSTS = locals().get("ALLOWED_HOSTS", ["*"])
|
ALLOWED_HOSTS = locals().get("ALLOWED_HOSTS", ["*"])
|
||||||
|
|
||||||
# Application definition
|
# 列权限需要排除的App应用
|
||||||
CUSTOM_APPS = [
|
COLUMN_EXCLUDE_APPS = ['channels', 'captcha'] + locals().get("COLUMN_EXCLUDE_APPS", [])
|
||||||
"dvadmin.system",
|
|
||||||
]
|
|
||||||
|
|
||||||
INSTALLED_APPS = [
|
INSTALLED_APPS = [
|
||||||
"django.contrib.auth",
|
"django.contrib.auth",
|
||||||
@@ -60,8 +58,8 @@ INSTALLED_APPS = [
|
|||||||
"corsheaders", # 注册跨域app
|
"corsheaders", # 注册跨域app
|
||||||
"drf_yasg",
|
"drf_yasg",
|
||||||
"captcha",
|
"captcha",
|
||||||
'channels',
|
"channels",
|
||||||
*CUSTOM_APPS,
|
"dvadmin.system",
|
||||||
]
|
]
|
||||||
|
|
||||||
MIDDLEWARE = [
|
MIDDLEWARE = [
|
||||||
|
|||||||
@@ -44,4 +44,5 @@ LOGIN_NO_CAPTCHA_AUTH = True
|
|||||||
# ================================================= #
|
# ================================================= #
|
||||||
|
|
||||||
ALLOWED_HOSTS = ["*"]
|
ALLOWED_HOSTS = ["*"]
|
||||||
CUSTOM_APPS = []
|
# 列权限中排除App应用
|
||||||
|
COLUMN_EXCLUDE_APPS = []
|
||||||
|
|||||||
@@ -130,7 +130,7 @@
|
|||||||
"parent": 1,
|
"parent": 1,
|
||||||
"title": "版权信息",
|
"title": "版权信息",
|
||||||
"key": "copyright",
|
"key": "copyright",
|
||||||
"value": "2021-2022 django-vue-admin.com 版权所有",
|
"value": "2021-2024 django-vue-admin.com 版权所有",
|
||||||
"sort": 4,
|
"sort": 4,
|
||||||
"status": true,
|
"status": true,
|
||||||
"data_options": null,
|
"data_options": null,
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ from django.db import models
|
|||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
from application import settings
|
from application import settings
|
||||||
|
|
||||||
table_prefix = settings.TABLE_PREFIX # 数据库表名前缀
|
table_prefix = settings.TABLE_PREFIX # 数据库表名前缀
|
||||||
|
|
||||||
|
|
||||||
@@ -71,10 +72,13 @@ class CoreModel(models.Model):
|
|||||||
id = models.BigAutoField(primary_key=True, help_text="Id", verbose_name="Id")
|
id = models.BigAutoField(primary_key=True, help_text="Id", verbose_name="Id")
|
||||||
description = models.CharField(max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述")
|
description = models.CharField(max_length=255, verbose_name="描述", null=True, blank=True, help_text="描述")
|
||||||
creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True,
|
creator = models.ForeignKey(to=settings.AUTH_USER_MODEL, related_query_name='creator_query', null=True,
|
||||||
verbose_name='创建人', help_text="创建人", on_delete=models.SET_NULL, db_constraint=False)
|
verbose_name='创建人', help_text="创建人", on_delete=models.SET_NULL,
|
||||||
|
db_constraint=False)
|
||||||
modifier = models.CharField(max_length=255, null=True, blank=True, help_text="修改人", verbose_name="修改人")
|
modifier = models.CharField(max_length=255, null=True, blank=True, help_text="修改人", verbose_name="修改人")
|
||||||
dept_belong_id = models.CharField(max_length=255, help_text="数据归属部门", null=True, blank=True, verbose_name="数据归属部门")
|
dept_belong_id = models.CharField(max_length=255, help_text="数据归属部门", null=True, blank=True,
|
||||||
update_datetime = models.DateTimeField(auto_now=True, null=True, blank=True, help_text="修改时间", verbose_name="修改时间")
|
verbose_name="数据归属部门")
|
||||||
|
update_datetime = models.DateTimeField(auto_now=True, null=True, blank=True, help_text="修改时间",
|
||||||
|
verbose_name="修改时间")
|
||||||
create_datetime = models.DateTimeField(auto_now_add=True, null=True, blank=True, help_text="创建时间",
|
create_datetime = models.DateTimeField(auto_now_add=True, null=True, blank=True, help_text="创建时间",
|
||||||
verbose_name="创建时间")
|
verbose_name="创建时间")
|
||||||
|
|
||||||
@@ -136,12 +140,23 @@ def get_model_from_app(app_name):
|
|||||||
|
|
||||||
|
|
||||||
def get_custom_app_models(app_name=None):
|
def get_custom_app_models(app_name=None):
|
||||||
"""获取所有项目下的app里的models"""
|
"""
|
||||||
|
获取所有项目下的app里的models
|
||||||
|
"""
|
||||||
if app_name:
|
if app_name:
|
||||||
return get_model_from_app(app_name)
|
return get_model_from_app(app_name)
|
||||||
|
all_apps = apps.get_app_configs()
|
||||||
res = []
|
res = []
|
||||||
for app in settings.CUSTOM_APPS:
|
for app in all_apps:
|
||||||
all_models = get_model_from_app(app)
|
if app.name.startswith('django'):
|
||||||
for model in all_models:
|
continue
|
||||||
res.append(model)
|
if app.name in settings.COLUMN_EXCLUDE_APPS:
|
||||||
|
continue
|
||||||
|
try:
|
||||||
|
all_models = get_model_from_app(app.name)
|
||||||
|
if all_models:
|
||||||
|
for model in all_models:
|
||||||
|
res.append(model)
|
||||||
|
except Exception as e:
|
||||||
|
pass
|
||||||
return res
|
return res
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
Django==4.2.6
|
Django==4.2.7
|
||||||
django-comment-migrate==0.1.7
|
django-comment-migrate==0.1.7
|
||||||
django-cors-headers==4.3.0
|
django-cors-headers==4.3.0
|
||||||
django-filter==23.3
|
django-filter==23.3
|
||||||
|
|||||||
@@ -10,23 +10,22 @@
|
|||||||
/>
|
/>
|
||||||
<meta
|
<meta
|
||||||
name="description"
|
name="description"
|
||||||
content="django-vue3-admin,基于 vue3 + CompositionAPI + typescript + vite + element plus, 是一款全栈,快速,开源的后台管理系统!"
|
content="django-vue-admin 基于RBAC模型的权限控制的一整套基础开发平台,权限粒度达到列级别,前后端分离,后端采用django + django-rest-framework,前端采用基于 vue3 + CompositionAPI + typescript + vite + element plus"
|
||||||
/>
|
/>
|
||||||
<link rel="icon" href="/favicon.ico" />
|
<link rel="icon" href="/favicon.ico" />
|
||||||
<title>django-vue3-admin</title>
|
<title>django-vue-admin</title>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<script type="text/javascript">
|
<script>
|
||||||
// let _hmt = _hmt || [];
|
var _hmt = _hmt || [];
|
||||||
(function () {
|
(function() {
|
||||||
let hm = document.createElement('script');
|
var hm = document.createElement("script");
|
||||||
hm.src = 'https://hm.baidu.com/hm.js?d9c8b87d10717013641458b300c552e4';
|
hm.src = "https://hm.baidu.com/hm.js?9ba8fc809b5584167a2fb9b31bb3970c";
|
||||||
let s = document.getElementsByTagName('script')[0];
|
var s = document.getElementsByTagName("script")[0];
|
||||||
s.parentNode.insertBefore(hm, s);
|
s.parentNode.insertBefore(hm, s);
|
||||||
})();
|
})();
|
||||||
</script>
|
</script>
|
||||||
<script type="module" src="/src/main.ts"></script>
|
<script type="module" src="/src/main.ts"></script>
|
||||||
<script type="text/javascript" src="https://api.map.baidu.com/api?v=3.0&ak=wsijQt8sLXrCW71YesmispvYHitfG9gv&s=1"></script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{
|
{
|
||||||
"name": "django-vue3-admin",
|
"name": "django-vue3-admin",
|
||||||
"version": "1.0.0",
|
"version": "3.0.0",
|
||||||
"description": "django-vue3-admin,基于 vue3 + CompositionAPI + typescript + vite + element plus, 是一款全栈,快速,开源的后台管理系统!",
|
"description": "是一套全部开源的快速开发平台,毫无保留给个人免费使用、团体授权使用。\n django-vue3-admin 基于RBAC模型的权限控制的一整套基础开发平台,权限粒度达到列级别,前后端分离,后端采用django + django-rest-framework,前端采用基于 vue3 + CompositionAPI + typescript + vite + element plus",
|
||||||
"license": "MIT",
|
"license": "MIT",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "vite --force",
|
"dev": "vite --force",
|
||||||
@@ -10,10 +10,10 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@element-plus/icons-vue": "^2.0.10",
|
"@element-plus/icons-vue": "^2.0.10",
|
||||||
"@fast-crud/fast-crud": "^1.18.3",
|
"@fast-crud/fast-crud": "^1.19.2",
|
||||||
"@fast-crud/fast-extends": "^1.18.3",
|
"@fast-crud/fast-extends": "^1.19.2",
|
||||||
"@fast-crud/ui-element": "^1.18.3",
|
"@fast-crud/ui-element": "^1.19.2",
|
||||||
"@fast-crud/ui-interface": "^1.18.3",
|
"@fast-crud/ui-interface": "^1.19.2",
|
||||||
"@vitejs/plugin-vue-jsx": "^3.0.0",
|
"@vitejs/plugin-vue-jsx": "^3.0.0",
|
||||||
"@wangeditor/editor": "^5.1.23",
|
"@wangeditor/editor": "^5.1.23",
|
||||||
"@wangeditor/editor-for-vue": "^5.1.12",
|
"@wangeditor/editor-for-vue": "^5.1.12",
|
||||||
|
|||||||
@@ -118,7 +118,7 @@
|
|||||||
list-type="picture-card"
|
list-type="picture-card"
|
||||||
>
|
>
|
||||||
<i class="el-icon-plus"></i>
|
<i class="el-icon-plus"></i>
|
||||||
<div slot="tip" class="el-upload__tip">选取图片后,需手动上传到服务器,并且只能上传jpg/png文件</div>
|
<div slot="tip" class="el-upload__tip">请选取图片,并且只能上传jpg/png文件</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<el-dialog :visible.sync="dialogImgVisible">
|
<el-dialog :visible.sync="dialogImgVisible">
|
||||||
<img width="100%" :src="dialogImageUrl" alt="" />
|
<img width="100%" :src="dialogImageUrl" alt="" />
|
||||||
@@ -150,7 +150,7 @@
|
|||||||
list-type="picture-card"
|
list-type="picture-card"
|
||||||
>
|
>
|
||||||
<i class="el-icon-plus"></i>
|
<i class="el-icon-plus"></i>
|
||||||
<div slot="tip" class="el-upload__tip">选取图片后,需手动上传到服务器,并且只能上传jpg/png文件</div>
|
<div slot="tip" class="el-upload__tip">请选取图片,并且只能上传jpg/png文件</div>
|
||||||
</el-upload>
|
</el-upload>
|
||||||
<el-dialog :visible.sync="dialogImgVisible">
|
<el-dialog :visible.sync="dialogImgVisible">
|
||||||
<img width="100%" :src="dialogImageUrl" alt="" />
|
<img width="100%" :src="dialogImageUrl" alt="" />
|
||||||
@@ -506,4 +506,8 @@ watch(
|
|||||||
);
|
);
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style></style>
|
<style scoped>
|
||||||
|
:deep(.el-upload-list--picture-card){
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|||||||
@@ -42,7 +42,7 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="login-authorization">
|
<div class="login-authorization">
|
||||||
<p>Copyright © {{getSystemConfig['login.copyright'] || '2021-2022 django-vue-admin.com'}} 版权所有</p>
|
<p>Copyright © {{getSystemConfig['login.copyright'] || '2021-2024 django-vue-admin.com'}} 版权所有</p>
|
||||||
<p class="la-other">
|
<p class="la-other">
|
||||||
<a href="https://beian.miit.gov.cn" target="_blank">{{getSystemConfig['login.keep_record'] || '晋ICP备18005113号-3'}}</a>
|
<a href="https://beian.miit.gov.cn" target="_blank">{{getSystemConfig['login.keep_record'] || '晋ICP备18005113号-3'}}</a>
|
||||||
|
|
|
|
||||||
|
|||||||
@@ -10,7 +10,7 @@
|
|||||||
<el-tag>{{ props.roleName }}</el-tag>
|
<el-tag>{{ props.roleName }}</el-tag>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6" :offset="8">
|
<el-col :span="6">
|
||||||
<div>
|
<div>
|
||||||
<el-button size="small" type="primary" class="pc-save-btn" @click="handleSavePermission">保存菜单授权
|
<el-button size="small" type="primary" class="pc-save-btn" @click="handleSavePermission">保存菜单授权
|
||||||
</el-button>
|
</el-button>
|
||||||
@@ -20,15 +20,16 @@
|
|||||||
</template>
|
</template>
|
||||||
<div class="permission-com">
|
<div class="permission-com">
|
||||||
<el-collapse v-model="collapseCurrent" @change="handleCollapseChange" accordion>
|
<el-collapse v-model="collapseCurrent" @change="handleCollapseChange" accordion>
|
||||||
<el-collapse-item v-for="(item,mIndex) in menuData" :key="mIndex" :name="mIndex">
|
<el-collapse-item v-for="(item,mIndex) in menuData" :key="mIndex" :name="mIndex"
|
||||||
|
style=" background-color: #fafafa;">
|
||||||
<template #title>
|
<template #title>
|
||||||
<div @click.stop="null">
|
<div>
|
||||||
<p class="pc-collapse-title">
|
<div class="pc-collapse-title">
|
||||||
<el-checkbox v-model="item.isCheck">
|
<el-checkbox v-model="item.isCheck" @click.stop="null">
|
||||||
<span>{{ item.name }}</span>
|
<span>{{ item.name }}</span>
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
</p>
|
</div>
|
||||||
<div v-show="!collapseCurrent.includes(mIndex)">
|
<div v-show="!collapseCurrent.includes(mIndex)" @click.stop="null" style="text-align: left;">
|
||||||
<el-checkbox v-for="btn in item.btns" :key="btn.value" :label="btn.value" v-model="btn.isCheck">
|
<el-checkbox v-for="btn in item.btns" :key="btn.value" :label="btn.value" v-model="btn.isCheck">
|
||||||
{{ btn.name }}
|
{{ btn.name }}
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
@@ -40,7 +41,7 @@
|
|||||||
<p>允许对这些数据有以下操作</p>
|
<p>允许对这些数据有以下操作</p>
|
||||||
<el-checkbox v-for="(btn,bIndex) in item.btns" :key="bIndex" v-model="btn.isCheck" :label="btn.value">
|
<el-checkbox v-for="(btn,bIndex) in item.btns" :key="bIndex" v-model="btn.isCheck" :label="btn.value">
|
||||||
<div class="btn-item">
|
<div class="btn-item">
|
||||||
{{ btn.data_range!==null ? `${btn.name}(${formatDataRange(btn.data_range)})` : btn.name }}
|
{{ btn.data_range !== null ? `${btn.name}(${formatDataRange(btn.data_range)})` : btn.name }}
|
||||||
<span v-show="btn.isCheck" @click.stop.prevent="handleSettingClick(item, btn.id)">
|
<span v-show="btn.isCheck" @click.stop.prevent="handleSettingClick(item, btn.id)">
|
||||||
<el-icon><Setting/></el-icon>
|
<el-icon><Setting/></el-icon>
|
||||||
</span>
|
</span>
|
||||||
@@ -51,7 +52,7 @@
|
|||||||
<div class="pccm-item">
|
<div class="pccm-item">
|
||||||
<p>对这些数据有以下字段权限</p>
|
<p>对这些数据有以下字段权限</p>
|
||||||
|
|
||||||
<ul class="columns-list">
|
<ul class="columns-list">
|
||||||
<li class="columns-head">
|
<li class="columns-head">
|
||||||
<div class="width-txt">
|
<div class="width-txt">
|
||||||
<span>字段</span>
|
<span>字段</span>
|
||||||
@@ -59,7 +60,7 @@
|
|||||||
|
|
||||||
<div v-for="(head,hIndex) in column.header" :key="hIndex" class="width-check">
|
<div v-for="(head,hIndex) in column.header" :key="hIndex" class="width-check">
|
||||||
<el-checkbox :label="head.value" @change="handleColumnChange($event, item, head.value)">
|
<el-checkbox :label="head.value" @change="handleColumnChange($event, item, head.value)">
|
||||||
<span>{{head.label}}</span>
|
<span>{{ head.label }}</span>
|
||||||
</el-checkbox>
|
</el-checkbox>
|
||||||
</div>
|
</div>
|
||||||
</li>
|
</li>
|
||||||
@@ -111,7 +112,13 @@
|
|||||||
import {ref, onMounted, defineProps, watch, computed, reactive} from 'vue';
|
import {ref, onMounted, defineProps, watch, computed, reactive} from 'vue';
|
||||||
import XEUtils from 'xe-utils';
|
import XEUtils from 'xe-utils';
|
||||||
import {errorNotification} from '/@/utils/message';
|
import {errorNotification} from '/@/utils/message';
|
||||||
import {getDataPermissionRange, getDataPermissionDept, getRolePremission, setRolePremission,setBtnDatarange} from './api';
|
import {
|
||||||
|
getDataPermissionRange,
|
||||||
|
getDataPermissionDept,
|
||||||
|
getRolePremission,
|
||||||
|
setRolePremission,
|
||||||
|
setBtnDatarange
|
||||||
|
} from './api';
|
||||||
import {MenuDataType, DataPermissionRangeType, CustomDataPermissionDeptType} from './types';
|
import {MenuDataType, DataPermissionRangeType, CustomDataPermissionDeptType} from './types';
|
||||||
import {ElMessage} from 'element-plus'
|
import {ElMessage} from 'element-plus'
|
||||||
|
|
||||||
@@ -158,9 +165,9 @@ let menuBtnCurrent = ref<number>(-1);
|
|||||||
let dialogVisible = ref(false);
|
let dialogVisible = ref(false);
|
||||||
let dataPermissionRange = ref<DataPermissionRangeType[]>([]);
|
let dataPermissionRange = ref<DataPermissionRangeType[]>([]);
|
||||||
const formatDataRange = computed(() => {
|
const formatDataRange = computed(() => {
|
||||||
return function(datarange:number){
|
return function (datarange: number) {
|
||||||
const findItem = dataPermissionRange.value.find((i) => i.value === datarange);
|
const findItem = dataPermissionRange.value.find((i) => i.value === datarange);
|
||||||
return findItem?.label || ''
|
return findItem?.label || ''
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
let deptData = ref<CustomDataPermissionDeptType[]>([]);
|
let deptData = ref<CustomDataPermissionDeptType[]>([]);
|
||||||
@@ -228,7 +235,7 @@ const handleDialogConfirm = () => {
|
|||||||
if (btn.id === menuBtnCurrent.value) {
|
if (btn.id === menuBtnCurrent.value) {
|
||||||
const findItem = dataPermissionRange.value.find((i) => i.value === dataPermission.value);
|
const findItem = dataPermissionRange.value.find((i) => i.value === dataPermission.value);
|
||||||
btn.data_range = findItem?.value || 0;
|
btn.data_range = findItem?.value || 0;
|
||||||
if(btn.data_range===4){
|
if (btn.data_range === 4) {
|
||||||
btn.dept = customDataPermission.value
|
btn.dept = customDataPermission.value
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -254,7 +261,10 @@ const handleSavePermission = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const column = reactive({
|
const column = reactive({
|
||||||
header:[{value:'is_create',label:'新增可见'},{value:'is_update',label:'编辑可见'},{value:'is_query',label:'列表可见'}]
|
header: [{value: 'is_create', label: '新增可见'}, {value: 'is_update', label: '编辑可见'}, {
|
||||||
|
value: 'is_query',
|
||||||
|
label: '列表可见'
|
||||||
|
}]
|
||||||
})
|
})
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
@@ -272,6 +282,7 @@ onMounted(() => {
|
|||||||
|
|
||||||
.pc-collapse-title {
|
.pc-collapse-title {
|
||||||
line-height: 32px;
|
line-height: 32px;
|
||||||
|
text-align: left;
|
||||||
|
|
||||||
span {
|
span {
|
||||||
font-size: 16px;
|
font-size: 16px;
|
||||||
@@ -365,6 +376,7 @@ onMounted(() => {
|
|||||||
border-left: 1px solid #ebeef5;
|
border-left: 1px solid #ebeef5;
|
||||||
border-right: 1px solid #ebeef5;
|
border-right: 1px solid #ebeef5;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
|
background-color: #fafafa;
|
||||||
}
|
}
|
||||||
|
|
||||||
.el-collapse-item__header.is-active {
|
.el-collapse-item__header.is-active {
|
||||||
|
|||||||
Reference in New Issue
Block a user