期末课设——彩票购买开奖系统 组长:高旭 组员 :林语晴
0 准备工作
0.1 调研
一般的彩票购买是没有线上渠道的。如果做一个线上彩票购买,需要有以下几个功能:
-①登录/注册 功能:要实现最基本的用户密码登录,注册,以及更改密码功能(增删改查)
-②基本的彩票功能:查询历史开奖信息,随机摇号选号,中奖后对彩票奖励进行兑换。
-③管理员:进行开奖,充值功能。
0.2 开发途中需要的软件/知识点
开发工具
Netbeans(主要是对gui的绘画,在netbeans自动生成后放在eclipse进行关键代码的编辑)
eclips(主要开发阵地)
Mysql 8.0/connectj (对用户登录,以及彩票购买信息的增删读写)
所使用的知识
dao模式 Java-gui
1.团队成员介绍及分工
成员 | 分工 | 自评等级 |
---|---|---|
组长:高旭 | 主要对所有gui的开发和算法的编写,博客的撰写 | B |
组员:林语晴 | 实现dao模式 | C |
项目git链接
2.用户的流程演示
2.1 主界面
用户点击登录后:
2.2 登陆界面
如果已有账号,则直接登录,如果忘记注册,在这一步会提示没有用户是否注册
核心代码:
String name = nameTextField.getText(); char[] password = PasswordField.getPassword(); String pwd=new String(password); UserDAOJDBC user=new UserDAOJDBC(); int flag=0;//判断提示框是否要存在 try { if(!user.loginName(name)) { int res=JOptionPane .showConfirmDialog(null, "用户不存在,是否跳转至注册界面", "用户不存在", JOptionPane.YES_NO_OPTION); if(res==JOptionPane.YES_OPTION){ RegisterMain reg=new RegisterMain(); reg.setVisible(true); this.setVisible(false); }}else { flag=1; } if(!user.loginPassword(name, pwd)&&flag==1) { JOptionPane.showMessageDialog(null, "密码输入错误,请检查您的密码", "密码错误", JOptionPane.ERROR_MESSAGE); } if(user.loginName(name)&&user.loginPassword(name, pwd)) { User loginUser=new User(); loginUser=user.getMessage(name); UserMain main = new UserMain(loginUser); main.setVisible(true); this.setVisible(false); }
2.3 注册界面:
用户每次误操作都会报警,下面是报警提示:
String name =registerTextField.getText(); char[]password=registerPasswordField.getPassword(); char[]passwordAgain=registerPasswordField2.getPassword(); String pwd=new String(password); String pwdA=new String(passwordAgain); String telephone=telephoneTextField.getText(); UserDAOJDBC dao=new UserDAOJDBC(); try { if(dao.loginName(name)||name.equals("")) { JOptionPane.showMessageDialog(null, "已存在该用户或用户为空,请更改您的用户名", "存在该用户", JOptionPane.ERROR_MESSAGE); }else { if(!pwd.equals(pwdA)||pwd.isEmpty()) { JOptionPane.showMessageDialog(null, "您的两次密码输入不正确或密码为空,请检查", "错误!", JOptionPane.ERROR_MESSAGE); }else { if(!dao.passwordLimit(pwd)) { JOptionPane.showMessageDialog(null, "您的密码为: "+pwd+" 不符合格式,请重试", "错误!", JOptionPane.ERROR_MESSAGE); }else { if(telephone.length()!=11) { JOptionPane.showMessageDialog(null, "您的电话号码不合法", "错误!", JOptionPane.ERROR_MESSAGE); }else { User user=new User(name, pwd, 10, telephone); dao.register(user); int res=JOptionPane.showConfirmDialog(null, "恭喜您注册成功,是否立即登录?", "成功!", JOptionPane.YES_NO_OPTION); if(res==JOptionPane.YES_OPTION){ LoginMain reg=new LoginMain(); reg.setVisible(true); this.setVisible(false); } } } } } }catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); }
当用户登陆后:
2.4 用户主界面
会显示一些个人信息,使用的方法是setTest
点击购买彩票
2.5 用户购买彩票界面
这里会限制用户重复购买彩票,而且会限制用户输入非数字的字符。
限制字符的代码
MaskFormatter formatter = null; try { formatter = new MaskFormatter("##"); formatter.setValidCharacters("1234567890"); } catch (ParseException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } formatter.setPlaceholderCharacter('0');
然后再使用FormattedTextField1 = new javax.swing.JFormattedTextField(formatter);
定义formattedtestfield
随机数的代码
Random r=new Random(); String str; int num=r.nextInt(100); if(num<10) { str="0"+num; }else { str=num+""; } return str;
这里我把它单独写成了一个类,方便管理员开奖的时候使用
点击一次随机数,就调动该方法,再使用setTest方法更改内容
确认购买彩票:
StringBuilder sb=new StringBuilder(); sb.append(jFormattedTextField1.getText()); sb.append(jFormattedTextField2.getText()); sb.append(jFormattedTextField3.getText()); sb.append(jFormattedTextField4.getText()); sb.append(jFormattedTextField5.getText()); sb.append(jFormattedTextField6.getText()); String lotteryNumber=sb.toString(); LotteryTicketDAOJDBC daoTicket=new LotteryTicketDAOJDBC(); UserDAOJDBC daoUser=new UserDAOJDBC(); if(userMessage.getMoney()<10) { JOptionPane.showMessageDialog(null, "您账户余额不足,现在余额为:"+userMessage.getMoney()+"元,请充值", "错误!", JOptionPane.ERROR_MESSAGE); }else { if(daoTicket.checkUserBuyLottery(userMessage.getUserName())) { JOptionPane.showMessageDialog(null, "您已经购买过本次彩票,请耐心等待开奖", "错误!", JOptionPane.ERROR_MESSAGE); }else { try { daoUser.changeMoney(userMessage.getUserName(), -10); } catch (Exception e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } daoTicket.buyLottery(userMessage.getUserName(), lotteryNumber); if(daoTicket.checkUserBuyLottery(userMessage.getUserName())) { JOptionPane.showMessageDialog(null, "购买成功,您购买的号码为"+lotteryNumber); }else { JOptionPane.showMessageDialog(null, "您没有购买成功,请重试或联系管理员", "错误!", JOptionPane.ERROR_MESSAGE); }}}
运用StringBulider,把每个数字都合计成一个String类方便存储
2.6 查询历史彩票界面
输入日期,点击查询
如果输入超过的日期会显示
如果输入已经开奖的日期会显示中奖号码以及方便兑奖的界面
2.7兑奖界面
不可以重复兑奖,如果重复兑奖会显示
管理员界面
首先在管理员界面输入 root 密码123456进入界面
2.8 管理员开奖界面
会提示本期有多少人购买彩票
点击摇奖 会随机一个数字,可以一直点击,只有真正确定了再进行开奖。而且仪器不能重复开奖。
if(flag) {//flag用于判断管理员是否重复开奖 LotteryTicketDAOJDBC dao=new LotteryTicketDAOJDBC(); dao.drowNewlotteryNumber(lotterySB.toString()); dao.drowNewLotteryTable(); flag=false; }else { JOptionPane.showMessageDialog(null, "本期您已开奖,请不要重复开奖!", "错误!", JOptionPane.ERROR_MESSAGE); }
2.9 充值界面
首先会输入用户名,管理员必须点击查询按钮查询,否则会提示
当查找用户存在会显示他的钱包余额
每步都会显示信息
而且每次充值都会查询,不能连续充值。
3. DAO类
3.1 算法
首先我们要建立三个表,分别为:
1lottery存放的是用户购买第一期彩票的彩票,allotterynumber存放的是每一期的中奖号码,users存放用户个人信息,包括用户名密码电话号码还有钱。
当用户购买彩票时会把彩票存放在新的一期里的表,当管理员开奖时,会建立新的表,而且把彩票号码放置在alllotterynumber里面。一旦建立新表,任何人都不能对老的表进行操作。flag是为了不让每个人重复兑奖。
3.2 彩票dao接口
import information.LotteryNumber; public interface LotteryTicketDAO { public boolean drowNewLotteryTable();//一开奖就建立新表 public boolean drowNewlotteryNumber(String newLottery);//开奖号码 public boolean buyLottery(String name,String lotteryNumber);//用户购买票 //public LotteryNumber searchHistryLottery(int number);//搜锁每一期中奖号码 public Integer getNewLotteryIssue();//获取已经开奖的期数 public boolean checkUserBuyLottery(String name);//检查用户是否购买本期彩票 public String getLotteryNumber(int num);//获得某期彩票中奖号码 public boolean exchangeLottery(String name,int num);//兑奖 public boolean searchExchangeLottery(String name,int num); public String userLottery(String name,int num); public Integer statsNumber(int num); }
3.3 彩票的dao 代码
import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.*; import JDBCconnent.JDBCUtil; import information.LotteryNumber; public class LotteryTicketDAOJDBC implements LotteryTicketDAO { @Override public boolean buyLottery(String name, String lotteryNumber) { int num=getNewLotteryIssue()+1; String sql="insert into "+num+"lottery(name,lottery,flag) values(?,?,?) "; try (Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ) { pst.setString(1,name); pst.setString(2,lotteryNumber); pst.setInt(3, 0); pst.executeUpdate(); }catch (SQLException e){ e.printStackTrace(); } return true; } //@Override // public LotteryNumber searchHistryLottery(int number) { // String sql="select * from alllotterynumber"; // try(Connection con= JDBCUtil.getConnection(); // PreparedStatement pst=con.prepareStatement(sql); // ){ // ResultSet rs = pst.executeQuery(sql); // while (rs.next()) { // Integer id = rs.getInt("id"); // if(id.equals(number)) { // String lotteryNumber=rs.getString("lottery"); // LotteryNumber lottery=new LotteryNumber(id,lotteryNumber); // return lottery; // } // } // }catch (SQLException e){ // e.printStackTrace(); // } // return null; // } @Override public Integer getNewLotteryIssue() { String sql="select * from alllotterynumber"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ){ Integer num=0; ResultSet rs = pst.executeQuery(sql); while (rs.next()) { num++; } return num; }catch (SQLException e){ e.printStackTrace(); } return null; } @Override public boolean drowNewLotteryTable() { int number=getNewLotteryIssue()+1; String creatsql = "CREATE TABLE "+number+"lottery(" + "id int not null primary key auto_increment," + "name varchar(20) not null," + "lottery varchar(20) not null," + "flag int);"; Statement stmt = null; try(Connection con= JDBCUtil.getConnection();){ stmt = con.createStatement(); stmt.executeLargeUpdate(creatsql); }catch(SQLException e) { e.printStackTrace(); } return false; } @Override public boolean drowNewlotteryNumber(String newLottery) { // TODO 自动生成的方法存根 String sql="insert into alllotterynumber(id,lottery) values(?,?) "; try (Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ) { pst.setInt(1,getNewLotteryIssue()+1); pst.setString(2,newLottery); pst.executeUpdate(); }catch (SQLException e){ e.printStackTrace(); } return true; } @Override public boolean checkUserBuyLottery(String name) { int num=getNewLotteryIssue()+1; String sql="select * from "+num+"lottery"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ){ ResultSet rs = pst.executeQuery(sql); while (rs.next()) { String username = rs.getString("name"); if(username.equals(name)) { return true; } } }catch (SQLException e){ e.printStackTrace(); } return false; } @Override public String getLotteryNumber(int num) { String sql="select * from alllotterynumber"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql)) { ResultSet rs = pst.executeQuery(sql); while (rs.next()) { int id=rs.getInt("id"); if(num==id) { String lotteryNumber=rs.getString("lottery"); return lotteryNumber; } } }catch (SQLException e){ e.printStackTrace(); } return null; } @Override public boolean exchangeLottery(String name,int num) { String sql1="update "+num+"lottery"+" set flag=? where name=?"; String sql="select * from "+num+"lottery"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); PreparedStatement pst1=con.prepareStatement(sql1); ){ ResultSet rs = pst.executeQuery(sql); while (rs.next()) { String username = rs.getString("name"); if(username.equals(name)) { pst1.setInt(1, 1); pst1.setString(2, username); pst1.executeUpdate(); return true; } } }catch (SQLException e){ e.printStackTrace(); } return false; } @Override public boolean searchExchangeLottery(String name, int num) { String sql="select * from "+num+"lottery"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ){ ResultSet rs = pst.executeQuery(sql); while (rs.next()) { String username = rs.getString("name"); if(username.equals(name)) { int flag=rs.getInt("flag"); if(flag==0) { return false; }else { return true; } } } }catch (SQLException e){ e.printStackTrace(); } return false; } @Override public String userLottery(String name, int num) { String sql="select * from "+num+"lottery"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ){ ResultSet rs = pst.executeQuery(sql); while (rs.next()) { String username = rs.getString("name"); if(username.equals(name)) { return rs.getString("lottery"); } } }catch (SQLException e){ e.printStackTrace(); } return null; } @Override public Integer statsNumber(int num) { String sql="select * from "+num+"lottery"; int flag=0; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ){ ResultSet rs = pst.executeQuery(sql); while (rs.next()) { flag++; } }catch (SQLException e){ e.printStackTrace(); } return flag; } }
3.4 用户dao接口
import information.User; public interface UserDAO { public boolean login(String name, String password,Integer flag) throws Exception;//判断用户密码是否正确,0代表用户名,1代表密码 public boolean loginName(String name) throws Exception;//返回用户名是否存在 public boolean loginPassword(String name,String password) throws Exception;//返回正确密码 public boolean register(User user) throws Exception;//注册功能 public boolean changePassword(String name,String newPassword) throws Exception;//更改密码 public boolean changeMoney(String name,double alterMoney) throws Exception;//改变钱,充值或者购买扣费 public boolean passwordLimit(String password)throws Exception;//限制密码 public User getMessage(String name);//获得除用户密码的个人信息 }
用户dao接口实现
public class UserDAOJDBC implements UserDAO {
@Override public boolean login(String name, String password,Integer flag) throws Exception { String sql="select * from users"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ){ ResultSet rs = pst.executeQuery(sql); while (rs.next()) { String username = rs.getString("username"); String myPasssword = rs.getString("password"); if(flag==1) { if (name.equals(username)&&password.equals(myPasssword)){ return true; }} if(flag==0) { if(name.equals(username)) { return true; } } } }catch (SQLException e){ e.printStackTrace(); } return false; } @Override public boolean loginName(String name) throws Exception { return login(name," ",0); } @Override public boolean loginPassword(String name, String password) throws Exception { return login(name,password,1); } @Override public boolean register(User user) throws Exception { // TODO 自动生成的方法存根 String sql="insert into users(username,password,telephone,money) values(?,?,?,?) "; try (Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ) { pst.setString(1,user.getUserName()); pst.setString(2,user.getPassword()); pst.setString(3,user.getTelePhone()); pst.setDouble(4,user.getMoney()); pst.executeUpdate(); }catch (SQLException e){ e.printStackTrace(); } return true; } @Override public boolean changePassword(String name, String newPassword) throws Exception { String sql="update users set password=? where username=?"; String sql2="select * from users"; try (Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); PreparedStatement pst2=con.prepareStatement(sql2); ) { ResultSet rs=pst2.executeQuery(sql2); pst.setString(1,newPassword); pst.setString(2,name); pst.executeUpdate(); }catch (SQLException e){ e.printStackTrace(); } return true; } @Override public boolean changeMoney(String name, double alterMoney) throws Exception { String sql="update users set money=? where username=?"; String sql2="select * from users"; double thisMoney=0; try (Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); PreparedStatement pst2=con.prepareStatement(sql2); ) { ResultSet rs=pst2.executeQuery(sql2); while (rs.next()){ if(name.equals(rs.getString("username"))){ thisMoney=rs.getInt("money"); } } thisMoney=thisMoney+alterMoney; pst.setDouble(1,thisMoney); pst.setString(2,name); pst.executeUpdate(); }catch (SQLException e){ e.printStackTrace(); } return true; } @Override public boolean passwordLimit(String password) throws Exception { int count = 0; if (password.length() - password.replaceAll("[A-Z]", "").length() > 0) { count++; } if (password.length() - password.replaceAll("[a-z]", "").length() > 0) { count++; } if (password.length() - password.replaceAll("[0-9]", "").length() > 0) { count++; } if (password.replaceAll("[0-9,A-Z,a-z]", "").length() > 0) { count++; } if(password.length()>=8&&count>=2&&password.length()<=16) { return true; }else { return false; } } @Override public User getMessage(String name) { String sql="select * from users"; try(Connection con= JDBCUtil.getConnection(); PreparedStatement pst=con.prepareStatement(sql); ){ ResultSet rs = pst.executeQuery(sql); while (rs.next()) { String username = rs.getString("username"); if (name.equals(username)){ User user=new User(rs.getInt("id"),username, rs.getDouble("money"), rs.getString("telephone")); return user; } } }catch (SQLException e){ e.printStackTrace(); } return null; }
}
4.0 实验不足
-① 没有用jtable把所有的彩票信息以表格的形式打印出来
-② 管理员并不能清楚的知道每次彩票中奖人数多少人
-③ 有些gui的美观度不足
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具