Django
我是py呀
py_学习,发布一些我在学习中遇到的问题和经验总结,大家一起学习呀~
展开
-
完整电商项目--(十一)后台管理项目(drf)(2):django-rest-framework-simplejwt实现登录功能
文章目录jwt使用包:djangorestframework-simplejwt安装使用配置jwt包实现登陆业务逻辑(深入包的源码)校验数据自定义返回结果获取数据jwt使用包:djangorestframework-simplejwt文档中推荐的第三方软件包安装使用pip install djangorestframework-simplejwt配置在Django settings中配置后端REST_FRAMEWORK = { ... 'DEFAULT_AUTHEN原创 2020-08-28 17:53:35 · 1473 阅读 · 0 评论 -
完整电商项目--(十一)后台管理项目(drf)(1):CORS跨域与JWT
文章目录跨域CORS(跨域资源共享)背景解决方案关于允许访问白名单:CORS_ALLOWED_ORIGINS允许互相访问cookie:CORS_ALLOW_CREDENTIALStoken机制流程1. 生成token2. 前端存储token字符串3.将token携带再请求当中,交由后端验证注意JWT(Json Web Token) 基于token的鉴权机制基本流程jwt的基本构成(1)headerpayloadsignaturesignature作用加密介绍跨域CORS(跨域资源共享)背景我们采用设原创 2020-08-27 21:53:47 · 809 阅读 · 0 评论 -
完整电商项目--(十)性能优化(1): 首页静态化
文章目录首页静态化介绍首页常用方案定时生成在哪里找到渲染后的html页面?保存静态页面的代码(部分)如何设置定时? 定期调用该方法生成新的静态页面安装包,用来让django调用linux的定时器首页静态化介绍场景:当数据辩护很小时,可以将页面静态化,首页静态化就是,将首页的渲染完成的html页面保存起来优点:不需要Django执行不需要mysql(数据库)执行提升性能,提高服务器的执行效率首页常用方案定时生成在哪里找到渲染后的html页面?我们知道 render函数返回的是原创 2020-08-25 16:09:13 · 461 阅读 · 0 评论 -
完整电商项目--(八)商品订单模块(2): mysql乐观锁与 事务隔离级别
文章目录什么是并发?前情提要:并发场景解决并发的方式:(1) 排队(2) 利用 **‘锁’**的方案。悲观锁乐观锁mysql事务隔离级别的问题mysql事务级别Serializable:Repeatable read(默认):Read committed:Read uncommitted:修改事务级别方式(ubuntu):现在是时候上我们的处理业务代码了什么是并发?前情提要:上节事务解决的问题是,多个逻辑任务之间是 必须同时成功,或者同时失败的(比如创建订单对象与创建订单商品对象)并发场景当原创 2020-08-24 22:25:56 · 608 阅读 · 0 评论 -
完整电商项目--(八)商品订单模块(1):订单结算与 mysql事务
文章目录订单结算页面重点:提交订单创建订单数据表注意事项:订单表介绍提交订单数据:订单结算页面位置:在购物车中选择好商品之后,就 可以点击 去结算按钮,进入到这个结算页面这里最关键的一点是:涉及到金钱的交易,要保证数据的准确性!我们不能相信前端 传递过来的 商品价格信息,而是应该自己根据redis当中勾选的商品id,进行计算价格。其他的并没有什么好说的,前端需要的数据从后端传递过去即可(1)用户地址信息(2)支付方式选择支付方式,我们 直接选择是0,1就可以代表那种支原创 2020-08-24 20:48:07 · 4848 阅读 · 0 评论 -
完整电商项目--(七)购物车模块(1)
文章目录购物车存储方案用户登录用户未登录存储数据存储位置存储类型存储逻辑说明数据安全处理:pickle模块介绍base64模块介绍下面是具体的代码实现增加购物车redis中cookie中删除购物车redis中删除cookie购物车全选购物车redis中:cookie中合并购物车购物车存储方案分两种情况用户登录描述一条完整的购物车记录需要用户、商品、数量、勾选状态存储数据:user_id、sku_id、count、selected存储位置:选择redis数据库数据存储类型(1原创 2020-08-23 16:13:56 · 4244 阅读 · 0 评论 -
完整电商项目--(六)商品模块(8):用户浏览记录
文章目录用户浏览记录介绍[redis 数据类型选择(文档)](http://redisdoc.com/list/lrem.html)redis存储逻辑读取数据命令用户浏览记录介绍我们记录用户的最多五条 浏览历史商品记录,并呈现使用redis 作为存储redis 数据类型选择(文档)需求分析我们需要 保存每个用户五条浏览记录,且要知道该用户是谁数据类型选择:采用 list 类型实现存储格式:history_user_id’ : [sku_id_1, sku_id_2, …]原创 2020-08-22 21:21:57 · 1124 阅读 · 0 评论 -
完整电商项目--(六)商品模块(7):商品详情页
文章目录商品详情页业务分析业务spu商品规格查询第一步:明确这是商品详情页!第二步:查询规格选项信息规格选项上的链接构造:**重点来了!商品详情页业务分析1.商品频道分类(讲过)2.面包屑导航(讲过)3.热销排行(讲过)4.商品SKU信息(详情信息)(查询)5.SKU规格信息(讲过)6.商品详情介绍、规格与包装、售后服务(查询)7.商品评价(查询)8.访问量统计其他的都没得说,我们主要讲解商品的详情页的 sku 规格展示,和 商品访问量统计业务spu商品规格查询就是我们上面原创 2020-08-22 18:03:24 · 3925 阅读 · 0 评论 -
完整电商项目--(六)商品模块(6):商品搜索Elasticsearch
文章目录Elasticsearch介绍安装:docker配置Elasticsearch-ik使用docker运行Elasticsearch-ikHaystack介绍安装django中注册应用和路由Haystack配置Haystack建立数据索引1.创建索引类创建text字段索引值模板文件3.手动生成初始索引Elasticsearch介绍Elasticsearch 是用 Java 实现的,实现全文检索的开源的搜索引擎。它可以快速地储存、搜索和分析海量数据。维基百科、Stack Overflow、Gi原创 2020-08-22 15:29:44 · 1439 阅读 · 0 评论 -
完整电商项目--(六)商品模块(5):商品列表页
商品列表页在哪?当我们进行首页的时候,点击三级分类的 第三级分类,就会进入该商品的 列表页。对应所有商品。我们数据库中只有手机的数据,所以默认点击手机下面就是对列表页的业务进行分析与实现:面包屑导航就是一级级的显示当前的位置。我们知道存储三级分类的表为自关联表,所以直接上代码def get_breadcrumb(cat3): # 面包屑导航,传递三级分类的对象 cat2 = cat3.parent cat1 = cat2.parent # 通过外键,从三级原创 2020-08-20 10:06:24 · 1708 阅读 · 1 评论 -
完整电商项目--(六)商品模块(5):自定义文件存储系统 - fastdfs存储
场景我们默认使用fastdfs 保存上传的文件(默认已经安装好fastdfs,不展开讲这些,先把django的业务实现)我们知道,fastdfs上传文件,会返回给我们一个 url链接,用来访问此文件# 1. 导入FastDFS客户端扩展from fdfs_client.client import Fdfs_client# 2. 创建FastDFS客户端实例client = Fdfs_client('meiduo_mall/utils/fastdfs/client.conf')# 3. 调用原创 2020-08-19 17:25:34 · 342 阅读 · 0 评论 -
完整电商项目--(六)商品模块(4):首页三级分类展示及广告展示
切记联系前文中简述的 数据表的关系三级分类中的数据返回构造:参照这个图片,看下面的数据结构:这是一个难点,最主要的就是以一个好的形式将数据传递,使用{ "1":{ # 这个数字key, 就是代表的 tb_channel_group 表当中的频道 "channels":[ # 这个就是一行,每个频道中包含的一级分类 {"id":1, "name":"手机", "url":"http://shouji.jd.co原创 2020-08-18 21:47:40 · 1732 阅读 · 0 评论 -
完整电商项目--(六)商品模块(3):总览商品信息数据表设计分析(复杂)
有多少张表?他们都是什么?来一张图片,清晰的展示这些表之间的关系从业务逻辑上分析表的作用(一)tb_goods_category(商品类别表):这里模仿京东(淘宝也是一样的! 现在很多网站都在用的,三级分类展示!)上图片:所以我们的首页也有三级分类的效果,他的实现就在于这个表它自关联的表。 存储1,2,3级的分类信息,字段没有什么过多的介绍。很常规。(二)tb_goods 商品(spu):这里我们知道,商品的 评论量,销量,信息,都是在 spu当中实现的,这很符合我们在京原创 2020-08-18 17:58:51 · 3240 阅读 · 0 评论 -
完整电商项目--(六)商品模块(2):首页广告数据表分析
商品这一块涉及了大量的数据表。我们一点点根据业务慢慢分析。首页广告数据库表分析首先上图片:应该有两张数据表(一) 广告类别表(1)这里要先讲一下广告位,我们观察仅供当就是到有很多广告位,这里后来是需要投放广告,赚钱的。具体位置有首页轮播广告,左侧面广告, 还有的搜索出来的商品也是广告(据我以前爬虫的经验,搜索一个商品,一页60个数据,会有5到10个是广告数据,因为 url构造不一样)所以我们要把广告分为不同的类别,不同类别的广告要投放的位置是不一样的(2)字段说明,只有一个原创 2020-08-18 16:30:51 · 535 阅读 · 0 评论 -
完整电商项目--(六)商品模块(1):SPU与SKU - 电商中两个重要的概念
什么是 SPUSPU = Standard Product Unit (标准产品单位)SPU是商品信息聚合的最小单位,是一组可服用、易检索的标准化信息的集合,该集合描述了一个产品的特性通俗的讲,属性值、特性相同的商品就可以归类到一类SPU举例子:我们京东搜索:华为手机p40,这就是一个SPU的概念。他表示一类事物,有些类似于我们python中的类,比较抽象化,与商家、颜色、款式、规格、套餐等都无关。而意具体的意见商品(SKU):比如华为p40,256G,蓝色,20000万像素等等,这是具体的商品原创 2020-08-18 15:59:19 · 1497 阅读 · 0 评论 -
完整电商项目--(五)用户基本信息(3):地址的三级联动--缓存处理
认识缓存django的缓存框架这个文档很详细的介绍了关于缓存的东西。(1)我们之前讲过的设置缓存我们使用的是设置 redis缓存后端。使用django-redis扩展包工具。这些缓存各有优点(2)缓存有很多种这些可以帮助我们完成 基于站点,视图, 模板片段等的缓存。调用方法讲的都很清晰。在阅读过这些之后,我们选择使用 底层的缓存API,因为我们所要缓存的只是一些简单的数据。下面来看下底层接口的用法:增删改查的功能十分详细,并且支持缓存所有的Python数据类型原创 2020-08-17 15:37:18 · 462 阅读 · 0 评论 -
完整电商项目--(五)用户基本信息(2):收货地址
业务分析(纯业务逻辑分析,增删改查我们就不讲代码实现,主要是学习电商设计)这一部分可以参考一般的电商网站做class Address(BaseModel): """用户地址""" user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='addresses', verbose_name='用户') title = models.CharField(max_length=20, verbose原创 2020-08-17 14:52:35 · 2215 阅读 · 0 评论 -
完整电商项目--(五)用户基本信息(1):发送邮件
业务场景当用户在自己的用户中心,填写自己的邮箱的时候。 后台保存起来是很简单的。 但是为了防止恶意的操作,比如 填写的不是自己的邮箱? 填写的根本不是一个邮箱? 填写的邮箱根本不可用?针对这些问题,当用户填写邮箱后, 我们会向用户邮箱发送一封 激活邮件,只有用户点击 激活邮件的链接,才能激活邮件。怎么发送邮件?我们打开django官网,关于发送 邮件的部分有两种常用的发送邮件的函数。send_mail(),send_mass_mail()用于处理大批量的邮件任务,我们选择使用 sen原创 2020-08-17 11:23:10 · 1279 阅读 · 0 评论 -
完整电商项目--(四)用户登录(5):QQ登录- 账号绑定中的数据加密,解密操作itsdangerous
包itsdangerous(官方文档)能够安全的 加密,解密数据保证安全性的方式:私钥安装pip install -U itsdangerous我们使用其中的JWS接口,就是 JSON Web SignatureSerializer找到对应的文档信息:使用这个类提供的功能是带有 时间限制的。通过这个类构建我们自己的加密,解密工具上代码:# 封装以下 加密解密的方法,使用起来更加方便from itsdangerous.jws import TimedJSONWe原创 2020-08-17 09:28:51 · 256 阅读 · 0 评论 -
完整电商项目--(四)用户登录(4):第三方登录-QQ登录(续,关联网站账号)
上一节已经讲过了如何利用第三方QQ登录。下面讲下 绑定 网站账号的操作。(1)创建QQ模型类我们只需要有两个字段user:用来关联 网站账号openid: QQ用户的唯一身份认证信息,相当于身份证。用来调用 openAPI接口,实现业务。class OAuthQQUser(BaseModel): """QQ登陆用户数据""" user = models.ForeignKey('users.User', on_delete=models.CASCADE, verbose_name原创 2020-08-16 22:18:08 · 754 阅读 · 2 评论 -
完整电商项目--(四)用户登录(3):第三方登录-QQ登录
1原创 2020-08-16 21:28:37 · 723 阅读 · 0 评论 -
完整电商项目--(四)用户登录(2):判断用户是否登录
前面讲了session机制,作为登录状态保持:那么既然登录状态已经保持了? 我们为什还要去判断,用户请求接口时 是否登录呢?我希望大家不要迷惑这些。session机制,只是保存用户的信息,并且交由 客户端一个 sessionid,用来验证用户已登录。 这一过程:我认为是发生在中间件当中的。 在django生成 request 对象的时候, 前端携带 带有sessionid的 cookie,经过处理,验证通过,说明已登录。并开始构造当前登录用户的对象 request.user, 若未验证通过,则req原创 2020-08-14 16:37:37 · 1418 阅读 · 0 评论 -
完整电商项目--(四)用户登录(1):基本业务逻辑
账号登录多账号登录:支持使用注册时的 用户名,和 手机号进行登录这是目前最流行的方式我觉得,给用户的体验也是最好的。 信息化时代,任何网站都需要账号。 众多的用户名。。。我是记不住。 但是同一个特点是都支持手机号登录。我们可以输入手机号 和密码进行登录。登录流程(同注册时讲的一样)接收,验证,处理,响应(1)处理当中的 保持登录状态 以及后续的退出登录,都已经讲过了。(2)我们在登陆成功之后,肯定是跳转到首页的。 然后显示用户名的操作:方案一:模板中 request 变量直接渲染原创 2020-08-14 15:37:24 · 1107 阅读 · 0 评论 -
完整电商项目--(三)验证码操作(3):短信验证码 -- cerely-RabbitMQ实现异步
什么是cerely这个在之前的项目中已经讲过了 有兴趣大家可以查看另外任务队列作为中间人(broker), 当时使用的是redis主要就是三部分:生产者:我们的代码,制造任务中间人:任务队列(很多可以充当)接受任务工人: 执行任务...原创 2020-08-14 10:36:07 · 614 阅读 · 0 评论 -
RSS订阅 原创 完整电商项目--(三)验证码操作(2):短信验证码--补充 :单例模式
什么是单例模式我们节选一段网上的话:单例模式(Singleton Pattern)是一种常用的软件设计模式,该模式的主要目的是确保某一个类只有一个实例存在。当你希望在整个系统中,某个类只能出现一个实例时,单例对象就能派上用场。举个例子,就像我们新定义一个类,去发送短信验证码。一个用户请求时会创建一个实例对象去处理。多个用户请求时,便会创建多个实例对象去处理。这大大的占用了内存空间,严重浪费内存资源。所以我们要做的,就是实现单例设计模式,我们希望在程序运行期间只存在一个发送验证码类的实例对象。如何原创 2020-08-12 21:14:20 · 263 阅读 · 0 评论 -
完整电商项目--(三)验证码操作(2):短信验证码
短信验证码操作流程首先django是不能实现 发送短信验证码的,所以我们要 借助第三方 操作短信验证码。这里选择 容联云通讯短信平台 实现第三方的 发送短信验证码码容联云通讯短信平台网址先来说下整个业务流程(1) 浏览器请求后端 获取短信验证码(2) 后端验证通过(我们这里的验证就是,必须它输入上节中讲的,正确的图像验证码),后端开始生成随机的 六位验证码, 并将短信验证码,保存进redis。 还是存储为 string类型, key 就是用户的手机号(前端传递),值就是这个验证码(3)原创 2020-08-12 18:02:31 · 1252 阅读 · 0 评论 -
完整电商项目--(三)验证码操作(1):图像验证码
实现图像验证码接口设计首先要知道一个叫 uuid 的东西这是一个几乎不会重复的值url (请求地址): image_codes/(?P[\w-]+)/响应结果: image/jpg流程分析首先我们需要接收前端的请求,生成图像验证码返回给前端还要自己保存 图形验证码的 值, 用来做后续 验证码的判断。保存图形验证码: 就是存储在 redis 当中的。存储为string类型 ,如果设置的键不存在则为添加,如果设置的键已经存在则修改因为用户数量庞大,我们为了保证避免重复的键,原创 2020-08-12 16:55:20 · 628 阅读 · 0 评论 -
完整电商项目--(二)用户注册(3):状态保持--session机制
状态保持目前我是用的一共有两种状态保持机制。(1)session机制的(2)JWT,json web token 机制的(我们主要介绍第一种session机制,后面一种在后续讲解 django drf 做后台管理时讲)什么是Cookie?简单的说,就是Cookie是存储在浏览器中的一段纯文本信息,在网站请求中用来 辨别用户身份、进行session跟踪而储存在用户本地终端上的数据(通常经过加密)。特点:Cookie以键值对的格式进行信息的存储。Cookie基于域名安全,不同的域原创 2020-08-11 20:22:17 · 542 阅读 · 0 评论 -
完整电商项目--(二)用户注册(2):用户注册业务流程
摘要我们作为学习笔记,不回去详细记录代码过程。而是思路,任何注册逻辑(或者说是后端逻辑):四个点(1)获取:即获取传递过来的数据,转化为可操作做的(就是python可以处理的数据)值(2)验证就是对传递来的数据,进行响应的验证,在数据格式不对时,做出对应的异常处理(3)处理对数据进行相应的处理,比如保存到数据库等,也就是对数据进行响应的处理操作(4)响应顾名思义,对处理的结果进行返回,予以前端 响应。包括状态码等信息。需要注意的业务流程在验证过程中:(1)原创 2020-08-11 16:21:15 · 1614 阅读 · 0 评论 -
完整电商项目--(二)用户注册(1):自定义用户模型类
首先要清楚django的默认用户认证系统同样是进入到官方文档首页:找到对应的部分进入认证系统(1)我们便可以知道,django默认的用户认证系统,就是基于这个 User对象的!(2) 包含权限(3)组(4)密码我们暂时不多介绍:可以看到认证系统的功能很多。我们再进入到 User对象的文档当中去:得知它是位于 django.contrib.auth下的。并且可以看到它的全部介绍以及字段。自定义用户模型但是往往,再带的 用户模型,它所涵原创 2020-08-11 11:28:20 · 387 阅读 · 0 评论 -
完整电商项目--django项目配置(5):日志文件的简单配置
参考文档链接:日志快速入门还是在settings中定义# 手动添加配置工程日志: 当运行出错时,记录在日志中,方便后续修改LOGGING = { 'version': 1, 'disable_existing_loggers': False, # 是否禁用已经存在的日志器 'formatters': { # 日志信息显示的格式 'verbose': { 'format': '%(levelname)s %(asctime)s %(原创 2020-08-10 20:44:14 · 195 阅读 · 0 评论 -
完整电商项目--django项目配置(4):配置前端静态文件及一些小技巧
配置静态文件需要在项目目录下创建一个 static 的文件夹。包括(1) css 文件夹(2) images 文件夹(3) js 文件夹(4)还有直接在static 目录下存储 静态页面。注释: 我们采用这样的集中处理方式。并没有将 每个应用下需要用到的静态文件定义到指定应用目录下。阅读文档,我们发现了,静态文件和 templates 是类似的查找方式。根据描述, STATICFILES_FINDERS 设置中包含多个 查找器(用来查找静态文件),我们进入到里面看看:我们知原创 2020-08-10 20:32:40 · 461 阅读 · 0 评论 -
完整电商项目--django项目配置(3):Redis
首先要知道:配置redis的目的redis的读写速度极快,我们把它用作缓存。在官方文档中找到控制缓存的字段:之后我们要借助第三方模块:django-redis 来进行配置 reids的使用。首先要知道django-redis的官方文档:https://django-redis-chs.readthedocs.io/zh_CN/latest/我们将从中找到配置方法。可以看到文档首页的这两个的配置方法是一样的用作session backend 使用配置下面就是我们代码中的展示(配原创 2020-08-10 17:34:04 · 448 阅读 · 0 评论 -
完整电商项目--django项目配置(2): Mysql
实际上,这些数据库后端的配置,都是相同,我们只需要知道一种,便可以掌握数据库的配置先要了解Mysql基本的创建:创建 数据库create database xxx charset=utf8;新建mysql用户create user name identified by ‘123456’;name :同户名, ‘123456’ 密码授权新建用户访问 xxx 数据库grant all on xxx. to ‘name’@’%’;*xxx 数据库名, name 创建的新用户原创 2020-08-10 16:19:46 · 264 阅读 · 0 评论 -
完整电商项目--项目介绍(1)
项目开发模式开发模式 : 前后端不分离后端框架 : Django + Jinja2模板引擎前端框架 :Vue.js项目介绍B2C – 企业对个人 ,既商对客的运营模式项目前端由 他人开发,合作项目,这里只介绍后端技术。归纳项目的主要模块验证: 图形验证、短信验证用户: 注册、登录、用户中心(基本信息、邮箱激活、收货地址、我的订单、修改密码)第三方登录: QQ登录首页广告: 首页广告商品: 商品列表、商品搜索、商品详情、商品浏览记录购物车 购物车管理、购物车合并订单: 确原创 2020-08-10 10:55:55 · 11203 阅读 · 1 评论 -
分布式FastDFS文件系统介绍和理解: django开发之天天生鲜项目知识总结【8】
(新手初学,根据老师所讲,对此作出初步的理解和简介)什么是分布式FastDFS文件系统:FastDFS 是用 c 语言编写的一款开源的分布式文件系统。FastDFS 为互联网量身定制, 充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用 FastDFS 很容易搭建一套高性能的文件服务器集群提供文件上传、下载等服务。FastDFS 架构包括 Tracker ser...原创 2019-11-27 12:40:46 · 207 阅读 · 0 评论 -
【python和FastDFS交互】显示用户最近浏览记录:django开发之天天生鲜项目知识总结【11】
作为新手入门,这里只是简单地介绍下,如何使用 python客户端上传文件。(需要的可以参考我的前几个文章讲解~)所需要的包:这个是直接下载的一个源码的压缩包下面开始进行操作1. workon django_py32. 进入fdfs_client-py-master.zip所在目录3. pip install fdfs_client-py-master.zip我的操作截图:...原创 2019-11-27 11:31:07 · 306 阅读 · 0 评论 -
【详细自己踩点成功按步骤安装】Nginx配合FastDFS使用的安装和配置(及相关异常处理): django开发之天天生鲜项目知识总结【10】
(声明:我是在虚拟机ubantu中安装的~)介绍软件包:nginx-1.8.1.tar.zip : nginx安装包。fastdfs-nginx-module-master.zip : 想要 nginx 配合 FastDFS 使用,需要安装这个附加的模块。下面直入主题,进行安装:安装nginx及fastdfs-nginx-module1. 解压缩 nginx-1.8.1.ta...原创 2019-11-26 21:20:34 · 310 阅读 · 0 评论 -
【详细】FastDFS安装和配置:django开发之天天生鲜项目知识总结【9】
(声明我是在虚拟机中的ubantu中安装的)介绍软件包:fastdfs-master.zip 里面是FastDFS的代码文件。libfastcommon-master.zip 里面是FastDFS所需要的一些依赖的安装包。安装:(1)首先需要先安装FastDFS所需要的依赖包:libfastcommon-master.zip安装fastdfs依赖包1. 解压缩libfas...原创 2019-11-26 17:11:04 · 357 阅读 · 0 评论 -
Invalid input of type: CacheKey. Convert to a byte, string or number first:杂记问题处理
问题如下图:Invalid input of type: ‘CacheKey’. Convert to a byte, string or number first在网上搜索了很多,也没有结果,都说是redis数据库版本过高,需要更换成2.10.6,但是 如果redis换成 2.10.6版本的话,celery又会报错,因为 它只支持3.2.0以上版本,很冲突。。。所以绞尽脑汁,在想是否是d...原创 2019-11-25 10:58:22 · 826 阅读 · 4 评论