云笔记项目
最近在写云笔记项目写一篇博客用于记录学习一点一点补充
一、模块
-
用户模块:登录、注册、退出、修改密码
-
笔记本模块:创建、产出、重命名、查看
-
笔记模块:创建、删除、更新、分享
二、 后台开发环境
IntelliJ IDEA 2018.2.4 ,JDK1.8,Mysql
三、 项目使用技术
HTML、jQuery、Ajax、Validate、SpringBoot、MyBatis- 客户端:jQuery+Ajax+Validate
- jQuery:简化客户端js和Ajax编程
- Ajax:异步发送http请求,实现页面的局部数据处理
- Validate:实现表单的验证(规则使用方法在博客中的文章中写过)
- 服务器端:SpringBoot
- SpringBoot:
- 配置web.xml,加载Spring和SpringMVC配置web.xml,加载Spring和SpringMVC
- 配置数据库的连接(Mybatis),配置Spring事物
- 配置加载配置文件的读取,开启注解,方便编程
- 配置日志文件
- 部署Tomcat
- SpringBoot:
- 导入连接池的jar包依赖(我选用的是alibaba的连接池)
<!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.9</version> </dependency> <!--导入使用发送Email邮件的jar包依赖--> <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-email --> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-email</artifactId> <version>1.5</version> </dependency>
- 配置application.yml文件
spring: datasource: // 引入上面引入连接池 type: com.alibaba.druid.pool.DruidDataSource druid: filter: stat driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/db_stringboot?useUnicode=true&characterEncoding=utf-8&serverTimezone=GMT%2B8&useSSL=false username: root password: 1230 mvc: favicon://显示网页title中的页签 enabled: false mybatis: mapper-locations: classpath:mapping/*.xml type-aliases-package: com.lee.com.lee.pojo ```
- 使用Mysql数据库
Mysql和Oracle的区别:- 主键:Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可
- 建表字段类型:Mysql使用Long、Double等,Oracle使用NUMBER
- 单引号的处理:Mysql里可以用双引号包起字符串,Oracle里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号
- 数据库函数或关键字:Mysql使用now()来获取系统当前时间,Oracle使用SYSTEM来获取系统当前时间
and so on
- 客户端:jQuery+Ajax+Validate
四、功能模块
- 登录模块
-
注册
用户名必须是邮箱注册,看数据库是否存在将要注册的用户名,如果有,将错误信息提示给用户,没有给此邮箱发送激活码,只有在邮箱被激活才可以使用- 发送Ajax请求
function register() { var userName = $("#regist_username").val(); var niCheng = $("#nickname").val(); var userPass = $("#regist_password").val(); var finalPass = $("#final_password").val(); userName.trim(); niCheng.trim(); userPass.trim(); finalPass.trim(); $.ajax({ beforeSend:function(){ showDiv(); }, complete:function () { hiddenDiv(); }, url:"/user/register", type:"post", data:{"userName":userName,"niCheng":niCheng,"userPass":userPass}, success:function (result) { if(result.success){ alert("注册成功,请到邮箱页面去登陆"); $("#zc").attr("class","sig sig_out"); $("#dl").attr("class","log log_in"); }else{ alert(result.msg) if(result.msg == '格式不正确'){ var errors = result.data; for(var i=0;i<errors.length;i++){ alert(errors[i].field+"---"+errors[i].defaultMessage) } } } } }) }
-
控制层 处理注册
@RequestMapping("/register") public Object register(@Valid User user, BindingResult bindingResult,HttpServletRequest request) throws MessagingException { Result result = new Result(); if (bindingResult.hasErrors()) { // 看是否有错误 List<ObjectError> allErrors = bindingResult.getAllErrors(); for (ObjectError error : allErrors) { // 输出错误信息 System.out.println(error.getDefaultMessage()); } result.setSuccess(false); result.setMsg("格式不正确"); result.setData(allErrors); return result; } String path = request.getContextPath(); String basePath = request.getScheme() + "://" + request.getServerName() + ":" + request.getServerPort() + path + "/"; String url = basePath + "user/openAccount"; Map<String, Object> map = userService.addUser(user, url); boolean success = (boolean) map.get("success"); if(!success){ result.setMsg(map.get("msg").toString()); result.setSuccess(false); } return result;
2. service层注册处理@Override public Map<String,Object> addUser(User user, String url) { Map<String , Object> result = new HashMap<String,Object>(); User u = userDao.queryUserByName(user.getUserName()); System.out.println(u); if (u != null) { result.put("success",false); result.put("msg","用户名或者密码错误"); } String id = UUID.randomUUID().toString(); user.setId(id); String msg =url + "?id=" +user.getId(); try { sendEmail(user.getUserName(),"激活云笔记账户","点击完成验证"+msg); // 操作数据库放在发送邮件后面 邮件有误 不存入数据库 userDao.addUser(user); result.put("success",true); } catch (MessagingException e) { result.put("success",false); result.put("msg","该邮箱不可用"); e.printStackTrace(); } return result; } // 成功调用发送邮件前提邮箱开启smtp协议 @Override public void sendEmail(String path,String title, String msg) throws MessagingException { Properties properties = new Properties(); properties.put("mail.transport.protocol", "smtp");// 连接协议 properties.put("mail.smtp.host", "smtp.qq.com");// 主机名 properties.put("mail.smtp.port", 465);// 端口号 properties.put("mail.smtp.auth", "true"); properties.put("mail.smtp.ssl.enable", "true");// 设置是否使用ssl安全连接 ---一般都使用 properties.put("mail.debug", "true");// 设置是否显示debug信息 true 会在控制台显示相关信息 // 得到回话对象 Session session = Session.getInstance(properties); // 获取邮件对象 Message message = new MimeMessage(session); // 设置发件人邮箱地址 message.setFrom(new InternetAddress("XXX@qq.com")); // 设置收件人邮箱地址 message.setRecipients(Message.RecipientType.TO, new InternetAddress[]{new InternetAddress(path)}); //message.setRecipient(Message.RecipientType.TO, new InternetAddress("xxx@qq.com"));//一个收件人 // 设置邮件标题 message.setSubject("激活账户"); // 设置邮件内容 message.setText("点击链接完成注册验证:" + msg); // 得到邮差对象 Transport transport = session.getTransport(); // 连接自己的邮箱账户 transport.connect("XXX@qq.com", "zwhrtmexylakifcd");// 密码为QQ邮箱开通的stmp服务后得到的客户端授权码 // 发送邮件 transport.sendMessage(message, message.getAllRecipients()); transport.close(); }
- 登录邮箱点击超链接进行激活处理(超链接直接访问controller层)
/** * 激活 * @param id * @param response */ @RequestMapping("/openAccount") public void openAccount(String id, HttpServletResponse response){ boolean success = userService.openAccount(id); try { String url = "/fail.html"; if(success){ url = "/success.html"; } response.sendRedirect(url); } catch (IOException e) { e.printStackTrace(); } }
- controller层调用service层的激活方法
/** * 激活账户 * @param RocsLee * @return */ @Override public boolean openAccount(String id) { User user = userDao.queryUserById(id); if(user==null){ return false; } userDao.openAccount(id); System.err.println(user.getId()); initSpecialNotebook(user.getId()); new Thread(new Runnable() { @Override public void run() { try { sendEmail(user.getUserName(),"云笔记开通成功","恭喜"+user.getUserName()+"用户开通成功!"); } catch (MessagingException e) { e.printStackTrace(); } } }).start(); return true; }
- service层调bean层
void openAccount(String id); User queryUserByName(String userName); void addUser(User user);
- bean的xml的配置
<mapper namespace="com.lee.com.lee.dao.UserDao"> <sql id="tem"> u.t_user_id AS id, u.t_user_name AS userName, u.t_user_pass AS userPass, u.t_user_nicheng As niCheng, u.t_user_model_flag As modelFlag </sql> <!--添加用户--> <insert id="addUser" parameterType="com.lee.com.lee.pojo.User"> insert into t_user(t_user_id,t_user_name,t_user_pass,t_user_niCheng) values(#{id},#{userName},#{userPass},#{niCheng}) </insert> <!--通过姓名查询数据库中的用户--> <select id="queryUserByName" parameterType="string" resultType="com.lee.com.lee.pojo.User"> select <include refid="tem"/> from t_user u where t_user_name = #{userName} </select> <!--通过用户id更改用户的信息--> <update id="updatePass" parameterType="com.lee.com.lee.pojo.User"> update t_user set t_user_pass = #{userPass} where t_user_id = #{id} </update> <!--通过用户id查询用户的信息--> <select id="queryUserById" parameterType="string" resultType="com.lee.com.lee.pojo.User"> select <include refid="tem"/> from t_user u where t_user_id = #{id} </select> <!--通过修改数据库的标志 来判断用户是否被激活--> <update id="openAccount" parameterType="string"> update t_user set t_user_model_flag = 1 where t_user_id = #{id} </update>
-
用户模块完成
笔记本模块——创建笔记本