`
Adan-Chiu
  • 浏览: 21692 次
社区版块
存档分类
最新评论

spring MVC组件开发-表单数据校验

 
阅读更多

       在实际工作中,得到数据后的第一步就是校验数据的正确性,如果存在录入上的问题,一般先经过前端js进行验证,但是前端有多种方式可以绕过前端js验证(不是安全有效的),为了数据安全性一般还需要在服务器端做数据校验。这个时候就可以使用spring所提供的验证器(Validator)规则去验证。

所有的验证都是要先注册验证器,不过验证器也是springmvc自动加载的。我们 使用hibernate校验规则。

 

使用JSR 303注解验证输入内容

        Spring  提供了对Bean的功能校验,通过注解@Valid标明哪个Bean需要启用注解式的验证。在javax.validation.constrains.*中定义了一系列的JSR 303规范给出的注解:

 

限制

说明

@Null

限制只能为null

@NotNull

限制必须不为null

@AssertFalse

限制必须为false

@AssertTrue

限制必须为true

@DecimalMax(value)

限制必须为一个不大于指定值的数字

@DecimalMin(value)

限制必须为一个不小于指定值的数字

@Digits(integer,fraction)

限制必须为一个小数,且整数部分的位数不能超过integer,小数部分的位数不能超过fraction

@Future

限制必须是一个将来的日期

@Max(value)

限制必须为一个不大于指定值的数字

@Min(value)

限制必须为一个不小于指定值的数字

@Past

限制必须是一个过去的日期

@Pattern(value)

限制必须符合指定的正则表达式

@Size(max,min)

限制字符长度必须在min到max之间

@Email

邮箱类型

@NotEmpty

集合,不为空

@NotBlank

不为空字符串

@Positive

数字,正数

@PositiveOrZero

数字,正数或0

@Negative

数字,负数

@NegativeOrZero

数字,负数或0

@PastOrPresent

过去或者现在日期

@FutrueOrPresent

将来或者现在日期

 
为了使用这些注解,假设要完成一个保存雇员表单:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>

<!DOCTYPE html>
<html>
<head>
    <title>添加员工</title>
</head>
<body>
    <form action="${pageContext.request.contextPath }/control/emp/save" method="post" >
	        用户名:<input type="text" name="username" placeholder="请输入用户名,最小4位,最大12位" required/>
	        <span></span>
	        <br/>
	        密码:<input type="password" name="password" placeholder="请输入登录密码"/><br/>
	        电子邮箱:<input type="email" name="email" placeholder="请输入电子邮箱"/><br/>
	        员工生日:<input type="date" name="bornDate" /><br/>
	        薪水:<input type="number" name="salary" placeholder="请输入员工薪水" /><br/>
	        联系电话:<input type="text" name="phone" placeholder="请输入员工联系电话"  pattern="^1[358]\d{9}$"/><br/>
	      
	        员工简介:
        <textarea placeholder="请输入员工简介" name="intro"></textarea> 
        <br/>
        <input type="submit" value="提交" /> <input type="reset">
    </form:form>
    
</body>
</html>
校验规则:
  • 户名,密码,电子邮箱,入职日期不能为空
  • 入职日期格式为yyyy-MM-dd,且只能大于今日
  • 生日日期格式为yyyy-MM-dd,且只能是一个过去日期
  • 邮箱需要符合格式:
  •  简介内容不得多于256个字符
  • 薪水最小值为2000,最大值为5万
  • 联系方式需为正确的手机号码(使用正则表达式匹配)

建立pojo,确定校验规则:

 

public class Employee {
	private Integer id;
	/**
	 * 用户名,不允许为空,最小4位,最大12位
	 */
	@NotBlank(message = "用户名不能为空")
	@Size(min = 4,max = 12,message = "{employee.username.valid.size.message}")
	private String username;
	/**
	 * 密码:不能为空,最小6位
	 */
	@NotBlank(message = "密码不能为空")
	@Size(min = 6,max = 12,message = "密码最低6位")
	private String password;
	
	/**
	 * 电子邮箱,不能为空,要满足邮箱基本格式
	 */
	@NotNull(message = "邮箱不能为空")
	@Email(message="邮箱必须满足基本格式")
	private String email;
	/**
	 * 员工生日,格式为:yyyy-MM-dd
	 * 必须是一个过去的日期
	 */
	@DateTimeFormat(iso = ISO.DATE)
	@Past(message = "你不能录用还未出生的员工")
	private LocalDate bornDate;
	
	/**
	 * 入职日期,格式为:yyyy-MM-dd
	 * 必须是一个现在或者将来的日期
	 */
	@DateTimeFormat(iso = ISO.DATE)
	@FutureOrPresent
	private LocalDate entryDate = LocalDate.now();
	/**
	 * 员工联系(手机)电话
	 * 必须符合手机号码格式(正则表达式)
	 */
	@Pattern(regexp = "^1[358]\\d{9}$",message = "请输入正确的手机号码")
	private String phone;
	/**
	 * 员工薪水,最低2000,最高5万
	 */
	@Min(value = 2000,message="工资不能低于2000,否则麻烦了")
	@Max(value=50000,message="工资不能大于50000,否则交奢侈税")
	private float salary;
	
	/**
	 * 员工简介,最大不超过200
	 */
	@Size(min = 6,max = 12,message = "员工简介不能超过200字")
	private String intro;

       //***************setter and getter*************/
}
       这样就定义了一个pojo,用于接收表单的信息。字段上面的注解反映了对每一个字段的验证要求,这样就可以加入对应校验,如果没有指定message属性,会生成默认的错误信息。message配置项用来定义当校验失败后的错误信息,这样就能启动Spring的检验规则来校验表单了。

 

 

用控制器验证表单

 

@Controller
@RequestMapping("/control/emp")
public class EmployeeController {
	@RequestMapping("/save")
	public String save(@Valid Employee emp,BindingResult errors) {
		if(errors.hasErrors()) {
			return "emp/emp_save";
		}
		return "redirect:./list";
	}
}
    使用了注解@Valid标明这个Bean将会被校验,另外一个类型为BindingResult的参数(或者为Errors)是用于保存校验是否存在错误信息的,也就是当采用JSR 303规范进行校验后,它会将这个错误信息保存到这个参数中,在方法中判断是否有错误信息,如果有错误信息,跳转到填写表单页面告诉用户错误信息。

 


如何在jsp页面中显示错误信息呢?这时可以使用jsp提供给我们的标签库

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="form"  uri="http://www.springframework.org/tags/form"%>
<!DOCTYPE html>
<html>
<head>
    <title>添加员工</title>
</head>
<body>
    <form:form action="${pageContext.request.contextPath }/control/emp/save" method="post"  modelAttribute="employee">
	        用户名:<input type="text" name="username" placeholder="请输入用户名,最小4位,最大12位" required/>
	        <span><form:errors path="username" cssStyle="color: red"/></span>
	        <br/>
	        密码:<input type="password" name="password" placeholder="请输入登录密码"/><br/>
	        电子邮箱:<input type="email" name="email" placeholder="请输入电子邮箱"/><br/>
	        员工生日:<input type="date" name="bornDate" /><br/>
	        薪水:<input type="number" name="salary" placeholder="请输入员工薪水" /><br/>
	        联系电话:<input type="text" name="phone" placeholder="请输入员工联系电话"  pattern="^1[358]\d{9}$"/><br/>
	      
	        员工简介:
        <textarea placeholder="请输入员工简介" name="intro"></textarea> 
        <br/>
        <input type="submit" value="提交" /> <input type="reset">
    </form:form>
</body>
</html>
 看起来似乎非常不错,但是我们的message错误提示信息是硬编码在pojo身上,为了避免其硬编码而实现可配置,我们在src/main/resource下新建messageSource.properties文件:

 

 

employee.username.valid.notnull.message=用户名不能为空
employee.username.valid.size.message=用户名不能少于4位且不能超过12位
 上面简单罗列了两个错误信息配置,其它道理一样,哪怎么应用(读取)指定的错误信息呢?在pojo验证规则之上:

 

/**
* 用户名,不允许为空,最小4位,最大12位
*/
@NotBlank(message = "{employee.username.valid.notnull.message}")
@Size(min = 4,max = 12,message = "{employee.username.valid.size.message}")
private String username;

 可以采用{}表达式对配置文件的key加以读取其对应的value。其它字段同理,到这里还不能读取指定配置文件,需要告诉spring的检验器加载什么样的配置文件,配置代码如下:

@Configuration
@ComponentScan(basePackages = "com.wise.tiger.web")
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer{
	@Bean
	public InternalResourceViewResolver viewResolver() {
		var viewResolver = new InternalResourceViewResolver();
		viewResolver.setPrefix("/WEB-INF/pages/");
		viewResolver.setSuffix(".jsp");
		return viewResolver;
	}

	@Override //静态资源不被前端控制器拦截
	public void addResourceHandlers(ResourceHandlerRegistry registry) {
		registry.addResourceHandler("/static/**")//添加静态资源的url-pattern
			.addResourceLocations("/static/");
	}
	@Bean
	public ReloadableResourceBundleMessageSource messageResource() {
		var messageResource = new ReloadableResourceBundleMessageSource();
		//如果不指定,默认会去classpath下的messages.properties配置文件
		messageResource.setBasename("classpath:resourceMessage");
		return messageResource;
	}
	
	/**
	 * 添加表单校验器
	 */
	@Override
	public Validator getValidator() {
		var validator = new LocalValidatorFactoryBean();
		validator.setProviderClass(HibernateValidator.class);
		validator.setValidationMessageSource(messageResource());
		return validator;
	}
}

 分组校验

1.定义分组:可以采用标识接口来进行分组区分

//分组校验1
public interface ValidationGroup1 {
}

//分组校验2
public interface ValidationGroup2 {
}

 

2.在检验规则上添加分组

/**
* 用户名,不允许为空,最小4位,最大12位
*/
@NotBlank(message = "{employee.username.valid.notnull.message}",groups = ValidationGroup1.class)
@Size(min = 4,max = 12,message = "{employee.username.valid.size.message}",groups = ValidationGroup2.class)
private String username;

3.在conroller中指定使用的分组校验

@Controller
@RequestMapping("/control/emp")
public class EmployeeController {
	@RequestMapping("/save")
	public String save( @Validated(ValidationGroup2.class) @ModelAttribute Employee emp,BindingResult errors,Model model) {
		if(errors.hasErrors()) {
			for (var i = 0; i < errors.getErrorCount();i++) {
				System.out.println(errors.getObjectName() + ":" + errors.getFieldError().getDefaultMessage());
			}
			return "emp/emp_save";
		}
		return "redirect:./list";
	}
}

 

   有时候除了简单的输入格式、非空性等校验,也需要一定的业务校验,Spring提供了Validator接口来实现校验,它将在进入控制器逻辑之前对参数的合法性进行校验。核心代码如下:

public interface Validator {
	/**
	 * 判断当前校验器是否用于检验clazz类型的pojo
	 * @param clazz -- pojo类型
	 * @return true 启动校验,false 不校验
	 */
	@Override
	public boolean supports(Class<?> clazz) {
		return false;
	}

	/**
	 * 检验pojo的合法性
	 * @param target 请求对象
	 * @param errors 错误信息
	 */
	@Override
	public void validate(Object target, Errors errors) {
		
	}

}

 

  Validator接口是SpringMvc校验表单的核心接口,它只是一个验证器,在Spring中最终被注册到验证器的列表中,这样就可以提供给各个控制器去定义,然后通过supports方法判定是否会启用验证器去验证数据。对于校验的过程,则是通过validate方法去实现的。

package com.wise.tiger.pojo;

import org.springframework.validation.Errors;
import org.springframework.validation.Validator;

/**
 * @Description: 员工校验器
 * @author: <a href="mailto:1020zhaodan@163.com">Adan</a> 
 * @date: 2019年5月28日  下午7:23:40
 * @version:1.0-snapshot
 */
public class EmployeeValidator implements Validator {
	/**
	 * 判断当前校验器是否用于检验clazz类型的pojo
	 * @param clazz -- pojo类型
	 * @return true 启动校验,false 不校验
	 */
	@Override
	public boolean supports(Class<?> clazz) {
		//判断验证是否为Employee,如果是则进行校验
		return Employee.class.equals(clazz);
	}

	/**
	 * 检验pojo的合法性
	 * @param target 请求对象
	 * @param errors 错误信息
	 */
	@Override
	public void validate(Object target, Errors errors) {
		var employee = (Employee)target;
		//对employee pojo类中年薪计算规则为薪水 * 16
		var yearlySalary = employee.getSalary() * 16;
		//如果年薪小于1,则认为业务错误
		if(yearlySalary < 1)
			//加入错误信息
			errors.rejectValue("yearlySalary", null, "年薪和月薪不匹配,月薪输入错误");
	}
}

 需要将该验证器捆绑到对应的控制器中,Spring MVC提供了注解@InitBinder,通过该注解就可以将验证器和控制器捆绑在一起,这样就能对请求表单进行验证了。

@Controller
@RequestMapping("/control/emp")
public class EmployeeController {
	@InitBinder
	public void initBinder(DataBinder binder){
		//数据绑定器加入验证器
		binder.setValidator(new EmployeeValidator());
	}
	@RequestMapping("/save")
	public String save( @Validated(ValidationGroup2.class) @ModelAttribute Employee emp,BindingResult errors,Model model) {
		if(errors.hasErrors()) {
			for (var i = 0; i < errors.getErrorCount();i++) {
				System.out.println(errors.getObjectName() + ":" + errors.getFieldError().getDefaultMessage());
			}
			return "emp/emp_save";
		}
		return "redirect:./list";
	}
}

 这样就能对比较复杂的逻辑关系进行校验了。@InitBinder的使用还有其它内容,后续讲解。。。。。。

 

附:依赖列表

 

dependencies {
    compile group: 'org.springframework', name: 'spring-context', version: '5.1.7.RELEASE'
    compile group: 'org.springframework', name: 'spring-webmvc', version: '5.1.7.RELEASE'
	compile group: 'org.springframework', name: 'spring-test', version: '5.1.7.RELEASE'
	providedCompile group: 'javax.servlet.jsp', name: 'javax.servlet.jsp-api', version: '2.3.3'
	providedCompile group: 'javax.servlet', name: 'javax.servlet-api', version: '4.0.1'
	compile group: 'taglibs', name: 'standard', version: '1.1.2'
	compile group: 'javax.servlet', name: 'jstl', version: '1.2'
	compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.9.2'
	compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.9.2'
	compile group: 'org.mybatis', name: 'mybatis-spring', version: '2.0.1'
	compile group: 'org.mybatis', name: 'mybatis', version: '3.5.1'
	compile group: 'com.alibaba', name: 'druid', version: '1.1.16'
	compile group: 'mysql', name: 'mysql-connector-java', version: '8.0.16'
	compile group: 'org.springframework', name: 'spring-jdbc', version: '5.1.7.RELEASE'
	compile group: 'javax.validation', name: 'validation-api', version: '2.0.1.Final'
	compile group: 'org.hibernate', name: 'hibernate-validator', version: '6.0.16.Final'
	compile group: 'com.fasterxml.jackson.core', name: 'jackson-databind', version: '2.9.9'
}

 

  • 大小: 16.8 KB
分享到:
评论

相关推荐

    一个采用MVC架构设计、Java实现的泡泡堂游戏。.zip

    一个采用MVC架构设计、Java实现的泡泡堂游戏。zip是一个基于Java语言开发的项目,旨在通过实践帮助初学者理解MVC(Model-View-Controller)设计模式在游戏开发中的应用。该项目不仅涵盖了游戏逻辑和用户交互,还注重代码结构和可维护性。项目的核心是MVC架构,它将应用程序分为三个主要组件:模型(Model)、视图(View)和控制器(Controller)。模型负责处理数据和业务逻辑,视图负责展示数据,控制器则作为两者之间的桥梁,处理用户输入并更新视图。这种设计模式有助于提高代码的可读性和可维护性,同时也使得项目的扩展和修改变得更加容易。该资源适合初学者学习,因为它的难度适中,功能清晰。通过这个项目,开发者可以深化对Java语言的理解,掌握MVC模式的应用,同时提升在游戏开发方面的能力。此外,项目源代码是公开的,初学者可以直接下载使用,查看源代码,理解项目的实现方式,也可以在此基础上进行修改和扩展,以进一步提高自己的编程技能。总之,“一个采用MVC架构设计、Java实现的泡泡堂游戏.zip”是一个宝贵的学习资源,它为初学者提供了一个实践平台,帮助他们在游戏开发中学习和成长。

    基于java的坦克大战游戏.zip

    基于Java的坦克大战游戏是一款经典的射击类游戏,通过Java编程语言实现。这款游戏不仅涵盖了面向对象编程、多线程处理和图形绘制等关键技术,还运用了Socket进行客户端与服务器端的通信,使玩家能够通过网络进行对战。游戏中,玩家需要操纵坦克守卫基地,同时尽可能摧毁敌方坦克,并有机会获得超级武器来提升坦克属性。其丰富的功能模块和高度互动性,使其成为学习和实践Java编程技术的优秀资源。

    原版apsw-3.39.4.0-cp311-cp311-win_arm64.whl-下载即用直接pip安装.zip

    安装前的准备 1、安装Python:确保你的计算机上已经安装了Python。你可以在命令行中输入python --version或python3 --version来检查是否已安装以及安装的版本。 个人建议:在anaconda中自建不同python版本的环境,方法如下(其他版本照葫芦画瓢): 比如创建python3.8环境,anaconda命令终端输入:conda create -n py38 python==3.8 2、安装pip:pip是Python的包管理工具,用于安装和管理Python包。你可以通过输入pip --version或pip3 --version来检查pip是否已安装。 安装WHL安装包 1、打开命令行(或打开anaconda命令行终端): 在Windows上,你可以搜索“cmd”或“命令提示符”并打开它。 在macOS或Linux上,你可以打开“终端”。 2、cd到whl文件所在目录安装: 使用cd命令导航到你下载的whl文件所在的文件夹。 终端输入:pip install xxx.whl安装即可(xxx.whl指的是csdn下载解压出来的whl) 3、等待安装完成: 命令行会显示安装进度,并在安装完成后返回提示符。 以上是简单安装介绍,小白也能会,简单好用,从此再也不怕下载安装超时问题。 使用过程遇到问题可以私信,我可以帮你解决! 收起

    钢材表面缺陷检测数据集

    钢材表面缺陷检测数据集是一个专门针对钢材表面缺陷检测的深度学习训练与测试资源。这个数据集的创建旨在推动钢铁工业中自动化检测技术的发展,提高生产效率和产品质量。它包含了大量经过精心标注的真实钢材图像,用于训练和验证深度学习模型,特别是针对目标检测任务的算法,如YOLO(You Only Look Once)。 一、表面缺陷检测的重要性: 在钢铁制造过程中,表面缺陷可能会影响材料的性能和寿命,甚至导致结构的失效。因此,及时、准确地检测出这些缺陷至关重要。传统的检测方法依赖于人工视觉检查,成本高且易受主观因素影响。随着机器学习和深度学习技术的进步,自动化检测已成为解决这一问题的有效途径。 二、深度学习在表面缺陷检测中的应用: 1. YOLO(You Only Look Once):YOLO是一种实时的目标检测系统,以其快速的检测速度和相对较高的准确性而受到广泛关注。在NEU-DET数据集中,YOLO可以被训练来识别并定位钢材表面的缺陷,如裂纹、锈斑、凹痕等。 2. 特征提取:深度学习模型,如卷积神经网络(CNN),能自动从图像中学习高级特征,这对于识别复杂的表面缺

    基于java的微信小程序健身房私教预约系统答辩PPT.pptx

    基于java的微信小程序健身房私教预约系统答辩PPT.pptx

    astropy-5.0.4-cp310-cp310-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    基于java的微信小程序中国剪纸微信小程序的设计与实现答辩PPT.pptx

    基于java的微信小程序中国剪纸微信小程序的设计与实现答辩PPT.pptx

    VB程序实例-保存窗口设置.zip

    基于VB的程序实例,可供参考学习使用

    基于java的微信小程序微信平台签到系统的设计与实现答辩PPT.pptx

    基于java的微信小程序微信平台签到系统的设计与实现答辩PPT.pptx

    astropy-4.2-cp36-cp36m-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    aggdraw-1.3.14-cp38-cp38-win32.whl.rar

    python whl离线安装包 pip安装失败可以尝试使用whl离线安装包安装 第一步 下载whl文件,注意需要与python版本配套 python版本号、32位64位、arm或amd64均有区别 第二步 使用pip install XXXXX.whl 命令安装,如果whl路径不在cmd窗口当前目录下,需要带上路径 WHL文件是以Wheel格式保存的Python安装包, Wheel是Python发行版的标准内置包格式。 在本质上是一个压缩包,WHL文件中包含了Python安装的py文件和元数据,以及经过编译的pyd文件, 这样就使得它可以在不具备编译环境的条件下,安装适合自己python版本的库文件。 如果要查看WHL文件的内容,可以把.whl后缀名改成.zip,使用解压软件(如WinRAR、WinZIP)解压打开即可查看。 为什么会用到whl文件来安装python库文件呢? 在python的使用过程中,我们免不了要经常通过pip来安装自己所需要的包, 大部分的包基本都能正常安装,但是总会遇到有那么一些包因为各种各样的问题导致安装不了的。 这时我们就可以通过尝试去Python安装包大全中(whl包下载)下载whl包来安装解决问题。

    兔兔答题源码 在线答题神器 一款前后端开源的移动端答题系统.zip

    依赖包安装 由于node的包非常大,所以提供源代码的时候就不提供第三方的依赖包,需要自己安装。在项目目录下执行npm i即可安装。 1、PHP的版本必须在8.2x,至于更高的版本,例如8.3x版本以及更高,系统还未完全测试过,生产环境不建议直接使用。 2、MySQL的版本必须是>= 5.7.x的版本,低于5.7.0的版本100%是无法使用的。 3、Redis的版本没有过多的要求,不过推荐使用7.0以及更高的版本。 4、管理端使用的Vue3的版本开发,同时使用了Element Plus的版本, 所以需要使用Node.js的版本推荐是>= 16.x的版本。同时推荐生产环境,编译打包成静态文件运行。 安装教程: 域名配置,打开utils目录下的request.js文件,按照文件说明配置实际的API地址。 App.vue里面的examUpdateTemplateId改成自己的微信小程序订阅模板id。 代码中有涉及到开发者的二维码图片,根据不同的地方替换成自己即可。 小程序配置,找到manifest.json文件,将下面的appid改成你自己的小程序appid。 “mp-we

    JSP基于SSM小区物业管理系统毕业源码案例设计.zip

    JSP基于SSM小区物业管理系统毕业源码案例设计 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。

    VB程序实例-程序菜单的隐藏&显示.zip

    基于VB的程序实例,可供参考学习使用

    基于Java实现的黄金矿工小游戏.zip

    本资源是一个基于Java实现的黄金矿工小游戏项目,旨在帮助初学者通过实践巩固Java编程知识。游戏包含多个功能模块,如窗口绘制、图片绘制、红线摇摆及抓取判定等,并采用双缓存技术解决画面闪动问题。此外,还实现了金块和石块的随机生成与抓取机制、积分设置、关卡设置以及商店购物等功能。本项目适合刚入门或有一定基础的Java学习者,通过完成这个项目,可以提升面向对象编程的理解和应用能力,同时增强对Java基础知识的掌握。

    盒子模型及盒子布局中的

    清除默认样式

    基于java的社区文化宣传网站答辩PPT.pptx

    基于java的社区文化宣传网站答辩PPT.pptx

    Trustwave DbProtect:高级查询与自定义报告技术教程.docx

    Trustwave DbProtect:高级查询与自定义报告技术教程.docx

    原版apsw-3.46.1.0-cp312-cp312-win_arm64.whl-下载即用直接pip安装.zip

    安装前的准备 1、安装Python:确保你的计算机上已经安装了Python。你可以在命令行中输入python --version或python3 --version来检查是否已安装以及安装的版本。 个人建议:在anaconda中自建不同python版本的环境,方法如下(其他版本照葫芦画瓢): 比如创建python3.8环境,anaconda命令终端输入:conda create -n py38 python==3.8 2、安装pip:pip是Python的包管理工具,用于安装和管理Python包。你可以通过输入pip --version或pip3 --version来检查pip是否已安装。 安装WHL安装包 1、打开命令行(或打开anaconda命令行终端): 在Windows上,你可以搜索“cmd”或“命令提示符”并打开它。 在macOS或Linux上,你可以打开“终端”。 2、cd到whl文件所在目录安装: 使用cd命令导航到你下载的whl文件所在的文件夹。 终端输入:pip install xxx.whl安装即可(xxx.whl指的是csdn下载解压出来的whl) 3、等待安装完成: 命令行会显示安装进度,并在安装完成后返回提示符。 以上是简单安装介绍,小白也能会,简单好用,从此再也不怕下载安装超时问题。 使用过程遇到问题可以私信,我可以帮你解决! 收起

    使用Java开发的一个小的飞机大战游戏.zip

    资源简介本资源是一个使用Java语言开发的小型飞机大战游戏,旨在为学习者提供一个完整的游戏开发案例。项目包含全部源代码及相关资源文件,适合初学者和有经验的开发者学习和参考。通过本项目,学习者可以深入了解Java编程、面向对象设计、图形渲染及事件处理等核心概念,并掌握游戏开发的基本技巧。该项目涵盖了从游戏设计到实现的全过程,包括游戏窗口创建、游戏元素(如飞机、子弹、敌机)的设计、碰撞检测、计分系统以及用户交互等功能。通过分析和研究这些代码,学习者不仅可以提升编程技能,还能理解游戏开发的基本原理和流程。总之,这个基于Java的飞机大战游戏项目是一个宝贵的学习资源,能够帮助学习者在实践中掌握Java编程和游戏开发的核心知识。

Global site tag (gtag.js) - Google Analytics