Skip to content

Commit 34a8b8b

Browse files
Tylerloggitee-org
authored andcommitted
正式发布v0.0.5版本
1. 新增docker部署 2. 新增添加线上静态文件转发模块 3. 新增是否使用插件功能配置项功能 4. 修复权限管理中自定义权限时,无部门的bug 5. 修复无效路由导致系统无法进入及添加校验路由是否有效
2 parents 14970ef + 6445c22 commit 34a8b8b

36 files changed

+946
-85
lines changed

README.md

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ npm run build:prod
115115
7. 启动项目
116116
python3 manage.py runserver 127.0.0.1:8000
117117
或使用 daphne :
118-
daphne -b 0.0.0.0 application.asgi:application
118+
daphne -b 0.0.0.0 -8000 application.asgi:application
119119
初始账号:superadmin 密码:admin123456
120120
后端接口文档地址:http://127.0.0.1:8000/swagger
121121
~~~
@@ -125,7 +125,26 @@ npm run build:prod
125125
### docker-compose 运行
126126

127127
~~~shell
128-
待完善
128+
# 先安装docker-compose (自行百度安装),执行此命令等待安装,如有使用celery插件请打开docker-compose.yml中celery 部分注释
129+
docker-compose up -d
130+
# 初始化后端数据(第一次执行即可)
131+
docker exec -ti dvadmin-pro-django bash
132+
python manage.py makemigrations
133+
python manage.py migrate
134+
python manage.py init -y
135+
exit
136+
137+
前端地址:http://127.0.0.1:8080
138+
后端地址:http://127.0.0.1:8000
139+
# 在服务器上请把127.0.0.1 换成自己公网ip
140+
账号:superadmin 密码:admin123456
141+
142+
# docker-compose 停止
143+
docker-compose down
144+
# docker-compose 重启
145+
docker-compose restart
146+
# docker-compose 启动时重新进行 build
147+
docker-compose up -d --build
129148
~~~
130149

131150

backend/application/settings.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,8 @@
2929
SECRET_KEY = 'django-insecure--z8%exyzt7e_%i@1+#1mm=%lb5=^fx_57=1@a+_y7bg5-w%)sm'
3030

3131
# SECURITY WARNING: don't run with debug turned on in production!
32-
DEBUG = True
33-
34-
ALLOWED_HOSTS = ['*']
32+
DEBUG = locals().get('DEBUG', True)
33+
ALLOWED_HOSTS = locals().get('ALLOWED_HOSTS', ['*'])
3534

3635
# Application definition
3736

@@ -52,6 +51,7 @@
5251

5352
MIDDLEWARE = [
5453
'django.middleware.security.SecurityMiddleware',
54+
'whitenoise.middleware.WhiteNoiseMiddleware',
5555
'django.contrib.sessions.middleware.SessionMiddleware',
5656
'corsheaders.middleware.CorsMiddleware', # 跨域中间件
5757
'django.middleware.common.CommonMiddleware',
@@ -91,7 +91,7 @@
9191
'NAME': DATABASE_NAME,
9292
'USER': DATABASE_USER,
9393
'PASSWORD': DATABASE_PASSWORD,
94-
'HOST': DATABASE_HOST,
94+
'HOST': os.getenv('DATABASE_HOST') or DATABASE_HOST,
9595
'PORT': DATABASE_PORT,
9696
}
9797
}
@@ -138,7 +138,6 @@
138138
os.path.join(BASE_DIR, "static"),
139139
]
140140

141-
142141
MEDIA_ROOT = 'media' # 项目下的目录
143142
MEDIA_URL = "/media/" # 跟STATIC_URL类似,指定用户可以通过这个url找到文件
144143

@@ -279,12 +278,12 @@
279278

280279
# ====================================#
281280
# ****************swagger************#
282-
#====================================#
281+
# ====================================#
283282
SWAGGER_SETTINGS = {
284283
# 基础样式
285284
'SECURITY_DEFINITIONS': {
286-
"basic":{
287-
'type': 'basic'
285+
"basic": {
286+
'type': 'basic'
288287
}
289288
},
290289
# 如果需要登录才能够查看接口文档, 登录的链接使用restframework自带的.
@@ -303,7 +302,7 @@
303302
# 方法列表字母排序
304303
'OPERATIONS_SORTER': 'alpha',
305304
'VALIDATOR_URL': None,
306-
'AUTO_SCHEMA_TYPE': 2, # 分组根据url层级分,0、1 或 2 层
305+
'AUTO_SCHEMA_TYPE': 2, # 分组根据url层级分,0、1 或 2 层
307306
'DEFAULT_AUTO_SCHEMA_CLASS': 'dvadmin.utils.swagger.CustomSwaggerAutoSchema',
308307
}
309308

@@ -319,12 +318,11 @@
319318
CAPTCHA_FOREGROUND_COLOR = '#0033FF' # 前景色
320319
CAPTCHA_BACKGROUND_COLOR = '#F5F7F4' # 背景色
321320
CAPTCHA_NOISE_FUNCTIONS = (
322-
'captcha.helpers.noise_arcs', # 线
323-
'captcha.helpers.noise_dots', # 点
321+
'captcha.helpers.noise_arcs', # 线
322+
'captcha.helpers.noise_dots', # 点
324323
)
325324
# CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.random_char_challenge' #字母验证码
326-
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge' # 加减乘除验证码
327-
325+
CAPTCHA_CHALLENGE_FUNCT = 'captcha.helpers.math_challenge' # 加减乘除验证码
328326

329327
# ================================================= #
330328
# ******************** 其他配置 ******************** #
@@ -346,6 +344,8 @@
346344
TABLE_PREFIX = "dvadmin_"
347345
DJANGO_CELERY_BEAT_TZ_AWARE = False
348346
CELERY_TIMEZONE = 'Asia/Shanghai' # celery 时区问题
347+
# 静态页面压缩
348+
STATICFILES_STORAGE = 'whitenoise.storage.CompressedStaticFilesStorage'
349349
# 初始化需要执行的列表,用来初始化后执行
350350
INITIALIZE_LIST = []
351351
INITIALIZE_RESET_LIST = []

backend/application/urls.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,15 +72,15 @@ def get_classes(arg):
7272
return name
7373
return ""
7474

75-
76-
with open(yamlPath, 'r', encoding='utf-8') as doc:
77-
plugins_dict = json.load(doc)
78-
# 进行排序
79-
plugins_dict = dict(sorted(plugins_dict.items(), key=lambda x: x[1]['priority'], reverse=True))
80-
for plugins_name, plugins_values in plugins_dict.items():
81-
# 校验插件是否
82-
if plugins_values.get('enable', None):
83-
exec(f"""
75+
if getattr(settings, 'ENABLE_PLUGINS', True):
76+
with open(yamlPath, 'r', encoding='utf-8') as doc:
77+
plugins_dict = json.load(doc)
78+
# 进行排序
79+
plugins_dict = dict(sorted(plugins_dict.items(), key=lambda x: x[1]['priority'], reverse=True))
80+
for plugins_name, plugins_values in plugins_dict.items():
81+
# 校验插件是否
82+
if plugins_values.get('enable', None):
83+
exec(f"""
8484
# 获取 url_prefix 前缀
8585
from plugins.{plugins_name} import apps
8686

backend/conf/env.example.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# ================================================= #
44
# 数据库地址
55
DATABASE_ENGINE = "django.db.backends.mysql"
6-
# 数据库地址
6+
# 数据库地址 改为自己数据库地址
77
DATABASE_HOST = "127.0.0.1"
88
# 数据库端口
99
DATABASE_PORT = 3306
@@ -13,3 +13,10 @@
1313
DATABASE_PASSWORD = "123456"
1414
# 数据库名
1515
DATABASE_NAME = "dvadmin_pro"
16+
# ================================================= #
17+
# ************** 其他 配置 ************** #
18+
# ================================================= #
19+
DEBUG = True # 线上环境请设置为True
20+
# 是否启用插件,不需要可以设置为False
21+
ENABLE_PLUGINS = True
22+
ALLOWED_HOSTS = ["*"]

backend/docker_start.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# python manage.py makemigrations
2+
# python manage.py migrate
3+
# python manage.py init -y
4+
daphne -b 0.0.0.0 -p 8000 application.asgi:application

backend/dvadmin/system/initialize.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
django.setup()
1010

1111
from dvadmin.system.models import Dept, Button, Menu, MenuButton, Role, Users
12+
from dvadmin.system.util import init_area
1213

1314

1415
class Initialize(CoreInitialize):
@@ -77,6 +78,9 @@ def init_menu(self):
7778
{"id": "97b8fd88-0510-4db7-8d53-983a04843c4c", "name": "字典管理", "sort": 1, "web_path": "/dictionary",
7879
"icon": "clock-o", "parent_id": "54f769b0-3dff-416c-8102-e55ec44827cc", "component": "system/dictionary",
7980
"component_name": "dictionary"},
81+
{"id": "97b8fd88-0510-4db7-8d53-983a04844c4c", "name": "地区管理", "sort": 6, "web_path": "/area",
82+
"icon": "area-chart", "parent_id": "54f769b0-3dff-416c-8102-e55ec44827cc", "component": "system/area",
83+
"component_name": "dictionary"},
8084
{"id": "805390f3-a6e6-411e-9798-eebd34b76204", "name": "附件管理", "sort": 7, "web_path": "",
8185
"icon": "envelope", "parent_id": "54f769b0-3dff-416c-8102-e55ec44827cc", },
8286
{"id": "ac956a17-87d3-4b61-8f72-44a97b9fbcd1", "name": "图片管理", "sort": 1, "web_path": "/img",
@@ -264,6 +268,7 @@ def run(self):
264268
self.init_menu_button()
265269
self.init_role()
266270
self.init_users()
271+
init_area.main() # 初始化地区数据
267272

268273

269274
# 项目init 初始化,默认会执行 main 方法进行初始化

backend/dvadmin/system/models.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ class Menu(CoreModel):
127127
(1, "是"),
128128
)
129129
is_link = models.IntegerField(choices=ISLINK_CHOICES, default=0, verbose_name="是否外链", help_text="是否外链")
130-
is_catalog = models.IntegerField(choices=ISLINK_CHOICES,default=0,verbose_name="是否目录",help_text="是否目录")
130+
is_catalog = models.IntegerField(choices=ISLINK_CHOICES, default=0, verbose_name="是否目录", help_text="是否目录")
131131
web_path = models.CharField(max_length=128, verbose_name="路由地址", null=True, blank=True, help_text="路由地址")
132132
component = models.CharField(max_length=128, verbose_name="组件地址", null=True, blank=True, help_text="组件地址")
133133
component_name = models.CharField(max_length=50, verbose_name="组件名称", null=True, blank=True, help_text="组件名称")
@@ -263,3 +263,23 @@ class Meta:
263263
verbose_name = '文件管理'
264264
verbose_name_plural = verbose_name
265265
ordering = ('-create_datetime',)
266+
267+
268+
class Area(CoreModel):
269+
name = models.CharField(max_length=100, verbose_name="名称", help_text="名称")
270+
code = models.CharField(max_length=20, verbose_name="地区编码", help_text="地区编码", unique=True, db_index=True)
271+
level = models.BigIntegerField(verbose_name="地区层级(1省份 2城市 3区县 4乡级)", help_text="地区层级(1省份 2城市 3区县 4乡级)")
272+
pinyin = models.CharField(max_length=255, verbose_name="拼音", help_text="拼音")
273+
initials = models.CharField(max_length=20, verbose_name="首字母", help_text="首字母")
274+
enable = models.BooleanField(default=True, verbose_name="是否启用", help_text="是否启用")
275+
pcode = models.ForeignKey(to='self', verbose_name='父地区编码', to_field="code", on_delete=models.CASCADE,
276+
db_constraint=False, null=True, blank=True, help_text="父地区编码")
277+
278+
class Meta:
279+
db_table = table_prefix + "area"
280+
verbose_name = '地区表'
281+
verbose_name_plural = verbose_name
282+
ordering = ('code',)
283+
284+
def __str__(self):
285+
return f"{self.name}"

backend/dvadmin/system/urls.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
from django.urls import path, re_path
1010
from rest_framework import routers
1111

12+
from dvadmin.system.views.area import AreaViewSet
1213
from dvadmin.system.views.button import ButtonViewSet
1314
from dvadmin.system.views.dept import DeptViewSet
1415
from dvadmin.system.views.dictionary import DictionaryViewSet
@@ -28,16 +29,15 @@
2829
system_url.register(r'dept', DeptViewSet)
2930
system_url.register(r'user', UserViewSet)
3031
system_url.register(r'operation_log', OperationLogViewSet)
31-
system_url.register(r'dictionary',DictionaryViewSet)
32-
system_url.register(r'img',ImgViewSet)
33-
system_url.register(r'file',FileViewSet)
34-
35-
32+
system_url.register(r'dictionary', DictionaryViewSet)
33+
system_url.register(r'area', AreaViewSet)
34+
system_url.register(r'img', ImgViewSet)
35+
system_url.register(r'file', FileViewSet)
3636

3737
urlpatterns = [
3838
re_path('role/role_id_to_menu/(?P<pk>.*?)/', RoleViewSet.as_view({'get': 'roleId_to_menu'})),
3939
path('menu/web_router/', MenuViewSet.as_view({'get': 'web_router'})),
40-
path('user/user_info/',UserViewSet.as_view({'get':'user_info','put':'update_user_info'})),
41-
re_path('user/change_password/(?P<pk>.*?)/',UserViewSet.as_view({'put':'change_password'})),
40+
path('user/user_info/', UserViewSet.as_view({'get': 'user_info', 'put': 'update_user_info'})),
41+
re_path('user/change_password/(?P<pk>.*?)/', UserViewSet.as_view({'put': 'change_password'})),
4242
]
4343
urlpatterns += system_url.urls
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
# 城市联动
2+
"""
3+
到乡级 使用方法
4+
1. https://www.npmjs.com/package/china-division 下载数据,把对应的json放入对应目录
5+
2. 修改此文件中对应json名
6+
3. 右击执行此py文件进行初始化
7+
"""
8+
import json
9+
import os
10+
11+
import django
12+
import pypinyin
13+
14+
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
15+
django.setup()
16+
from application.settings import BASE_DIR
17+
from dvadmin.system.models import Area
18+
19+
area_code_list = []
20+
21+
22+
def area_list(code_list, pcode=None, depth=1):
23+
"""
24+
递归获取所有列表
25+
"""
26+
for code_dict in code_list:
27+
code = code_dict.get('code', None)
28+
name = code_dict.get('name', None)
29+
children = code_dict.get('children', None)
30+
pinyin = ''.join([''.join(i) for i in pypinyin.pinyin(name, style=pypinyin.NORMAL)])
31+
area_code_list.append(
32+
{
33+
"name": name,
34+
"code": code,
35+
"level": depth,
36+
"pinyin": pinyin,
37+
"initials": pinyin[0].upper() if pinyin else "#",
38+
"pcode_id": pcode,
39+
}
40+
)
41+
if children:
42+
area_list(code_list=children, pcode=code, depth=depth + 1)
43+
44+
45+
def main():
46+
with open(os.path.join(BASE_DIR, 'dvadmin', 'system', 'util', 'pca-code.json'), 'r') as load_f:
47+
code_list = json.load(load_f)
48+
area_list(code_list)
49+
if Area.objects.count() == 0:
50+
Area.objects.bulk_create([Area(**ele) for ele in area_code_list])
51+
else:
52+
for ele in area_code_list:
53+
code = ele.pop("code")
54+
Area.objects.update_or_create(code=code, defaults=ele)
55+
56+
57+
if __name__ == '__main__':
58+
main()

backend/dvadmin/system/util/pca-code.json

Lines changed: 1 addition & 0 deletions
Large diffs are not rendered by default.

0 commit comments

Comments
 (0)