# Conflicts:
#	README.md
pull/99/MERGE v2.1.4
李强 2023-06-01 14:59:26 +08:00
commit 2bc79d48bb
15 changed files with 180 additions and 68 deletions

View File

@ -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 accountsuperadmin
@ -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
<img src='https://foruda.gitee.com/images/1685090287886551832/e3afa9e1_5074988.png' width='200'>
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] (<https://bbs.django-vue-admin.com/plugMarket.html>) : 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 <br />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 <br />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)

View File

@ -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,8 +51,6 @@
👩‍👦‍👦文档地址:[https://django-vue-admin.com](https://django-vue-admin.com)
## 交流
- 交流社区:[戳我](https://bbs.django-vue-admin.com)👩‍👦‍👦
@ -46,20 +58,14 @@
- 插件市场:[戳我](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交流03群442108213 [点击链接加入群聊](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=kwmm0yWKN927XnoMRrfpOM0WQFsrhRHX&authKey=8VzzQW73dHSI%2F2LnN%2Fsiffk%2FMRjesIO%2B6j7by1N%2BoizpAExQAjb887tXfWQa7wbT&noverify=0&group_code=442108213)
- django-vue-admin交流03群442108213 [点击链接加入群聊](https://qm.qq.com/cgi-bin/qm/qr?k=ESpuF6A1Fcx0XrY4w6CzCvbnjI4kNsa0&jump_from=webapi)
- 二维码
<img src='https://foruda.gitee.com/images/1684571588696924229/2d16437f_7947594.png' width='200'>
## 源码地址
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)👩‍👦‍👦
<img src='https://foruda.gitee.com/images/1685090287886551832/e3afa9e1_5074988.png' width='200'>
## 内置功能
@ -75,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 (推荐最新)
@ -197,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)

View File

@ -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 时区问题

View File

@ -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']
# ================================================= #
# ****************** 其他 配置 ******************* #
# ================================================= #

View File

@ -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

View File

@ -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
@ -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"],
@ -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="修改成功")

View File

@ -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):
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("当前用户已被禁用,请联系管理员!")

View File

@ -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)

View File

@ -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:

View File

@ -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":
# 示例数据
@ -160,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"

View File

@ -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",

View File

@ -104,7 +104,7 @@ export default {
},
grid: {
top: 40,
left: 40,
left: 50,
right: 65,
bottom: 75
},

View File

@ -95,7 +95,7 @@ export default {
},
grid: {
top: 40,
left: 40,
left: 50,
right: 65,
bottom: 60
},

View File

@ -98,7 +98,7 @@ export default {
},
grid: {
top: 40,
left: 40,
left: 50,
right: 65,
bottom: 60
},

View File

@ -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'
})
}