• Java Swing+Mysql电影购票系统(普通用户/管理员登录+充值购票+影院管理)


    @

    文章目录

    电影购票系统模拟真实购票流程,在线选座,充值购票,影院信息管理。登录用户分为:普通用户+管理员

    数据库连接

    BaseDao类,建立数据库连接
    代码如下:

    package daoimpl;
    
    import java.lang.reflect.Field;
    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.PreparedStatement;
    import java.sql.ResultSet;
    import java.sql.ResultSetMetaData;
    import java.sql.SQLException;
    import java.util.ArrayList;
    import java.util.List;
    
    public class BaseDao {
    	
    	private static final String DRIVER = "com.mysql.jdbc.Driver";
    	private static final String URL = "jdbc:mysql://localhost:3306/moviesystem?useUnicode=true&characterEncoding=UTF-8";
    	private static final String USER = "root";
    	private static final String PASSWORD = "123456";
    
    	static{
    		try {
    			Class.forName(DRIVER);
    		} catch (ClassNotFoundException e) {
    			e.printStackTrace();
    		}
    	}
    	
    	/**
    	 * 与数据库建立连接
    	 * 
    	 * @return
    	 */
    	public static Connection getconn() {
    		Connection conn = null;
    		
    		try {
    			conn = DriverManager.getConnection(URL,USER,PASSWORD);
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return conn;
    	}
    
    	/**
    	 * 释放所有资源
    	 * 
    	 */
    	public static void closeAll(ResultSet rs, PreparedStatement psts, Connection conn) {
    
    		try {
    			if (rs != null) {
    				rs.close();
    			}
    			if (psts != null) {
    				psts.close();
    			}
    			if (conn != null) {
    				conn.close();
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    
    	}
    
    	/**
    	 * 此方法可以完成对数据库的增删改操作
    	 * 
    	 * @param sql
    	 * @param params
    	 * @return
    	 */
    
    	public static boolean operUpdata(String sql, List<Object> params) {
    		int res = 0;//返回影响的行数
    		Connection conn = null;
    		PreparedStatement psts = null;//执行sql语句
    		ResultSet rs = null;
    
    		try {
    			conn = getconn();// 与数据库建立连接
    			psts = conn.prepareStatement(sql);// 装载sql语句
    			if (params != null) {// 假如有?号,在执行之前把问号替换掉
    				for(int i = 0; i < params.size(); i++) {
    					psts.setObject(i + 1, params.get(i));
    				}
    			}
    			res = psts.executeUpdate();
    
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			closeAll(rs, psts, conn);
    		}
    		return res > 0 ? true : false;
    	}
    
    	/*
    	 * 实现查的操作
    	 * 
    	 */
    	
    	public static <T> List<T> operQuery(String sql, List<Object> p, Class<T> cls)throws Exception {
    		Connection conn = null;
    		PreparedStatement pste = null;// 预处理语句
    		ResultSet rs = null;// 结果集
    		List<T> list = new ArrayList<T>();
    		conn = getconn();
    		try {
    			pste = conn.prepareStatement(sql);
    			if (p != null) {// 将条件值装入预处理语句
    				for (int i = 0; i < p.size(); i++) {
    					pste.setObject(i + 1, p.get(i));
    				}
    			}
    			
    			rs = pste.executeQuery();// 执行
    			ResultSetMetaData rsmd = rs.getMetaData();
    			while (rs.next()) {
    				T entity = cls.newInstance();// 反射
    				for (int j = 0; j < rsmd.getColumnCount(); j++) {
    					// 从数据库中取得字段名
    					String col_name = rsmd.getColumnName(j + 1);
    					Object value = rs.getObject(col_name);
    					Field field = cls.getDeclaredField(col_name);
    					field.setAccessible(true);// 类中的成员变量为private,故必须进行此操作
    					field.set(entity, value);// 给实体类entity的field属性赋值
    				}
    				list.add(entity);// 加入list列表
    			}
    		} catch (SQLException e) {
    			e.printStackTrace();
    		} finally {
    			closeAll(rs, pste, conn);// 关闭连接,释放资源
    		}
    		return list;
    	
    	}
    
    }
    
    

    主要页面

    登录页面:LoginUI

    package view;
    
    import java.awt.Color;
    import java.awt.Container;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.ButtonGroup;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPasswordField;
    import javax.swing.JRadioButton;
    import javax.swing.JTextField;
    
    import entity.User;
    import service.UserService;
    import serviceimpl.UserServiceImpl;
    
    
    
    class Login implements ActionListener {
    	private JFrame jf = new JFrame("电影系统");
    	private Container con = jf.getContentPane();// 获得面板
    
    	private Toolkit toolkit = Toolkit.getDefaultToolkit();
    	private Dimension sc = toolkit.getScreenSize();// 获得屏幕尺寸
    	private JLabel title = new JLabel("欢迎使用电影购票系统");
    	private JLabel name1 = new JLabel("用户名");
    	private JLabel pass1 = new JLabel("密  码");
    	private JTextField textName = new JTextField();
    	private JPasswordField textPs = new JPasswordField();// 密码框
    
    	private JRadioButton choice1 = new JRadioButton("用户");
    	private JRadioButton choice2 = new JRadioButton("管理员");
    
    	private JLabel code1 = new JLabel("验证码");
    	private JTextField textCode = new JTextField();
    	private JLabel code2 = new JLabel();
    
    	private JButton btn_login = new JButton("登录");
    	private JButton btn_rgist = new JButton("注册");
    	
    	// 按钮
    
    	private Font font = new Font("楷体", 1, 28);
    	private Font font1 = new Font("楷体", 0, 20);
    	private Font font2 = new Font("楷体", 0, 18);
    	// 字体,样式(粗体,斜体),大小
    
    	private ButtonGroup buttongroup = new ButtonGroup();
    
    	private ImageIcon loginbg = new ImageIcon("image/loginbg.jpg");
    	
    	
    	
    	public Login() {
    		con.setLayout(null);
    		jf.setSize(1000, 618);
    		jf.setLocation((sc.width - 1000) / 2, (sc.height - 618) / 2);
    
    		jf.setResizable(false);// 窗口大小不可变
    		jf.setVisible(true);
    		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		con.setVisible(true);
    
    		JLabel maxlabel = new JLabel(loginbg);
    		
    		title.setBounds(375, 10, 370, 30);
    		title.setFont(font);
    //		title.setForeground(Color.black);
    		title.setForeground(Color.white);
    
    		name1.setBounds(140, 140, 85, 30);// 账号的位置大小
    		name1.setFont(font1);// 字体
    		name1.setForeground(Color.red);// name1字的颜色
    
    		pass1.setBounds(140, 190, 85, 30);// 密码的位置大小
    		pass1.setForeground(Color.red);
    		pass1.setFont(font1);
    
    		textName.setBounds(200, 143, 140, 25);
    		textName.setBorder(null);// 边框
    		textName.setFont(font1);
    		textPs.setBounds(200, 193, 140, 25);
    		textPs.setBorder(null);
    		textPs.setEchoChar('*');// 可以将密码显示为* ;默认为·
    		textPs.setFont(font1);
    		choice1.setBounds(140, 290, 120, 25);
    		choice1.setSelected(true);// 默认普通用户登录
    		choice2.setBounds(260, 290, 80, 25);
    
    		code1.setBounds(140, 240, 60, 25);
    		code1.setFont(font1);
    		code1.setForeground(Color.black);
    		textCode.setBounds(200, 240, 95, 25);
    		textCode.setBorder(null);
    		textCode.setFont(font1);
    		code2.setBounds(300, 240, 70, 25);
    		code2.setFont(font1);
    		code2.setText(code());
    		code2.setForeground(Color.black);
    		code1.setVisible(false);
    		code2.setVisible(false);
    		textCode.setVisible(false);
    
    		btn_login.setBounds(140, 340, 90, 25);//140, 340, 90, 25
    		btn_login.setFont(font2);
    		btn_login.addActionListener(this);
    		jf.getRootPane().setDefaultButton(btn_login);//回车默认是登录按钮
    		
    		
    		btn_rgist.setBounds(250, 340, 90, 25);//250, 340, 90, 25
    		btn_rgist.setFont(font2);
    		btn_rgist.addActionListener(this);
    
    		
    		JLabel bg = new JLabel(loginbg);
    		
    		maxlabel.add(title);
    		maxlabel.add(name1);
    		maxlabel.add(pass1);
    		maxlabel.add(textName);
    		maxlabel.add(textPs);
    		maxlabel.add(choice1);
    		maxlabel.add(choice2);
    
    		buttongroup.add(choice1);
    		buttongroup.add(choice2);
    
    		maxlabel.add(code1);
    		maxlabel.add(code2);
    		maxlabel.add(textCode);
    		maxlabel.add(btn_login);
    		maxlabel.add(btn_rgist);
    		
    		
    		maxlabel.setBounds(0, 0, 999, 617);
    		con.add(maxlabel);
    
    	}
    
    	private String code() {
    		int m = 0;
    		for (int i = 0; i < 4; i++) {
    			m *= 10;
    			m += (int) (Math.random() * 9 + 1);
    		}
    		return ((Integer) m).toString();
    	}
    
    	public void cleanUserInfo() {
    		this.textName.setText("");
    		this.textPs.setText("");
    		this.textCode.setText("");
    	}
    
    	public static void winMessage(String str) {// 提示窗口,有多个地方调用
    		JOptionPane.showMessageDialog(null, str, "提示",
    				JOptionPane.INFORMATION_MESSAGE);
    	}
    
    	
    
    	@Override
    	public void actionPerformed(ActionEvent ac) {
    		
    		
    		if (ac.getSource() == this.btn_login) {
    			String name = textName.getText();
    			String pswd = new String(textPs.getPassword());
    			
    			if (name.equals("") || pswd.equals("")) {
    				winMessage("账号、密码不能为空!");
    				cleanUserInfo();
    				this.code2.setText(code());
    			} else {
    //				String code1 = textCode.getText();
    				
    				int code1 = 1;
    				
    //				String code = code2.getText();
    //				if(code1.equals("")){
    //					winMessage("验证码不能为空!");
    //					return;
    //				}
    				if (code1==1) {
    					int choice;
    					if (choice1.isSelected())
    						choice = 0;
    					else
    						choice = 1;
    					UserService userBiz = new UserServiceImpl();
    					
    					User user = userBiz.login(name, pswd, choice);
    					if (user == null) {
    						winMessage("用户名或密码不正确!登录失败!");
    						cleanUserInfo();
    						this.code2.setText(code());
    					} else {
    							if (user.getType() == 0) {
    								new UserUi(user,1);
    							} else if (user.getType() == 1) {
    								new AdminMainView(user);
    							}
    							this.jf.dispose();
    					}
    				} else {
    					winMessage("验证码不正确!");
    					textCode.setText("");
    					this.code2.setText(code());
    				}
    			}
    		} else if (ac.getSource() == this.btn_rgist) {
    			new RegisterUi();
    			this.jf.dispose();// 点击按钮时,new一个frame,原先frame销毁
    		}
    	}
    
    }
    
    

    用户登录成功后页面:UserUi

    package view;
    
    import java.awt.*;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.util.List;
    
    import javax.swing.*;
    import javax.swing.event.TableModelListener;
    import javax.swing.table.TableModel;
    
    import entity.Hall;
    import entity.Movie;
    import entity.Session;
    import entity.Ticket;
    import entity.User;
    import service.CinemaService;
    import service.HallService;
    import service.MovieService;
    import service.SessionService;
    import service.TicketService;
    import service.UserService;
    import serviceimpl.CinemaServiceImpl;
    import serviceimpl.HallServiceImpl;
    import serviceimpl.MovieServiceImpl;
    import serviceimpl.SessionServiceImpl;
    import serviceimpl.TicketServiceImpl;
    import serviceimpl.UserServiceImpl;
    
    public class UserUi implements ActionListener ,Runnable{
    
    	private SessionService session = null;
    	private MovieService ms = null;
    	private CinemaService cs = null;
    	private HallService hs = null;
    	 TicketService ts = null;
    	private UserService us = null;
    	
    	private User user;
    	private int defaultcard;
    	private JFrame jf = new JFrame("电影购票系统");
    	private Container con = jf.getContentPane();// 获得面板
    
    	private Toolkit toolkit = Toolkit.getDefaultToolkit();
    	private Dimension sc = toolkit.getScreenSize();// 获得屏幕尺寸
    	private JLabel lb_welcome = null;
    
    	JTable rtb = null;
    	JTable rtb2 = null;
    
    	private JButton btn_buy = null;
    	private JButton btn_comment = new JButton("评价");
    	private JButton btnsearch = new JButton("搜索影片");
    	private JButton btn_balance = new JButton("充值/余额查询");
    
    	private JMenuBar menuBar = new JMenuBar();
    
    	private JLabel oldjl;
    	private JLabel newjl;
    
    	private JLabel card0 = new JLabel();
    	private JButton updatepass = new JButton("修改用户信息");
    	private JButton confirmUp = new JButton("确定");
    	private JButton cancel = new JButton("取消");
    	private JPasswordField oldpass = new JPasswordField();
    	private JPasswordField newpass = new JPasswordField();
    	private JLabel card1 = new JLabel();
    	private JLabel card2 = new JLabel();
    	private JLabel card3 = new JLabel();
    	private JLabel card4 = new JLabel();
    
    	private Font font = new Font("楷体", 0, 20);
    	private Font font0 = new Font("楷体", 0, 25);
    	private Font font1 = new Font("楷体", 0, 16);
    	private Font font2 = new Font("楷体", 0, 15);
    	private ImageIcon userinfobg = new ImageIcon("image/userinfo.jpg");
    
    	private JTable tb = null;
    
    	JButton[] card1_btn = null;
    	int x = 0;
    
    	int k = 0;
    
    	List<Movie> mlist = null;
    	List<Session> sessionlist = null;
    	List<Ticket> ticketByUId = null;
    
    	// 开启线程使得欢迎标签动起来
    	// 这是单线程
    	private class thread implements Runnable {
    
    		@Override
    		public void run() {
    			while (true) {// 死循环让其一直移动
    				for (int i = 900; i > -700; i--) {
    					// for(int i=-100;i<900;i++){
    					try {
    						Thread.sleep(10);// 让线程休眠100毫秒
    					} catch (InterruptedException e) {
    						e.printStackTrace();
    					}
    					lb_welcome.setLocation(i, 5);
    				}
    			}
    		}
    
    	}
    
    	public UserUi(User user) {
    		super();
    		this.user = user;
    	
    		session = new SessionServiceImpl();
    		ms = new MovieServiceImpl();
    		cs = new CinemaServiceImpl();
    		hs = new HallServiceImpl();
    		ts = new TicketServiceImpl();
    		us = new UserServiceImpl();
    		showTicketTable(ticketByUId);
    		showSessionTable(sessionlist);
    	}
    
    	public UserUi(User u, int defaultcard) {
    		user = u;
    		this.defaultcard = defaultcard;
    		session = new SessionServiceImpl();
    		ms = new MovieServiceImpl();
    		cs = new CinemaServiceImpl();
    		hs = new HallServiceImpl();
    		ts = new TicketServiceImpl();
    		us = new UserServiceImpl();
    
    		mlist = ms.getAllMovielist();
    		sessionlist = session.queryAllSession();
    		//showTicketTable(ticketByUId);
    	//	showSessionTable(sessionlist);
    		// con.setLayout(null);
    		jf.setSize(1000, 618);
    		jf.setLocation((sc.width - 1000) / 2, (sc.height - 618) / 2);
    
    		jf.setResizable(false);// 窗口大小不可变
    		jf.setVisible(true);
    		jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		con.setVisible(true);
    
    		btn_buy = new JButton("购买");
    		btn_buy.setEnabled(false);
    		btn_buy.addActionListener(this);
    		btn_buy.setFont(font1);
    		btn_comment.addActionListener(this);
    		btn_comment.setFont(font1);
    		btn_comment.setEnabled(false);
    		btn_comment.setVisible(false);
    		btn_balance.addActionListener(this);
    		btn_balance.setFont(font1);
    		btnsearch.setBounds(300, 0, 150, 30);
    		btnsearch.setFont(font1);
    		btnsearch.addActionListener(this);
    
    		lb_welcome = new JLabel("欢 迎 " + u.getUname() + " 进 入 用 户 功 能 界 面");
    		lb_welcome.setFont(new Font("楷体", Font.BOLD, 34));
    		lb_welcome.setForeground(Color.BLUE);
    
    		jf.setJMenuBar(menuBar);
    		menuBar.add(btn_buy);
    		menuBar.add(btn_balance);
    		menuBar.add(btnsearch);
    		menuBar.add(btn_comment);
    		menuBar.add(lb_welcome);
    
    		JTabbedPane tabbedPane = new JTabbedPane(JTabbedPane.RIGHT);// 点击栏位置
    		// 选项卡面板类
    		tabbedPane.setFont(font);// 选项栏栏字体,字号
    
    		tabbedPane.setTabLayoutPolicy(JTabbedPane.SCROLL_TAB_LAYOUT);// 每个选项卡滚动模式
    		con.add(tabbedPane);
    
    		// tabbedPane.setSelectedIndex(0); // 设置默认选中的card
    		// card0 user.getUname()
    		
    		tabbedPane.addTab(u.getUname()+" 欢迎您", card0);
    		JLabel maxlabel = new JLabel();
    
    		JLabel[] card0_label = new JLabel[2];
    		for (int i = 0; i < 2; i++) {
    			card0_label[i] = new JLabel();
    			maxlabel.add(card0_label[i]);
    			card0_label[i].setFont(font0);
    			card0_label[i].setBounds(40, 70 + (i * 50), 250, 50);
    		}
    
    		card0_label[0].setText("您的信息如下: ");
    		card0_label[0].setForeground(Color.gray);
    		card0_label[1].setText("用户名 : " + u.getUname());// user.getUname()
    		card0_label[1].setForeground(Color.gray);
    		updatepass.setBounds(40, 190, 120, 35);
    		updatepass.addActionListener(this);
    		updatepass.setBackground(Color.gray);
    		updatepass.setFont(font);
    		updatepass.setForeground(Color.white);
    		maxlabel.add(updatepass);
    
    		oldjl = new JLabel("原密码");
    		oldjl.setBounds(40, 250, 90, 30);
    		oldjl.setForeground(Color.LIGHT_GRAY);
    		oldjl.setFont(font);
    		oldjl.setVisible(false);
    		maxlabel.add(oldjl);
    
    		oldpass.setBounds(40, 280, 120, 30);
    		oldpass.setBackground(Color.GRAY);
    		oldpass.setFont(font);
    		oldpass.setForeground(Color.white);
    		oldpass.setEchoChar('*');
    		oldpass.setVisible(false);
    		maxlabel.add(oldpass);
    
    		newjl = new JLabel("新密码");
    		newjl.setBounds(40, 350, 90, 30);
    		newjl.setFont(font);
    		newjl.setForeground(Color.LIGHT_GRAY);
    		newjl.setVisible(false);
    		maxlabel.add(newjl);
    
    		newpass.setBounds(40, 380, 120, 30);
    		newpass.setBackground(Color.GRAY);
    		newpass.setForeground(Color.white);
    		newpass.setFont(font);
    		newpass.setEchoChar('*');
    		newpass.setVisible(false);
    		maxlabel.add(newpass);
    
    		cancel.setBounds(40, 500, 120, 30);
    		maxlabel.add(cancel);
    		cancel.setBackground(Color.GRAY);
    		cancel.setForeground(Color.white);
    		cancel.setFont(font);
    		cancel.setVisible(false);
    		cancel.addActionListener(this);
    
    		confirmUp.setBounds(40, 445, 120, 30);
    		confirmUp.setBackground(Color.GRAY);
    		confirmUp.setForeground(Color.white);
    		confirmUp.setFont(font);
    		maxlabel.add(confirmUp);
    		confirmUp.setVisible(false);
    		confirmUp.addActionListener(this);
    
    		maxlabel.setIcon(userinfobg);
    		maxlabel.setBounds(0, 0, 850, 602);
    		card0.add(maxlabel);
    
    		// card1
    		tabbedPane.addTab("热门影片", card1);
    
    		movieShow(mlist);
    
    		// card3
    
    		tabbedPane.addTab("我的购票信息", card3);
    		 ticketByUId = ts.queryTicketByUserId(user.getUser_id());
    
    		showTicketTable(ticketByUId);
    
    		// card2未还记录
    		tabbedPane.addTab("场次信息", card2);
    
    		showSessionTable(sessionlist);
    
    
    		tabbedPane.setSelectedIndex(defaultcard); // 设置默认选中的card
    
    		rtb.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent e) {
    				if (rtb.getSelectedRow() != -1) {
    					btn_buy.setEnabled(true);
    				}
    
    			}
    
    		});
    		
    		rtb2.addMouseListener(new MouseAdapter() {
    			@Override
    			public void mouseClicked(MouseEvent e) {
    				if (rtb2.getSelectedRow() != -1) {
    					btn_comment.setEnabled(true);
    				}
    
    			}
    
    		});
    
    		//new Thread(UserUi.this).start();
    	}
    
    	public void showTicketTable(List<Ticket> ticketByUId) {
    		int recordrow = 0;
    		if(ticketByUId!=null){
    			 recordrow = ticketByUId.size();
    		}
    		
    
    		String[][] rinfo = new String[recordrow][8];
    
    		for (int i = 0; i < recordrow; i++) {
    			for (int j = 0; j < 8; j++)
    				rinfo[i][j] = new String();
    			int sessionid = ticketByUId.get(i).getSession_id();
    			Session session2 = session.querySessionBySessionId(sessionid);// 获取session对象
    			rinfo[i][0] = " " + user.getUname();
    			rinfo[i][1] = cs.queryCinemaById(session2.getCinema_id()).getCname();// 获取电影院名称
    			rinfo[i][2] = " " + hs.queryHallById(session2.getHall_id()).getHname();// 获取场厅名称
    			rinfo[i][3] = ms.getMovieById(ticketByUId.get(i).getMovie_id()).getMname();
    			rinfo[i][4] = " " + session2.getStarttime();
    			rinfo[i][5] = " " + ms.getMovieById(session2.getMovie_id()).getDuration() + "分钟";
    			rinfo[i][6] = " " + session2.getPrice() + "元";
    			rinfo[i][7] = " " + ticketByUId.get(i).getSeat()+"号";
    		}
    		String[] tbheadnames = { "用户", "电影院名", "场厅", "电影名字", "开始时间", "播放时间", "价格", "座位号" };
    
    		rtb2 = new JTable(rinfo, tbheadnames);
    		rtb2.repaint();
    		rtb2.setRowHeight(30);
    		rtb2.setFont(font);
    		rtb2.setEnabled(true);
    		rtb2.getTableHeader().setFont(new Font("楷体", 1, 20));
    		rtb2.getTableHeader().setBackground(Color.red);
    		rtb2.getTableHeader().setReorderingAllowed(false); // 不可交换顺序
    		rtb2.getTableHeader().setResizingAllowed(true); // 不可拉动表格
    		
    		JScrollPane sPane3 = new JScrollPane(rtb2);
    		sPane3.setBounds(0, 0, 849, 580);// 大小刚好
    		sPane3.setVisible(true);
    		
    		card3.add(sPane3);
    
    	
    	}
    
    	public void movieShow(List<Movie> list) {
    
    		int row = (list.size() + 3) / 4;
    		int k = list.size();
    
    		JLabel[][] btn_label = new JLabel[row][4];
    		card1_btn = new JButton[k];
    		JLabel[][] dname = new JLabel[row][4];
    		JLabel[][] locality_language = new JLabel[row][4];
    		JLabel[][] type_grade = new JLabel[row][4];
    
    		JLabel allinfo = new JLabel();
    
    		String[] cnames = { "", "", "", "" };
    		// JTable tb = new JTable(btn_label,cnames);
    		tb = new JTable(btn_label, cnames);
    
    		allinfo.setSize(840, 402 * row);
    		tb.setRowHeight(400);
    
    		ImageIcon img = null;
    		ImageIcon defaultImg = new ImageIcon("image/img.jpg");
    
    		for (int i = 0; i < row; i++) {
    			for (int j = 0; j < 4 && x < k; j++) {
    				// list.get(i).getImg()
    				if (list.get(x).getImg() != null) {
    					img = new ImageIcon("image/" + list.get(x).getImg());
    				} else {
    					img = defaultImg;
    				}
    				card1_btn[x] = new JButton(img);
    				card1_btn[x].setBounds(0, 0, 205, 300);
    
    				card1_btn[x].addActionListener(this);
    
    				dname[i][j] = new JLabel("片名:" + list.get(x).getMname());
    				dname[i][j].setBounds(0, 310, 208, 30);
    				dname[i][j].setFont(font);
    
    				locality_language[i][j] = new JLabel(
    						"类型:" + list.get(x).getType() + "  时长:" + list.get(x).getDuration() + " 分钟");
    				locality_language[i][j].setBounds(0, 340, 208, 30);
    				locality_language[i][j].setFont(font1);
    
    				type_grade[i][j] = new JLabel("描述:" + list.get(x).getDetail());
    				type_grade[i][j].setBounds(0, 370, 208, 30);
    				type_grade[i][j].setFont(font2);
    
    				btn_label[i][j] = new JLabel();
    				btn_label[i][j].setBounds(210 * j + 1, 400 * i, 208, 400);
    				btn_label[i][j].add(dname[i][j]);
    				btn_label[i][j].add(locality_language[i][j]);
    				btn_label[i][j].add(type_grade[i][j]);
    				btn_label[i][j].add(card1_btn[x]);
    
    				allinfo.add(btn_label[i][j]);
    
    				x++;
    			}
    		}
    		tb.add(allinfo);
    		tb.setEnabled(false);
    		JScrollPane sPane = new JScrollPane(tb);
    
    		sPane.setBounds(0, 0, 849, 550);
    		sPane.setVisible(true);
    		card1.add(sPane);
    
    	}
    
    	public void showSessionTable(List<Session> sessionlist) {
    		int recordrow = 0;
    		if(sessionlist!=null){
    			 recordrow = sessionlist.size();
    		}
    
    		String[][] rinfo = new String[recordrow][6];
    
    		for (int i = 0; i < recordrow; i++) {
    			for (int j = 0; j < 6; j++)
    			rinfo[i][j] = new String();
    			rinfo[i][0] = cs.queryCinemaById(sessionlist.get(i).getCinema_id()).getCname();
    			rinfo[i][1] = hs.queryHallById(sessionlist.get(i).getHall_id()).getHname();
    			rinfo[i][2] = ms.getMovieById(sessionlist.get(i).getMovie_id()).getMname();
    			rinfo[i][3] = "  " + sessionlist.get(i).getStarttime();
    			rinfo[i][4] = "  " + sessionlist.get(i).getPrice();
    			rinfo[i][5] = "  " + sessionlist.get(i).getRemain();
    		}
    		String[] tbheadnames = { "电影院名称", "场厅名字", "电影名字", "开始时间", "价格", "剩余座位数" };
    		rtb = new JTable(rinfo, tbheadnames);
    		rtb.setRowHeight(40);
    		rtb.setFont(font);
    		rtb.setEnabled(true);
    		rtb.getTableHeader().setFont(new Font("楷体", 1, 20));
    		rtb.getTableHeader().setBackground(Color.orange);
    		rtb.getTableHeader().setReorderingAllowed(false); // 不可交换顺序
    		rtb.getTableHeader().setResizingAllowed(false); // 不可拉动表格
    
    		
    		rtb.repaint();
    		JScrollPane sPane2 = new JScrollPane(rtb);
    		
    		// sPane.add()加按钮等一些控件时,要鼠标滑过,才会显示出来,直接在构造方法中传参则正常
    		sPane2.setBounds(0, 0, 849, 580);// 大小刚好
    		sPane2.setVisible(true);
    		card2.add(sPane2);
    		
    		
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent e) {
    
    		for (int i = 0; i < mlist.size(); i++) {
    			if (e.getSource() == this.card1_btn[i]) {
    
    				new MovieInfoView(mlist.get(i), user);
    
    			}
    		}
    
    		if (e.getSource() == this.btn_buy) {// 购买监听事件
    
    			int row = rtb.getSelectedRow();
    			List<Session> thisSession = session.queryAllSession();
    
    			if (row != -1) {
    				int remain = thisSession.get(row).getRemain() - 1;// 购票后,剩余座位需要减一
    				int hall_id = thisSession.get(row).getHall_id();
    				double balance = user.getBalance() - thisSession.get(row).getPrice();
    			
    				int flag = JOptionPane.showConfirmDialog(jf, "确认是否购买?", "确认信息", JOptionPane.YES_NO_OPTION);
    				if (flag == JOptionPane.YES_OPTION) {
    
    					if (remain < 0) {
    						JOptionPane.showMessageDialog(jf, "无坐了,请更换影院或者场厅!");
    					} else if (balance < 0) {
    						JOptionPane.showMessageDialog(jf, "余额不足,请先去充值!");
    					} else {
    
    						new ZuoWeiFrame(user, hall_id, thisSession.get(row));
    					}
    
    				}
    
    			}
    
    		} else if (e.getSource() == this.btn_comment) {//评论
    			
    			int row = rtb2.getSelectedRow();
    			
    			new CommentView(ticketByUId.get(row));
    			
    			
    			
    		} else if (e.getSource() == this.btn_balance) {
    			new ChargeView(user);
    		} else if (e.getSource() == this.btnsearch) {
    			new SearchMovieUi();
    		} else if (e.getSource() == this.updatepass) {
    			this.oldjl.setVisible(true);
    			this.oldpass.setVisible(true);
    			this.newjl.setVisible(true);
    			this.newpass.setVisible(true);
    			this.cancel.setVisible(true);
    			this.confirmUp.setVisible(true);
    		} else if (e.getSource() == this.confirmUp) {
    			// 修改密码
    			String oldpassw = new String(this.oldpass.getPassword());
    			String newpassw = new String(this.newpass.getPassword());
    			if ("".equals(oldpassw) || "".equals(newpassw)) {
    				Login.winMessage("信息不完整!");
    			} else if (!oldpassw.equals(user.getPasswd())) {
    				Login.winMessage("原密码错误,无法更改!");
    			} else {
    				// this.user.setPasswd(newpassw);
    				if (us.updataUser(user.getUser_id(), newpassw)) {
    					Login.winMessage("密码修改成功!");
    					this.oldjl.setText("");
    					this.oldpass.setText("");
    					this.newjl.setText("");
    					this.newpass.setText("");
    
    					this.oldjl.setVisible(false);
    					this.oldpass.setVisible(false);
    					this.newjl.setVisible(false);
    					this.newpass.setVisible(false);
    
    					this.cancel.setVisible(false);
    					this.confirmUp.setVisible(false);
    				} else {
    					Login.winMessage("密码修改失败!");
    				}
    			}
    
    		} else if (e.getSource() == this.cancel) {
    			this.oldjl.setText("");
    			this.oldpass.setText("");
    			this.newjl.setText("");
    			this.newpass.setText("");
    
    			this.oldjl.setVisible(false);
    			this.oldpass.setVisible(false);
    			this.newjl.setVisible(false);
    			this.newpass.setVisible(false);
    
    			this.cancel.setVisible(false);
    			this.confirmUp.setVisible(false);
    		}
    	}
    
    	@Override
    	public void run() {
    		while(true){
    			try {
    				
    				rtb.validate();
    				rtb2.validate();
    				
    				rtb.updateUI();
    				rtb2.updateUI();
    				
    				System.out.println("Thread sleeping····");
    				
    				Thread.sleep(1000);
    				
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    
    	
    }
    

    电影信息页面:MovieInfoView

    package view;
    
    import java.awt.Color;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.text.SimpleDateFormat;
    import java.util.List;
    
    import javax.swing.GroupLayout;
    import javax.swing.GroupLayout.Alignment;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.JTextField;
    import javax.swing.LayoutStyle.ComponentPlacement;
    import javax.swing.border.EmptyBorder;
    import javax.swing.table.DefaultTableModel;
    
    import entity.Comment;
    import entity.Movie;
    import entity.User;
    import service.CommentService;
    import service.MovieService;
    import service.UserService;
    import serviceimpl.CommentServiceImpl;
    import serviceimpl.MovieServiceImpl;
    import serviceimpl.UserServiceImpl;
    
    public class MovieInfoView extends JFrame {
    
    	private JPanel contentPane;
    	private JTable table;
    	JScrollPane scrollPane = null;
    
    	Movie movie = null;
    	User user = null;
    	MovieService ms = null;
    	CommentService cs = null;
    	UserService us = null;
    	
    	
    	public MovieInfoView(Movie movie,User user) {
    		this.movie = movie;
    		this.user = user;
    		ms = new MovieServiceImpl();
    		cs = new CommentServiceImpl();
    		us = new UserServiceImpl();
    		setTitle("用户选票界面");
    		setBounds(260, 130, 620, 600);
    		
    		contentPane = new JPanel();
    		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
    		setContentPane(contentPane);
    		
    		JLabel lblNewLabel = new JLabel("New label");
    		lblNewLabel.setIcon(new ImageIcon("image/"+movie.getImg()));
    		
    		JLabel label = new JLabel("正在热映···");
    		
    		JLabel lblNewLabel_1 = new JLabel("影片名:");
    		lblNewLabel_1.setFont(new Font("楷体", Font.BOLD, 18));
    		
    		JLabel label_1 = new JLabel("类型:");
    		
    		JLabel label_2 = new JLabel("时长:");
    		
    		JLabel label_3 = new JLabel("电影详情:");
    		
    		JLabel label_4 = new JLabel(movie.getMname());
    		label_4.setFont(new Font("楷体", Font.BOLD, 18));
    		
    		JButton btnNewButton = new JButton("购买");
    		btnNewButton.setForeground(Color.BLUE);
    		btnNewButton.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				new UserUi(user,3);
    				movie.getMovie_id();
    				List<Movie> movieByName = ms.getMovieByName(movie.getMname());
    				
    				for (Movie movie2 : movieByName) {
    					System.out.println(movie2);
    				}				
    				MovieInfoView.this.dispose();
    				
    			}
    		});
    		
    		JButton button = new JButton("取消");
    		button.setForeground(Color.RED);
    		button.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				MovieInfoView.this.dispose();
    			}
    		});
    		
    		scrollPane = new JScrollPane();
    		scrollPane.setEnabled(false);
    		scrollPane.setVisible(false);
    		
    		JButton button_1 = new JButton("查看评论");
    		button_1.addActionListener(new ActionListener() {
    			public void actionPerformed(ActionEvent e) {
    				scrollPane.setVisible(true);
    				showComment();
    				table.repaint();
    				
    			}
    		});
    		
    		button_1.setForeground(Color.MAGENTA);
    		
    		
    		
    		JLabel lblNewLabel_2 = new JLabel("欢迎来到电影详情界面");
    		lblNewLabel_2.setFont(new Font("新宋体", Font.BOLD, 20));
    		lblNewLabel_2.setForeground(Color.BLACK);
    		
    		JLabel label_5 = new JLabel(movie.getType());
    		
    		JLabel label_6 = new JLabel(movie.getDuration()+"分钟");
    		
    		JLabel label_7 = new JLabel(movie.getDetail());
    		
    		GroupLayout gl_contentPane = new GroupLayout(contentPane);
    		gl_contentPane.setHorizontalGroup(
    			gl_contentPane.createParallelGroup(Alignment.TRAILING)
    				.addGroup(gl_contentPane.createSequentialGroup()
    					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addGap(218)
    							.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
    								.addGroup(gl_contentPane.createSequentialGroup()
    									.addComponent(label_3)
    									.addPreferredGap(ComponentPlacement.RELATED)
    									.addComponent(label_7, GroupLayout.PREFERRED_SIZE, 70, GroupLayout.PREFERRED_SIZE))
    								.addGroup(gl_contentPane.createSequentialGroup()
    									.addComponent(lblNewLabel_1)
    									.addPreferredGap(ComponentPlacement.RELATED)
    									.addComponent(label_4, GroupLayout.PREFERRED_SIZE, 137, GroupLayout.PREFERRED_SIZE))
    								.addGroup(gl_contentPane.createSequentialGroup()
    									.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
    										.addComponent(label_2)
    										.addGroup(gl_contentPane.createSequentialGroup()
    											.addPreferredGap(ComponentPlacement.RELATED)
    											.addComponent(label_1)))
    									.addGap(4)
    									.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
    										.addComponent(label_6, GroupLayout.PREFERRED_SIZE, 55, GroupLayout.PREFERRED_SIZE)
    										.addComponent(label_5, GroupLayout.PREFERRED_SIZE, 82, GroupLayout.PREFERRED_SIZE)))
    								.addGroup(gl_contentPane.createSequentialGroup()
    									.addComponent(btnNewButton)
    									.addGap(18)
    									.addComponent(button, GroupLayout.PREFERRED_SIZE, 71, GroupLayout.PREFERRED_SIZE)
    									.addGap(18)
    									.addComponent(button_1))))
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addGap(36)
    							.addComponent(label))
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addGap(170)
    							.addComponent(lblNewLabel_2))
    						.addComponent(lblNewLabel, GroupLayout.PREFERRED_SIZE, 200, GroupLayout.PREFERRED_SIZE)
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addGap(84)
    							.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 464, GroupLayout.PREFERRED_SIZE)))
    					.addContainerGap(46, Short.MAX_VALUE))
    		);
    		gl_contentPane.setVerticalGroup(
    			gl_contentPane.createParallelGroup(Alignment.TRAILING)
    				.addGroup(gl_contentPane.createSequentialGroup()
    					.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addGap(46)
    							.addComponent(label)
    							.addPreferredGap(ComponentPlacement.UNRELATED)
    							.addComponent(lblNewLabel, GroupLayout.DEFAULT_SIZE, 277, Short.MAX_VALUE))
    						.addGroup(gl_contentPane.createSequentialGroup()
    							.addContainerGap()
    							.addComponent(lblNewLabel_2)
    							.addGap(58)
    							.addGroup(gl_contentPane.createParallelGroup(Alignment.LEADING)
    								.addComponent(lblNewLabel_1)
    								.addComponent(label_4, GroupLayout.PREFERRED_SIZE, 21, GroupLayout.PREFERRED_SIZE))
    							.addPreferredGap(ComponentPlacement.RELATED, 53, Short.MAX_VALUE)
    							.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
    								.addComponent(label_1)
    								.addComponent(label_5))
    							.addGap(18)
    							.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
    								.addComponent(label_2)
    								.addComponent(label_6))
    							.addGap(18)
    							.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
    								.addComponent(label_3)
    								.addComponent(label_7))
    							.addGap(125)
    							.addGroup(gl_contentPane.createParallelGroup(Alignment.BASELINE)
    								.addComponent(btnNewButton)
    								.addComponent(button)
    								.addComponent(button_1))))
    					.addGap(28)
    					.addComponent(scrollPane, GroupLayout.PREFERRED_SIZE, 139, GroupLayout.PREFERRED_SIZE))
    		);
    		
    		showComment();
    		scrollPane.setViewportView(table);
    		contentPane.setLayout(gl_contentPane);
    		this.setVisible(true);
    	}
    	
    	public void showComment(){
    		List<Comment> commlist = cs.getAllCommentByMovieId(movie.getMovie_id());
    		int recordrow = 0;
    		
    		if(commlist!=null){
    			 recordrow = commlist.size();
    		}
    		String[][] rinfo = new String[recordrow][3];
    
    		SimpleDateFormat sdf = new SimpleDateFormat("yy-MM-dd hh:mm");
    		for (int i = 0; i < recordrow; i++) {
    			for (int j = 0; j < 3; j++){
    				rinfo[i][j] = new String();
    			
    			rinfo[i][0] = us.queryUserById(commlist.get(i).getUser_id()).getUname();
    			rinfo[i][1] = commlist.get(i).getContent();
    			rinfo[i][2] = sdf.format(commlist.get(i).getDatetime());
    			}
    		}
    		
    		String[] tbheadnames = { "用户名", "评论内容", "评论时间" };
    
    		table = new JTable(rinfo, tbheadnames);
    		table.setBorder(null);
    		table.setRowHeight(20);
    		table.setEnabled(false);
    		table.getColumnModel().getColumn(0).setPreferredWidth(30);
    		table.getTableHeader().setFont(new Font("楷体", 1, 20));
    		table.getTableHeader().setBackground(Color.CYAN);
    		table.getTableHeader().setReorderingAllowed(false); // 不可交换顺序
    		table.getTableHeader().setResizingAllowed(true); // 不可拉动表格
    
    		scrollPane.add(table);
    		scrollPane.setBorder(null);
    
    		table.repaint();
    		
    	}
    }
    
    

    管理员页面:AdminUi

    package view;
    
    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.BorderFactory;
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JDesktopPane;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JPanel;
    
    
    import entity.User;
    
    
    public class AdminMainView extends JFrame {
    	private JPanel main_panel = null;
    	private JPanel fun_panel = null;
    	private JDesktopPane fundesk = null;
    	
    	private JButton oper_User = null;
    	private JButton oper_Cinema = null;
    	private JButton oper_Hall = null;
    	private JButton oper_Session = null;
    	private JButton oper_Movie = null;
    	private JButton back = null;
    	
    	private JLabel lb_welcome = null;
    	private JLabel lb_image = null;
    	private User admin = null;
    	
    	public AdminMainView() {
    		init();
    		RegisterListener();
    	}
    	
    	public AdminMainView(User admin) {
    		this.admin = admin;
    		init();
    		RegisterListener();
    	}
    
    	private void init() {
    		main_panel = new JPanel(new BorderLayout());
    		fun_panel = new JPanel(new GridLayout(8, 1, 0, 18));
    		oper_User = new JButton("对用户进行操作");
    		oper_Cinema = new JButton("对影院进行操作");
    		oper_Hall = new JButton("对场厅进行操作");
    		oper_Session = new JButton("对场次进行操作");
    		oper_Movie = new JButton("对电影进行操作");
    		back = new JButton("返回");
    		
    		fun_panel.add(new JLabel());
    		fun_panel.add(oper_User);
    		fun_panel.add(oper_Cinema);
    		fun_panel.add(oper_Hall);
    		fun_panel.add(oper_Session);
    		fun_panel.add(oper_Movie);
    		fun_panel.add(back);
    		fun_panel.add(new JLabel());
    		
    		//设置面板外观
    				fun_panel.setBorder(BorderFactory.createTitledBorder(
    						BorderFactory.createRaisedBevelBorder(), "功能区"));
    						
    				lb_welcome = new JLabel("欢 迎 " + admin.getUname() + " 进 入 管 理 员 功 能 界 面");
    				lb_welcome.setFont(new Font("楷体", Font.BOLD, 34));
    				lb_welcome.setForeground(Color.BLUE);
    		
    		fundesk = new JDesktopPane();
    		ImageIcon img = new ImageIcon(ClassLoader.getSystemResource("image/beijing2.jpg"));
    		lb_image = new JLabel(img);
    		lb_image.setBounds(10, 10, img.getIconWidth(), img.getIconHeight());
    		fundesk.add(lb_image, new Integer(Integer.MIN_VALUE));
    		
    		main_panel.add(lb_welcome, BorderLayout.NORTH);
    		main_panel.add(fun_panel, BorderLayout.EAST);
    		main_panel.add(fundesk, BorderLayout.CENTER);
    				
    		//为了不让线程阻塞,来调用线程
    		//放入队列当中
    		EventQueue.invokeLater(new Runnable() {			
    		
    			public void run() {
    				new Thread(new thread()).start();				
    			}
    		});
    		
    		this.setTitle("管理员功能界面");
    		this.getContentPane().add(main_panel);
    		this.setSize(880, 600);
    		this.setResizable(false);
    		this.setVisible(true);
    		this.setLocationRelativeTo(null);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    	
    	
    	//开启线程使得欢迎标签动起来
    	//这是单线程
    	private class thread implements Runnable{
    
    		@Override
    		public void run() {
    			while(true){//死循环让其一直移动
    				for(int i=900;i>-700;i--){
    					//for(int i=-100;i<900;i++){
    					try {
    						Thread.sleep(10);//让线程休眠100毫秒
    					} catch (InterruptedException e) {						
    						e.printStackTrace();
    					}
    					lb_welcome.setLocation(i, 5);
    				}
    			}
    		}
    		
    	}
    	
    	private void RegisterListener() {
    		oper_User.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				operUserView ouv = new operUserView();
    				fundesk.add(ouv);
    				ouv.toFront();
    			}
    		});
    		
    		oper_Cinema.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				operCinemaView ocv = new operCinemaView();
    				fundesk.add(ocv);
    				ocv.toFront();
    			}
    		});
    		
    		oper_Hall.addActionListener(new ActionListener() {
    
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				operHallView ohv = new operHallView();
    				fundesk.add(ohv);
    				ohv.toFront();
    			}
    		});
    		
    		
    		oper_Session.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				operSessionView osv = new operSessionView();
    				fundesk.add(osv);
    				osv.toFront();
    			}
    		});
    		
    		oper_Movie.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				operMovieView omv = new operMovieView();
    				fundesk.add(omv);
    				omv.toFront();
    			}
    		});
    		back.addActionListener(new ActionListener() {
    			
    			@Override
    			public void actionPerformed(ActionEvent e) {
    				new Login();
    				AdminMainView.this.dispose();
    			}
    		});
    	}
    }
    
    

    由于篇幅有限,不能把所有代码贴上来:
    在这里插入图片描述

    运行截图

    普通用户界面:

    登录:
    在这里插入图片描述
    主页面:
    在这里插入图片描述
    购买影片:
    在这里插入图片描述
    在线选座:
    在这里插入图片描述
    我的购票信息:
    在这里插入图片描述
    管理员界面:
    影院管理:
    在这里插入图片描述
    场厅、场次管理:
    在这里插入图片描述
    在这里插入图片描述
    电影管理:
    在这里插入图片描述
    (代码由于太多贴不全,如果有问题或者需要所有源码,可以加博主V交流: Code2Life2)

  • 相关阅读:
    block
    最短路径(图论-北京地铁线路查询)
    Linux与git使用引导(git rm 与rm命令)
    Linux、vim、Makefile-操作系统lab0
    2019-BUAA-OO-第一次作业(表达式函数求导)
    1064
    Navicate 连接mysql问题
    pypi上传问题
    pypi上传命令
    关于 List add方法
  • 原文地址:https://www.cnblogs.com/hongming-blogs/p/13507094.html
Copyright © 2020-2023  润新知