From ef0445d7f3e405c152b4a2d05449422834b04a8d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com>
Date: Sat, 6 May 2023 14:36:21 +0800
Subject: [PATCH 1/9] =?UTF-8?q?perf:=20=E2=9A=A1=20=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=9B=BE=E8=A1=A8=E5=B7=A6=E4=BE=A7=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web/src/views/dashboard/workbench/components/loginRegion.vue | 2 +-
web/src/views/dashboard/workbench/components/registeredUser.vue | 2 +-
web/src/views/dashboard/workbench/components/userLogin.vue | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/web/src/views/dashboard/workbench/components/loginRegion.vue b/web/src/views/dashboard/workbench/components/loginRegion.vue
index f867ee0..c83adab 100644
--- a/web/src/views/dashboard/workbench/components/loginRegion.vue
+++ b/web/src/views/dashboard/workbench/components/loginRegion.vue
@@ -104,7 +104,7 @@ export default {
},
grid: {
top: 40,
- left: 40,
+ left: 60,
right: 65,
bottom: 75
},
diff --git a/web/src/views/dashboard/workbench/components/registeredUser.vue b/web/src/views/dashboard/workbench/components/registeredUser.vue
index 6841240..6ecc7af 100644
--- a/web/src/views/dashboard/workbench/components/registeredUser.vue
+++ b/web/src/views/dashboard/workbench/components/registeredUser.vue
@@ -95,7 +95,7 @@ export default {
},
grid: {
top: 40,
- left: 40,
+ left: 60,
right: 65,
bottom: 60
},
diff --git a/web/src/views/dashboard/workbench/components/userLogin.vue b/web/src/views/dashboard/workbench/components/userLogin.vue
index 8cd00fe..19885fe 100644
--- a/web/src/views/dashboard/workbench/components/userLogin.vue
+++ b/web/src/views/dashboard/workbench/components/userLogin.vue
@@ -98,7 +98,7 @@ export default {
},
grid: {
top: 40,
- left: 40,
+ left: 60,
right: 65,
bottom: 60
},
From fc33d271d8de4f444f6f43053f5b74f14e74467c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com>
Date: Sat, 6 May 2023 15:10:30 +0800
Subject: [PATCH 2/9] =?UTF-8?q?perf:=20=E2=9A=A1=20=E4=BC=98=E5=8C=96?=
=?UTF-8?q?=E9=A6=96=E9=A1=B5=E5=9B=BE=E8=A1=A8=E5=B7=A6=E4=BE=A7=E6=95=B0?=
=?UTF-8?q?=E6=8D=AE=E6=98=BE=E7=A4=BA=E4=B8=8D=E5=85=A8bug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/application/settings.py | 13 ++++++++-----
backend/conf/env.example.py | 5 +++++
.../dashboard/workbench/components/loginRegion.vue | 2 +-
.../workbench/components/registeredUser.vue | 2 +-
.../dashboard/workbench/components/userLogin.vue | 2 +-
5 files changed, 16 insertions(+), 8 deletions(-)
diff --git a/backend/application/settings.py b/backend/application/settings.py
index 6a3904d..735a488 100644
--- a/backend/application/settings.py
+++ b/backend/application/settings.py
@@ -366,14 +366,17 @@ CAPTCHA_CHALLENGE_FUNCT = "captcha.helpers.math_challenge" # 加减乘除验证
# ================================================= #
DEFAULT_AUTO_FIELD = "django.db.models.AutoField"
-API_LOG_ENABLE = True
+# 是否启动API日志记录
+API_LOG_ENABLE = locals().get("API_LOG_ENABLE", True)
+# API 日志记录的请求方式
+API_LOG_METHODS = locals().get("API_LOG_METHODS", ["POST", "UPDATE", "DELETE", "PUT"])
# API_LOG_METHODS = 'ALL' # ['POST', 'DELETE']
-API_LOG_METHODS = ["POST", "UPDATE", "DELETE", "PUT"] # ['POST', 'DELETE']
-API_MODEL_MAP = {
+# 在操作日志中详细记录的请求模块映射
+API_MODEL_MAP = locals().get("API_MODEL_MAP", {
"/token/": "登录模块",
"/api/login/": "登录模块",
- "/api/plugins_market/plugins/": "插件市场",
-}
+ "/api/logout/": "登录模块",
+})
DJANGO_CELERY_BEAT_TZ_AWARE = False
CELERY_TIMEZONE = "Asia/Shanghai" # celery 时区问题
diff --git a/backend/conf/env.example.py b/backend/conf/env.example.py
index 9ff3bcf..6e2de5f 100644
--- a/backend/conf/env.example.py
+++ b/backend/conf/env.example.py
@@ -39,6 +39,11 @@ DEBUG = True
ENABLE_LOGIN_ANALYSIS_LOG = True
# 登录接口 /api/token/ 是否需要验证码认证,用于测试,正式环境建议取消
LOGIN_NO_CAPTCHA_AUTH = True
+# 是否启动API日志记录
+API_LOG_ENABLE = locals().get("API_LOG_ENABLE", True)
+# API 日志记录的请求方式
+API_LOG_METHODS = locals().get("API_LOG_METHODS", ["POST", "UPDATE", "DELETE", "PUT"])
+# API_LOG_METHODS = 'ALL' # ['POST', 'DELETE']
# ================================================= #
# ****************** 其他 配置 ******************* #
# ================================================= #
diff --git a/web/src/views/dashboard/workbench/components/loginRegion.vue b/web/src/views/dashboard/workbench/components/loginRegion.vue
index c83adab..47136e4 100644
--- a/web/src/views/dashboard/workbench/components/loginRegion.vue
+++ b/web/src/views/dashboard/workbench/components/loginRegion.vue
@@ -104,7 +104,7 @@ export default {
},
grid: {
top: 40,
- left: 60,
+ left: 50,
right: 65,
bottom: 75
},
diff --git a/web/src/views/dashboard/workbench/components/registeredUser.vue b/web/src/views/dashboard/workbench/components/registeredUser.vue
index 6ecc7af..ce18148 100644
--- a/web/src/views/dashboard/workbench/components/registeredUser.vue
+++ b/web/src/views/dashboard/workbench/components/registeredUser.vue
@@ -95,7 +95,7 @@ export default {
},
grid: {
top: 40,
- left: 60,
+ left: 50,
right: 65,
bottom: 60
},
diff --git a/web/src/views/dashboard/workbench/components/userLogin.vue b/web/src/views/dashboard/workbench/components/userLogin.vue
index 19885fe..d0672db 100644
--- a/web/src/views/dashboard/workbench/components/userLogin.vue
+++ b/web/src/views/dashboard/workbench/components/userLogin.vue
@@ -98,7 +98,7 @@ export default {
},
grid: {
top: 40,
- left: 60,
+ left: 50,
right: 65,
bottom: 60
},
From 799642f1b16048aab8f7b29412834c8fbca3d9fd Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com>
Date: Fri, 19 May 2023 16:02:34 +0800
Subject: [PATCH 3/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E5=AF=BC?=
=?UTF-8?q?=E5=85=A5=E6=A8=A1=E6=9D=BF=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/dvadmin/utils/import_export.py | 18 +++++++++---------
backend/dvadmin/utils/import_export_mixin.py | 3 +++
2 files changed, 12 insertions(+), 9 deletions(-)
diff --git a/backend/dvadmin/utils/import_export.py b/backend/dvadmin/utils/import_export.py
index 2bd6e1e..320c72f 100644
--- a/backend/dvadmin/utils/import_export.py
+++ b/backend/dvadmin/utils/import_export.py
@@ -21,9 +21,9 @@ def import_to_data(file_url, field_data, m2m_fields=None):
file_path_dir = os.path.join(settings.BASE_DIR, file_url)
workbook = openpyxl.load_workbook(file_path_dir)
table = workbook[workbook.sheetnames[0]]
- theader = tuple(table.values)[0] #Excel的表头
- is_update = '更新主键(勿改)' in theader #是否导入更新
- if is_update is False: #不是更新时,删除id列
+ theader = tuple(table.values)[0] # Excel的表头
+ is_update = '更新主键(勿改)' in theader # 是否导入更新
+ if is_update is False: # 不是更新时,删除id列
field_data.pop('id')
# 获取参数映射
validation_data_dict = {}
@@ -35,9 +35,10 @@ def import_to_data(file_url, field_data, m2m_fields=None):
for k, v in choices.get("data").items():
data_dict[k] = v
elif choices.get("queryset") and choices.get("values_name"):
- data_list = choices.get("queryset").values(choices.get("values_name"), "id")
+ data_list = choices.get("queryset").values(choices.get("values_name"),
+ choices.get("values_value", "id"))
for ele in data_list:
- data_dict[ele.get(choices.get("values_name"))] = ele.get("id")
+ data_dict[ele.get(choices.get("values_name"))] = ele.get(choices.get("values_value", "id"))
else:
continue
validation_data_dict[key] = data_dict
@@ -53,12 +54,11 @@ def import_to_data(file_url, field_data, m2m_fields=None):
values = items[1]
value_type = 'str'
if isinstance(values, dict):
- value_type = values.get('type','str')
+ value_type = values.get('type', 'str')
cell_value = table.cell(row=row + 1, column=index + 2).value
- if cell_value is None or cell_value=='':
+ if cell_value is None or cell_value == '':
continue
elif value_type == 'date':
- print(61, datetime.strptime(str(cell_value), '%Y-%m-%d %H:%M:%S').date())
try:
cell_value = datetime.strptime(str(cell_value), '%Y-%m-%d %H:%M:%S').date()
except:
@@ -66,7 +66,7 @@ def import_to_data(file_url, field_data, m2m_fields=None):
elif value_type == 'datetime':
cell_value = datetime.strptime(str(cell_value), '%Y-%m-%d %H:%M:%S')
else:
- # 由于excel导入数字类型后,会出现数字加 .0 的,进行处理
+ # 由于excel导入数字类型后,会出现数字加 .0 的,进行处理
if type(cell_value) is float and str(cell_value).split(".")[1] == "0":
cell_value = int(str(cell_value).split(".")[0])
elif type(cell_value) is str:
diff --git a/backend/dvadmin/utils/import_export_mixin.py b/backend/dvadmin/utils/import_export_mixin.py
index 44f51cc..4f6a807 100644
--- a/backend/dvadmin/utils/import_export_mixin.py
+++ b/backend/dvadmin/utils/import_export_mixin.py
@@ -1,4 +1,5 @@
# -*- coding: utf-8 -*-
+from types import FunctionType, MethodType
from urllib.parse import quote
from django.db import transaction
@@ -68,6 +69,8 @@ class ImportSerializerMixin:
:return:
"""
assert self.import_field_dict, "'%s' 请配置对应的导出模板字段。" % self.__class__.__name__
+ if isinstance(self.import_field_dict, MethodType) or isinstance(self.import_field_dict, FunctionType):
+ self.import_field_dict = self.import_field_dict()
# 导出模板
if request.method == "GET":
# 示例数据
From 56f177a3cc19180fa54301c38f3eb5d9b59ea3da Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com>
Date: Fri, 19 May 2023 16:15:50 +0800
Subject: [PATCH 4/9] =?UTF-8?q?=E4=BC=98=E5=8C=96=EF=BC=9A=E5=AF=BC?=
=?UTF-8?q?=E5=85=A5=E6=A8=A1=E6=9D=BF=E4=BC=98=E5=8C=96?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/dvadmin/utils/import_export_mixin.py | 2 ++
1 file changed, 2 insertions(+)
diff --git a/backend/dvadmin/utils/import_export_mixin.py b/backend/dvadmin/utils/import_export_mixin.py
index 4f6a807..1836f3b 100644
--- a/backend/dvadmin/utils/import_export_mixin.py
+++ b/backend/dvadmin/utils/import_export_mixin.py
@@ -163,6 +163,8 @@ class ImportSerializerMixin:
assert self.import_field_dict, "'%s' 请配置对应的导入模板字段。" % self.__class__.__name__
assert self.import_serializer_class, "'%s' 请配置对应的导入序列化器。" % self.__class__.__name__
data = self.import_serializer_class(queryset, many=True, request=request).data
+ if isinstance(self.import_field_dict, MethodType) or isinstance(self.import_field_dict, FunctionType):
+ self.import_field_dict = self.import_field_dict()
# 导出excel 表
response = HttpResponse(content_type="application/msexcel")
response["Access-Control-Expose-Headers"] = f"Content-Disposition"
From c38580682ca9abac765bbb87dd5021925332b96b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com>
Date: Sat, 27 May 2023 22:19:58 +0800
Subject: [PATCH 5/9] =?UTF-8?q?bug=E4=BF=AE=E5=A4=8D:=E7=94=A8=E6=88=B7?=
=?UTF-8?q?=E7=AE=A1=E7=90=86=E5=AF=BC=E5=87=BAbug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
web/src/views/system/user/api.js | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/web/src/views/system/user/api.js b/web/src/views/system/user/api.js
index 8f88c54..3d18ded 100644
--- a/web/src/views/system/user/api.js
+++ b/web/src/views/system/user/api.js
@@ -61,8 +61,8 @@ export function ResetPwd (obj) {
*/
export function exportData (params) {
return downloadFile({
- url: urlPrefix + 'export/',
+ url: urlPrefix + 'export_data/',
params: params,
- method: 'post'
+ method: 'get'
})
}
From 83fcae3c51aba4be3842cdbd1d9c44cde3f69b94 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8C=BF=E5=B0=8F=E5=A4=A9?= <1638245306@qq.com>
Date: Sat, 27 May 2023 22:37:02 +0800
Subject: [PATCH 6/9] =?UTF-8?q?=E4=BF=AE=E5=A4=8DBUG:=20generate=5Finit=5F?=
=?UTF-8?q?json=E7=94=9F=E6=88=90=E7=9A=84=E6=96=87=E4=BB=B6=E6=A0=BC?=
=?UTF-8?q?=E5=BC=8F=E6=9C=89=E9=97=AE=E9=A2=98?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../dvadmin/system/management/commands/generate_init_json.py | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/backend/dvadmin/system/management/commands/generate_init_json.py b/backend/dvadmin/system/management/commands/generate_init_json.py
index 6b265ef..4877c6d 100644
--- a/backend/dvadmin/system/management/commands/generate_init_json.py
+++ b/backend/dvadmin/system/management/commands/generate_init_json.py
@@ -34,7 +34,7 @@ class Command(BaseCommand):
def serializer_data(self, serializer, query_set: QuerySet):
serializer = serializer(query_set, many=True)
data = json.loads(json.dumps(serializer.data, ensure_ascii=False))
- with open(os.path.join(BASE_DIR, f'init_{query_set.model._meta.model_name}.json'), 'w') as f:
+ with open(os.path.join(BASE_DIR, f'init_{query_set.model._meta.model_name}.json'), 'w',encoding="utf-8") as f:
json.dump(data, f, indent=4, ensure_ascii=False)
return
From c9db7993043ece2ff380b87b99b87edaf1f40ec8 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com>
Date: Sun, 28 May 2023 12:14:39 +0800
Subject: [PATCH 7/9] =?UTF-8?q?perf:=20=F0=9F=90=9B=20=E4=BF=AE=E5=A4=8D?=
=?UTF-8?q?=E7=94=A8=E6=88=B7=E7=99=BB=E5=BD=95=E5=90=8E=EF=BC=8C=E6=AF=8F?=
=?UTF-8?q?=E6=AC=A1=E9=83=BD=E4=BC=9A=E5=8F=98=E5=8C=96=E5=AF=86=E7=A0=81?=
=?UTF-8?q?=E5=8A=A0=E5=AF=86=E5=80=BCbug?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
backend/dvadmin/system/views/user.py | 10 +++++-----
backend/dvadmin/utils/backends.py | 20 +++++++++++++-------
2 files changed, 18 insertions(+), 12 deletions(-)
diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py
index 66b298f..78a86ea 100644
--- a/backend/dvadmin/system/views/user.py
+++ b/backend/dvadmin/system/views/user.py
@@ -1,6 +1,6 @@
import hashlib
-from django.contrib.auth.hashers import make_password
+from django.contrib.auth.hashers import make_password, check_password
from django_restql.fields import DynamicSerializerMethodField
from rest_framework import serializers
from rest_framework.decorators import action, permission_classes
@@ -347,10 +347,10 @@ class UserViewSet(CustomModelViewSet):
return ErrorResponse(msg="参数不能为空")
if new_pwd != new_pwd2:
return ErrorResponse(msg="两次密码不匹配")
- check_password = request.user.check_password(old_pwd)
- if not check_password:
- check_password = request.user.check_password(hashlib.md5(old_pwd.encode(encoding='UTF-8')).hexdigest())
- if check_password:
+ verify_password = check_password(old_pwd, self.request.user.password)
+ if not verify_password:
+ verify_password = check_password(hashlib.md5(old_pwd.encode(encoding='UTF-8')).hexdigest(), self.request.user.password)
+ if verify_password:
request.user.password = make_password(new_pwd)
request.user.save()
return DetailResponse(data=None, msg="修改成功")
diff --git a/backend/dvadmin/utils/backends.py b/backend/dvadmin/utils/backends.py
index 92ed5ec..4b28024 100644
--- a/backend/dvadmin/utils/backends.py
+++ b/backend/dvadmin/utils/backends.py
@@ -3,8 +3,11 @@ import logging
from django.contrib.auth import get_user_model
from django.contrib.auth.backends import ModelBackend
+from django.contrib.auth.hashers import check_password
from django.utils import timezone
+from dvadmin.utils.validator import CustomValidationError
+
logger = logging.getLogger(__name__)
UserModel = get_user_model()
@@ -24,10 +27,13 @@ class CustomBackend(ModelBackend):
except UserModel.DoesNotExist:
UserModel().set_password(password)
else:
- check_password = user.check_password(password)
- if not check_password:
- check_password = user.check_password(hashlib.md5(password.encode(encoding='UTF-8')).hexdigest())
- if check_password and self.user_can_authenticate(user):
- user.last_login = timezone.now()
- user.save()
- return user
+ verify_password = check_password(password, user.password)
+ if not verify_password:
+ password = hashlib.md5(password.encode(encoding='UTF-8')).hexdigest()
+ verify_password = check_password(password, user.password)
+ if verify_password:
+ if self.user_can_authenticate(user):
+ user.last_login = timezone.now()
+ user.save()
+ return user
+ raise CustomValidationError("当前用户已被禁用,请联系管理员!")
From b8fa4e7b2ad6ea89859182d8c1070ade72a20071 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com>
Date: Sun, 28 May 2023 13:24:51 +0800
Subject: [PATCH 8/9] =?UTF-8?q?perf:=20=F0=9F=90=9B=20filter=5Ffields?=
=?UTF-8?q?=E4=BD=BF=E7=94=A8exact=E6=97=A0=E6=95=88=EF=BC=8C=E4=BD=BF?=
=?UTF-8?q?=E7=94=A8icontains=E7=AD=89=E6=8A=A5=E9=94=99?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
fix: https://gitee.com/liqianglog/django-vue-admin/issues/I6QZW5
---
backend/dvadmin/system/views/user.py | 6 +++---
backend/dvadmin/utils/filters.py | 13 +++++++++----
2 files changed, 12 insertions(+), 7 deletions(-)
diff --git a/backend/dvadmin/system/views/user.py b/backend/dvadmin/system/views/user.py
index 78a86ea..23bb19a 100644
--- a/backend/dvadmin/system/views/user.py
+++ b/backend/dvadmin/system/views/user.py
@@ -251,9 +251,9 @@ class UserViewSet(CustomModelViewSet):
update_serializer_class = UserUpdateSerializer
# filter_fields = ["name", "username", "gender", "is_active", "dept", "user_type"]
filter_fields = {
- "name": ["exact"],
- "mobile": ["exact"],
- "username": ["exact"],
+ "name": ["icontains"],
+ "mobile": ["icontains"],
+ "username": ["icontains"],
"gender": ["icontains"],
"is_active": ["icontains"],
"dept": ["exact"],
diff --git a/backend/dvadmin/utils/filters.py b/backend/dvadmin/utils/filters.py
index 4e157be..6e34639 100644
--- a/backend/dvadmin/utils/filters.py
+++ b/backend/dvadmin/utils/filters.py
@@ -154,12 +154,14 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
"~": "icontains",
}
- def construct_search(self, field_name):
+ def construct_search(self, field_name, lookup_expr=None):
lookup = self.lookup_prefixes.get(field_name[0])
if lookup:
field_name = field_name[1:]
else:
- lookup = "icontains"
+ lookup = lookup_expr
+ if field_name.endswith(lookup):
+ return field_name
return LOOKUP_SEP.join([field_name, lookup])
def find_filter_lookups(self, orm_lookups, search_term_key):
@@ -239,7 +241,10 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
# warn if the field doesn't exist.
if field is None:
undefined.append(field_name)
-
+ # 更新默认字符串搜索为模糊搜索
+ if isinstance(field, (models.CharField)) and filterset_fields == '__all__' and lookups == [
+ 'exact']:
+ lookups = ['icontains']
for lookup_expr in lookups:
filter_name = cls.get_filter_name(field_name, lookup_expr)
@@ -288,7 +293,7 @@ class CustomDjangoFilterBackend(DjangoFilterBackend):
for search_field in filterset.filters:
if isinstance(filterset.filters[search_field], CharFilter):
orm_lookups.append(
- self.construct_search(six.text_type(search_field))
+ self.construct_search(six.text_type(search_field), filterset.filters[search_field].lookup_expr)
)
else:
orm_lookups.append(search_field)
From 3f872cd973e7578a1cf098e19946529cd6571b5b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E6=9D=8E=E5=BC=BA?= <1206709430@qq.com>
Date: Thu, 1 Jun 2023 14:40:52 +0800
Subject: [PATCH 9/9] =?UTF-8?q?docs:=20=F0=9F=93=9D=20=E6=9B=B4=E6=96=B0?=
=?UTF-8?q?=E6=96=87=E6=A1=A3=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.en.md | 76 ++++++++++++++++++++++++++++++++++++++++--------
README.md | 69 +++++++++++++++++++++++++++++++++----------
web/package.json | 2 +-
3 files changed, 118 insertions(+), 29 deletions(-)
diff --git a/README.en.md b/README.en.md
index c4968b1..228c52c 100644
--- a/README.en.md
+++ b/README.en.md
@@ -10,6 +10,21 @@ We are a group of young people who love Code. In this hot era, we hope to calm d
Because of love, so embrace the future
+
+
+🗓️ **「Development Roadmap」**
+
+Please leave your valuable suggestions for creating a more comprehensive dvadmin [Submit Requirements](https://rgej2wr12o.feishu.cn/share/base/form/shrcnsHNfeC9URj6RIOR3xPPD3f) | [Roadmap](https://rgej2wr12o.feishu.cn/base/KevWbAzaEazgD2s8SmKc36PJnwb)
+
+
+
+👩👦👦 **「Essay Competition」**
+
+To promote better community development, we are organizing the dvadmin Essay Competition. Exciting prizes, including **perpetual commercial licenses**, await you. [Click here to view the details](https://bbs.django-vue-admin.com/question/462.html).
+
+
+
+
## framework introduction
💡 [django-vue-admin](https://gitee.com/dvadmin/django-vue-admin) Is a set of all open source rapid development platform, no reservation for individuals and enterprises free use.
@@ -19,11 +34,13 @@ Because of love, so embrace the future
* 👫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.
* 💏 Special thanks:[D2Admin](https://github.com/d2-projects/d2-admin) 、[Vue-Element-Admin](https://github.com/PanJiaChen/vue-element-admin)。
-* 💡 💏 Special thanks:[jetbrains](https://www.jetbrains.com/) To provide a free IntelliJ IDEA license for this open source project.
+* 💡 Special thanks:[jetbrains](https://www.jetbrains.com/) To provide a free IntelliJ IDEA license for this open source project.
+
+
## Online experience
-👩👧👦👩👧👦 demo address:[http://demo.django-vue-admin.com](http://demo.django-vue-admin.com)
+👩👧👦demo address:[http://demo.django-vue-admin.com](http://demo.django-vue-admin.com)
* demo account:superadmin
@@ -31,17 +48,25 @@ Because of love, so embrace the future
👩👦👦docs:[https://django-vue-admin.com](https://django-vue-admin.com)
-## communication
-* Communication community:[click here](https://bbs.django-vue-admin.com)👩👦👦
-* plugins market:[click here](https://bbs.django-vue-admin.com/plugMarket.html)👩👦👦
+## Communication
-## source code url:
+- Communication community:[click here](https://bbs.django-vue-admin.com)👩👦👦
+
+- plugins market:[click here](https://bbs.django-vue-admin.com/plugMarket.html)👩👦👦
+
+- django-vue-admin Discussion Group 01 (Full): 812482043 [Click here to join the group chat](https://qm.qq.com/cgi-bin/qm/qr?k=aJVwjDvH-Es4MPJQuoO32N0SucK22TE5&jump_from=webapi)
+
+- django-vue-admin Discussion Group 02 (Full): 687252418 [Click here to join the group chat](https://qm.qq.com/cgi-bin/qm/qr?k=4jJN4IjWGfxJ8YJXbb_gTsuWjR34WLdc&jump_from=webapi)
+
+- django-vue-admin Discussion Group 03 : 442108213 [Click here to join the group chat](https://qm.qq.com/cgi-bin/qm/qr?k=ESpuF6A1Fcx0XrY4w6CzCvbnjI4kNsa0&jump_from=webapi)
+
+- QR Code Image
+
+
-gitee(Main push):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin)👩👦👦
-github:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin)👩👦👦
## core function
@@ -55,13 +80,38 @@ github:[https://github.com/liqianglog/django-vue-admin](https://github.com/liq
8. 🧑🔧 Regional management: to manage provinces, cities, counties and regions.
9. 📁 Attachment management: Unified management of all files and pictures on the platform.
10. 🗓 ️operation logs: log and query the system normal operation; Log and query system exception information.
-11.🔌 [plugins market] () : based on the Django framework - Vue - Admin application and plug-in development.
+11. 🔌 [plugins market](https://bbs.django-vue-admin.com/plugMarket.html) : based on the Django framework - Vue - Admin application and plug-in development.
+
+## source code url:
+
+gitee(Main push):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin)👩👦👦
+
+github:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin)👩👦👦
+
+| Project | Star | Introduction |
+| ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
+| [django-vue-admin](https://gitee.com/liqianglog/django-vue-admin) | [](https://gitee.com/liqianglog/django-vue-admin) [](https://github.com/liqianglog/django-vue-admin) | Management Dashboard based on
Vue2 + Element + D2Admin + Django. |
+| [django-vue3-admin](https://gitee.com/huge-dream/django-vue3-admin) | [](https://gitee.com/huge-dream/django-vue3-admin) [](https://github.com/huge-dream/django-vue3-admin) | Management Dashboard implemented based on
Vue3 + vue-next-admin + fastcrud + Django. |
## plugins market 🔌
-* Celery Asynchronous task:[dvadmin-celery](https://gitee.com/huge-dream/dvadmin-celery)
-* 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)
+#### [Click here to view the latest development progress](https://rgej2wr12o.feishu.cn/base/KevWbAzaEazgD2s8SmKc36PJnwb?table=tblpongo56gp6zN9&view=vewpLA5Hdc) | [Plugin Market](https://bbs.django-vue-admin.com/plugMarket.html)
+
+| Plugin Name | Development Status | Description |
+| ------------------------------------------------------------ | ------------------ | ------------------------------------------------------------ |
+| [dvadmin3-celery 定时任务](https://bbs.django-vue-admin.com/plugMarket/129.html) | Released | Enables asynchronous tasks in dvadmin3, including task scheduling and record management |
+| [dvadmin-celery 定时任务](https://bbs.django-vue-admin.com/plugMarket/115.html) | Released | Enables asynchronous tasks in dvadmin3, including task scheduling and record management |
+| [dvadmin-sms 短信服务](https://bbs.django-vue-admin.com/plugMarket/128.html) | Released | Integrates SMS service plugins for various platforms |
+| [dvadmin-vform 表单设计器](https://bbs.django-vue-admin.com/plugMarket/118.html) | Released | Low-code form designer plugin |
+| [dvadmin-tenants 多租户管理](https://bbs.django-vue-admin.com/plugMarket/124.html) | Released | Saas mode for multi-tenancy management |
+| [dvadmin-third 第三方用户管理](https://bbs.django-vue-admin.com/plugMarket/122.html) | Released | Plugin for managing third-party users |
+| [dvadmin-ak-sk 加密密钥管理](https://bbs.django-vue-admin.com/plugMarket/120.html) | Released | Manages encryption keys for verifying authentication strings |
+| [dvadmin-pay 支付插件]() | Released | Payment plugin for dvadmin, supports WeChat Pay and Alipay |
+| [dvadmin-uniapp](https://bbs.django-vue-admin.com/plugMarket/130.html) | Released | Uniapp plugin for dvadmin |
+| dvadmin-cloud-storage 云存储插件 | Development | Plugin for storing files using various cloud storage providers |
+| dvadmin-es 搜索插件 | Development | Search plugin for Elasticsearch |
+| dvadmin-low-code-crud 低代码生成 | Development | Low-code generation plugin |
+| dvadmin-flow 工作流插件 | Development | Workflow plugin |
## before start project you need:
@@ -171,5 +221,7 @@ docker-compose up -d --build

+# Commercial License
+

diff --git a/README.md b/README.md
index ed618b2..9406fc1 100644
--- a/README.md
+++ b/README.md
@@ -12,6 +12,20 @@
因为热爱,所以拥抱未来
+
+
+🗓️ **「开发线路」**
+
+请留下您宝贵建议,打造更加完善的dvadmin [需求提交](https://rgej2wr12o.feishu.cn/share/base/form/shrcnsHNfeC9URj6RIOR3xPPD3f) | [需求线路图](https://rgej2wr12o.feishu.cn/base/KevWbAzaEazgD2s8SmKc36PJnwb)
+
+
+
+👩👦👦 **「征文大赛」**
+
+为促进社区的更好发展,现开展dvadmin征文大赛,更有 **永久商业授权** 等丰厚奖品等你来拿 [点我查看详情](https://bbs.django-vue-admin.com/question/462.html)
+
+
+
## 平台简介
💡 [django-vue-admin](https://gitee.com/dvadmin/django-vue-admin) 是一套全部开源的快速开发平台,毫无保留给个人及企业免费使用。
@@ -37,28 +51,21 @@
👩👦👦文档地址:[https://django-vue-admin.com](https://django-vue-admin.com)
-
-
## 交流
- 交流社区:[戳我](https://bbs.django-vue-admin.com)👩👦👦
- 插件市场:[戳我](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交流02群:687252418 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=4jJN4IjWGfxJ8YJXbb_gTsuWjR34WLdc&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交流03群:442108213 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=ESpuF6A1Fcx0XrY4w6CzCvbnjI4kNsa0&jump_from=webapi)
- 二维码
-
-
-## 源码地址
-
-gitee地址(主推):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin)👩👦👦
-
-github地址:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin)👩👦👦
-
-
+
## 内置功能
@@ -74,13 +81,41 @@ github地址:[https://github.com/liqianglog/django-vue-admin](https://github.c
10. 🗓️操作日志:系统正常操作日志记录和查询;系统异常信息日志记录和查询。
11. 🔌[插件市场 ](https://bbs.django-vue-admin.com/plugMarket.html):基于Django-Vue-Admin框架开发的应用和插件。
+## 源码地址
+
+gitee地址(主推):[https://gitee.com/liqianglog/django-vue-admin](https://gitee.com/liqianglog/django-vue-admin)👩👦👦
+
+github地址:[https://github.com/liqianglog/django-vue-admin](https://github.com/liqianglog/django-vue-admin)👩👦👦
+
+| 项目 | Star | 简介 |
+| ------------------------------------------------------------ | ------------------------------------------------------------ | -------------------------------------------- |
+| [django-vue-admin](https://gitee.com/liqianglog/django-vue-admin) | [](https://gitee.com/liqianglog/django-vue-admin) [](https://github.com/liqianglog/django-vue-admin) | 基于 Vue2 + element + d2admin + django 实现的管理后台 |
+| [django-vue3-admin](https://gitee.com/huge-dream/django-vue3-admin) | [](https://gitee.com/huge-dream/django-vue3-admin) [](https://github.com/huge-dream/django-vue3-admin) | 基于 Vue3 + vue-next-admin + fastcrud + django 实现的管理后台 |
+
## 插件市场 🔌
-- 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)
+#### [点我查看最新开发进度](https://rgej2wr12o.feishu.cn/base/KevWbAzaEazgD2s8SmKc36PJnwb?table=tblpongo56gp6zN9&view=vewpLA5Hdc) | [插件市场](https://bbs.django-vue-admin.com/plugMarket.html)
+
+| 插件名称 | 开发状态 | 简介 |
+| --------------------------------------------------------- | -------- | ------------------------------------------------------------ |
+| [dvadmin3-celery 定时任务](https://bbs.django-vue-admin.com/plugMarket/129.html) | 已发布 | 适用dvadmin3可快速使用异步任务,包含在线添加任务、任务记录等 |
+| [dvadmin-celery 定时任务](https://bbs.django-vue-admin.com/plugMarket/115.html) | 已发布 | 适用dvadmin3可快速使用异步任务,包含在线添加任务、任务记录等 |
+| [dvadmin-sms 短信服务](https://bbs.django-vue-admin.com/plugMarket/128.html) | 已发布 | 整合各端的短信服务插件 |
+| [dvadmin-vform 表单设计器](https://bbs.django-vue-admin.com/plugMarket/118.html) | 已发布 | 低代码表单设计器插件 |
+| [dvadmin-tenants 多租户管理](https://bbs.django-vue-admin.com/plugMarket/124.html) | 已发布 | 多租户的saas模式 |
+| [dvadmin-third 第三方用户管理](https://bbs.django-vue-admin.com/plugMarket/122.html) | 已发布 | 第三方用户管理插件 |
+| [dvadmin-ak-sk 加密密钥管理](https://bbs.django-vue-admin.com/plugMarket/120.html) | 已发布 | 用于加密认证字符串来验证认证字符串的密钥 |
+| [dvadmin-pay 支付插件]() | 已发布 | 适用于dvadmin的支付插件,支持微信支持、支付宝支付 |
+| [dvadmin-uniapp](https://bbs.django-vue-admin.com/plugMarket/130.html) | 已发布 | 适用于dvadmin的uniapp插件 |
+| dvadmin-cloud-storage 云存储插件 | 开发中 | 适用各种云存储进行存储插件 |
+| dvadmin-es 搜索插件 | 开发中 | 适用于es的搜索插件 |
+| dvadmin-low-code-crud 低代码生成 | 开发中 | 低代码生成插件 |
+| dvadmin-flow 工作流插件 | 开发中 | 工作流插件 |
+
+
## 准备工作
+
~~~
Python >= 3.8.0 (推荐3.8+版本)
nodejs >= 14.0 (推荐最新)
@@ -196,6 +231,8 @@ docker-compose up -d --build

+#商业授权
+

diff --git a/web/package.json b/web/package.json
index 7399dc0..5edf210 100644
--- a/web/package.json
+++ b/web/package.json
@@ -1,6 +1,6 @@
{
"name": "django-vue-admin",
- "version": "2.1.3",
+ "version": "2.1.4",
"scripts": {
"serve": "vue-cli-service serve --open",
"start": "npm run serve",