旅游商城系统开发

3 篇文章 2 订阅
订阅专栏

一.导入初始化的maven项目

导入的方法可以参考下面链接:

如何在eclipse中导入maven项目 ?在eclipse中导入maven项目的教程-天极下载

如何用Eclipse导入一个已经存在的Maven项目 - 爱码爱生活

​​​Eclipse在运行 Maven项目build时出现No compiler is provided in this environment的处理_康冕峰的博客-CSDN博客

导入后并启动初始化的maven项目的静态页面

二.创建数据库

​
/*==============================================================*/
/* DBMS name:      MySQL 5.0                                    */
/* Created on:     2018/2/14 23:10:29                           */
/*==============================================================*/
create database travel
set names utf8;

drop table if exists tab_favorite;
drop table if exists tab_route_img;
drop table if exists tab_route;
drop table if exists tab_category;
drop table if exists tab_seller;
drop table if exists tab_user;

/*==============================================================*/
/* Table: tab_category                                          */
/*==============================================================*/
create table tab_category
(
   cid                  int not null auto_increment,
   cname                varchar(100) not null,
   primary key (cid),
   unique key AK_nq_categoryname (cname)
);

/*==============================================================*/
/* Table: tab_favorite                                          */
/*==============================================================*/
create table tab_favorite
(
   rid                  int not null,
   date                 date not null,
   uid                  int not null,
   primary key (rid, uid)
);

/*==============================================================*/
/* Table: tab_route                                             */
/*==============================================================*/
create table tab_route
(
   rid                  int not null auto_increment,
   rname                varchar(500) not null,
   price                double not null,
   routeIntroduce       varchar(1000),
   rflag                char(1) not null,
   rdate                varchar(19),
   isThemeTour          char(1) not null,
   count                int default 0,
   cid                  int not null,
   rimage               varchar(200),
   sid                  int,
   sourceId             varchar(50),
   primary key (rid),
   unique key AK_nq_sourceId (sourceId)
);

/*==============================================================*/
/* Table: tab_route_img                                         */
/*==============================================================*/
create table tab_route_img
(
   rgid                 int not null auto_increment,
   rid                  int not null,
   bigPic               varchar(200) not null,
   smallPic             varchar(200),
   primary key (rgid)
);

/*==============================================================*/
/* Table: tab_seller                                            */
/*==============================================================*/
create table tab_seller
(
   sid                  int not null auto_increment,
   sname                varchar(200) not null,
   consphone            varchar(20) not null,
   address              varchar(200),
   primary key (sid),
   unique key AK_Key_2 (sname)
);

/*==============================================================*/
/* Table: tab_user                                              */
/*==============================================================*/
create table tab_user
(
   uid                  int not null auto_increment,
   username             varchar(100) not null,
   password             varchar(32) not null,
   name                 varchar(100),
   birthday             date,
   sex                  char(1),
   telephone            varchar(11),
   email                varchar(100),
   status               char(1) ,
   code					varchar(50),
   
   primary key (uid),
   unique key AK_nq_username (username),
   unique key AK_nq_code (code)
);

alter table tab_favorite add constraint FK_route_favorite foreign key (rid)
      references tab_route (rid) on delete restrict on update restrict;

alter table tab_favorite add constraint FK_user_favorite foreign key (uid)
      references tab_user (uid) on delete restrict on update restrict;

alter table tab_route add constraint FK_category_route foreign key (cid)
      references tab_category (cid) on delete restrict on update restrict;

alter table tab_route add constraint FK_seller_route foreign key (sid)
      references tab_seller (sid) on delete restrict on update restrict;

alter table tab_route_img add constraint FK_route_routeimg foreign key (rid)
      references tab_route (rid) on delete restrict on update restrict;
	  
	  
insert  into `tab_category`(`cid`,`cname`) values (8,'全球自由行'),(5,'国内游'),(4,'处境游'),(7,'抱团定制'),(6,'港澳游'),(2,'酒店'),(1,'门票'),(3,'香港车票');
insert  into `tab_seller`(`sid`,`sname`,`consphone`,`address`) values (1,'黑马程序员','12345678901','传智播客javaEE学院');


/*Data for the table `tab_route` */

三.代码开发

3.1注册登录功能的开发

学习目标

     1.能够完成项目注册功能

     2.能够完成邮箱登录功能

学习指南

  1. 注册功能的表单校验
  2. 注册功能的验证码校验
  3. 注册功能的邮箱激活
  4. 登录功能的实现

3.1.1注册功能分析

1.前端页面功能实现 

  *使用js完成表单校验

  *使用ajax完成表单提交

  *注册成功后,跳转的页面success.html

1.1表单校验功能

     ①用户名:单词字符,长度8-20位(当然这里也可以设计成校验是否中英文名字)

     ②密码:单词字符,长度8-20位

     ③email:邮件格式

     ④姓名:非空

     ⑤手机号:手机号格式

     ⑥出生日期:非空

     ⑦验证码:非空

1.2代码的编写

表单各种校验js代码可以参考: JS常用的表单验证(数字、长度,汉字,邮箱,手机号,身份证等)_无尽的沉默的博客-CSDN博客_js表单验证身份证

ajax是用来验证表单的正确性 

①用户名校验

用正则表达式校验账号密码是否符合规范
function checkUsername() {
   //1.获取用户名值
   var username = $("#username").val();
   //2.定义正则
   var reg_username = /^\w{8,20}$/;
   
   //3.判断,给出提示信息
    var flag = reg_username.test(username);
    if(flag){
        //用户名合法
                 $("#username").css("border","");
   }else{
        //用户名非法,加一个红色边框
      $("#username").css("border","1px solid red");
   }
    
   return flag;
}

②密码校验

 //校验密码
		   function checkPassword() {
			 //1.获取用户名值
			   var password = $("#password").val();
			   //2.定义正则
			   var reg_password = /^\w{8,20}$/;
			   
			   //3.判断,给出提示信息
			    var flag = reg_password.test(password);
			    if(flag){
			        //用户名合法
			                 $("#password").css("border","");
			   }else{
			        //用户名非法,加一个红色边框
			      $("#password").css("border","3px solid red");
			   }
			    
			   return flag;
			}

③电子邮箱检验

//校验电子邮件
		   function checkEmail() {
			   //1.获取用户名值
			   var email = $("#email").val();
			   //2.定义正则
			   //对电子邮件的验证
			   var reg_email = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
			   
			   //3.判断,给出提示信息
			   var flag = reg_email.test(email);
			   if(flag){
			       //用户名合法
			       $("#email").css("border","");
			   }else{
			       //用户名非法,加一个红色边框
			       $("#email").css("border","3px solid red");
			   }
			   return flag;
			}
		 
//校验电子邮件
		   function checkEmail() {
			   //1.获取用户名值
			   var email = $("#email").val();
			   //2.定义正则
			   //对电子邮件的验证
			   var reg_email = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
			   
			   //3.判断,给出提示信息
			   var flag = reg_email.test(email);
			   if(flag){
			       //用户名合法
			       $("#email").css("border","");
			   }else{
			       //用户名非法,加一个红色边框
			       $("#email").css("border","3px solid red");
			   }
			   return flag;
			}
		  //检验姓名(中文)
		  function checkName() {
			//1.获取姓名值
			var name=$("#name").val();
			//2.定义正则
			//对姓名进行验证
			var reg_name =/^[\u0391-\uFFE5]+$/;
			//3.判断,给出提示信息
			var flag = reg_name.test(name);
			if(flag){
			       //用户名合法
			       $("#name").css("border","");
			}else{
			       //用户名非法,加一个红色边框
			       $("#name").css("border","3px solid red");
			}
			return flag;
		   }
		   //检验手机号
			function checkTelephone() {
				//1.获取姓名值
				var telephone=$("#telephone").val();
				//2.定义正则
				//对姓名进行验证
				var reg_telephone =/^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;;
				//3.判断,给出提示信息
				var flag = reg_telephone.test(telephone);
				if(flag&&(telephone.length==11)){
				       //手机号合法
				       $("#telephone").css("border","");
				}else{
				       //手机号非法,加一个红色边框
				       $("#telephone").css("border","3px solid red");
				}
				return flag;
			}
		//检验出生日期
		  function checkBirthday() {
			//1.获取出生日期
			var birthday=$("#birthday").val();
			var date1=birthday.replace(/-/g,"/");//替换字符,变成标准格式(检验格式为:'2009-12-10')
			// var obj_value=obj.replace("-","/");//替换字符,变成标准格式(检验格式为:'2010-12-10 11:12')
			var date1=new Date(Date.parse(date1));
			print(date1)
			var date2=new Date();//取今天的日期
			//3.判断,给出提示信息
			if(date1>date2){
				//日期非法,加一个红色边框
			    $("#birthday").css("border","3px solid red");
			    return false;
			}
			else{
				$("#birthday").css("border","");
				return true;
			}
		}
		 

Ajax校验

//ajax校验
		   $(function() {
			$("#registerForm").submit(function() {
				return checkUsername()&&checkPassword();
			});
			//当某一个组件失去焦点时,调用对应的校验方法
			$("#username").blur(checkUsername);
			$("#password").blur(checkPassword);
			$("#email").blur(checkEmail);
			$("#name").blur(checkName);
			$("#telephone").blur(checkTelephone);
			$("#birthday").blur(checkBirthday);
		});

2.后端代码的编写

首先编写web层的控制器RegistUserServlet,它用来接收前端请求数据信息,然后交给service层处理

package cn.itcast.travel.web.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;

import com.fasterxml.jackson.databind.ObjectMapper;

import cn.itcast.travel.dao.impl.UserDaoImpl;
import cn.itcast.travel.domain.ResultInfo;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.service.UserService;
import cn.itcast.travel.service.impl.UserServiceImpl;

/**
 * Servlet implementation class RegistUserServlet
 */
@WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获取前端的数据
		Map<String, String[]> map=request.getParameterMap();
		
		//2.封装对象
		User user=new User();
        try {
			BeanUtils.populate(user, map);  //将map中的字典封装成user
		} catch (IllegalAccessException | InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        System.out.println(user);
        
		//3.调用service层的函数来完成注册
        UserService userService=new UserServiceImpl();
        boolean flag=userService.regist(user);
        
        ResultInfo info=new ResultInfo();  //返回的结果封装info对象
		//4.响应结果
        if(flag) {  //注册成功
        	info.setFlag(true);	
        }
        else {  //注册失败
        	info.setErrorMsg("注册失败!");
        	info.setFlag(false);
        	System.out.println("注册失败");
        }
        //将info对象序列化成json
        ObjectMapper oMapper=new ObjectMapper();
        String json=oMapper.writeValueAsString(info);
        
        //将json字符串回写到客户端
        //设置content-type
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(json);
        
	}

}

service层中userservice接口和它的实现类userserviceImpl编写

package cn.itcast.travel.service;

import cn.itcast.travel.domain.User;

public interface UserService {
	//注册用户
	public boolean regist(User user);
}
package cn.itcast.travel.service.impl;

import cn.itcast.travel.dao.UserDao;
import cn.itcast.travel.dao.impl.UserDaoImpl;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.service.UserService;

public class UserServiceImpl implements UserService {
    //注册用户
	@Override
	public boolean regist(User user) {
		// 通过用户名来查询用户信息
		UserDao uDao=new UserDaoImpl();
		User user2=uDao.findByUsername(user.getUsername());
		if(user2!=null) {
			//说明已经注册了信息,用户名注册失败
			return false;
		}
		//没有注册,保存用户的信息
		uDao.save(user);
		return true;
	}

}

DAO层中userdao接口和它的实现类userdaoImpl编写

package cn.itcast.travel.dao;

import cn.itcast.travel.domain.User;

public interface UserDao {
	  //根据用户名来查询用户信息
      public User findByUsername(String username);
      //用户信息保存
      public void save(User user);
      
}
package cn.itcast.travel.dao.impl;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;

import cn.itcast.travel.util.JDBCUtils;
import cn.itcast.travel.dao.UserDao;
import cn.itcast.travel.domain.User;


public class UserDaoImpl implements UserDao {
	//操作数据库的对象
	private JdbcTemplate jdbcTemplate=new JdbcTemplate(JDBCUtils.getDataSource());
	@Override
	public User findByUsername(String username) {
		//根据用户名来查询用户信息
		User user=null;
		try {//这个trycatch是为了防止jdbctemplate查询时没查到用户,封装用户会出异常,不是返回null 而设置的
			// 1.编写sql语句
			String sql="select* from tab_user where username = ?";
			//2.执行sql语句
			user = jdbcTemplate.queryForObject(sql, new BeanPropertyRowMapper<User>(User.class),username);
		} catch (DataAccessException e) {
		}
		return user;
	}

	@Override
	public void save(User user) {
		// 1.定义sql
		String sql="insert into tab_user(username,password,name,birthday,sex,telephone,email) values(?,?,?,?,?,?,?)";
		//2.执行sql语句
		jdbcTemplate.update(sql,user.getUsername(),
				                user.getPassword(),
				                user.getName(),
				                user.getBirthday(),
				                user.getSex(),
				                user.getTelephone(),
				                user.getEmail()
				           );
		
	}
     
}

至此注册这个功能原理基本完成

其他:

JDBCUtils类中编写了获得连接池对象的方法,这里不阐述

jdbc连接数据库的jar包以及js相关的jar包,这里省略了

3.后台验证码和前台对返回数据的处理

我们只需要在web层的控制器RegistUserServlet中编写接收来自客户端的验证码值和接收来自checkCodeServlet中session域值,然后两者进行比较,如果不相同,则设置结果对象信息为验证码错误,并将结果对象序列化为json,返回给客户端显示

RegistUserServlet

package cn.itcast.travel.web.servlet;

import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.beanutils.BeanUtils;

import com.fasterxml.jackson.databind.ObjectMapper;

import cn.itcast.travel.dao.impl.UserDaoImpl;
import cn.itcast.travel.domain.ResultInfo;
import cn.itcast.travel.domain.User;
import cn.itcast.travel.service.UserService;
import cn.itcast.travel.service.impl.UserServiceImpl;

/**
 * Servlet implementation class RegistUserServlet
 */
@WebServlet("/registUserServlet")
public class RegistUserServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    /**
     * @see HttpServlet#HttpServlet()
     */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		this.doPost(request, response);
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		//1.获取前端的数据
		Map<String, String[]> map=request.getParameterMap();
		String code=request.getParameter("check");  //获取前台的验证码
		HttpSession session=request.getSession();
		String scode=(String) session.getAttribute("CHECKCODE_SERVER");  //获取来自生成验证码的session域
		session.removeAttribute("CHECKCODE_SERVER");  //为了防止客户端倒退,避免前一个验证码继续有效,保证验证码只用一次
		System.out.println(scode);
		System.out.println(code);
		//判断验证码是否正确		
		if(scode == null||!scode.equalsIgnoreCase(code)) {//如果不正确
			ResultInfo info=new ResultInfo();  //返回的结果封装info对象
			info.setErrorMsg("验证码错误!");
        	info.setFlag(false);
        	System.out.println("验证码错误");
        	//将info对象序列化成json
            ObjectMapper oMapper=new ObjectMapper();
            String json=oMapper.writeValueAsString(info);
            
            //将json字符串回写到客户端
            //设置content-type
            response.setContentType("application/json;charset=utf-8");
            response.getWriter().write(json);
            return;
		}
		//2.封装对象
		User user=new User();
        try {
			BeanUtils.populate(user, map);  //将map中的字典封装成user
		} catch (IllegalAccessException | InvocationTargetException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
        System.out.println(user);
        
		//3.调用service层的函数来完成注册
        UserService userService=new UserServiceImpl();
        boolean flag=userService.regist(user);
        
        ResultInfo info=new ResultInfo();  //返回的结果封装info对象
		//4.响应结果
        if(flag) {  //注册成功
        	info.setFlag(true);	
        }
        else {  //注册失败
        	info.setErrorMsg("注册失败!");
        	info.setFlag(false);
        	System.out.println("注册失败");
        }
        //将info对象序列化成json
        ObjectMapper oMapper=new ObjectMapper();
        String json=oMapper.writeValueAsString(info);
        
        //将json字符串回写到客户端
        //设置content-type
        response.setContentType("application/json;charset=utf-8");
        response.getWriter().write(json);
        
	}

}

前端接收来自控制器处理的json数据后,进行显示

前端代码:

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>注册</title>
        <link rel="stylesheet" type="text/css" href="css/common.css">
        <link rel="stylesheet" href="css/register.css">
		<!--导入jquery-->
		<script src="js/jquery-3.3.1.js"></script>
		<script>
		   //校验用户名
		   function checkUsername() {
	               //1.获取用户名值
				   var username = $("#username").val();
				   //2.定义正则
				   var reg_username = /^\w{8,20}$/;
				   
				   //3.判断,给出提示信息
				    var flag = reg_username.test(username);
				    if(flag){
				        //用户名合法
				                 $("#username").css("border","");
				   }else{
				        //用户名非法,加一个红色边框
				      $("#username").css("border","3px solid red");
				   }
				    
				   return flag;
	         }
		   //校验密码
		   function checkPassword() {
			 //1.获取用户名值
			   var password = $("#password").val();
			   //2.定义正则
			   var reg_password = /^\w{8,20}$/;
			   
			   //3.判断,给出提示信息
			    var flag = reg_password.test(password);
			    if(flag){
			        //用户名合法
			                 $("#password").css("border","");
			   }else{
			        //用户名非法,加一个红色边框
			      $("#password").css("border","3px solid red");
			   }
			    
			   return flag;
			}
		 //校验电子邮件
		   function checkEmail() {
			   //1.获取用户名值
			   var email = $("#email").val();
			   //2.定义正则
			   //对电子邮件的验证
			   var reg_email = /^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/;
			   
			   //3.判断,给出提示信息
			   var flag = reg_email.test(email);
			   if(flag){
			       //用户名合法
			       $("#email").css("border","");
			   }else{
			       //用户名非法,加一个红色边框
			       $("#email").css("border","3px solid red");
			   }
			   return flag;
			}
		  //检验姓名(中文)
		  function checkName() {
			//1.获取姓名值
			var name=$("#name").val();
			//2.定义正则
			//对姓名进行验证
			var reg_name =/^[\u0391-\uFFE5]+$/;
			//3.判断,给出提示信息
			var flag = reg_name.test(name);
			if(flag){
			       //用户名合法
			       $("#name").css("border","");
			}else{
			       //用户名非法,加一个红色边框
			       $("#name").css("border","3px solid red");
			}
			return flag;
		   }
		   //检验手机号
			function checkTelephone() {
				//1.获取姓名值
				var telephone=$("#telephone").val();
				//2.定义正则
				//对姓名进行验证
				var reg_telephone =/^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1}))+\d{8})$/;;
				//3.判断,给出提示信息
				var flag = reg_telephone.test(telephone);
				if(flag&&(telephone.length==11)){
				       //手机号合法
				       $("#telephone").css("border","");
				}else{
				       //手机号非法,加一个红色边框
				       $("#telephone").css("border","3px solid red");
				}
				return flag;
			}
		//检验出生日期
		  function checkBirthday() {
			//1.获取出生日期
			var birthday=$("#birthday").val();
			var date1=birthday.replace(/-/g,"/");//替换字符,变成标准格式(检验格式为:'2009-12-10')
			// var obj_value=obj.replace("-","/");//替换字符,变成标准格式(检验格式为:'2010-12-10 11:12')
			var date1=new Date(Date.parse(date1));
			print(date1)
			var date2=new Date();//取今天的日期
			//3.判断,给出提示信息
			if(date1>date2){
				//日期非法,加一个红色边框
			    $("#birthday").css("border","3px solid red");
			    return false;
			}
			else{
				$("#birthday").css("border","");
				return true;
			}
		}
		 	 
		 
		 //ajax校验
		 $(function() {
				$("#registerForm").submit(function() {
					//发送数据到服务器
					if(checkUsername()&&checkPassword()){ //如果校验成功
						//异步提交
						$.post("registUserServlet",$(this).serialize(),function(data){  //date是服务器返回的值
							//处理服务器响应的数据 data
							if(data.flag){//如果返回的json的flag是true,注册成功,跳转页面
								//注册成功,跳转页面
								location.href="register_ok.html";
							}
							else{ //注册失败,给error_msg标签显示错误信息
								$("#error_msg").html(data.errorMsg);
							}
						});
					}
					return false;
				});
				//当某一个组件失去焦点时,调用对应的校验方法
				$("#username").blur(checkUsername);
				$("#password").blur(checkPassword);
				$("#email").blur(checkEmail);
				$("#name").blur(checkName);
				$("#telephone").blur(checkTelephone);
				$("#birthday").blur(checkBirthday);
		});

		</script>
    </head>
	<body>
	<!--引入头部-->
	<div id="header"></div>
        <!-- 头部 end -->
    	<div class="rg_layout">
    		<div class="rg_form clearfix">
    			<div class="rg_form_left">
    				<p>新用户注册</p>
    				<p>USER REGISTER</p>
    			</div>
    			<div class="rg_form_center">
					<div id="error_msg" style="color: red; text-align:center;" ></div>
					<!--注册表单-->
    				<form id="registerForm" action="user">
						<!--提交处理请求的标识符-->
						<input type="hidden" name="action" value="register">
    					<table style="margin-top: 25px;">
    						<tr>
    							<td class="td_left">
    								<label for="username">用户名</label>
    							</td>
    							<td class="td_right">
    								<input type="text" id="username" name="username" placeholder="请输入账号">
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left">
    								<label for="password">密码</label>
    							</td>
    							<td class="td_right">
    								<input type="text" id="password" name="password" placeholder="请输入密码">
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left">
    								<label for="email">Email</label>
    							</td>
    							<td class="td_right">
    								<input type="text" id="email" name="email" placeholder="请输入Email">
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left">
    								<label for="name">姓名</label>
    							</td>
    							<td class="td_right">
    								<input type="text" id="name" name="name" placeholder="请输入真实姓名">
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left">
    								<label for="telephone">手机号</label>
    							</td>
    							<td class="td_right">
    								<input type="text" id="telephone" name="telephone" placeholder="请输入您的手机号">
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left">
    								<label for="sex">性别</label>
    							</td>
    							<td class="td_right gender">
    								<input type="radio" id="sex" name="sex" value="男" checked> 男
    								<input type="radio" name="sex" value="女"> 女
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left">
    								<label for="birthday">出生日期</label>
    							</td>
    							<td class="td_right">
    								<input type="date" id="birthday" name="birthday" placeholder="年/月/日">
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left">
    								<label for="check">验证码</label>
    							</td>
    							<td class="td_right check">
    								<input type="text" id="check" name="check" class="check">
    								<img src="checkCode" height="32px" alt="" onclick="changeCheckCode(this)">
									<script type="text/javascript">
										//图片点击事件
										function changeCheckCode(img) {
											img.src="checkCode?"+new Date().getTime();
                                        }
									</script>
    							</td>
    						</tr>
    						<tr>
    							<td class="td_left"> 
    							</td>
    							<td class="td_right check"> 
    								<input type="submit" class="submit" value="注册">
									<span id="msg" style="color: red;"></span>
    							</td>
    						</tr>
    					</table>
    				</form>
    			</div>
    			<div class="rg_form_right">
    				<p>
    					已有账号?
    					<a href="#">立即登录</a>
    				</p>
    			</div>
    		</div>
    	</div>
        <!--引入尾部-->
    	<div id="footer"></div>
		<!--导入布局js,共享header和footer-->
		<script type="text/javascript" src="js/include.js"></script>
    	
    </body>
</html>

下一篇接着继续分析 

旅游网站系统项目开发
07-14
1、系统分为系统前台和系统后台,并使用了母版; 2、用户分为普通用户、注册用户、管理者; 3、代码都有详细的注解; 4、是网站开发者的引路项目,也适合新手参考研究。
如何开发旅游商城系统
weixin_48744821的博客
12-10 514
进入电商时代,旅游商家们纷纷在线上开展业务,建立旅游商城。 线上旅游商城帮助旅游商家打破时间地域限制,获取更广范围客源。而且还可以容纳更加丰富的业态和服务形式,比如特产销售、私人定制等。 那么,如何开发一个旅游商城系统呢? 需要的功能: 线路、门票、酒店、租车等常规旅游业务,还有户外、邮轮、研学、私人定制等多类型产品,以及旅游特产、实物零售、旅游增值服务等内容,为游客提供丰富旅游产品,提供吃住行游娱购一条龙服务。 管理方面则需要接口对接、财务统计、会员管理、订单管理、供应商管理、分销商管理等功能。 如
基于springboot旅游管理系统设计与实现
最新发布
weixin_44308935的博客
09-10 1122
基于springboot旅游管理系统设计与实现
旅游管理系统(前后台开发
10-08
一、首页可以展示关于旅游平台的介绍、系统登录入口、系统介绍、联系方式等等介绍、主要像一些旅游官网一样,供信息展示使用; 用户注册登录: 1、选择自己喜欢的旅游景点/酒店 2、修改个人信息以及密码 3、查课预定的酒店/景点 4、景点/酒店反馈评论 5、在个人信息可以查看自己的订单信息 6、统计最近热门的景点/酒店 7、根据类型在前台展示景点/酒店 8、展示每个景点/酒店的详细介绍(视频形式或者文字形式) 二、系统的后台管理 1、旅游机构角色管理、等用户的信息管理,支持权限分配和控制; 2、景点/酒店信息管理,针对游客的喜好发布相关的景点/酒店,此外整个机构会有许多不同种类性质的酒店/
旅游|基于Springboot的旅游管理系统设计与实现(源码+数据库+文档)
伟庭的博客
02-09 4779
旅游管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发旅游管理系统有管理员,用户两个角色。管理员功能有个人心,用户管理,景点分类管理,景点信息管理,景点购票管理,酒店信息管理,酒店预定管理,游记分享管理,系统管理。用户可以注册登录,查看景点信息,并且可以进行景点购票操作和酒店预定操作,还可以发布游记分享。
基于Springboot实现旅游网站系统开发
BS009的博客
06-24 1348
系统基于 Springboot开发,前台采用Bootstrap 实现,开发工具为IDEA/ECLIPSE,数据库为MYSQL,系统功能完整,运行无误,适合做毕业设计使用。 系统分为网站前台和后台管理: 前台系统可以进行用户注册登陆,查看预定酒店,查看预定景点线路,可以发布景点攻略等操作。 后台系统可以进行用户管理,景点管理,线路管理,攻略审核管理等操作。 下面就系统部分功能进行展示:...
基于微信小程序的商业旅游系统开发.rar
05-07
"基于微信小程序的商业旅游系统开发"是指使用微信小程序作为用户界面,结合后端Python技术和MySQL数据库,构建的一款针对旅游业的应用。这个系统旨在为用户提供便捷的旅游服务,如景点查询、预订、路线规划等,同时...
旅游管理系统代码 java旅游管理系统代码
03-19
旅游系统代码 java旅游系统代码 基于springboot的旅游系统代码 1、旅游系统的技术栈、环境、工具、软件: ① 系统环境:Windows/Mac ② 开发语言:Java ③ 框架:SpringBoot ④ 架构:B/S、MVC ⑤ 开发环境:IDEA、JDK...
java语言开发本科毕业设计旅游服务管理系统源代码.zip
06-06
java语言开发本科毕业设计旅游服务管理系统源代码.主要模块分为后端、前端的后台管理系统和前端的主站,主要功能就是展示景点、旅馆、美食、旅游线路等信息以及游客的游记发布和反馈发布。后端技术栈主要为...
PHP针对酒店旅游业定制开发的一套旅游业类商城系统源码.zip
11-02
这套"PHP针对酒店旅游业定制开发的一套旅游业类商城系统源码"正是基于PHP技术,旨在满足旅游业的特定需求。 1. **系统架构与设计** - MVC模式:源码可能采用了Model-View-Controller(MVC)设计模式,将业务逻辑、...
微信小程序开发的户外旅游系统
05-07
微信小程序开发的户外旅游系统,微信小程序模板源码纯前端静态小程序源码导入就可显示。功能说明:实现了户外旅行推荐列表,游记详情,兴趣点详情,游客评论,发现地点,热门景点等功能。数据接口: ...
基于SSM的旅游管理系统设计与实现
weixin_52721608的博客
11-23 696
现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集处理数据信息的管理方式。本思途旅游管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。
DROP TABLE IF EXISTS `ay_admin` ;
u012062810的专栏
05-05 1万+
导入数据库一直出现标题错误,但是数据库是没错的。如图:这是因为你要先新建这个数据库名,然后再该名下导入数据库文件,就可以了。
MySQL表的约束
不思量
04-05 192
介绍MySQL表约束的概念、分类和语法。
MySQL 表字段唯一性约束设置方法, 设置字段自增的方法
热门推荐
大苯熊-我的书房
09-07 4万+
1. 建表时加上唯一性约束 CREATE TABLE `t_user` (       `Id` int(11) NOT NULL AUTO_INCREMENT,  -- 自增       `username` varchar(18) NOT NULL unique,  -- 唯一性约束       `password` varchar(18) NOT NULL, PRIMARY KEY
MySQL 表字段唯一性约束设置方法unique
strong0511的博客
04-20 2万+
http://blog.csdn.net/webrobot/article/details/7953688 1. 建表时加上唯一性约束 CREATE TABLE `t_user` (       `Id` int(11) NOT NULL AUTO_INCREMENT,  -- 自增       `username` varchar(18) NOT NULL uni
MySQL之唯一性约束(UNIQUE KEY)
qq_38523616的博客
08-27 2940
MySQL唯一约束(Unique Key)要求该列唯一,允许为空,但只能出现一个空值。唯一约束可以确保一列或者几列不出现重复值。 在创建表时设置唯一约束<字段名> <数据类型> UNIQUE; mysql> CREATE TABLE student( id int primary key, name varchar(50) unique ); Qu...
mysqlunique key在查询的使用
iCoding91
09-11 1万+
1、建表语句: CREATE TABLE `employees` ( `emp_no` int(11) NOT NULL, `birth_date` date NOT NULL, `first_name` varchar(14) NOT NULL, `last_name` varchar(16) NOT NULL, `gender` char(1) NOT NULL, `
写文章

热门文章

  • python最详细的安装与完全卸载 179732
  • 2022版 的IDEA创建一个maven项目(超详细) 137694
  • 逻辑斯谛回归(Logistic回归)最详解 67861
  • 经典卷积神经网络---VGG16详解 58059
  • yolov4的全面详解 52234

分类专栏

  • problem 5篇
  • 工具安装 8篇
  • 深度学习 9篇
  • java 问题 4篇
  • 旅游商城系统开发 3篇
  • leetcode 26篇
  • 论文解读 1篇
  • 目标检测 3篇
  • java 13篇
  • JQuery 4篇
  • servlet 9篇
  • 函数用法 17篇
  • js 10篇
  • 学习的坑点 1篇
  • c语言知识 5篇
  • YOLO 2篇
  • 计算机网络 1篇
  • keras 9篇
  • 机器学习 4篇
  • 算法 19篇
  • 操作系统 1篇
  • python 8篇
  • 进程的管理 1篇
  • 进程 1篇

最新评论

  • Python爬虫获取百度的图片

    北风之神c: 总结的很全面的爬虫,写得赞,博主用心了。 此国产分布式函数调度框架 funboost python万能通用函数加速器 https://funboost.readthedocs.io/zh-cn/latest/articles/c8.html 加到爬虫更强更自由更简单 。 funboost 分布式函数调度框架,定位于调度用户的任何函数,只要用户在函数里面写爬虫代码,就可以分布式调度爬虫,并且对爬虫函数施加30种控制功能, 例如 qps恒定 任何时候随意关机重启代码消息万无一失确认消费 非常简单的开启多进程叠加线程/协程,这些强大的功能绝大部分爬虫框架还做不到。 此框架如果用于爬虫,不管从任何方面比较可以领先scrapy 20年,也比任意写的爬虫框架领先10年。 主要是设计思维问题,普通爬虫框架一般就设计为url请求调度框架,url怎么请求都是被框内置架束缚死了, 所以有些奇葩独特的想法在那种框架里面难以实现,用户需要非常之精通框架本身然后改造框架才能达到随心所欲的驾驭的目的。 而此框架是函数调度框架,函数里面可以实现一切任意自由想法,天生不会有任何束缚,国内一般人设计的爬虫框架都是仿scrapy api,天生不自由受束缚。 使用funboost爬虫,与用户使用别的爬虫框架或者无框架用户手写多线程爬虫相比, funboost都代码更少更强更简单更自由。 pip install funboost 或者是直接使用 pip install boost_spider (powerd by funboost ,boost_spider比funboost增加了更加专门的针对爬虫请求和解析和存储) https://github.com/ydf0509/boost_spider

  • 2022版 的IDEA创建一个maven项目(超详细)

    qq_51990842: 培训班是花钱了的,为啥不教?还正常?不提供服务,我还花什么钱,我B站大学不香?

  • 2023版Idea创建JavaWeb时,右键new没有Servlet快捷键选项

    无尽的沉默: Name是idea中servlet模版的名字,可以随便取的,File name则是你根据模版创建servlet的文件名

  • 大整数乘法的详解

    2301_81050217: 理想下的是不是有问题

  • 2023版Idea创建JavaWeb时,右键new没有Servlet快捷键选项

    AAA米哈游游戏渲染算法工程师(未上岗): 请问设置的时候Name和File Name有什么区别?File Name是什么?不设置的话每次创建Servlet都会弹窗询问要求我填写File name,还是必填那种

大家在看

  • 倒背如流的方法:《琵琶行》倒背的记忆方法,正背、倒背、点背都可以 1088
  • 电脑端视频剪辑软件 CyberLink PowerDirector 注册码
  • 《金融数据安全分级指南JR/T 0197-2020》解读与想法 630
  • KMP算法 1
  • Photoshop图像算法(五)(代码在每个原理后面)

最新文章

  • 油猴(TamperMonkey)插件的详细使用
  • Flask返回Json格式字符,中文导致unicode乱码问题
  • maven项目报错Cannot resolve plugin org.apache.maven.plugins:maven-war-plugin:2.2
2024年6篇
2023年5篇
2022年50篇
2021年54篇
2020年18篇
2017年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值

玻璃钢生产厂家浦江玻璃钢花盆花器玻璃钢雪莉雕塑兴安盟玻璃钢雕塑厂家河南超市商场美陈市场价南明区玻璃钢雕塑制作电话玻璃钢雕塑生产价格淄博玻璃钢雕塑制作厂家玻璃钢仙鹤雕塑厂家广东商场节庆美陈雕塑摆件定制商场美陈布展申请玻璃钢卡通雕塑阿狸厂家商场摩登主题美陈康平玻璃钢花盆花器江苏玻璃钢雕塑加工厂家岳阳仿铜西式玻璃钢雕塑社区 玻璃钢雕塑永康玻璃钢雕塑厂家彭州玻璃钢长颈雕塑上海个性化玻璃钢雕塑供应商玻璃钢动物牛雕塑公司美陈商场怎么选内装饰玻璃钢雕塑道具 商场美陈信阳玻璃钢动物雕塑厂家定制驻马店玻璃钢雕塑设计陕西仿铜玻璃钢雕塑优势水果玻璃钢雕塑鹤岗玻璃钢雕塑生产厂家江苏玻璃钢几何雕塑汕头玻璃钢景观雕塑香港通过《维护国家安全条例》两大学生合买彩票中奖一人不认账让美丽中国“从细节出发”19岁小伙救下5人后溺亡 多方发声单亲妈妈陷入热恋 14岁儿子报警汪小菲曝离婚始末遭遇山火的松茸之乡雅江山火三名扑火人员牺牲系谣言何赛飞追着代拍打萧美琴窜访捷克 外交部回应卫健委通报少年有偿捐血浆16次猝死手机成瘾是影响睡眠质量重要因素高校汽车撞人致3死16伤 司机系学生315晚会后胖东来又人满为患了小米汽车超级工厂正式揭幕中国拥有亿元资产的家庭达13.3万户周杰伦一审败诉网易男孩8年未见母亲被告知被遗忘许家印被限制高消费饲养员用铁锨驱打大熊猫被辞退男子被猫抓伤后确诊“猫抓病”特朗普无法缴纳4.54亿美元罚金倪萍分享减重40斤方法联合利华开始重组张家界的山上“长”满了韩国人?张立群任西安交通大学校长杨倩无缘巴黎奥运“重生之我在北大当嫡校长”黑马情侣提车了专访95后高颜值猪保姆考生莫言也上北大硕士复试名单了网友洛杉矶偶遇贾玲专家建议不必谈骨泥色变沉迷短剧的人就像掉进了杀猪盘奥巴马现身唐宁街 黑色着装引猜测七年后宇文玥被薅头发捞上岸事业单位女子向同事水杯投不明物质凯特王妃现身!外出购物视频曝光河南驻马店通报西平中学跳楼事件王树国卸任西安交大校长 师生送别恒大被罚41.75亿到底怎么缴男子被流浪猫绊倒 投喂者赔24万房客欠租失踪 房东直发愁西双版纳热带植物园回应蜉蝣大爆发钱人豪晒法院裁定实锤抄袭外国人感慨凌晨的中国很安全胖东来员工每周单休无小长假白宫:哈马斯三号人物被杀测试车高速逃费 小米:已补缴老人退休金被冒领16年 金额超20万

玻璃钢生产厂家 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化