# 云笔记项目

云笔记项目


最近在写云笔记项目写一篇博客用于记录学习一点一点补充

一、模块

  1. 用户模块:登录、注册、退出、修改密码

  2. 笔记本模块:创建、产出、重命名、查看

  3. 笔记模块:创建、删除、更新、分享
    二、 后台开发环境
    IntelliJ IDEA 2018.2.4 ,JDK1.8,Mysql
    三、 项目使用技术
    HTML、jQuery、Ajax、Validate、SpringBoot、MyBatis

    1. 客户端:jQuery+Ajax+Validate
      1. jQuery:简化客户端js和Ajax编程
      2. Ajax:异步发送http请求,实现页面的局部数据处理
      3. Validate:实现表单的验证(规则使用方法在博客中的文章中写过)
    2. 服务器端:SpringBoot
      1. SpringBoot:
        1. 配置web.xml,加载Spring和SpringMVC配置web.xml,加载Spring和SpringMVC
        2. 配置数据库的连接(Mybatis),配置Spring事物
        3. 配置加载配置文件的读取,开启注解,方便编程
        4. 配置日志文件
        5. 部署Tomcat
    3. 导入连接池的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>
    
    1. 配置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	```
      
    2. 使用Mysql数据库
      Mysql和Oracle的区别:
      1. 主键:Mysql一般使用自动增长类型,在创建表时只要指定表的主键为auto increment,插入记录时,不需要再指定该记录的主键值,Mysql将自动增长;Oracle没有自动增长类型,主键一般使用的序列,插入记录时将序列号的下一个值付给该字段即可;只是ORM框架是只要是native主键生成策略即可
      2. 建表字段类型:Mysql使用Long、Double等,Oracle使用NUMBER
      3. 单引号的处理:Mysql里可以用双引号包起字符串,Oracle里只可以用单引号包起字符串。在插入和修改字符串前必须做单引号的替换:把所有出现的一个单引号替换成两个单引号
      4. 数据库函数或关键字:Mysql使用now()来获取系统当前时间,Oracle使用SYSTEM来获取系统当前时间
        and so on

四、功能模块

  1. 登录模块
    1. 注册
      用户名必须是邮箱注册,看数据库是否存在将要注册的用户名,如果有,将错误信息提示给用户,没有给此邮箱发送激活码,只有在邮箱被激活才可以使用

      1. 发送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)
         			}
         		}
         	}
      }
      })
      }      
      
      
    2. 控制层 处理注册

      @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();
    }
    
    1. 登录邮箱点击超链接进行激活处理(超链接直接访问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();
        }
    }
    
    1. 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;
    }
    
    1. service层调bean层
     void openAccount(String id);
     User queryUserByName(String userName);
     void addUser(User user);
    
    1. 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>
    
```

用户模块完成
笔记本模块——创建笔记本

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值