一、完整代码已上传到github:https://github.com/LazyTraveller/estore

二、需求分析

1.整个项目是分成前台页面和后台管理两部分组成。* 前台:提供用户浏览,购买,查看订单等功能。* 后台:提供管理员管理商城,提供添加图书、分类等功能。2.根据网上商城的需求分成以下几个模块。1.用户模块* 前台:1.注册功能(包含发送一封邮件给用户,用户需要点击激活链接才能登陆)2.激活链接功能(注册后,点击链接激活后,才能登陆成功 -- 实现方式可以修改用户的状态(可以规定0代表没有激活,1代码已经激活))3.登陆功能(注册成功后,可以登陆--实现方式根据用户名和密码以及用户状态(1状态代表已经激活))4.退出功能(用户登陆成功,会把用户信息存入到session中,通过销毁session完成退出功能)* 后台:1.登陆后台功能2.分类模块* 前台:1.查询分类的功能* 后台:1.查看分类功能2.增加分类功能3.修改分类功能4.删除分类功能3.商品模块  * 前台:1.查询所有分类的商品2.查询某一个分类的商品3.查询某个商品的详情* 后台:1.添加商品(上传商品图片)2.修改商品3.删除商品4.查询商品4.订单模块* 前台1.生成订单2.按用户查找订单3.查看某个订单* 后台1.查询所有订单2.查询某个状态订单

三、页面设计(一般由美工完成

依据页面原型进行开发。

四、数据库的设计

一个实体就会对应一个数据库中表.
* 用户:* 编号(主键)* 用户名* 密码* 邮箱* 激活码(发送邮件时显示的激活码)* 状态    0:未激活       1:已经激活* 分类* 编号(主键)* 名称* 图书* 编号(主键)* 名称* 作者* 价格* 图片(存放图片的地址)* 分类编号(外键) -- 和分类是一对多的关系,所以在图书表中创建外键指向分类表中的主键* 订单* 编号(主键)* 时间* 金额* 地址* 状态* 用户编号(外键)-- 和用户是一对多的关系,所以在订单表中创建外键指向用户表中的主键* 订单图书中间表:* 订单项编号(主键)* 图书编号(外键)-- 和图书表是一对多的关系,所以在订单图书中间表中创建外键指向图书表中的主键* 订单编号(外键)-- 和订单表是一对多的关系,所以在订单图书中间表中创建外键指向订单表中的主键* 数量* 小计

五、编写代码,部署上线,后期维护。

下面开始详细开发步骤:

一、根据页面原型进行功能扩展美化

前台原型页面:

后台原型页面:

二、搭建开发环境

*创建estore的项目,把原型的文件拷贝进去

*开发架构:Servlet+JSP+javaBean+JDBC

*向lib中导入jar包

*创建包架构

三、进行开发

在cn.itcast.servlet包中创建模板servlet,用于调用方法,在下面使用时需要更改servlet的名称

*编写通用的BaseServlet

package cn.itcast.servlet;import java.io.IOException;
import java.lang.reflect.Method;import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** BaseServlet通用的Servlet* @author Administrator**/
public class BaseServlet extends HttpServlet{private static final long serialVersionUID = -7510809537032738047L;/*** 服务器会调用该service方法*/public void service(HttpServletRequest req, HttpServletResponse resp)throws ServletException, IOException {// 设置编码req.setCharacterEncoding("UTF-8");resp.setContentType("text/html;charset=UTF-8");// 可以进行一些判断控制   // 对用户有一些要求:给我传过来取你要调用的方法  http://localhost/estore/demo?method=xxxUser// addUser方法的签名也有要求:addUser(HttpServletRequest request, HttpServletResponse response)// 参数必须是HttpServletRequest request,HttpServletResponse response// 获取method参数String methodName = req.getParameter("method");// 如果methodName忘了传入了if(methodName == null || methodName.trim().isEmpty()){throw new RuntimeException("亲,请您传入method参数!!");}// 通过反射的技术,来完成该事// 获取Class对象,获取method对象。Class clazz = this.getClass();// 通过clazz获取method对象Method method = null;try {method = clazz.getMethod(methodName, HttpServletRequest.class,HttpServletResponse.class);} catch (Exception e) {throw new RuntimeException("亲,您传入的"+methodName+"不存在!!");} try {// method肯定有值了,让method方法执行String result = (String) method.invoke(this, req,resp);// /jsps/msg.jspif(result != null && !result.trim().isEmpty()){req.getRequestDispatcher(result).forward(req, resp);}} catch (Exception e) {System.out.println("程序内部错误");throw new RuntimeException(e);}}}

ServletDemo.java(调用ServletBean判断执行调用哪些方法)

package cn.itcast.servlet;import java.io.IOException;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;/*** 测试* @author Administrator*/
public class ServletDemo extends BaseServlet {private static final long serialVersionUID = 2947357007498494328L;public String addUser(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("addUser...");// 想做重定向// response.sendRedirect("");return "ss";}public void updateUser(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("updateUser...");}public void deleteUser(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {System.out.println("deleteUser...");}
}

用户的模块

*在MySQL中创建数据库

并关联到c3p0-config.xml

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><!-- 默认的配置,如果一会读取配置,默认找该配置 --><default-config><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql:///estore</property><property name="user">root</property><property name="password">root</property></default-config>
</c3p0-config>

在cn.itcast.vo包中创建

user.java  javabean封装对象

package cn.itcast.vo;/*** 用户的JavaBean* @author Administrator**/
public class User {private String uid;private String username;private String password;private String email;private int state;private String code;public String getUid() {return uid;}public void setUid(String uid) {this.uid = uid;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public int getState() {return state;}public void setState(int state) {this.state = state;}public String getCode() {return code;}public void setCode(String code) {this.code = code;}
}

前台页面分析:

几个jsp组合成一个前台页面

实现注册功能:

1.用户输入数据(用户名,密码,邮箱)

*主键

*把用户的默认状态设置成0(未激活的状态)

*默认生成激活码code字段

2.需要给注册的用户的邮箱发送一封邮件

3.流程  regist.jsp-->UerServlet(指定regist方法的名称)-->调用userService--》调用UserDao

regist.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>注册</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><meta http-equiv="content-type" content="text/html;charset=utf-8"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><h1>注册</h1><p style="color: red; font-weight: 900">${msg }</p><form action="${ pageContext.request.contextPath }/user" method="post"><!-- 隐藏域 --><input type="hidden" name="method" value="registUser"/>用户名:<input type="text" name="username" value=""/><br/>密 码:<input type="password" name="password"/><br/>邮 箱:<input type="text" name="email" value=""/><br/><input type="submit" value="注册"/></form></body>
</html>

编写和用户相关的Servlet:

UserServlet.java

package cn.itcast.servlet;import java.io.IOException;
import java.util.Map;import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.apache.commons.beanutils.BeanUtils;import cn.itcast.service.UserService;
import cn.itcast.vo.User;/*** 和用户相关的Servlet* 先改继承BaseServlet* @author Administrator*/
public class UserServlet extends BaseServlet {private static final long serialVersionUID = -8230838990948681763L;/*** 注册用户的方法* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String registUser(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 接收数据// 封装数据// 处理数据// 显示数据// 接收数据Map<String, String []> map = request.getParameterMap();// 封装数据User user = new User();try {BeanUtils.populate(user, map);// 处理数据UserService us = new UserService();// 注册用户boolean flag = us.registUser(user);// 根据返回的结果,调用不同页面进行处理// 注册失败了if(flag == false){// 向request域中存入消息request.setAttribute("msg", "注册失败!!");}else{// 向request域中存入消息request.setAttribute("msg", "注册成功,请您激活!!");}} catch (Exception e) {e.printStackTrace();}// 在BaseServlet中完成了转发的功能return "/jsps/msg.jsp";}/*** 邮件激活用户的方法* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String active(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 先获取code激活码77cec5d12a5840dd88dd6f9a7f0ad2c467c55972837e484d9851fad028169407String code = request.getParameter("code");// 处理数据UserService us = new UserService();// 通过激活码查询的用户User user = us.findUserByCode(code);// 如果用户为空,说明没有查到用户if(user == null){request.setAttribute("msg", "激活失败了");}else{// 修改用户的状态,状态默认值0,修改成1.user.setState(1);// 再调用UserService修改方法us.updateUser(user);// 设置信息request.setAttribute("msg", "激活成功了,请您登陆!!");}return "/jsps/msg.jsp";}/*** 用户登陆的功能* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 获取数据* 封装数据* 处理数据* 显示数据*/Map<String, String[]> map = request.getParameterMap();User user = new User();try {BeanUtils.populate(user, map);UserService us = new UserService();// 登陆功能User existUser = us.login(user);// 如果登陆失败,给出用户提示if(existUser == null){request.setAttribute("msg", "用户名或者密码错误或者未激活!!");return "/jsps/msg.jsp";}else{// 如果登陆成功,把用户的信息保存到session中,转发到首页request.getSession().setAttribute("existUser", existUser);// 转发main.jsp的页面上return "/jsps/main.jsp";}} catch (Exception e) {e.printStackTrace();} return null;}/*** 用户退出的功能* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String exit(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取session,直接销毁request.getSession().invalidate();return "/jsps/main.jsp";}}

在cn.itcast.service包中创建(业务层)

Userservice.java

package cn.itcast.service;import cn.itcast.dao.UserDao;
import cn.itcast.dao.UserDaoImple;
import cn.itcast.utils.MailUtil;
import cn.itcast.utils.MyUUIDUtil;
import cn.itcast.vo.User;/*** 用户相关的业务类* @author Administrator**/
public class UserService {/*** 业务层注册用户* @param user* @return*/public boolean registUser(User user) {// 调用持久层代码注册用户UserDao dao = new UserDaoImple();// 添加业务/*** 用户的主键(字符串类型)* 设置用户的状态为0* 生成激活码*/// 生成主键user.setUid(MyUUIDUtil.getUUID());// 设置状态码为0 -- 未激活的状态user.setState(0);// 生成激活码String code = MyUUIDUtil.getUUID()+MyUUIDUtil.getUUID();user.setCode(code);// 发送一封邮件MailUtil.sendMail(user.getEmail(), code);return dao.saveUser(user);}/*** 通过code查询用户* @param code* @return*/public User findUserByCode(String code) {UserDao dao = new UserDaoImple();return dao.findUserByCode(code);}/*** 修改的方法* @param user*/public void updateUser(User user) {UserDao dao = new UserDaoImple();dao.updateUser(user);}public User login(User user) {UserDao dao = new UserDaoImple();return dao.login(user);}}

持久层:

在cn.itcast.dao添加userdao接口

package cn.itcast.dao;import cn.itcast.vo.User;public interface UserDao {boolean saveUser(User user);User findUserByCode(String code);void updateUser(User user);User login(User user);}

UserDaolmple.java是userDao的实现类(同一个包):

package cn.itcast.dao;import java.sql.SQLException;import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;import cn.itcast.utils.MyJdbcUtil;
import cn.itcast.vo.User;/*** 用户相关的持久层代码* @author Administrator**/
public class UserDaoImple implements UserDao {/*** 注册用户*/public boolean saveUser(User user) {boolean flag = false;QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());String sql = "insert into user values (?,?,?,?,?,?)";Object [] params = {user.getUid(),user.getUsername(),user.getPassword(),user.getEmail(),user.getState(),user.getCode()};try {// 执行注册的方法int count = runner.update(sql, params);// 根据返回值进行判断if(count > 0){flag = true;}} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}return flag;}/*** 通过code查询用户*/public User findUserByCode(String code) {QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());String sql = "select * from user where code = ?";try {return runner.query(sql, new BeanHandler<User>(User.class), code);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}/*** 修改用户的所有的信息*/public void updateUser(User user) {QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());String sql = "update user set username = ? , password = ?,email = ?,state = ?,code = ? where uid = ?";Object [] params = {user.getUsername(),user.getPassword(),user.getEmail(),user.getState(),user.getCode(),user.getUid()};try {runner.update(sql, params);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}/*** 登陆的功能*/public User login(User user) {QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());String sql = "select * from user where username = ? and password = ? and state = ?";try {return runner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword(),1);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}}

在cn.iscast.utils包中创建MyUUIDUtil.java,获取唯一的序列字符串

package cn.itcast.utils;import java.util.UUID;/*** 随机生成字符串* @author Administrator**/
public class MyUUIDUtil {/*** 随机的生成字符串* @return*/public static String getUUID(){return UUID.randomUUID().toString().replace("-", "");}}

邮件的功能

*邮件的服务器

安装提供的邮件的服务器

*电子邮箱

aaa@sina.com.cn

*邮箱的协议

发送邮件协议  SMTP协议

接受邮件的协议  POP3协议

*IMAP协议(不是所有的邮箱支持)

先安装邮件的服务器

链接:https://pan.baidu.com/s/1B6_xsKTnKFLd8xlTHpwGkg 
提取码:mmyc

双击安装

配置邮件服务器  点击设置  选择单域名  修改域名

申请账号  点击新账号

然后安装邮件的客户端

*网页版   --以前的版本登录后失效的时间

*客户端软件 --不是有该问题      默认的时间去接受邮件

双击安装,一路继续

配置客户端,与服务器绑定,填写自己申请的账号密码

实现注册的时候发送一封邮件:

发送邮件工具类,在cn.itcast.utils包中创建一个MailUtils.ajva

用于获取服务器链接

package cn.itcast.utils;import java.util.Properties;import javax.mail.Authenticator;
import javax.mail.Message;
import javax.mail.PasswordAuthentication;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMessage.RecipientType;/*** 发送邮件工具类* @author Administrator*/
public class MailUtil {/*** 发送邮件* @param to  发送给谁* @param code  激活码*/public static void sendMail(String to,String code){// 1.属性对象Properties props = new Properties();// 发送邮件的协议props.setProperty("mail.smtp", "localhost");// 2.创建一个对象Session.Session session = Session.getInstance(props, new Authenticator() {@Overrideprotected PasswordAuthentication getPasswordAuthentication() {return new PasswordAuthentication("service@estore.com", "123");}});// 3.创建一个代表邮件的对象:Message message = new MimeMessage(session);try {// 设置发件人:message.setFrom(new InternetAddress("service@estore.com"));// 设置收件人:// TO:收件人.// CC:抄送// BCC:暗送,密送message.setRecipient(RecipientType.TO, new InternetAddress(to));// 设置邮件的主题:message.setSubject("ESTORE官方网站的激活邮件");// 设置邮件的正文:message.setContent("<h1>欢迎来到ESTROE购物天堂</h1><h3><a href='http://192.168.35.64/estore/user?method=active&code="+code+"'>http://192.168.35.64/estore/user?method=active&code="+code+"</a></h3>", "text/html;charset=UTF-8");// 发送邮件:Transport.send(message);} catch (Exception e) {e.printStackTrace();throw new RuntimeException();} }
}

和UserService.java结合使用实现通过邮件验证注册

public boolean registUser(User user) {// 调用持久层代码注册用户UserDao dao = new UserDaoImple();// 添加业务/*** 用户的主键(字符串类型)* 设置用户的状态为0* 生成激活码*/// 生成主键user.setUid(MyUUIDUtil.getUUID());// 设置状态码为0 -- 未激活的状态user.setState(0);// 生成激活码String code = MyUUIDUtil.getUUID()+MyUUIDUtil.getUUID();user.setCode(code);// 发送一封邮件MailUtil.sendMail(user.getEmail(), code);return dao.saveUser(user);}

在USerServlet.java中添加邮件激活方法

*从连接发送code的激活码

*在数据库中保存了一个激活码

*获取到get请求发送过来的激活码,去数据库中进行查询,如果查询到了返回user,修改用户的状态为state=1(激活状态)

/*** 邮件激活用户的方法* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String active(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 先获取code激活码77cec5d12a5840dd88dd6f9a7f0ad2c467c55972837e484d9851fad028169407String code = request.getParameter("code");// 处理数据UserService us = new UserService();// 通过激活码查询的用户User user = us.findUserByCode(code);// 如果用户为空,说明没有查到用户if(user == null){request.setAttribute("msg", "激活失败了");}else{// 修改用户的状态,状态默认值0,修改成1.user.setState(1);// 再调用UserService修改方法us.updateUser(user);// 设置信息request.setAttribute("msg", "激活成功了,请您登陆!!");}return "/jsps/msg.jsp";}

UserDao.java中添加:

User findUserByCode(String code);

在UserDaoImple.java:

/*** 通过code查询用户*/public User findUserByCode(String code) {QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());String sql = "select * from user where code = ?";try {return runner.query(sql, new BeanHandler<User>(User.class), code);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}

登录功能:

login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html><head><title>登录</title><meta http-equiv="pragma" content="no-cache"><meta http-equiv="cache-control" content="no-cache"><meta http-equiv="expires" content="0">    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"><meta http-equiv="description" content="This is my page"><meta http-equiv="content-type" content="text/html;charset=utf-8"><!--<link rel="stylesheet" type="text/css" href="styles.css">--></head><body><h1>登录</h1><p style="color: red; font-weight: 900">${msg }</p><form action="${ pageContext.request.contextPath }/user" method="post"><!-- 添加隐藏域 --><input type="hidden" name="method" value="login" />用户名:<input type="text" name="username"/><br/>密 码:<input type="password" name="password"/><br/><input type="submit" value="登录"/></form></body>
</html>

在UserServlet.java中添加方法,封装数据:

/*** 用户登陆的功能* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String login(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {/*** 获取数据* 封装数据* 处理数据* 显示数据*/Map<String, String[]> map = request.getParameterMap();User user = new User();try {BeanUtils.populate(user, map);UserService us = new UserService();// 登陆功能User existUser = us.login(user);// 如果登陆失败,给出用户提示if(existUser == null){request.setAttribute("msg", "用户名或者密码错误或者未激活!!");return "/jsps/msg.jsp";}else{// 如果登陆成功,把用户的信息保存到session中,转发到首页request.getSession().setAttribute("existUser", existUser);// 转发main.jsp的页面上return "/jsps/main.jsp";}} catch (Exception e) {e.printStackTrace();} return null;}

在UserServlet.java中添加方法:

public User login(User user) {UserDao dao = new UserDaoImple();return dao.login(user);}

在UserDao.java中添加

User login(User user);

在UserDaoiImple.java

/*** 登陆的功能*/public User login(User user) {QueryRunner runner = new QueryRunner(MyJdbcUtil.getDataSource());String sql = "select * from user where username = ? and password = ? and state = ?";try {return runner.query(sql, new BeanHandler<User>(User.class), user.getUsername(),user.getPassword(),1);} catch (SQLException e) {e.printStackTrace();throw new RuntimeException(e);}}

top.jsp

<c:if test="${ not empty existUser }">您好:${ existUser.username }&nbsp;&nbsp;|&nbsp;&nbsp;<a href="<c:url value='/jsps/cart/list.jsp'/>" target="body">我的购物车</a>&nbsp;&nbsp;|&nbsp;&nbsp;

退出功能:

top.jsp

<a href="${ pageContext.request.contextPath }/user?method=exit" target="_parent">退出</a></c:if>

在UserServlet.java中添加

/*** 用户退出的功能* @param request* @param response* @return* @throws ServletException* @throws IOException*/public String exit(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException {// 获取session,直接销毁request.getSession().invalidate();return "/jsps/main.jsp";}

完整的代码已经上传到github。

项目开发:网上书店(详细的开发流程记录)----注册登录功能,通过邮件验证相关推荐

  1. java网上书店管理系统_基于JAVA的网上书店管理系统的开发.doc

    基于JAVA的网上书店管理系统的开发 基于 JAVA 的网上书店系统的设计与开发 摘 要 电子商务是一种在互联网上进行商务活动的形式,近年来随着互联网技术的 发展得以迅速普及.如何利用最新互联网编程技 ...

  2. 一步步开发自己的博客 .NET版(3、注册登录功能)

    前言 这次开发的博客主要功能或特点:     第一:可以兼容各终端,特别是手机端.     第二:到时会用到大量html5,炫啊.     第三:导入博客园的精华文章,并做分类.(不要封我)     ...

  3. 26:第三章:开发通行证服务:9:【注册/登录】接口:验证码校验OK后,先根据手机号去查查该用户是否已存在,如果用户不存在就创建这个用户;(tkmybatis查询构建查询条件,雪花算法,枚举类等等)

    说明: (1)本篇博客内容:继续开发[注册/登录]接口: ● 在[25:第三章:开发通行证服务:8:[注册/登录]接口:接收并校验"手机号和验证码"参数:]中,[注册/登录]接口, ...

  4. 手机短信验证码一键注册登录功能开发 2

    1. 上一篇我们开发好了 短信验证码的发送功能, 接下来开发 我们的 一键登录注册功能 2. 有前端的视图我们可以看到, 传入的参数为手机号和验证码,我们用BO对其进行统一的封装,同时使用valid ...

  5. 使用ASP.NET技术开发网上书店

    (注意:本文档包括--知识点说明,详细,复习) 共10章 1~4 ASP.NET页面基础 5~7 ASP.NET页面重要组成部分 8~10 ASP.NET锦上添花 知识点说明: 第1章 1)Asp.N ...

  6. WeX5 3.8开发工具之蓝牙打印(全流程记录不是最全,胜似最全)

    技术分享 记录踩过的坑和别的大佬没有叽歪的点 开始做蓝牙打印看到网上很多做混合开发 和安卓开发,ios开发的例子,插件等等版本大同小异,并不是像其他博客上所说的那么简单,[下载插件,无需改动,连接打印 ...

  7. 鸿蒙OS应用开发之——实现APP注册登录功能

    一.功能简介 注册登录页面作为基础模块,具体包括了注册.登录.登录后界面的策划设计. 1.1注册 注册包括用户名,密码,确认密码三个流程,密码现在是明码显示的方式.这个模块中设置了判断"确认 ...

  8. 三分钟快速开发手机号注册登录功能

    手机号注册登录如今已经是大多数APP必备的功能,通过验证码的核实,我们获取了用户的手机号码,从而在以下几个方面确保安全和产生价值: 符合国家信息安全监管的需要,避免个别的用户违反监管要求,而我们无法追 ...

  9. 基于SpringBoot从零构建博客网站 - 整合ehcache和开发注册登录功能

    对于程序中一些字典信息.配置信息应该在程序启动时加载到缓存中,用时先到缓存中取,如果没有命中,再到数据库中获取同时放到缓存中,这样做可以减轻数据库层的压力.目前暂时先整合ehcache缓存,同时预留了 ...

  10. 手机短信验证码一键注册登录功能开发 1

    1. 首先根据业务分析, 先要在前端填写我们的手机号, 发送短信验证码给我们的用户 对于我们后端来说, 发送验证码就是我们要开发的接口, 手机号就是我们传入的参数,然后就可以编写相应的代码了 @Api ...

最新文章

  1. Mongodb的索引操作
  2. PTC Creo7.0中文版
  3. 网络和计算机管理制度,网络和计算机使用管理制度
  4. IDEA 创建maven jar、war、 pom项目
  5. 腾讯又双叒涨工资了!平均月薪已达7.27万?
  6. Android-----巧用科大讯飞语句实现中文语音播报
  7. 移动硬盘常见故障分析
  8. java后端简历项目经历_JAVA后端开发工程师个人简历模板
  9. ntko php,NTKO 附件管理控件_
  10. json日期格式转换为正常格式
  11. jQuery选择器 第六章
  12. npm下载以来版本问题 npm ERR! code ERESOLVE
  13. 谷歌无法打开微信二维码链接解决方案 之 使用谷歌模拟微信浏览器
  14. 启用计算机的无线同屏,Windows10如何使用无线同屏功能?
  15. Put GridView inside ScrollView
  16. redis常用命令getex_Redis常用命令整理
  17. 1004: 惠民工程 (2013年中南大学研究生复试机试 )
  18. 车联网是什么_车联网有什么用_车联网功能介绍
  19. 最经典的消息中间件:RabbitMQ
  20. 计算机二级模拟office,2016年计算机二级office模拟试卷(附答案)

热门文章

  1. Android SDK Manager设置HTTP Proxy Server代理服务器
  2. 计算机网络——计算机网络病毒和黑客
  3. 计算机专业老师新学期工作计划,2020教师新学期工作计划5篇
  4. 计算机辅助教学课件中的辅导型模式是以,在开发计算机教学辅助教学课件时采用的主要理论是()...
  5. Android精品开源项目整理_V20140221
  6. 记一次PSP游戏文件(iso)提取BGM(cpk文件处理,无后缀音频文件格式转换,pmf文件转换)
  7. 二级java考什么_​Java计算机二级考试考什么
  8. 关闭VS2019和VAssistX的导航栏
  9. RF-接口自动化测试-「Body Data格式」
  10. J1939协议简介【小白入门】