云笔记项目 Unit04
来源:互联网 发布:京东店铺销量数据 编辑:程序博客网 时间:2024/05/21 06:02
云笔记
登录(续)
显示错误消息
原理:
重构控制器增加异常处理方法 UserController
@ExceptionHandler( UserNotFoundException.class)@ResponseBodypublic JsonResult handleUserNotFound( UserNotFoundException e){ e.printStackTrace(); return new JsonResult(2,e);}@ExceptionHandler(PasswordException.class)@ResponseBodypublic JsonResult handlePassword( PasswordException e){ e.printStackTrace(); return new JsonResult(3,e);}
重构JsonResult 添加 构造器
public JsonResult(int state, Throwable e) { this.state = state; this.message = e.getMessage();}
重构 login.js 的loginAction方法, 显示错误信息
var msg = result.message;if(result.state==2){ $('#count').next().html(msg);}else if(result.state==3){ $('#password').next().html(msg);}else{ alert(msg);}
测试
注册功能
原理:
1. 持久层
声明持久层方法: UserDao
int addUser(User user);
声明SQL UserMappeer.xml
<insert id="addUser" parameterType="cn.tedu.note.entity.User"> insert into cn_user ( cn_user_id, cn_user_name, cn_user_password, cn_user_token, cn_user_nick ) values ( #{id}, #{name}, #{password}, #{token}, #{nick} )</insert>
测试 UserDaoTest:
UserDao dao;@Beforepublic void initDao(){ dao = ctx.getBean( "userDao", UserDao.class);}@Testpublic void testAddUser(){ String id=UUID.randomUUID().toString(); String name = "Tom"; String salt = "今天你吃了吗?"; String password = DigestUtils.md5Hex(salt+"123456"); String token = ""; String nick = ""; User user = new User( id, name, password, token, nick); int n = dao.addUser(user); System.out.println(n); }
2. 业务层
声明业务层方法 UserService
/** * UserService 中添加注册功能 * @param name * @param nick * @param password * @param confirm * @return 注册成功的用户信息 * @throws UserNameException 用户名异常 * @throws PasswordException 密码异常 */User regist(String name, String nick, String password, String confirm) throws UserNameException, PasswordException;
声明业务层异常 UserNameException
public class UserNameException extends RuntimeException { private static final long serialVersionUID = 6435296194529486206L; public UserNameException() { } public UserNameException(String message) { super(message); } public UserNameException(Throwable cause) { super(cause); } public UserNameException(String message, Throwable cause) { super(message, cause); } public UserNameException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) { super(message, cause, enableSuppression, writableStackTrace); }}
重构 jdbc.properties 和 UserServiceImpl, 将salt存储到配置文件, 利用Spring注入到属性中:
# jdbc.propertiessalt=\u4ECA\u5929\u4F60\u5403\u4E86\u5417?// UserServiceImpl@Value("#{jdbc.salt}")private String salt;
实现业务层方法: UserServiceImpl
public User regist(String name, String nick, String password, String confirm) throws UserNameException, PasswordException { //检查name, 不能重复 if(name==null || name.trim().isEmpty()){ throw new UserNameException("不能空"); } User one = userDao.findUserByName(name); if(one!=null){ throw new UserNameException("已注册"); } //检查密码 if(password==null || password.trim().isEmpty()){ throw new PasswordException("不能空"); } if(! password.equals(confirm)){ throw new PasswordException("确认密码不一致"); } //检查nick if(nick ==null || nick.trim().isEmpty()){ nick = name; } String id = UUID.randomUUID().toString(); String token = ""; password = DigestUtils.md5Hex(salt+password); User user = new User( id, name, password, token, nick); int n = userDao.addUser(user); if(n!=1){ throw new RuntimeException("添加失败!"); } return user;}
测试:UserServiceTest
UserService service;@Beforepublic void initService(){ service = ctx.getBean("userService", UserService.class);}@Testpublic void testRegist(){ User user = service.regist( "Andy", "Andy", "123456", "123456"); System.out.println(user); }
3. 控制器
添加控制器方法 UserController
@RequestMapping("/regist.do")@ResponseBodypublic JsonResult regist(String name, String nick, String password, String confirm){ User user = userService.regist( name, nick, password, confirm); return new JsonResult(user);}
测试
http://localhost:8080/note/user/regist.do?name=Jerry&nick=AN&password=12345&confirm=12345
4. 添加注册JS脚本
更新 log_in.html 取消页面检查js脚本:
window.onload=function(){ var t =setTimeout("get('zc').style.visibility='visible'",800); //get('final_password').onblur=function(){ // var npassword=get('regist_password').value; // var fpassword=get('final_password').value; // if(npassword!=fpassword){ // get('warning_3').style.display='block'; // } //} //get('regist_password').onblur=function(){ // var npassword=get('regist_password').value.length; // if(npassword<6&&npassword>0){ // get('warning_2').style.display='block'; // } //} //get('regist_password').onfocus=function(){ // get('warning_2').style.display='none'; //} //get('final_password').onfocus=function(){ // get('warning_3').style.display='none'; //}}
添加注册对话框事件脚本 login.js
$('#regist_button').click(registAction);$('#regist_username').blur(checkRegistName);$('#regist_password').blur(checkRegistPassword);$('#final_password').blur(checkConfirm);
添加注册对话框数据检验方法:login.js
function checkConfirm(){ var pwd2 = $('#final_password').val(); var pwd = $('#regist_password').val(); //pwd 如果是空值表示 false, 非空则是true if(pwd && pwd==pwd2){ $('#final_password').next().hide(); return true; } $('#final_password').next().show() .find('span').html('确认密码不一致'); return false;}function checkRegistPassword(){ var pwd = $('#regist_password').val().trim(); var rule = /^\w{4,10}$/; if(rule.test(pwd)){ $('#regist_password').next().hide(); return true; } $('#regist_password').next().show() .find('span').html('4~10个字符'); return false;}function checkRegistName(){ var name = $('#regist_username').val().trim(); var rule = /^\w{4,10}$/; if(rule.test(name)){ $('#regist_username').next().hide(); return true; } $('#regist_username').next().show() .find('span').html('4~10字符'); return false;}
添加注册对话框注册按钮事件方法 login.js
function registAction(){ console.log('registAction'); //检验界面参数 var n = checkRegistName() + checkRegistPassword() + checkConfirm(); if(n!=3){ return ; } //获取界面中表单数据 var name = $('#regist_username').val().trim(); var nick = $('#nickname').val(); var password = $('#regist_password').val(); var confirm = $('#final_password').val(); //发起AJAX请求 var url = 'user/regist.do'; var data = {name:name, nick:nick, password:password, confirm:confirm}; //console.log(data); // $.post 是 $.ajax的简化版 $.post(url, data, function(result){ console.log(result); if(result.state==0){ //退回登录界面 $('#back').click(); var name = result.data.name; $('#count').val(name); $('#password').focus(); //清空表单 $('#regist_username').val(''); $('#nickname').val(''); $('#regist_password').val(''); $('#final_password').val(''); }else if(result.state==4){ $('#regist_username').next().show() .find('span').html(result.message); }else if(result.state==3){ $('#regist_password').next().show() .find('span').html(result.message); }else{ alert(result.message); } }); //得到响应以后, 更新界面}
重构控制器UserController 增加事件处理方法:
@ExceptionHandler(UserNameException.class)@ResponseBodypublic JsonResult handleUserName( UserNameException e){ e.printStackTrace(); return new JsonResult(4,e);}
测试…
调试工具:
笔记本列表功能
原理:
1. 持久层
添加持久层接口 NotebookDao:
public interface NotebookDao { List<Map<String, Object>> findNotebooksByUserId( String userId);}
添加Mapper文件: NotebookMapper.xml
<mapper namespace="cn.tedu.note.dao.NotebookDao"> <select id="findNotebooksByUserId" parameterType="string" resultType="map"> select cn_notebook_id as id, cn_notebook_name as name from cn_notebook where cn_user_id = #{userId} order by cn_notebook_createtime desc </select></mapper>
测试:
public class NotebookDaoTest extends BaseTest{ NotebookDao dao; @Before public void initDao(){ dao = ctx.getBean("notebookDao", NotebookDao.class); } @Test //select cn_user_id from cn_notebook; public void testFindNotebooksByUserId(){ String userId="52f9b276-38ee-447f-a3aa-0d54e7a736e4"; List<Map<String, Object>> list= dao.findNotebooksByUserId(userId); for (Map<String, Object> map : list) { System.out.println(map); } }}
提示: 需要先到数据库中获得拥有笔记的用户ID userId
select cn_user_id from cn_notebook;
List
2. 业务层
声明业务接口NotebookService
public interface NotebookService { List<Map<String, Object>> listNotebooks(String userId) throws UserNotFoundException;}
实现业务接口 NotebookServiceImpl
@Service("notebookService")public class NotebookServiceImpl implements NotebookService { @Resource private NotebookDao notebookDao; @Resource private UserDao userDao; public List<Map<String, Object>> listNotebooks(String userId) throws UserNotFoundException { if(userId==null || userId.trim().isEmpty()){ throw new UserNotFoundException("ID不能空"); } User user = userDao.findUserById(userId); if(user==null){ throw new UserNotFoundException("用户不存在"); } return notebookDao .findNotebooksByUserId(userId); }}
添加查询方法 UserDao
User findUserById(String userId);
添加SQL UserMapper
<select id="findUserById" parameterType="string" resultType="cn.tedu.note.entity.User"> select cn_user_id as id, cn_user_name as name, cn_user_password as password, cn_user_token as token, cn_user_nick as nick from cn_user where cn_user_id = #{userId}</select>
测试:
public class NotebookServiceTest extends BaseTest { NotebookService service; @Before public void initService(){ service = ctx.getBean("notebookService", NotebookService.class); } @Test public void testListNotebooks(){ String userId="52f9b276-38ee-447f-a3aa-0d54e7a736e4"; List<Map<String, Object>> list= service.listNotebooks(userId); for (Map<String, Object> map : list) { System.out.println(map); } }}
阅读全文
0 0
- 云笔记项目 Unit04
- SSH Unit04
- SE02 Unit04 多线程基础
- SPRINGMYBATIS01 Unit04:实战技巧 、 登录
- ORACLE Unit04 SQL(高级查询)
- 云笔记项目
- 云笔记系统项目
- 云笔记项目 Unit01
- 云笔记项目 Unit02
- 云笔记项目 Unit03
- 云笔记项目 Unit05
- 云笔记项目 Unit06
- 云笔记项目 Unit07
- 云笔记项目 Unit08
- 云笔记项目 Unit09
- 云笔记项目实战部分
- FUNDAMENTAL Unit04 循环结构(while、do-while、for)
- SE01 Unit04 集合框架 、 集合操作 —— 线性表
- 判断php变量是否为空/已定义
- Android 进阶笔记。
- vijos1023 Victoria的舞会3
- solr初识
- java多线程详解(并发,并行,同步)
- 云笔记项目 Unit04
- LINUX环境下Nginx与php-fpm安装部署
- 压力测试-步骤
- 初级着色器
- 【Java基础之网络编程】代码库(七)
- Findbugs 缺陷详解与英文代号的对照表
- java读取properties文件
- 对象和封装
- Lvs+keepalived 实现高可用负载均衡文档