首页 > 其他分享 >期末课设——彩票购买开奖系统 组长:高旭 组员 :林语晴

期末课设——彩票购买开奖系统 组长:高旭 组员 :林语晴

时间:2023-01-10 11:56:37浏览次数:36  
标签:name 课设 高旭 林语 rs sql public pst String

0 准备工作

0.1 调研

一般的彩票购买是没有线上渠道的。如果做一个线上彩票购买,需要有以下几个功能:

-①登录/注册 功能:要实现最基本的用户密码登录,注册,以及更改密码功能(增删改查)
-②基本的彩票功能:查询历史开奖信息,随机摇号选号,中奖后对彩票奖励进行兑换。
-③管理员:进行开奖,充值功能。

0.2 开发途中需要的软件/知识点

开发工具

Netbeans(主要是对gui的绘画,在netbeans自动生成后放在eclipse进行关键代码的编辑)
eclips(主要开发阵地)
Mysql 8.0/connectj (对用户登录,以及彩票购买信息的增删读写)

所使用的知识

dao模式 Java-gui

1.团队成员介绍及分工

成员 分工 自评等级
组长:高旭 主要对所有gui的开发和算法的编写,博客的撰写 B
组员:林语晴 实现dao模式 C

2.用户的流程演示

主界面

image
用户点击登录后:

登陆界面

image
如果已有账号,则直接登录,如果忘记注册,在这一步会提示没有用户是否注册
核心代码:

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);
			}

image

注册界面:

image
用户每次误操作都会报警,下面是报警提示:
image

 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();
		}

当用户登陆后:

用户主界面

image
会显示一些个人信息,使用的方法是setTest
点击购买彩票

用户购买彩票界面

这里会限制用户重复购买彩票,而且会限制用户输入非数字的字符。
限制字符的代码

       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类方便存储

查询历史彩票界面

image
输入日期,点击查询
如果输入超过的日期会显示
image
如果输入已经开奖的日期会显示中奖号码以及方便兑奖的界面
image

兑奖界面

image
不可以重复兑奖,如果重复兑奖会显示
image

管理员界面

首先在管理员界面输入 root 密码123456进入界面
image

管理员开奖界面

image
会提示本期有多少人购买彩票
点击摇奖 会随机一个数字,可以一直点击,只有真正确定了再进行开奖。而且仪器不能重复开奖。

if(flag) {//flag用于判断管理员是否重复开奖
        LotteryTicketDAOJDBC dao=new LotteryTicketDAOJDBC();
        dao.drowNewlotteryNumber(lotterySB.toString());
        dao.drowNewLotteryTable();
        flag=false;
        }else {
        	JOptionPane.showMessageDialog(null, "本期您已开奖,请不要重复开奖!", "错误!", JOptionPane.ERROR_MESSAGE);	
        }

充值界面

image

首先会输入用户名,管理员必须点击查询按钮查询,否则会提示
image
image

当查找用户存在会显示他的钱包余额
image
image
每步都会显示信息
而且每次充值都会查询,不能连续充值。

DAO类

算法

首先我们要建立三个表,分别为:
image
image
image
1lottery存放的是用户购买第一期彩票的彩票,allotterynumber存放的是每一期的中奖号码,users存放用户个人信息,包括用户名密码电话号码还有钱。
当用户购买彩票时会把彩票存放在新的一期里的表,当管理员开奖时,会建立新的表,而且把彩票号码放置在alllotterynumber里面。一旦建立新表,任何人都不能对老的表进行操作。flag是为了不让每个人重复兑奖。

彩票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);
}

彩票的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;
	}


	

}

用户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;
}

}

实验不足

-① 没有用jtable把所有的彩票信息以表格的形式打印出来
-② 管理员并不能清楚的知道每次彩票中奖人数多少人
-③ 有些gui的美观度不足

标签:name,课设,高旭,林语,rs,sql,public,pst,String
From: https://www.cnblogs.com/magicfat/p/17039724.html

相关文章

  • python django 云招聘系统(课设、毕设、学习)
    pythondjango云招聘系统(课设、毕设、学习)pythondjango简历系统pythondjango招聘系统pythondjango职位招聘后端:pythondjango数据库:MySQL5.7前端:htmlcssjs等涉及......
  • 学生基本信息管理系统(Java课设)
    1.项目简介用Java编写一个简单GUI程序——学生基本信息管理系统,登录人员分为信息管理人员与学生两个大类,其中信息管理人员可以实现增加、删除、修改、查找和查看全部学......
  • 大四上 | 计算机综合课设答辩经验帖
    被问了如下问题:我们的OS中是否有idle进程。背景:如果所有进程都被kill掉了,那么os就会陷入死循环。即使再发生需要响应的事情,比如希望再创建个进程或者异常处理......
  • 软工综合实践课设——员工招聘系统(参考BOSS直聘);Pyhton实现
    应用背景:随着科学技术的发展,岗位数量越来越多,特别是每逢毕业季找工作的人数也很多,如果人们找工作或者企业招人靠纯手工的话,费时费力,仅仅是筛选简历和费劲,并且员工找工......
  • 课设贡献度排行
    课设贡献度排行1)、刘谨铭调试node.js语言中gm-crypto密码算法库实现国密算法调试node.js语言中sm-crypto密码算法库实现国密算法调试python语言中gmssl算法库实现国......
  • 课设实验报告 小组总和
    课设实验报告小组总和北京电子科技学院《信息安全工程技术应用》课程设计报告基于密码算法库的国密算法支持研究与运用小组成员姓名:20201327刘谨铭20201310何忠鑫......
  • 课设个人实验报告
    北京电子科技学院《信息安全工程技术应用》课程设计报告基于密码算法库的国密算法支持研究与运用成员姓名:20201327刘谨铭指导教师:娄嘉鹏提交时间:2022年12月11日课......
  • 20201204于瀛鹏课设个人总结
    本次课设题目要求在openEuler中实现国密算法的调用,作为组长,我主要完成的工作有:1、明确组员分工,定期检查组员进度2、撰写博客。3、管理码云。4、主要完成C语言和python语......
  • 基于密码算法库的国密算法支持研究与运用——于瀛鹏吴卓航龙雪江村组课设报告
    小组成员姓名:20201204于瀛鹏20201224吴卓航20201228龙雪江村指导教师:娄嘉鹏1任务简介1.1任务内容寻找密码算法库,调用其中的国密算法,并在国产系统openEuler中......
  • 课设个人实验报告
    课设个人实验报告北京电子科技学院《信息安全工程技术应用》课程设计报告基于密码算法库的国密算法支持研究与应用小组成员姓名:20201303张奕博指导教师:娄嘉鹏提交......