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) | [![Gitee star](https://gitee.com/liqianglog/django-vue-admin/badge/star.svg?theme=white)](https://gitee.com/liqianglog/django-vue-admin) [![GitHub stars](https://img.shields.io/github/stars/liqianglog/django-vue-admin.svg?style=social&label=Stars)](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) | [![Gitee star](https://gitee.com/huge-dream/django-vue3-admin/badge/star.svg?theme=white)](https://gitee.com/huge-dream/django-vue3-admin) [![GitHub stars](https://img.shields.io/github/stars/huge-dream/django-vue3-admin.svg?style=social&label=Stars)](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 ![image-12](https://foruda.gitee.com/images/1681118517168485285/f34152ba_5074988.png) +# Commercial License + ![image-13](https://foruda.gitee.com/images/1681118527820910716/43a7c660_5074988.png) 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) | [![Gitee star](https://gitee.com/liqianglog/django-vue-admin/badge/star.svg?theme=white)](https://gitee.com/liqianglog/django-vue-admin) [![GitHub stars](https://img.shields.io/github/stars/liqianglog/django-vue-admin.svg?style=social&label=Stars)](https://github.com/liqianglog/django-vue-admin) | 基于 Vue2 + element + d2admin + django 实现的管理后台 | +| [django-vue3-admin](https://gitee.com/huge-dream/django-vue3-admin) | [![Gitee star](https://gitee.com/huge-dream/django-vue3-admin/badge/star.svg?theme=white)](https://gitee.com/huge-dream/django-vue3-admin) [![GitHub stars](https://img.shields.io/github/stars/huge-dream/django-vue3-admin.svg?style=social&label=Stars)](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 ![image-12](https://foruda.gitee.com/images/1681118517168485285/f34152ba_5074988.png) +#商业授权 + ![image-13](https://foruda.gitee.com/images/1681118527820910716/43a7c660_5074988.png) 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",