基于JavaGUI界面和MySQL的商品价格波动交易买卖系统

发布于:2022-12-08 ⋅ 阅读:(844) ⋅ 点赞:(0)

目录
1 绪论 3
2 系统概述 4
2.1 系统分析 4
2.2 可行性分析 4
3 系统设计 5
3.1 系统设计 5
3.2 数据库设计 6
根据E-R图,可以得到数据库的逻辑结构设计,进而设计出数据库: 10
用户登陆表(user-login): 10
用户信息表(user): 10
商品A出售表(sell-info): 10

4 详细设计 11
4.1 登录界面 11
4.2 笔记本交易区主面板 12
1.3 开发环境
开发基于:MySQL5.0.67、Eclipse Java 2019-03
操作系统:Microsoft Windows 10 (BUILD:17134) (64 位)
CPU信息:Intel® Core™ i5-7200U CPU @ 2.50GHz
步进:9 型号:E 系列:6 扩展型号:8E 扩展系列:6
主板信息:Acer MiniOne_SK
内存信息:8.0 GB (4.0 GB / 4.0 GB / )
显卡信息:Intel® HD Graphics 620
1.3 本报告的主要内容
本报告详细的介绍了系统平台的开发过程,主要涉及到的工作如下:系统的需求分析,系统的总体设计,系统的概念设计、系统部分模块的详细设计。
2 系统概述
2.1 系统分析
商品价格波动模拟系统的总体任务是实现简单的商品交易模型。
系统功能分析是在系统开发的总体任务的基础上完成的,本商品价格波动模拟系统需要完成的功能主要有:
1.登录功能:登录者根据注册(数据库)的账号密码进行登陆,输入不同的板块代码进入不同的交易版块界面。
2.出售功能:发布出售信息,并将公共出售区域的信息导入显示,包括用户基本信息、交易数量、出售价格等。
3.用户对出售信息的查询,包括出售方用户的基本信息、交易数量、售出价格等。
4.购买功能:选定一项出售信息,可以购买,购买后划分库存并更新显示的公共出售区信息表。
5.交易达成的处理,包括从低到高的递进式确认交易达成机制、交货的库存划分、完成交易后的删除出售购入信息等。
6.刷新功能:获取最新的公共出售区信息。
2.2 可行性分析
经济可行性:很经济
技术可行性:系统分析阶段需要实现的功能是对数据库进行增删查改,所有从技术上是可行的。
法律可行性:此系统开发所使用的框架和软件都是开源的,无法律风险。

package finalPriceSystem;
import com.mysql.jdbc.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.UIManager;


public class Login extends javax.swing.JFrame { //登陆页面窗体
	// 先声明变量
         
	   private javax.swing.JButton JButton1;
	   private javax.swing.JButton JButton2;
	   private javax.swing.JLabel jLabel1;
	   private javax.swing.JLabel jLabel2;
	   private javax.swing.JLabel jLabel3;
	   private javax.swing.JPasswordField jPasswordField1;
	   private javax.swing.JTextField jTextField2;
	   private javax.swing.JTextField jTextField3;

	   public static String priceUserName = null ;//传递用户名,用于传递给面板控制端


   public Login() { //本体:构造方法
	   super("PriceSystem登陆");
       initComponents();//由构造跳转到【启动机制】
   }
   @SuppressWarnings("unchecked")  //忽略报错信息
   private void initComponents() { //启动机制
	   this.setLocationRelativeTo(null);
       jLabel1 = new javax.swing.JLabel(); //设置一个空的jLabel	   																						// JLabel 对象可以显示文本、图像或同时显示二者。可以通过设置垂直和水平对齐方式, 
       jLabel2 = new javax.swing.JLabel(); //设置第二个空的jLabel
       jLabel3 = new javax.swing.JLabel(); //设置前置选择       										
/**
 * JTextField 是一个轻量级组件,它允许编辑单行文本。 JTextField 应与 
 * java.awt.TextField 具有源代码兼容性,理应如此。此组件具有 java.awt.TextField 类中没有的功能。
 */
       jTextField2 = new javax.swing.JTextField();//设置一个空的单行输入,没有1?
       jTextField3 = new javax.swing.JTextField();//前置选择
/**
 * JPasswordField 是一个轻量级组件,允许编辑一个单行文本,其视图指示键入内容,但不显示原始字符。
 */
       jPasswordField1 = new javax.swing.JPasswordField(); //一个密码框
/**
 * JButton类是按钮的实现。该组件具有标签,并在按下时生成事件。它也可以有一个图像
 */
       JButton1 = new javax.swing.JButton();
       JButton2 = new javax.swing.JButton();
       //关闭窗口,用户单击窗口的关闭按钮时程序执行的操作
       setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

       jLabel1.setText("账号"); //把第一个jLabel内容填入“账号”,居中方式默认
       jLabel2.setText("密码"); //把第二个jLabel内容填入“密码”,居中方式默认
       jLabel3.setText("版块");
       jTextField2.setText(" ");// 构造使用指定文本【一个空格】字符串初始化的新TextField。
       jTextField3.setText(" ");
       JButton1.setText("登录");//将登陆两个字塞进按钮里
/**
 * 给这个按钮添加一个监听者,一旦有事件发生(比如鼠标点击),监听者都可以得到这个事件,
 * 并可以把事件信息(例如事件源)传给事件处理函数。
 */
       JButton1.addActionListener(new java.awt.event.ActionListener() 
       {
           public void actionPerformed(java.awt.event.ActionEvent evt) //执行操作
           {
               System.out.println("'登陆' 按钮被按下");
        	   JButton1ActionPerformed(evt);//跳转到登陆按钮执行程序
           }
       }
    );

       JButton2.setText("退出");//将退出两个个字塞进按钮里
       JButton2.addActionListener(new java.awt.event.ActionListener() 
       {
           public void actionPerformed(java.awt.event.ActionEvent evt) //执行操作
           {
        	   System.out.println("'退出'  按钮被按下");
               JButton2ActionPerformed(evt);//跳转到退出按钮执行程序
           }
       });
       
       
       
       
       
       
       
       
       
       
       
       
       
       

/**
 * GroupLayout,分组布局管理器。它将组建按层次分组,以决定它们在 Container 中的位置。
 * GroupLayout 主要供生成器使用(生成 并行组 和 串行组)。分组由GroupLayout.Group类的实例来完成,
 * 每个组可以包含任意数量的元素(Group、Component 或 Gap)。
 */
       javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());//先创建分组布局,并关联容器
       getContentPane().setLayout(layout);
       
       
       layout.setHorizontalGroup( //设置水平组
           layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)//设置并行组对其方式(底部)
           .addGroup(layout.createSequentialGroup()//设置整体串行组,左右结构
               .addGap(90, 90, 90)//左框边距大小 默认103              
               //并行指按x轴排列,将垂直项目归为一组
               .addGroup/*添加组元素*/(layout.createParallelGroup/*创建并行组*/(javax.swing.GroupLayout.Alignment.TRAILING)
               //public static final grouplayout.alignment trailing
               //指示元素应该向区域底端对齐。对于从左到右的水平轴,这表示向右端对齐。对于垂直轴,trailing 表示向底端对齐。
            		.addComponent(jLabel3)
                   .addComponent(jLabel2)//“账号”
                   .addComponent(jLabel1)//“密码”
               )//并行完毕: 将账号、密码并行
               
               .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
/**
 * addpreferredgap(layoutstyle.componentplacement type,int pref,int max)
 * 添加一个表示两个距离最近的组件之间首选间隙的元素。在布局过程中,找到相邻元素,并根据相邻组件之间的首选间隙大小来设置此间隙的最小大小。
 * 如果找不到相邻组件,则最小大小被设置为 0。                  * 参数:
type - 间隙的类型;layoutstyle.componentplacement.related 或 layoutstyle.componentplacement.unrelated组件放置不相关
pref - 间隙的首选大小;default_size 或大于等于 0 的值
max - 间隙的最大大小;default_size、preferred_size 或大于等于 0 的值
 */         
               .addGroup(layout.createParallelGroup/*创建并行组*/(javax.swing.GroupLayout.Alignment.TRAILING, false)/*添加组元素,创建并行组*/
                   .addGroup(layout.createSequentialGroup() //创建串行组
                       .addComponent(JButton1)
                       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE)
                       .addComponent(JButton2))//串行完毕: 将登陆、退出按钮串行
                   
                   .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)//创建并行组
                		.addComponent(jTextField3, javax.swing.GroupLayout.DEFAULT_SIZE, 149, Short.MAX_VALUE)
                       .addComponent(jTextField2, javax.swing.GroupLayout.DEFAULT_SIZE, 149, Short.MAX_VALUE)
                       .addComponent(jPasswordField1))//并行完毕:将输入框、密码框并行
                   )//并行完毕:将输入组和按钮组并行
               .addContainerGap(114, Short.MAX_VALUE))//右边的边框,默认114
/**
 * 添加一个表示容器边缘和触到容器边框的组件之间首选间隙的元素。如果添加的间隙没有触到父容器的边缘,则此方法没有任何效果。
 * 创建用来表示间隙的元素是不可调整大小的。
 */
           
       );//水平组完毕
       
       
       layout.setVerticalGroup( //设置垂直组
           layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)//设置并行组对其方式(底部)
           .addGroup(layout.createSequentialGroup()//设置整体串行组,应该是 上下结构
        		   
               .addGap(69, 69, 69)//上面的边框
               
               .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)//设置并行组
                       .addComponent(jLabel3)
                       .addComponent(jTextField3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                       )//并行完毕
               
               .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
               
               .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)//设置并行组
                   .addComponent(jLabel1)//账号
                   .addComponent(jTextField2/*账号输入框*/, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                   )//并行完毕: 将账号和账号输入框并行
               
               .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
            
               .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)//设置并行组
                   .addComponent(jLabel2/*密码*/, javax.swing.GroupLayout.PREFERRED_SIZE, 26, javax.swing.GroupLayout.PREFERRED_SIZE)//指示组件或间隙的首选大小应该用于特定的范围值,限制上下最大显示范围
                   .addComponent(jPasswordField1/*密码框*/, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                   )//并行完毕:将密码和密码框并行
               
               .addGap(18, 18, 18)//和按钮的距离
               
               .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)//并行组
                   .addComponent(JButton1)
                   .addComponent(JButton2)
                   )//并行完毕,两个按钮
               
               .addContainerGap(49, Short.MAX_VALUE))//设置底部边框
       );//垂直组设置完毕
       

       
       
       pack();//依据你放置的组件设定窗口的大小 使之正好能容纳你放置的所有组件
   }                  

   
   
   
   
   
   
   
   
   
   
   
   //退出按钮
   private void JButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
       System.exit(0);
   }                                        

   
   //  登陆按钮执行程序 
   private void JButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                       
       try {
           Connection con = DBConnection.getConnection();//指向数据库链接
           Statement stmt = con.createStatement();//?
           String sql="select *from user";//SQL筛选
           ResultSet rs = stmt.executeQuery(sql);
           
           String usename=jTextField2.getText().trim();//新建字符串读取用户名,
           String plate  =jTextField3.getText().trim();//7.1new
           //getText().trim() 在获得的文本中除去空格。
           
           char[] p=jPasswordField1.getPassword();//新建字符数组读取密码
           String pwd=new String(p);//转换为字符串
           
           String   name = null;//新建两个对比字符串
           String pass = null;
           while(rs.next()){
                name=rs.getString(1);
                pass=rs.getString(2);//读取数据库内账号密码
                
                if(usename.equals(name)&&pwd.equals(pass)){
                    System.out.println("登录成功!!deal late no more!!!!");
                    priceUserName = usename ;//将登陆用户名传递给传递用户名
                    System.out.println("当前用户为:"+priceUserName);
                    //分板块激活
                    if(plate.equals("laptop"))
                    {
                    	new laptop_InfoGui().setVisible(true);//跳转到操作框,操作框可见
                    	this.dispose(); //关闭当前登陆窗口
                    }
                    
                    
                    else
                    {
                    	JOptionPane.showMessageDialog(null, "请输入正确板块名", "deal late no more", JOptionPane.ERROR_MESSAGE);
                    }
                    
                    
                    
                    

             }    
                } 



       } catch (ClassNotFoundException ex) {
           Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
       } catch (SQLException ex) {
           Logger.getLogger(Login.class.getName()).log(Level.SEVERE, null, ex);
       }
   }                                        

   
   
  
   
   public static void main(String args[]) {
     //整体外观设置Nimbuslookandfeel
       try {
    	   
    	   UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
           
       } catch (Exception e) {
    	   e.printStackTrace();
       }
       

     //保存单线性:awt的事件处理线程
       java.awt.EventQueue.invokeLater(new Runnable() 
       {
           public void run() 
           {
               new Login().setVisible(true);//打开登陆窗体
           }
       });
   }

                      
}

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


网站公告

今日签到

点亮在社区的每一天
去签到