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

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 主界面

image
用户点击登录后:

2.2 登陆界面

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

2.3 注册界面:

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

当用户登陆后:

2.4 用户主界面

image
会显示一些个人信息,使用的方法是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 查询历史彩票界面

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

2.7兑奖界面

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

管理员界面

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

2.8 管理员开奖界面

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

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

2.9 充值界面

image

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

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

3. DAO类

3.1 算法

首先我们要建立三个表,分别为:
image
image
image
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的美观度不足

posted @   魔法少女小胖  阅读(147)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示