vue中验证码的实现方式
在写登录页的时候有的系统会让你也进行一下验证码绘制,那么验证码如何实现的呢?我在写登录页的时候通过将登录框,验证码分开页面来写,最后将它们变成标签来导入到我的样式页面中,这样写不仅方便,更容易修改代码,很便捷。
也就是说我登录页的样式,输入框,验证码是分别写了三个页面。
然后将验证码绘制的图形,通过组件的形式放入输入框的页面中。
import Identify from '../component/code.vue'; //引用验证码组件
<!-- 验证码组件 --><el-col :span="8"><div class="change-email"><Identify :identifyCode="identifyCode" :changeCode="changeCode"></Identify><!-- 引用验证码组件 --></div></el-col>
然后下面这里是验证码的逻辑,比如验证码的初始值或者它的生成范围,可以只生成数字或者字母
// 验证码逻辑
const identifyCode = ref('1234'); // 验证码的初始值
const identifyCodes = '1234567890abcdefghijklmnopqrstuvwxyz'; // 验证码生成范围
// 生成验证码的方法
const changeCode = () => {identifyCode.value = ''; // 清空当前验证码makeCode(identifyCodes, 4); // 重新生成新的验证码
};
// 生成随机数字
const randomNum = (min: any, max: any) => {max = max + 1; // 最大值加1,使得能够取到最大值return Math.floor(Math.random() * (max - min) + min); // 返回一个在[min, max]范围内的随机数
};
// 根据给定的字符集和长度生成验证码
const makeCode = (data: any, len: any) => {for (let i = 0; i < len; i++) {identifyCode.value += data[randomNum(0, data.length - 1)]; // 从字符集中随机取字符拼接成验证码}
};
onMounted(() => {changeCode(); // 组件挂载时,生成验证码
});
然后changeCode就是每次触发验证码的事件,它都会重新生成一个新的验证码,当然如果在输入验证码错误的时候就需要调用这个验证码重新生成。
最主要的就是这一生成验证码的部分,直接复制就可以,它是通过canvas来进行绘制的
<template><!-- 二维码识别组件容器,包含一个 canvas 元素用于绘制验证码 --><div class="s-canvas"><!-- canvas 元素,用于绘制验证码图案 --><canvas @click="changeCode" class="s-canvas" :width="contentWidth" :height="contentHeight"></canvas></div>
</template>
<script>
export default {name: 'Identify', // 组件名称props: {identifyCode: { // 验证码内容type: String,default: '1234'},fontSizeMin: { // 最小字体大小type: Number,default: 20},fontSizeMax: { // 最大字体大小type: Number,default: 35},backgroundColorMin: { // 背景颜色最小值(用于生成干扰背景颜色)type: Number,default: 180},backgroundColorMax: { // 背景颜色最大值type: Number,default: 240},colorMin: { // 字体颜色最小值(用于生成干扰字体颜色)type: Number,default: 50},colorMax: { // 字体颜色最大值type: Number,default: 160},lineColorMin: { // 干扰线颜色最小值type: Number,default: 40},lineColorMax: { // 干扰线颜色最大值type: Number,default: 180},dotColorMin: { // 干扰点颜色最小值type: Number,default: 0},dotColorMax: { // 干扰点颜色最大值type: Number,default: 255},contentWidth: { // 验证码画布宽度type: Number,default: 100},contentHeight: { // 验证码画布高度type: Number,default: 40},changeCode: { // 切换验证码的事件函数type: Function}},methods: {// 生成一个指定范围内的随机数randomNum(min, max) {return Math.floor(Math.random() * (max - min) + min)},// 生成一个随机的颜色randomColor(min, max) {let r = this.randomNum(min, max)let g = this.randomNum(min, max)let b = this.randomNum(min, max)return 'rgb(' + r + ',' + g + ',' + b + ')'},// 绘制验证码图案drawPic() {let canvas = document.getElementsByClassName('s-canvas'); // 获取所有 canvas 元素let ctx = canvas[1].getContext('2d'); // 获取第一个 canvas 的上下文ctx.textBaseline = 'bottom' // 设置文字的基准线为底部// 绘制背景ctx.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)ctx.fillRect(0, 0, this.contentWidth, this.contentHeight) // 绘制背景矩形// 绘制验证码文字for (let i = 0; i < this.identifyCode.length; i++) {this.drawText(ctx, this.identifyCode[i], i) // 绘制每个字符}// 绘制干扰线this.drawLine(ctx)// 绘制干扰点this.drawDot(ctx)// 为其他 canvas 元素绘制同样的验证码图案(如果存在的话)if (canvas[3]) {let ctx1 = canvas[3].getContext('2d');ctx1.textBaseline = 'bottom'ctx1.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)ctx1.fillRect(0, 0, this.contentWidth, this.contentHeight)for (let i = 0; i < this.identifyCode.length; i++) {this.drawText(ctx1, this.identifyCode[i], i)}this.drawLine(ctx1)this.drawDot(ctx1)}if (canvas[5]) {let ctx2 = canvas[5].getContext('2d');ctx2.textBaseline = 'bottom'ctx2.fillStyle = this.randomColor(this.backgroundColorMin, this.backgroundColorMax)ctx2.fillRect(0, 0, this.contentWidth, this.contentHeight)for (let i = 0; i < this.identifyCode.length; i++) {this.drawText(ctx2, this.identifyCode[i], i)}this.drawLine(ctx2)this.drawDot(ctx2)}},// 绘制文字drawText(ctx, txt, i) {ctx.fillStyle = this.randomColor(this.colorMin, this.colorMax) // 随机字体颜色ctx.font = this.randomNum(this.fontSizeMin, this.fontSizeMax) + 'px SimHei' // 随机字体大小let x = (i + 1) * (this.contentWidth / (this.identifyCode.length + 1)) // 计算字符的 x 坐标let y = this.randomNum(this.fontSizeMax, this.contentHeight - 5) // 计算字符的 y 坐标var deg = this.randomNum(-45, 45) // 随机旋转角度// 修改坐标原点和旋转角度ctx.translate(x, y)ctx.rotate(deg * Math.PI / 180)ctx.fillText(txt, 0, 0) // 绘制文字// 恢复坐标原点和旋转角度ctx.rotate(-deg * Math.PI / 180)ctx.translate(-x, -y)},// 绘制干扰线drawLine(ctx) {for (let i = 0; i < 3; i++) {ctx.strokeStyle = this.randomColor(this.lineColorMin, this.lineColorMax) // 随机线条颜色ctx.beginPath()ctx.moveTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight)) // 起点ctx.lineTo(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight)) // 终点ctx.stroke() // 绘制线条}},// 绘制干扰点drawDot(ctx) {for (let i = 0; i < 30; i++) {ctx.fillStyle = this.randomColor(0, 255) // 随机点的颜色ctx.beginPath()ctx.arc(this.randomNum(0, this.contentWidth), this.randomNum(0, this.contentHeight), 1, 0, 2 * Math.PI) // 绘制圆形ctx.fill() // 填充圆形}}},watch: {// 监视验证码内容变化时,重新绘制验证码图案identifyCode() {this.drawPic()}},mounted() {// 页面加载时绘制验证码图案this.drawPic()}
}
</script>
<style scoped>
/* canvas 容器样式 */
.s-canvas {margin-left: 10px; /* 设置左边距 */display: flex; /* 使用 flex 布局 */align-items: center; /* 垂直居中对齐 */cursor: pointer; /* 鼠标悬浮时显示为可点击 */
}
/* 可选的验证码提示文字样式 */
.s-canvas-tip {color: #5C7099; /* 设置提示文字的颜色 */font-size: 14px; /* 设置字体大小 */margin-left: 14px; /* 设置左边距 */cursor: pointer; /* 鼠标悬浮时显示为可点击 */
}
</style>
但是生成验证码的书写格式并不是vue3中的,因为我不是通过setup直接写,是通过export来进行导出。
相关文章:
vue中验证码的实现方式
在写登录页的时候有的系统会让你也进行一下验证码绘制,那么验证码如何实现的呢?我在写登录页的时候通过将登录框,验证码分开页面来写,最后将它们变成标签来导入到我的样式页面中,这样写不仅方便,更容易修改…...
从零开始学习18串锂电池BMS保护板
18串锂电池BMS保护板实物开源资料! BMS系统ADBMS1818/LTC6813凌力尔特主从一体机采集板:STM32F103LTC6813/ADBMS1818程序已调通: 1:18串电池电压(采集精度1.2mV/3mV) 2:8通道温度采集 3:一通道电流采集 4:RS485通信(楼…...
最左侧1问题的一种二分法解法
背景 最近看TI的C6000系列DSP文档时了解到Leftmost 1 or 0 counting功能, 网上搜索到这篇相关博客(最左侧1问题),发现里面的二分法代码自己看不懂,于是尝试用更容易看懂的方式重写一下。 思路 假设输入数据不超过3…...
HarmonyOS-中级(四)
文章目录 Native适配开发三方库的基本使用 🏡作者主页:点击! 🤖HarmonyOS专栏:点击! ⏰️创作时间:2024年12月09日11点12分 Native适配开发 Node-API HarmonyOS Node-API 是 HarmonyOS 提供的…...
rust中self、self、self区别
self的类型,在给出调用者和方法名的前提下,Rust可以准确地推导出方法是否是只读的(&self),是否需要修改数据(&mut self),是否会获取数据的所有权(self࿰…...
种子流和花粉流怎么理解它们之间的大小关系
种子流和花粉流是植物繁殖和遗传多样性研究中的两个重要概念,它们分别描述了种子和花粉在空间上的传播过程。理解它们之间的大小关系,即传播距离和对遗传结构的影响,对于生态学和保护生物学具有重要意义。 种子流(Seed Dispersal&…...
Mybatis-plus 源码解读
简述 本篇主要针对MybatisPlus源码进行解读。 案例 上一篇已经讲了Springboot如何集成MybatisPlus: springboot-mybatis-plus集成篇 源码解析 和Springboot集成Mybatis一样, 依赖了mybatis-plus-spring-boot3-starter,其中主要关注spri…...
web 期末作业简单设计网页——“我的家乡”网站简单设计
1、网页效果 首页 七彩云南页 旅游攻略页 用户页面 2、源代码 首页 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>首页</title><link rel"stylesheet" href"out.css&quo…...
Redis篇-3--原理篇2--Redis事务
1、概述 Redis 提供了简单的事务机制,Redis 事务的本质是一组命令的集合。当执行redis事务时,即一次性按照添加顺序依次执行这些命令,中间不会被打断或者干扰。 Redis 的事务机制并不像关系型数据库中的事务那样提供完整的ACID特性…...
GEE:CCDC 分类组件,对每个分段进行分类
作者:CSDN @ _养乐多_ 连续变化检测与分类(Continuous Change Detection and Classification, CCDC) 利用了时间序列拟合来对影像中的像素值随时间的变化趋势建模。每一段模型代表一个时间段内的地表覆盖类型和状态。 本文将解释如何在谷歌地球引擎(Google Earth Engine,…...
常见排序算法总结 (四) - 快速排序与随机选择
快速排序 算法思想 每一轮在数组相应的范围上随机找一个元素进行划分,将不大于它的所有元素都放到左边,将大于它的元素都放到右边。在左右两个子数组上不断地递归,直到整个数组上有序。 注意:实现时选择的时参考荷兰国旗问题优化…...
[创业之路-187]:《华为战略管理法-DSTE实战体系》-1-从UTStarcom的发展历程,如何辩证的看企业初期发展太顺利中的危机
目录 一、UTStarcom(UT斯达康)的发展历程 1、创立与初期发展 2、快速成长与上市 3、技术创新与业务拓展 4、战略调整与持续发展 二、从UTStarcom的发展历程,如何辩证的看企业初期发展太顺利中的危机 1、企业初期发展的顺利表现 2、顺…...
C缺陷与陷阱 — 3 深入理解表达式
目录 1 表达式的运算次序 1.1 自增或自减操作符 1.2 函数参数 1.3 函数指针 1.4 函数调用 1.5 嵌套赋值语句 2 函数调用不作为函数参数 3 赋值语句的谨慎使用 1 表达式的运算次序 除了少数操作符(函数调用操作符 ( )、&&、| |、? : 和 ,ÿ…...
Next.js 系统性教学:中间件与国际化功能深入剖析
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 一、Next.js 中间件 (Middleware) 功能解析 1.1 什么是中间件? 1.2 Next.js 中间件的工作机制 1.3 中间件的功能应用 身份验证与授权 请求重定向 修改请…...
openWebUI+ollamawindows+不用docker+webLite本地安装
openWebUI & ollama & windows & 不用docker & webLite 本地安装 总结一下安装教程 10核CPU16G内存 两个web框架都可以,先说简单的 ollama-webui-lite(https://github.com/ollama-webui/ollama-webui-lite) 轻量级,只使用nodejs 先装…...
动态规划——机器分配、01背包问题
一、机器分配 题目名称:机器分配 题目描述: 总公司拥有高效设备M台,准备分给下属的N个分公司。 各分公司若获得这些设备,可以为国家提供一定的盈利。 问:如何分配这M台设备才能使国家得到的盈利最大?求出最…...
leetcode——哈希表1
242.有效的字母异位词 给定两个字符串 s 和 t ,编写一个函数来判断 t 是否是 s 的 字母异位词 。 示例 1: 输入: s "anagram", t "nagaram" 输出: true示例 2: 输入: s "rat", t "car" 输出: false 提示: 1 < s.le…...
STM32+模拟或硬件IIC+SHT20驱动问题:接上拉电阻、BUSY死锁?
主要问题: 1,使用STM32F103C8T6,模拟IIC,SCL和SDA口配置为推挽输出上拉,主要是SDA脚,每次都要输出输入模式重新配置,虽然也能通信,但不稳定,出错率大; 2&…...
Android四大组件——Activity(二)
一、Activity之间传递消息 在(一)中,我们把数据作为独立的键值对进行传递,那么现在把多条数据打包成一个对象进行传递: 1.假设有一个User类的对象,我们先使用putExtra进行传递 activity_demo06.xml <…...
PHP实现华为OBS存储
一:华为OBS存储文档地址 官方文档:https://support.huaweicloud.com/obs/index.html github地址:https://github.com/huaweicloud/huaweicloud-sdk-php-obs 二:安装华为OBS拓展 composer require obs/esdk-obs-php 三&#x…...
SQL连续登录问题(详细案例分析)
如果要统计用户活跃度,那就涉及连续登录问题,接下来将举一个简单的例子来详细说明这个问题: 一、创建一些模拟数据 一些测试数据如下: deviceid1,2022-10-26,2022-10-26,2022-11-01 deviceid1,2022-10-26,2022-11-03,2022-11-0…...
OpenCV相机标定与3D重建(9)相机标定函数calibrateCameraRO()的使用
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 cv::calibrateCameraRO 是 OpenCV 中用于相机标定的函数,它允许固定某些点来进行更精确的标定。 函数原型 double cv::calibrateCa…...
【一本通】农场派对
【一本通】农场派对 💐The Begin💐点点关注,收藏不迷路💐 N头牛要去参加一场在编号为x(1≤x≤n)的牛的农场举行的派对(1≤N≤1000),有M(1≤m≤100000)条有向道路,每条路长ti(1≤ti≤100);每头牛…...
uniapp中父组件传参到子组件页面渲染不生效问题处理实战记录
上篇文件介绍了,父组件数据更新正常但是页面渲染不生效的问题,详情可以看下:uniapp中父组件数组更新后与页面渲染数组不一致实战记录 本文在此基础上由于新增需求衍生出新的问题.本文只记录一下解决思路. 下面说下新增需求方便理解场景: 商品信息设置中添加抽奖概率设置…...
基础暴力算法
线性枚举 线性枚举(Linear Enumeration)是一种暴力枚举的方法,它逐一检查每个可能的解,适用于搜索和枚举问题。 其核心思路是:对问题的所有可能情况逐一进行遍历,并针对每种情况判断是否满足条件…...
【复变函数】三、复变函数的积分
目录 1. 复变函数积分1.1. 复积分1.2. 存在性与计算1.2.1 第二类曲线积分与格林公式1.2.2 第一类曲线积分与参数式 1.3. 性质1.4. 圆径积分 2. 柯西积分定理2.1. 柯西(Cauchy)基本定理与莫雷拉(Morrera)定理2.2. 复合闭路定理2.3.…...
ChatGPT Pro是什么
ChatGPT Pro 和 ChatGPT Plus 的区别主要体现在功能范围、适用场景和目标用户上。 ChatGPT Plus 功能 • 价格:20美元/月。 • 目标用户:针对个人用户设计。 • 主要特点: • 在高峰期响应速度更快。 • 使用高级模型(如 GPT-4…...
React - echarts 世界地图,中国地图绘制
中国地图 首先需要一个包含中国所有省份名称的 json,这个好多网站都能找到。 我传到资源里了,放百度网盘怕太长时间不登录给我删掉了。 中国地图中文版json 我把地图抽出来单独做成了组件,这样用的时候比较方便. 使用的时候: …...
knife4j-openapi3 4.5 最基本的使用 openAPI
最基本的使用,配置太多懒得研究 SpringBoot 整合 knfe4j ,使用 OpenAPI3 规范,这个兄弟写的挺好 环境: spring-boot-starter-parent:3.4.0 1. 依赖 <dependency><groupId>com.github.xiaoymin</gr…...
如何在 Ubuntu 22.04 上安装和使用 Apache Kafka
简介 Apache Kafka是一个高性能、低延迟的分布式流处理平台,广泛用于构建实时数据管道和流式应用。本文将指导你如何在Ubuntu 22.04系统上快速部署Apache Kafka,让你体验到Kafka在处理大规模实时数据流方面的强大能力。通过本教程,你将学会如…...
Linux:network:添加ip的时候自动添加一个本地路由
文章目录 问题问题 最近在看一个路由的问题,顺便看内核代码,发现在添加IP的时候,内核会自动添加一个local route。 net/ipv4/devinet.c inet_rtm_newaddr->__inet_insert_ifa /* Send message first, then call notifier.Notifier will trigger FIB update, so thatlis…...
Android 10、11、12存储适配相关
AndroidQ(10)分区存储完美适配 - 简书前言 最近时间在做AndroidQ的适配,截止到今天AndroidQ分区存储适配完成,期间出现很多坑,目前网上的帖子大部分都是概述变更内容,接下来的几篇帖子都是对分区存储实际...https://www.jianshu.c…...
如何将视频转化为音频?五个方法策略
在日常生活中,我们经常需要将视频中的音频提取出来,以便在特定的场合使用。无论是为了制作铃声、背景音乐,还是为了进行语音转文字处理,视频转音频的需求都非常普遍。如何将视频转化为音频?本文将详细介绍多种将视频转…...
ecovadis评估最新标准
EcoVadis评估的最新标准主要包括奖牌评估规则和新增的徽章规则,以下是对这两方面的详细阐述: 一、奖牌评估规则 评估范围:EcoVadis的评估总分为100分,评估内容涵盖环境、劳工与人权、商业道德、可持续采购等四大主题。 奖牌等级…...
Java版-图论-最小生成树-Kruskal算法
实现描述 为了造出一棵最小生成树,我们从最小边权的边开始,按边权从小到大依次加入,如果某次加边产生了环,就扔掉这条边,直到加入了 n-1 条边,即形成了一棵树。 实现代码 首选我们对所有的边,…...
【单片机开发】MCU三种启动方式(Boot选择)[主Flash/系统存储器(BootLoader)/嵌入式SRAM]
目录 参考资料: 利用 Boot 选择不同的启动方式: 单片机的存储结构(主 FLASH/系统存储器/嵌入式 SRAM): 1. Cortex-M 内核芯片——启动原理: 1.1. 启动流程: 1.2. 根据单片机的存储器映射和架构图:启动…...
实验15 验证LSTM模型的长程依赖
本次实验依托上个实验 一 模型构建 创建LSTM模型,里面包括初始化init函数、初始化权重函数_init_weights、初始化状态函数init_state、前向传播函数forward。 init函数:虽然每个时间的输入和隐层都是一样的,但是他们会有四组不同的权重&am…...
Charles功能说明
1.扫把(clear the current Session) (前头方向) 作用:清除所有抓取的包(正方形框) 2.中心圈-未启用显示(Star Recording)点击启动 -启动之后显示(Stop Recording)点击停止 作用:启动之后开始抓取包(刷新一次页面或跳转抓取内容) 3.锁-未启动显示(Star SSL Proxying)点击启动 -启…...
自动秒收录程序与自动秒收录网站源码论坛版本下载
自动秒收录程序与自动秒收录网站源码论坛版本下载 随着互联网的快速发展,网站优化已成为众多企业和个人博主提升在线影响力的关键手段。其中,SEO(搜索引擎优化)作为提升网站排名的核心策略,备受关注。而SEO优化的一个…...
HTML颜色-HTML脚本
HTML脚本 js使得HTML页面具有更强的动态和交互性 HTML<script>标签 标签用于定义客户端脚本,比如javascript 可包含脚本语句,也可以通过src属性指向外部的脚本文件 JavaScript最常用于图片操作,表单验证以及动态的内容更新 HTML<n…...
【WRF理论第十三期】详细介绍 Registry 的作用、结构和内容
目录 1. Introduction:介绍 Registry 的作用和功能。2. Registry Contents:详细描述 Registry 的结构和内容,包括各个部分的条目类型。2.1. DIMSPEC ENTRIES(维度规格条目)2.2. STATE ENTRIES(状态变量条目…...
使用Kimi开发自己的问答应用
概述 Kimi是大家常用的一个人工智能助手,本文使用Kimi开发文档,以node作为后端,开发与一个问答系统 实现效果 Kimi简介 Kimi是由Moonshot AI开发的人工智能助手,擅长中文和英文对话。目标是帮助用户解决问题、提供信息和执行任…...
Vue前端开发-路由其他配置
在路由文件中,除了跳转配置外,还可以进行路径重定向配置,如果没有找到对应的地址,还可以实现404的配置,同时,如果某个页面需要权限登录,还可以进行路由守卫配置,接下来,分…...
AI与遥感的融合:构建新一代智能监测作业平台
在测绘地理信息与遥感领域,人工智能(AI)技术的融合正推动着一场监测作业模式的革命。AI不仅提升了数据处理的效率,还极大地扩展了遥感技术的应用范围和深度。 遥感监测的智能化趋势 随着遥感数据量的激增,传统的人工…...
3D 视觉定位技术:汽车零部件制造的智能变革引擎
在汽车零部件制造领域,传统工艺正面临着前所未有的挑战。市场对于零部件精度与生产效率近乎苛刻的要求,促使企业寻求突破之道。而 3D 视觉定位技术,为汽车零部件制造开启了精准定位与智能化生产的新纪元。 3D 视觉定位系统的核心技术原理 3…...
git提交时出现merge branch main of xxx
git提交时出现merge branch main of xxx 原因: 1、同事commit了一个修改A,push到remote 2、我把这个修改直接pull了下来(pull是fetchmerge的操作,自动合并到本地workspace) 3、同事因为后续的commit有冲突,…...
重生之我在异世界学编程之C语言:深入结构体篇(上)
大家好,这里是小编的博客频道 小编的博客:就爱学编程 很高兴在CSDN这个大家庭与大家相识,希望能在这里与大家共同进步,共同收获更好的自己!!! 本文目录 引言正文《1》 结构体的两种声明一、结构…...
到达率和服务率在python中实现
到达率和服务率在python中实现 概念理解 到达率(Arrival Rate):是指顾客(或任务、事件等)到达服务系统的平均速率,通常用单位时间内到达的数量来表示。例如,在一个客服中心,每小时平均有10个客户来电咨询,这里的每小时10个客户就是到达率。服务率(Service Rate):是…...
重视猫艾滋:宠物健康的隐秘挑战
猫艾滋,全称为猫获得性免疫缺陷综合征(Feline Acquired Immunodeficiency Syndrome),是由猫免疫缺陷病毒(FIV)感染引起的一种严重危害猫类健康的疾病。虽然其名称与人类艾滋病相似,但猫艾滋仅在…...
使用长轮询解决某些场景的实时消息推送需求
需求来源 最近做一个需求实现在移动端通过按钮,远程控制大屏幕上展示的资源进行实时切换,可以展示一个大屏页面,可以展示一段视频,也可以展示一张图片。 解决思路 大屏幕上打开一个游览器,访问指定动态资源展示页面…...