猿进化系列16——实战之一学会SQL开发正确姿势

猿人工厂君在上一章节已经带着你扫清了小项目的关键内容,小项目的架子算是搭起来了,今天猿人工厂君就带你来完成这个小项目的部分内容。

      猿进化是一个原创系列文章,帮助你从一只小白快速进化为一个猿人,更多精彩内容,敬请大家关注公主号猿人工厂,点击猿人养成获取

       哈哈,金胖子,你是要逗我吗?如此简单的一个注册页面,有什么好讲的。注册嘛,每个用户填写资料,只要符合一定的校验规则,服务器存储这些信息就可以了。从这个页面上看,用户信息也不算复杂,用户名,密码,email,姓名,手机号,性别,出生日期也就够了。用户点击注册,数据库存储不重复的用户信息就可以了。

       嗯,要存储用户信息,自然先定义一个用户类,之前数据库已经设计好了,我们使用SpringJdbcTemplete,要求类的属性满足驼峰式的命名规范,帮助我们方面地以对象的形式操作数据。我们的用户类几乎已经是现成的了。

       这样子,用户类暂时定下来了(访问器方法及构造方法省略)。

/**
 *
用户实体
 
* @author pangzi
 *
 */
public class TravelUser implements Serializable{
   private long travelUserId;//用户id
   private StringtravelUserName;//用户名,账号
   private StringtravelUserPassword;//密码
   private StringtravelUserRelName;//真实姓名
   private StringtravelUserBirthday;//出生日期
   private int travelUserSex;//男或女
   private StringtravelUserTelephone;//手机号
   private StringtravelUserEmail;//邮箱
   private int travelUserStatus;//激活状态,1代表激活,0代表未激活
   private StringtravelUserCode;//激活码(要求唯一)
}

        嗯,再看看这个功能,还是存在一些隐藏的业务逻辑,用户名的长度,密码长度,邮箱的基本格式,还有一个最重要的事情,用户名是不能重复的,这个需要根据用户名来检索数据库中的数据,如果已经存在数据了,就要提醒用户换一个用户名了。嗯,好像还遗忘了一个事情,还需要根据激活码来校验用户激活操作是否正确。嗯,脑容量有点不够了,怎么办啊?

   

重点来了,新手正确的编写SQL确实是一个比较难以回避的话题,select*的各种问题,可以自行度娘,猿人工厂君也不想多费口舌。现在就教你一种简单快捷无错的sql编写办法,好好珍藏吧。

以要操作的travel_user表为例,先在SQLylog中执行语句desc table_name。

然后对着执行结果右键->复制->复制所有行到粘贴板。新建一个excel,将结果粘贴下来:

去掉表头,只留下两列,把第二列输入英文半角的逗号,下拉,快速得到如下结果,注意噢,最后一行没有逗号噢。

然后找一个在线压缩工比如https://www.sojson.com/jshtml.html,将两列复制下来粘贴进去。

然后点击普通压缩,你要查询的字段名就已经好了,复制代码,然后回到SQLyog,编写代码,把需要查询或新增的部分留出来,把查询过滤条件写好。

然后粘贴之前复制的内容稍做调整即可,记得执行下噢,验证下sql的正确性。

       

如果是写插入语句把select换成insert into 语句,去掉自增的字段(如果有的话),然后只用关心values后边有几个问号就好了^_^

于是我们快速的得到了好用而且规范编写的sql语句:

SELECT
travel_user_id,travel_user_name,travel_user_password,
travel_user_rel_name,travel_user_birthday,
travel_user_sex,travel_user_telephone,travel_user_email,
travel_user_status,travel_user_code
FROM travel_user WHEREtravel_user_name = ?
SELECT
travel_user_id,travel_user_name,travel_user_password,
travel_user_rel_name,travel_user_birthday,
travel_user_sex,travel_user_telephone,travel_user_email,
travel_user_status,travel_user_code
FROM travel_user WHERE travel_user_code= ?
INSERT INTO


travel_user(travel_user_name,travel_user_password,travel_user_rel_name,travel_user_birthday,travel_user_sex,travel_user_telephone,travel_user_email,travel_user_status,travel_user_code)VALUES(?,?,?,?,?,?,?,?,?)

接下来,页面的实现和后端代码的编写就容易多了。接下来由于篇幅有限,猿人工厂君就把功能实现的关键代码奉献给你了。

前端页面脚本实现

 

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","1px solid red");
                }
 
                return flag;
            }
 
            //校验邮箱
                     function checkEmail(){
                         //1.获取邮箱
                            var email = $("#email").val();
                            //2.定义正则            itcast@163.com
                            var reg_email = /^\w+@\w+\.\w+$/;
 
                            //3.判断
                            var flag = reg_email.test(email);
                            if(flag){
                    $("#email").css("border","");
                            }else{
                    $("#email").css("border","1px solid red");
                            }
 
                            return flag;
                     }
 
                     $(function () {
                //当表单提交时,调用所有的校验方法
                            $("#registerForm").submit(function(){
                                   //1.发送数据到服务器
                                   if(checkUsername() && checkPassword()&& checkEmail()){
                                       //校验通过,发送ajax请求,提交表单的数据   username=zhangsan&password=123
 
                                          $.post("user/regist",$(this).serialize(),function(data){
                                                 //处理服务器响应的数据 data  {flag:true,errorMsg:"注册失败"}
 
                                                 if(data.flag){
                                                     //注册成功,跳转成功页面
                                                        location.href="register_ok.html";
                                                 }else{
                                                     //注册失败,给errorMsg添加提示信息
                                                        $("#errorMsg").html(data.errorMsg);
 
                                                 }
                                          });
 
                                   }
                                   //2.不让页面跳转
                    return false;
                    //如果这个方法没有返回值,或者返回为true,则表单提交,如果返回为false,则表单不提交
                            });
 
                //当某一个组件失去焦点是,调用对应的校验方法
                            $("#username").blur(checkUsername);
                $("#password").blur(checkPassword);
                $("#email").blur(checkEmail);
 
 
            });

                   后端代码实现

package com.pz.route.dao;
 
import com.pz.route.domain.TravelUser;
 
 
 
/**
 *
 * @author pangzi
 *
 */
public interface TravelUserDao {
 
    /**
     * 根据用户名查询用户信息
     * @param travelUserName
     * @return
     */
    public TravelUser findByTravelUsername(StringtravelUserName);
 
    /**
     * 保存用户信息
     * @param travelUser
     */
    publicvoidsaveTravelUser(TravelUser travelUser);
 
    /**
     * 根据激活码查询用户
     * @param travelUsercode
     * @return
     */
    TravelUser findByTravelUserCode(StringtravelUsercode);
   
    /**
     * 更新用户状态
     * @param travelUser
     */
    void updateTravelUserStatus(TravelUsertravelUser);
   
    /**
     * 根据用户名和密码查询用户
     * @param travelUserName
     * @param travelUserPassword
     * @return
     */
    TravelUser findByUsernameAndPassword(StringtravelUserName, String travelUserPassword);
}

 

 

package com.pz.route.dao.impl;
 
import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.BeanPropertyRowMapper;
import org.springframework.jdbc.core.JdbcTemplate;
 
import com.pz.route.dao.TravelUserDao;
import com.pz.route.domain.TravelUser;
import com.pz.route.util.JDBCUtils;
 
publicclass TravelUserDaoImpl implements TravelUserDao {
 
    private JdbcTemplate template = newJdbcTemplate(JDBCUtils.getDataSource());
 
    @Override
    public TravelUserfindByTravelUsername(String travelUserName) {
        TravelUser user = null;
        try {
            //1.声明sql
            String sql = "select * fromtravel_user where travel_user_name = ?";
            //2.执行sql
            user = template.queryForObject(sql,new BeanPropertyRowMapper<TravelUser>(TravelUser.class), travelUserName);
        } catch (Exception e) {
 
        }
 
        return user;
    }
 
    @Override
    public void saveTravelUser(TravelUsertravelUser) {
        //1.声明sql
        String sql = "insert intotravel_user(travel_user_name,travel_user_password,travel_user_rel_name,travel_user_birthday,travel_user_sex,travel_user_telephone,travel_user_email,travel_user_status,travel_user_code)values(?,?,?,?,?,?,?,?,?)";
        //2.执行sql
 
       template.update(sql,travelUser.getTravelUserName(),
                    travelUser.getTravelUserPassword(),
                    travelUser.getTravelUserRelName(),
                    travelUser.getTravelUserBirthday(),
                    travelUser.getTravelUserSex(),
                    travelUser.getTravelUserTelephone(),
                    travelUser.getTravelUserEmail(),
                    travelUser.getTravelUserStatus(),
                    travelUser.getTravelUserCode()
                );
    }
 
    /**
     * 根据激活码查询用户对象
     * @param code
     * @return
     */
    @Override
    public TravelUserfindByTravelUserCode(String travelUserCode) {
        TravelUser user = null;
        try {
            String sql = "select * fromtravel_user where travel_user_code = ?";
 
            user = template.queryForObject(sql,newBeanPropertyRowMapper<TravelUser>(TravelUser.class),travelUserCode);
        } catch (DataAccessException e) {
            e.printStackTrace();
        }
 
        return user;
    }
 
    /**
     * 修改指定用户激活状态
     * @param user
     */
    @Override
    public voidupdateTravelUserStatus(TravelUser travelUser) {
        String sql = " update travel_userset status = 1 where travel_user_id=?";
       template.update(sql,travelUser.getTravelUserId());
    }
 
    /**
     * 根据用户名和密码查询的方法
     * @param username
     * @param password
     * @return
     */
    @Override
    public TravelUserfindByUsernameAndPassword(String travelUserName, String travelUserPassword) {
        TravelUser user = null;
        try {
            //1.定义sql
            String sql = "select * fromtravel_user where travel_user_name = ? and travel_user_password = ?";
            //2.执行sql
            user = template.queryForObject(sql,new BeanPropertyRowMapper<TravelUser>(TravelUser.class),travelUserName,travelUserPassword);
        } catch (Exception e) {
 
        }
 
        return user;
    }
}
 

 

package com.pz.route.service;
 
import com.pz.route.domain.TravelUser;
 
publicinterface TravelUserService {
    /**
     * 注册用户
     * @param user
     * @return
     */
    boolean regist(TravelUser user);
   
    /**
     * 激活用户
     * @param code
     * @return
     */
    boolean active(String code);
   
    /**
     * 用户登陆
     * @param user
     * @return
     */
    TravelUser login(TravelUser user);
}
package com.pz.route.service.impl;
 
import com.pz.route.dao.TravelUserDao;
import com.pz.route.dao.impl.TravelUserDaoImpl;
import com.pz.route.domain.TravelUser;
import com.pz.route.service.TravelUserService;
import com.pz.route.util.MailUtils;
import com.pz.route.util.UuidUtil;
 
public class TravelUserServiceImpl implements TravelUserService {
 
    private TravelUserDao travelUserDao = newTravelUserDaoImpl();
    /**
     * 注册用户
     * @param user
     * @return
     */
    @Override
    public boolean regist(TravelUsertravelUser) {
        //1.根据用户名查询用户对象
        TravelUser dbUser =travelUserDao.findByTravelUsername(travelUser.getTravelUserName());
        //判断u是否为null
        if(dbUser != null){
            //用户名存在,注册失败
            return false;
        }
        //2.保存用户信息
        //2.1设置激活码,唯一字符串
       travelUser.setTravelUserCode(UuidUtil.getUuid());
        //2.2设置激活状态
        travelUser.setTravelUserStatus(1);
       travelUserDao.saveTravelUser(travelUser);
 
        //3.激活邮件发送,邮件正文?
 
        String content="<ahref='http://localhost/travel/user/active?code="+travelUser.getTravelUserCode()+"'>点击激活【胖子旅游网】</a>";
 
       MailUtils.sendMail(travelUser.getTravelUserEmail(),content,"激活邮件");
 
        return true;
    }
 
    /**
     * 激活用户
     *@param code
     * @return
     */
    @Override
    public boolean active(String code) {
        //1.根据激活码查询用户对象
        TravelUser user =travelUserDao.findByTravelUserCode(code);
        if(user != null){
            //2.调用dao的修改激活状态的方法
            travelUserDao.updateTravelUserStatus(user);
            return true;
        }else{
            return false;
        }
 
 
 
    }
 
    /**
     * 登录方法
     * @param user
     * @return
     */
    @Override
    public TravelUser login(TravelUsertravelUser) {
        return travelUserDao.findByUsernameAndPassword(travelUser.getTravelUserName(),travelUser.getTravelUserPassword());
    }
 
}
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本火锅店点餐系统采用Java语言和Vue技术,框架采用SSM,搭配Mysql数据库,运行在Idea里,采用小程序模式。本火锅店点餐系统提供管理员、用户两种角色的服务。总的功能包括菜品的查询、菜品的购买、餐桌预定和订单管理。本系统可以帮助管理员更新菜品信息和管理订单信息,帮助用户实现在线的点餐方式,并可以实现餐桌预定。本系统采用成熟技术开发可以完成点餐管理的相关工作。 本系统的功能围绕用户、管理员两种权限设计。根据不同权限的不同需求设计出更符合用户要求的功能。本系统中管理员主要负责审核管理用户,发布分享新的菜品,审核用户的订餐信息和餐桌预定信息等,用户可以对需要的菜品进行购买、预定餐桌等。用户可以管理个人资料、查询菜品、在线点餐和预定餐桌、管理订单等,用户的个人资料是由管理员添加用户资料时产生,用户的订单内容由用户在购买菜品时产生,用户预定信息由用户在预定餐桌操作时产生。 本系统的功能设计为管理员、用户两部分。管理员为菜品管理、菜品分类管理、用户管理、订单管理等,用户的功能为查询菜品,在线点餐、预定餐桌、管理个人信息等。 管理员负责用户信息的删除和管理,用户的姓名和手机号都可以由管理员在此功能里看到。管理员可以对菜品的信息进行管理、审核。本功能可以实现菜品的定时更新和审核管理。本功能包括查询餐桌,也可以发布新的餐桌信息。管理员可以查询已预定的餐桌,并进行审核。管理员可以管理公告和系统的轮播图,可以安排活动。管理员可以对个人的资料进行修改和管理,管理员还可以在本功能里修改密码。管理员可以查询用户的订单,并完成菜品的安排。 当用户登录进系统后可以修改自己的资料,可以使自己信息的保持正确性。还可以修改密码。用户可以浏览所有的菜品,可以查看详细的菜品内容,也可以进行菜品的点餐。在本功能里用户可以进行点餐。用户可以浏览没有预定出去的餐桌,选择合适的餐桌可以进行预定。用户可以管理购物车里的菜品。用户可以管理自己的订单,在订单管理界面里也可以进行查询操作。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值