火车售票系统(Web服务开发)

该博客介绍了如何使用WebAPI实现火车售票系统的用户管理功能,包括模型层、仓储层和控制器层的设计。在模型层,定义了管理员实体类;仓储层实现了数据库操作,如账号密码验证、账户注册和删除;控制器层处理前端请求。客户端通过HttpClient调用WebAPI进行注册、登录和删除操作。博客还展示了实际运行的截图。
摘要由CSDN通过智能技术生成

WebAPI完整代码:
WebAPI(第一组)

客户端完整代码:
TrainTicketSystem(第一组)

一、WebAPI

本次实验中,我们将用户类与数据库相关的操作封装在了webapi里,在第二次实验的基础上,查询账号密码、登录、注册等功能将改变为通过自己设计的api间接访问数据库,而不是直接操作数据库。
基于Rest风格的webapi(WebServer项目)

(1)model层

model层即数据库实体层,也被称为entity层。
一般数据库一张表对应一个实体类,类属性同表字段一一对应。
在本项目中,model层中的Product类即对应于管理员类。里面的属性账号、密码分别于数据库中管理员表的字段一一对应。

namespace Webserver.Models
{
    public class Product
    {
        private int id;
        private int password;

        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }

        public int Password
        {
            get
            {
                return password;
            }
            set
            {
                password = value;
            }
        }

    }
}

(2)repository层

这一层的作用为访问数据库,向数据库发送sql语句,完成数据的增删改查任务。
本项目中,我们在ProductRepository.cs中访问数据库,包括查询账号密码是否正确、当前账号是否在表中已经存在、新增账号和删除管理员账户几个功能。

//查询账号密码是否正确以便于登录
        public bool CheckIsPwdCorrect(int Account, int Password)
        {
            DatabaseConnection();
            try
            {
                string sql = "select password from adm_id where Adm_ID=" + Account + ";";
                MySqlCommand command = new MySqlCommand(sql, Conn);
                MySqlDataReader reader = command.ExecuteReader();

                while (reader.Read())
                {
                    if (reader.HasRows && reader.GetString(0) == Password.ToString())
                    {
                        reader.Close();
                        return true;
                    }
                }
                reader.Close();
                Conn.Close();
                return false;
            }
            catch (Exception e)
            {
                Conn.Close();
                return false;
                throw new Exception("查询失败" + e.Message);
            }

        }

(3)controller层

controller层即控制层,功能为请求和响应控制。
controller层负责前后端交互,接受前端请求,对于请求作出相应的处理,的数据,最后返回具体的页面或数据到客户端。
在UserController.cs中,我们只关心操作结果,于是这一块调用repository中的方法时,用的主要都是GET方法来获取是否操作成功。

 public bool GetIsPwdCorrect(int id, int pwd)
        {
            return repository.CheckIsPwdCorrect(id,pwd);
        }

二、客户端调用WebAPI

我们使用用HttpClient来进行Web Api的调用。由于WebApi的调用本质上就是一次普通的发送请求与接收响应的过程,所有HttpClient其实可以作为一般意义上发送HTTP请求的工具。
如在登录界面,用户输入相应账号和密码后,按下登录按钮后调用CheckIsPwdCorrect()方法,这里将我们封装好的WebAPi中相对应的检查账户和密码是否匹配的函数GetIsPwdCorrect及其参数赋值id和pwd写入url,并通过HttpClient发起调用。
由于我们这里主要实现用户类的WebApi的封装与调用,所以我们只在用户类的数据库相关操作上改变为通过自己设计的api间接访问数据库。

(1)注册

  1. 注册时判断账号是否重复
 //checkIsAcclegal()方法
 public string CheckIsAccLegal(int Account)//判断账号是否重复
        {
            //int id = int.Parse(tbAccount.Text);
            HttpClient client = new HttpClient();
            string url = "https://localhost:44376/api/User/GetAccLegal?id=" + Account;
            string html = client.GetStringAsync(url).Result;
            return html;
        }
  1. 添加账户
//AddManager()方法
      public void AddManager()    //添加账户
        {
            string id = tbAccount.Text;
            string pwd = tbPassword.Text;
            HttpClient client = new HttpClient();
            string url = "https://localhost:44376/api/User/GetAdd?id=" + id + "&pwd=" + pwd;
            string res = client.GetStringAsync(url).Result;
        }

(2)登录

  1. 登录时检查账号密码是否匹配
//CheckIsPwdCorrect()方法
public string CheckIsPwdCorrect()//检查账号密码是否匹配
        {
            string id = AccountText.Text;
            string pwd = PasswordText.Text;
            HttpClient client = new HttpClient();
            string url = "https://localhost:44376/api/User/GetIsPwdCorrect?id=" + id + "&pwd=" + pwd;
            string html = client.GetStringAsync(url).Result;
            //MessageBox.Show(html);
            return html;
        }

(3)删除账户

  1. 删除
//DeleteManager()方法
        public string DeleteManager()    //删除账户
        {
            int id = int.Parse(AccountText.Text);
            //string pwd = PasswordText.Text;
            HttpClient client = new HttpClient();
            string url = "https://localhost:44376/api/User/GetDelUser?id=" + id;
            string html = client.GetStringAsync(url).Result;
            return html;
            //MessageBox.Show(html);
        }

运行结果截图

(1)WebAPI运行

WebAPI运行

(2)注册

注册
注册成功

(3)登录

登录

(4)删除

删除账户
删除成功

import java.util.*; import java.sql.*; import java.awt.FlowLayout; import java.awt.event.*; import java.text.SimpleDateFormat; import java.util.Calendar; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JButton; import javax.swing.JTextField; import javax.swing.JOptionPane; public class BookTheTicket implements Runnable{ private Thread clocker,time; String s1,s2,s3,s4; long startTime,endTime; long nowTime, leftTime, leftSec, leftMin; boolean flag=false; private char chs[]=new char[8]; private Connection con = null; private Statement stmt = null; ResultSet rs=null,rs2=null; String str; public BookTheTicket(String s1,String s2,String s3,String s4) { this.s1=s1;//用户名 this.s2=s2;//订票数量 this.s3=s3;//车次 this.s4=s4;//定第n天的票 clocker = new Thread(this,"clock"); clocker.start(); time=new Thread(this,"ti"); time.start(); } //生成随机码 //*******************************************************************************************************************************************// public void play() { SimpleDateFormat dateFormat = new SimpleDateFormat(); long endtime; Calendar startCalendar = Calendar.getInstance(); endtime=startCalendar.getTime().getTime()+48*60*60*1000; //获取系统当天时间并加两天 for(int i=0;i<8;i++) { Random r2=new Random(); int m=0; do { m=r2.nextInt(124); }while(m<48||m>122||(m>90&&m<97)||(m>57&&m<65)); chs[i]=(char)m; //将筛选合格的字符存储在chs数组中 } str=String .valueOf(chs[0]); //获取chs[i]给str 如果不进行此步,str默认是null,合并后的字符串总以null开头 for(int j=1;j<chs.length;j++) str+=chs[j]; //连接数据库 //*******************************************************************************************************************************************// try { Class.forName("oracle.jdbc.driver.OracleDriver"); //DriverManager.registerDriver( //new oracle.jdbc.OracleDriver()); }catch (ClassNotFoundException e) {} //url 定义了数据库服务器的ip地址和服务端口号以及要连接的数据名 String url = "jdbc:oracle:thin:@192.168.5.16:1521:lieche"; // 定义登陆数据库的用户名和密码 String user = "system"; String password = "111111"; try { //创建一个连接对象con con = DriverManager.getConnection(url, user, password); //创建statement对象 stmt = con.createStatement(); }catch (SQLException e){} try { stmt.executeUpdate("insert into dingpiao(用户名,订票时间,过期时间,订票数量,订票验证码,车次) values('"+s1+"','"+dateFormat.format(startCalendar.getTime())+"','"+dateFormat.format(endtime)+"','"+s2+"','"+str+"','"+s3+"')"); // stmt.executeUpdate("update "+s3+" set 总票=总票-1,第"+s4+"天剩余=第"+s4+"天剩余-1 where 车次='"+s3+"' "); }catch (SQLException e) { e.printStackTrace(); } Calendar startCalendar1 = Calendar.getInstance(); startTime = startCalendar1.getTime().getTime(); // 获得开始时候的那个时间点 endTime = startTime+10*1000; // 从开始时刻开始加10秒之后过期 flag = true; } public void run() { Calendar now; while(((Thread.currentThread()).getName()).equals("clock")) { now = Calendar.getInstance(); nowTime = now.getTime().getTime(); } while(((Thread.currentThread()).getName()).equals("ti")) while(flag){ leftTime = endTime - nowTime; leftSec = leftTime / 1000; leftMin = leftTime / (60 * 1000); if(leftSec == 0) { flag=false; try { stmt.executeUpdate("delete from dingpiao where 用户名='"+s1+"'"); stmt.executeUpdate("update "+s3+" set 总票=总票+1,第"+s4+"天剩余=第"+s4+"天剩余+1 where 车次='"+s3+"'"); }catch (SQLException e) { e.printStackTrace(); } // System.exit(1); } try { Thread.sleep(1000); } catch(InterruptedException e) { e.printStackTrace(); } } } public ResultSet query(){ try { rs = stmt.executeQuery("select * from dingpiao where 用户名="+"'"+s1+"'"); System.out.println(rs.getString(1)); } catch (SQLException e) {} return rs; } public ArrayList L(){ int i=1; ArrayList list=new ArrayList(); rs2=query(); try { rs2.next(); } catch (SQLException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } while(i<=6) {try { list.add(rs.getString(i)); } catch (SQLException e) { e.printStackTrace(); } i++; } return list; } // public static void main(String[] args){ // BookTheTicket f=new BookTheTicket("u4", "3", "D101", "1"); // f.play(); // ArrayList list=new ArrayList(); // list=f.L(); // System.out.println(list.get(0).toString()); // // // } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值