【Django】教程-14-验证码+登录页
【Django】教程-1-安装+创建项目+目录结构介绍
【Django】教程-2-前端-目录结构介绍
【Django】教程-3-数据库相关介绍
【Django】教程-4-一个增删改查的Demo
【Django】教程-5-ModelForm增删改查+规则校验【正则+钩子函数】
【Django】教程-6-搜索框-条件查询前后端
【Django】教程-7-分页,默认使用django的
【Django】教程-8-页面时间组件
【Django】教程-9-登录+退出
【Django】教程-10-ajax请求Demo,结合使用
【Django】教程-11-ajax弹窗实现增删改查
【Django】教程-12-柱状图
【Django】教程-13-饼图,折线图
19 .验证码+登录页
验证码工具类 captcha_utils.py
from PIL import Image, ImageDraw, ImageFont
import random
import stringdef generate_captcha(length=4, size=(120, 30), font_size=20):""" 一个可以返回验证码的,方法Returns:list:- image,验证码图- captcha_text,验证码字符串"""# 定义验证码字符集characters = string.ascii_letters + string.digits# 随机生成验证码captcha_text = ''.join(random.choice(characters) for _ in range(length))# 创建一个彩色图像,背景颜色选择较浅的色调background_color = (random.randint(200, 255),random.randint(200, 255),random.randint(200, 255))image = Image.new('RGB', size, color=background_color)draw = ImageDraw.Draw(image)# 选择字体font = ImageFont.load_default()# 也可以使用自定义字体,例如:# font = ImageFont.truetype('arial.ttf', font_size)# 绘制验证码字符,字体颜色选择较深的色调for i, char in enumerate(captcha_text):char_color = (random.randint(0, 100),random.randint(0, 100),random.randint(0, 100))draw.text((10 + i * 25, 10), char, fill=char_color, font=font)# 添加干扰线for _ in range(5):line_color = (random.randint(150, 255),random.randint(150, 255),random.randint(150, 255))x1 = random.randint(0, size[0])y1 = random.randint(0, size[1])x2 = random.randint(0, size[0])y2 = random.randint(0, size[1])draw.line((x1, y1, x2, y2), fill=line_color, width=2)# 添加干扰点for _ in range(20):point_color = (random.randint(150, 255),random.randint(150, 255),random.randint(150, 255))x = random.randint(0, size[0])y = random.randint(0, size[1])draw.point((x, y), fill=point_color)return image, captcha_text
登录页 login.html
{% load static %}
<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>登录页面</title><!-- 引入 Bootstrap 的 CSS 文件 --><link rel="stylesheet" href="{% static 'plugins/bootstrap-3.4.1/css/bootstrap.css' %}"/><style>/* 自定义一些样式让页面更美观 */body {background-color: #f8f9fa;display: flex;justify-content: center;align-items: center;min-height: 100vh;margin: 0;}.login-card {background-color: white;border-radius: 8px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);padding: 2rem;width: 350px;}.form-group {margin-bottom: 1.5rem;}.form-control {height: calc(2.25rem + 2px);}.btn-login {width: 100%;padding: 0.75rem;background-color: #007bff;color: white;border: none;border-radius: 4px;cursor: pointer;}.btn-login:hover {background-color: #0056b3;}.register-link {text-align: center;margin-top: 1rem;}.register-link a {color: #007bff;text-decoration: none;}.register-link a:hover {text-decoration: underline;}</style>
</head><body>
<div class="container login-card"><h2 class="text-center mb-4">用户登录</h2><form method="post" novalidate>{% csrf_token %}<div class="form-group"><label>用户名:</label>{{ user.username }}<span style="color: red">{{ user.username.errors.0 }}</span></div><div class="form-group"><label>密码:</label>{{ user.password }}<span style="color: red">{{ user.password.errors.0 }}</span></div><div class="form-group"><label>验证码:</label><img id="captcha-image" class="img-fluid" src="/captcha/get" >{{ user.captcha }}<span style="color: red">{{ user.captcha.errors.0 }}</span></div><button type="submit" class="btn-login">登录</button></form><div class="register-link">还没有账号?<a href="#">立即注册</a></div>
</div><script src="{% static 'js/jquery-3.6.0.min.js' %}"></script>
<script src="{% static 'plugins/bootstrap-3.4.1/js/bootstrap.js' %}"></script>
<script>$(document).ready(function () {$('#captcha-image').click(function () {$.ajax({url: '/captcha/get',type: 'GET',success: function (response) {$('#captcha-image').attr('src', '/captcha/get');// 可以在这里清空验证码输入框{#$('input[name="captcha"]').val('');#}},error: function () {alert('刷新验证码失败');}});});});
</script>
</body>
</html>
业务控制层login_view.py
import iofrom django.http import HttpResponse, JsonResponse
from django.shortcuts import render, redirect
from django.views.decorators.csrf import csrf_exempt
from appTang.forms import LoginForm
from appTang.models import Admin
from appTang.util.captcha_utils import generate_captchadef login(req):"""用户登录"""""" modelform 方式添加用户"""if req.method == 'GET':user = LoginForm()return render(req, 'login/login.html', {"user": user})# 用户post提交,数据校验user = LoginForm(data=req.POST)if user.is_valid():# username = req.POST.get("username")username = user.clean_username()user = Admin.objects.filter(username=username).first()# 需要添加用户认证成功信息req.session["info"] = {"username": username, 'id': user.id}captcha = req.POST.get("captcha")image_code = req.session.get('captcha', '') # 超时时,没有,给个''# 不区分大小写比较if image_code.upper() == captcha.upper():# 登录成功设置session,超时时间req.session.set_expiry(60 * 60 * 24 * 7) # 7天免登录return redirect("/admin/list")else:user = LoginForm(data=req.POST)user.add_error('captcha', '验证码输入错误')# # 校验失败, 在页面上展示错误信息return render(req, 'login/login.html', {"user": user})def logout(req):"""注销"""req.session.clear();return redirect("/login/")def get_captcha(request):""" 获取 验证码 """image, captcha_text = generate_captcha()# 将验证码存储在会话中request.session['captcha'] = captcha_text# 设置超时时间request.session.set_expiry(60)# 将图片保存到内存中buffer = io.BytesIO()image.save(buffer, 'PNG')# buffer.seek(0)print(captcha_text)# 返回图片响应return HttpResponse(buffer.getvalue())
forms.py
from django import forms
from django.core.exceptions import ValidationError
from django.core.validators import RegexValidatorfrom . import models
from .models import Department, UserInfo, Admin, Order
from .util.md5 import md5class BootstrapModelForm(forms.ModelForm):def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# 循环Modelform中所有字段,给每个字段插件设置for name, field in self.fields.items():if field.widget.attrs:field.widget.attrs["class"] = "form-control"field.widget.attrs["placeholder"] = field.labelelse:field.widget.attrs = {"class": "form-control", "placeholder": field.label}# 登录Form
class LoginForm(BootstrapModelForm):captcha = forms.CharField(label="验证码", widget=forms.TextInput())class Meta:model = Admin# 字段按照顺序加载fields = ['username', 'password', 'captcha']widgets = {"password": forms.PasswordInput(render_value=True)}def clean_username(self):username = self.cleaned_data.get("username")if not Admin.objects.filter(username=username).exists():# raise ValidationError("用户名不存在!")raise ValidationError("用户名或密码错误!")return usernamedef clean_password(self):password = self.cleaned_data.get("password")username = self.cleaned_data.get("username")if not Admin.objects.filter(username=username, password=md5(password)).exists():# raise ValidationError("密码不正确!")raise ValidationError("用户名或密码错误!")return md5(password)
models.py
from django.utils import timezone
from django.db import modelsclass Admin(models.Model):"""管理员"""username = models.CharField(verbose_name="用户名", max_length=32)password = models.CharField(verbose_name="密码", max_length=64)
相关文章:
【Django】教程-14-验证码+登录页
【Django】教程-1-安装创建项目目录结构介绍 【Django】教程-2-前端-目录结构介绍 【Django】教程-3-数据库相关介绍 【Django】教程-4-一个增删改查的Demo 【Django】教程-5-ModelForm增删改查规则校验【正则钩子函数】 【Django】教程-6-搜索框-条件查询前后端 【Django】教程…...
flask实现上传文件与下载文件
以下是一个使用Python Flask实现的文件上传和下载服务的完整步骤及代码示例:供参 功能说明: 上传文件: POST请求到/upload端点 需要包含一个名为file的文件参数 支持的文件类型包括:txt, pdf, png, jpg, jpeg, gif, doc, docx, xlsx, zip 返回上传成功信息和下载链接 下载…...
用Java写一个MVCC例子
MVCC(Multi-Version Concurrency Control,多版本并发控制)是一种用于数据库管理系统中处理并发访问数据的技术。它允许事务在查询时看到数据的一个快照版本,而不是直接查看最新的提交数据。这种方法不仅提高了并发性能,…...
【遥感科普】卫星影像产品处理等级有哪些?
遥感数据等级划分是指将卫星遥感原始数据按处理深度分为不同等级,用户可快速匹配需求:初级数据适合算法开发,高级产品可直接用于分析。分级体系促进数据标准化,降低使用门槛,提升跨机构协作效率;同时便于质…...
第十二天 - Flask/Django基础 - REST API开发 - 练习:运维管理后台API
从零开始用Flask/Django构建运维管理后台API(实战指南) 前言:为什么选择Python Web框架? 在运维自动化领域,构建管理后台是每个运维工程师的必修课。本文将通过Flask和Django两个主流框架,手把手教你构建…...
计算机视觉与深度学习 | 视觉里程计(Visual Odometry, VO)学习思路总结
视觉里程计(Visual Odometry, VO)学习思路总结 视觉里程计(VO)是通过摄像头捕获的图像序列估计相机运动轨迹的技术,广泛应用于机器人、自动驾驶和增强现实等领域。以下是一个系统的学习路径,涵盖基础理论、核心算法、工具及实践建议:一、基础理论与数学准备 核心数学工具…...
解决vite.config.ts 引入scss 预处理报错
版本号: "sass": "^1.86.3","sass-loader": "^16.0.5","vite": "^6.2.0" 报错图片: vite.config.ts 一开始文件错误 修改之后:完美解决报错(不过我还没搞懂为什么…...
Design Compiler:中断命令/脚本的执行
相关阅读 Design Compilerhttps://blog.csdn.net/weixin_45791458/category_12738116.html?spm1001.2014.3001.5482 中断命令的执行 如果在使用命令时输入了错误的选项或输入了错误的命令,可以使用CtrlC手动中断命令的执行并返回到dc_shell中,此时终端…...
图灵逆向——题十七-字体加密
十七题是一个很经典的字体加密案例,很适合新手入门~ 目录列表 过程分析代码实现 过程分析 打开开发者工具直接看请求,发现它请求的没有加密参数,以为万事大吉的你迫不及待的点击了响应,然后就会发现依托。。。 返回的数据中字体…...
uniapp微信小程序图片生成水印
整体思路: 用户通过uni.chooseImage选择图片后,获得图片文件的path和size。通过path调用uni.getImageInfo获取图片信息,也就是图片宽高。图片宽高等比缩放至指定大小,不然手机处理起来非常久,因为手机随便拍拍就很大。…...
【MySQL】001.MySQL安装
文章目录 一. MySQL在Ubuntu 20.04 环境安装1.1 更新软件包列表1.2 安装MySQL服务器1.3 配置安全设置1.4 检查mysql server是否正在运行1.5 进行连接1.6 查询自带的数据库 二. 配置文件的修改三. MySQL连接TCP/IP时的登陆问题四. MySQL中的命令 一. MySQL在Ubuntu 20.04 环境安…...
《深度剖析 Linux 权限管理:从基础到进阶,解锁系统安全密钥》
一、权限管理 1.1 普通权限(普通文件和目录) [rootmd ~]# ll total 124 drwxr-xr-x. 2 root root 28 Feb 16 15:48 : drwxr-xr-x. 3 root root 64 Mar 9 00:22 111 -rw-r--r--. 1 root root 43 Feb 17 22:44 1.txt 1 2 …...
2025年4月9日-华为暑期实习-第一题-100分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 软件依赖链分析系统 问题描述 LYA 是某软件公司的工程师,负责管理公司的软件依赖关系。每个软件组件都有可能依赖于其他组件,形成一个依赖链。为了确保系统的稳定性,LYA 需要…...
leetcode 377. Combination Sum IV
这道题也是完全背包问题。这道题和第518题几乎一摸一样,所不同的是,第518题要求的是组合数,而第377题要求的是排列数。虽然本题题目描述中说求的是组合数,但从例子1中(1,1,2)和&…...
【TS学习】(22)什么是混入
在 TypeScript 中,混入(Mixins) 是一种设计模式,用于将多个类的功能组合到一个类中。它是一种实现代码复用的方式,尤其适用于需要从多个来源继承功能的场景。TypeScript 不直接支持多继承,但可以通过混入模…...
Firebase Studio,谷歌推出的云端AI 开发环境
Firebase Studio 是谷歌推出的一款基于云的全栈应用开发环境,旨在帮助开发者高效构建和交付集成 AI 功能的高质量应用。该平台结合了 Project IDX 和专用的 Firebase AI 代理,提供从后端到前端、移动应用等多维度的开发支持。 Firebase Studio是什么 F…...
电能质量在线监测分析装置支持实时监测、数据存储及远程传输,适用于电网、工业等场景
电能质量在线监测分析装置主要技术指标 2.1工作电源 交流:220V10% ;50Hz0.5Hz;谐波畸变率不大于15% 直流:220V10%,纹波系数不大于5% 2.2电流信号输入 输入方式:电流互感器输入; …...
线代[13]|线性代数题37道以及数学分析题3道(多图预警)
博主首次发布于CSDN,禁止转载!(CSDN:汉密士2025) 文章目录 一、缘起|《俗说矩阵》课程目录照片存档|线性代数学习脉络|线代习题集封面存档|未来——我与线性代数的纠缠 二…...
gitlab内置pgsql数据库迁移
gitlab内置pgsql数据库迁移 创建gitlab备份方法一,使用pg_dump备份方法二 使用gitlab工具 gitlab-backup 备份 运行sql文件注意事项ERROR: extension "btree_gist" has no installation script nor update path for version "1.7"btree_gist 找…...
IDEA、Webstorm使用账号密码登录Gitlab
在开发过程中,为了保证代码安全,更改了gitlab司库的密码,当更新项目时,发现更新失败了。让填入access_token,gitlab网页设置中虽然generate了token,也填入了它,但是还是报错401unauthorized&…...
水利水电安全员ABC适合哪些人考?
水利水电安全员证是水利工程建设领域的重要职业资格证书,主要涉及水利水电工程施工安全管理、风险防控和应急处理等工作。那么,哪些人适合考取? 哪些人适合考水利水电安全员? 1. 水利水电工程从业人员 ✅ 施工管理人员…...
Service Mesh 深度解析与 Istio+Envoy 实现方案
Service Mesh 深度解析与 IstioEnvoy 实现方案 一、Service Mesh 技术全景 核心架构演进 第一代架构:以库形式集成(如 Netflix OSS)第二代架构:Sidecar 代理模式(如 Linkerd)第三代架构:全功…...
使用uv管理python项目环境
安装uv 使用默认python环境安装uv(把uv安装到默认python环境):pip install uv 创建python项目虚拟环境 如果是已有项目并且项目中有uv.lock文件,直接运行 uv run main.py,这会默认使用uv.lock文件创建虚拟环境如果是新…...
【Code】《代码整洁之道》笔记-Chapter9-单元测试
第9章 单元测试 过去十年以来,编程专业领域进步很大。1997年时,没人听说过测试驱动开发。对于我们之中的大多数人来说,单元测试是那种用来确保程序“可运行”的用过即扔的短代码。我们辛勤地编写类和方法,再弄出一些特殊代码来测…...
数据结构-顺序表
目录 基本概念 什么是数据结构? 数据 结构 线性结构 树形结构 网状结构 第一章绪论 了解概念 几个概念 数据存储方式: 算法的五个重要特性: 算法设计的要求: 总结 线性表 线性表的定义: 顺序表的设计思想 定长顺序表 不定…...
端到端语音识别服务重构方案
以下是重构ASR服务架构,集成Whisper V3Conformer混合模型的端到端实现方案,经过技术增强与流程优化: 端到端语音识别服务重构方案 基于Whisper V3Conformer混合架构 系统架构设计 采用四层微服务架构,支持水平扩展与模块化部署…...
耳根圆通与禅定的交融与分野
引言 在浩瀚的修行体系中,耳根圆通与禅定的关系犹如月映千江——本质同一而显相各异。本文以《楞严经》为经教依据,结合禅宗心法与现代实证视角,系统解析二者在修行原理、实践路径与终极旨归中的深刻关联与微妙差异,揭示这一古老智…...
python基础语法:缩进规则
Python 的缩进规则是其语法的重要组成部分,它通过缩进来表示代码块的层次结构,而不是像其他语言(如 C 或 Java)那样使用大括号 {}。以下是 Python 缩进规则的详细说明: 1. 缩进的基本规则 代码块的标识:Pyt…...
从0到1的Python接口自动化学习路线
Python 是一门非常适合初学者且功能强大的编程语言,它在接口自动化测试领域具有广泛应用。 以下是一份针对 Python 与接口自动化测试的详细学习路线,帮助你从零开始学习并逐步掌握相关知识。 第一阶段:Python基础 目标:掌握 Python 基本语法和编程能力。 一、学习内容 1.…...
大数据(7.3)Kafka量子安全加密实践指南:构建抗量子计算攻击的消息系统
目录 一、量子计算带来的加密革命1.1 量子计算机的威胁时间表1.2 Kafka现有加密机制脆弱性分析 二、后量子加密算法选型2.1 NIST标准化算法矩阵2.2 混合加密最佳实践 三、Kafka量子安全改造方案3.1 Bouncy Castle量子安全Provider3.2 Kafka服务端配置 四、实战案例:…...
【11408学习记录】英语语法精讲:主从复合句之状语从句全解析——以时间状语从句为例
时间 英语语法总结—— 主从复合句状语从句从句位置从句的分类 每日一句词汇第一步:找谓语第二步:断开第三步:简化第一句第二句第三句第四句 英语 语法总结—— 主从复合句 状语从句 状语从句指的是一个句子作状语,表达“描述性…...
深度分页及优化建议
深度分页的定义 深度分页是指在分页查询中,当用户请求非常靠后的页面时,数据库需要处理大量数据,导致查询性能显著下降的情况。例如,一个查询结果有 100 万条记录,而用户要查询第 999 页(每页 10 条记录&a…...
阿里云kafka集成boot在docker启动找不到kafka.client.truststore.jks文件问题
此问题困扰了我好久,看阿里云官方文档,建议配置绝对路径,但项目部署在docker没有绝对路径,开始以为配置在docker的/root下即可,但报找不到文件,后来改相对路径 ./kafka.client.truststore.jks,…/…/还是找…...
kafka 集群搭建,开启sasl认证
Kafka提供了多种认证方式来保护集群的安全性,包括以下几种常见的认证方式: SSL/TLS认证:Kafka支持使用SSL/TLS协议对网络通信进行加密和认证。通过使用SSL/TLS证书对客户端和服务器进行身份验证,可以确保通信的机密性和完整性。SASL/PLAIN认证:SASL/PLAIN是一种基于用户名…...
在 iOS 项目中,Info.plist文件用于配置应用的基本信息和权限
在 iOS 项目中,Info.plist 文件用于配置应用的基本信息和权限。以下是常见的需要添加的权限及其说明: 常见权限及说明 NSCameraUsageDescription 说明: 说明应用为何需要访问相机。示例: “我们需要访问您的相机以便您可以拍摄照片。”NSPhotoLibraryUsageDescription 说明:…...
【完整可用】使用openhtmltopdf生成PDF(带SVG)
文章目录 前言OpenHTMLToPDF 简介maven配置依赖字体文件demo代码其他资源放置截图防止maven编译字体文件 前言 AI和网上都是跑不起来或者版本过低的,还有各种BUG的。本文都是查阅官方文档得出的。如果你能跑起来请给个大大的赞! OpenHTMLToPDF 简介 Ope…...
仿照管理系统布局配置
1.vue仿照snowy 配置,如下图: 2.代码实现 <template><div class"theme-settings"><!-- 导航栏 --><div class"nav-bar"><el-breadcrumb separator"/"><el-breadcrumb-item>导航设置…...
RLAgent note
OpenManus github LlamaGym github GRPO 实践 知乎:Deepseek R1 Zero成功复现 BabyAGI 0,环境 CUDA版本12.X:nvcc -V python 3.10:python -V gcc 11:gcc -V 1,安装llama-cpp-python [git | docs]…...
Python设计模式-工厂模式
一、模式定义与核心思想 工厂模式(Factory Pattern)属于创建型设计模式,其核心思想是通过一个"工厂类"来创建对象,而不是直接调用类的构造函数。这种模式将对象的实例化过程封装起来,使系统在实例化对象时能…...
Vue环境搭建:vue+idea
目录 第一章、Vue环境搭建:安装node2.1)node的下载2.2)配置node的环境变量2.3)常见的npm命令 第二章、使用idea创建vue工程2.1)在IDEA中设置国内镜像2.2)在IDEA中进行脚手架安装2.3)在IDEA中创建…...
庙算兵推:使用Streamlit框架构建了一个智能作战推演系统。
这段代码是一个完整的军事模拟应用,使用Streamlit框架构建了一个智能作战推演系统。该系统包括了三维地图显示、作战单位管理、应急事件处理等功能。用户可以通过界面控制推演的开始和暂停,调整时间加速倍率,并查看实时的战斗情况和系统状态。…...
APIGen-MT:高效生成多轮人机交互Agent数据的两阶段框架
APIGen-MT:高效生成多轮人机交互数据的两阶段框架 引言 随着人工智能技术的飞速发展,AI代理(Agent)已从简单的聊天机器人发展为能够执行复杂现实任务的系统,例如管理金融交易、安排预约和处理客户服务等。然而&#x…...
02-redis-数据结构实现原理
1、redis整体涉及的结构 在redis中整体是KV键值对的方式进行访问的,redis的查询的时间复杂度O(1),底层的数据结构其实跟java中的HashMap底层实现类似,整体采用的是数组链表的实现方式,哈希冲突的时候使用的是链表法解决࿱…...
京华幻梦:科技自然共生诗篇
故事摘要 故事发生在现代中国北京,展现了未来城市的奇幻景象与科技变革。在这个充满想象的未来世界里,科技与自然不再对立,而是达成了和谐共生的美妙平衡。故宫、鸟巢、798艺术区等标志性地点,在科技的赋能下焕发新的生机&#x…...
python:面向对象之包
1.包的定义: 包就是把有联系的模块组织在一起,即放在同一文件夹下,并且在这个文件夹下创建一个__init__.py文件,这个文件就叫做包。 2.包的创建: 创建好好会自动生成一个__init__.py文件。 3.包的调用: …...
spring boot整合redis
spring boot整合redis 步骤: ① 引入redis依赖 <dependency><groupId>org.springframework.boot</group><artifactId>spring-boot-starter-data-redis</artifactId> </dependency>②在application.yml配置文件中,…...
DIA——边缘检测
1.边缘 边缘是像素的突变位置。 2.常见边缘检测算法 通过找到一阶导数的极值点或者二阶导数的过零点来确定边缘像素的位置。边缘检测通常使用算子,即特定的卷积核。通过差分对离散的像素点求导,然后转化成卷积核进行卷积。使用卷积统一涵盖求导&…...
redis 免安装版本 启动方法 windows 安装包
redis 免安装版本 启动方法 windows 安装包 下载解压直接使用 百度网盘连接如下 链接:https://pan.baidu.com/s/1W4ICvdUUxkWPhK93GtdG0Q 提取码:vzw3 下载解压后会用32位和64位两种,根据自己的电脑选择 cmd命令 cd /d D:\yaochengwei\so…...
C语言练习二 进制转换
#include <stdio.h>// 强制类型转换int main(){int i 5;float j i / 2; // 只是把整形先除了 再赋值float k (float)i / 2; //先强制改成float 再赋值printf("%f\n",j);printf("%f\n",k);return 0; } #include <stdio.h> int main(){int…...
AlDente Pro for Mac电脑 充电限制保护工具
AlDente Pro for Mac电脑 充电限制保护工具 一、介绍 AlDente Pro for Mac,是一款充电限制保护工具,是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池(如 MacBook 中的电池)在40% 至 80% 之…...