飞道的博客

口罩预约管理系统——系统网站实现(前端+PHP+MySQL)

475人阅读  评论(0)

口罩预约管理系统网站实现

一、前言

二、系统登陆逻辑及界面实现

三、用户模块

1、用户预约系统界面

2、用户查看我的订单界面

3、用户修改预约信息

四、管理员模块

1、管理员登陆界面

 2、查看用户预约订单

3、修改/删除用户信息

五、快递员模块

1、快递员登录配送系统

2、接单

3、关单

六、系统实现总结

1、安全性

2、用户预约时间

3、前后端与数据库交互


口罩预约管理系统网站实现

一、前言

在上一篇《口罩预约管理系统——数据库设计(前端+PHP+MySQL)》,基本上完成口罩预约管理系统的数据库设计,而这个项目的目标是实现一个相对完整、功能齐全的模拟口罩预约管理系统,所以这一篇将完成接下来的工作——系统网站前端(HTML+CSS+Javascript)和后端(PHP),以及实现前后端与MySQL数据库的交互,实现功能简要描述如下:

  • 用户模块:创建账号,登录系统预约口罩确认提交,查看订单状态修改订单预约信息,修改个人注册信息。
  • 市政人员(管理员)模块:查询已注册用户信息修改或删除用户信息,审核订单以及分配快递员。管理每种类型口罩,查询库存数量,合理分配用户预约的口罩数量,按需求查看订单的配送状态,方便做数据分析。
  • 快递员模块:查看分配到的订单,选择接单配送,完成配送选择关单按订单状态查看订单,统计完成的订单数量。

二、系统登陆逻辑及界面实现

系统登录页面对系统进行安全性管理,三种角色的账号和密码分别保存在 admin,users,deliver 表中,根据不同的登录用户,设计不同的权限,从而进入不同的模块,登录模块流程图 :

系统界面使用简单的登录页面:

输入框和用户类型框以及登录按钮,登录页面后端使用 login_check.php 来处理用户请求信息,并返回结果。前端、后端和数据库之间交互,检索登录身份,如果有账号记录,则登录成功,否则登录失败。
整个系统实现使用的技术包括 HTML5、CSS3、Javascript、PHP 和 MySQL 数据库。运用并结合这些技术使系统呈现友好的操作页面和系统功能的引导。下面将介绍各个功能页面及关键代码。

三、用户模块

1、用户预约系统界面

使用到的前端元素包括输入框、下拉框、日期选择框、文本区域和Button按钮,详见代码实现:

前端页面代码:


  
  1. <!--user.php-->
  2. <?php
  3. //检查是否存在登录session,否则跳转登录界面
  4. session_start();
  5. require_once 'mysql_connect.php';
  6. if ( !isset( $_SESSION[ 'user_id' ] ) ) {
  7. header( "Location:maskorder.php" );
  8. exit( '非法访问!' );
  9. }
  10. error_reporting( E_ERROR );
  11. mysqli_query( $link, "set names 'utf8'" );
  12. $id = $_SESSION[ 'user_id' ];
  13. $query = "select * from users where user_id='$id' ";
  14. $result = mysqli_query( $link, $query );
  15. $arr = mysqli_fetch_array( $result );
  16. ?>
  17. <!doctype html>
  18. <html>
  19. <head>
  20. <meta charset="utf-8">
  21. <title>口罩预约系统 </title>
  22. <link rel="stylesheet" href="css/person.css" type="text/css">
  23. <style type="text/css">
  24. #res_form {
  25. /*表的宽度以及位置*/
  26. width: 500px;
  27. position: relative;
  28. left: 500px;
  29. top: 100px;
  30. }
  31. #a {
  32. /*调整input输入框与文字位置,显示同一行*/
  33. height: 50px;
  34. border: 1px;
  35. margin: 10px;
  36. text-align: left;
  37. }
  38. #a input {
  39. border: 1px solid #000000;
  40. /*按钮边缘*/
  41. border-radius: 5px;
  42. float: right;
  43. }
  44. #a select {
  45. border: 5px;
  46. width: 200px;
  47. border-color: #000000;
  48. border-radius: 5px;
  49. float: right;
  50. }
  51. #textarea {
  52. float: right;
  53. width: 200px;
  54. }
  55. #bt input {
  56. float: left;
  57. margin: 10px;
  58. width: 50px;
  59. background-color: #3CF;
  60. border-bottom-color: #000000;
  61. border-radius: 5px;
  62. position: relative;
  63. top: 20px;
  64. left: 100px;
  65. }
  66. #bt input :hover {
  67. background-color: #F00;
  68. color: #FFF;
  69. cursor: pointer;
  70. }
  71. #out {
  72. display: block;
  73. position: relative;
  74. left: 10px;
  75. }
  76. img {
  77. position: relative;
  78. float: right;
  79. }
  80. #we {
  81. position: relative;
  82. right: 100px;
  83. }
  84. h1 {
  85. position: absolute;
  86. float: left top;
  87. left: 660px;
  88. }
  89. </style>
  90. </head>
  91. <body>
  92. <div id="res">
  93. <ul id="item">
  94. <img src="images/2.png"> </img>
  95. <div id="out">
  96. <div id="we">欢迎您 &nbsp; &nbsp;
  97. <?php
  98. echo $id;
  99. ?> &nbsp;, </div>
  100. <!--此处未改好样式-->
  101. <li> <a href="login_out.php">退出登录 </a>
  102. </li>
  103. <li> <a href="adm_up_user.php" target="_blank">修改密码 </a>
  104. </li>
  105. <li> <a href="myorder.php">我的订单 </a>
  106. </li>
  107. </ul>
  108. </div>
  109. <h1>口罩预约系统 </h1>
  110. <div id="res_form">
  111. <form action="reserveorder.php" method="post">
  112. <div id="a">
  113. 姓名
  114. <!--placeholder="预约人姓名" placeholder="身份证号"-->
  115. <input type="text" name="name" value="<?php echo $arr['user_name']; ?>" readonly="readonly" required="required">
  116. </div>
  117. <div id="a">
  118. 身份证号
  119. <input type="text" name="ID" value="<?php echo $arr['ID']; ?>" required readonly>
  120. </div>
  121. <div id="a">
  122. 联系方式
  123. <input type="text" name="phone" placeholder="请填写手机号" required>
  124. </div>
  125. <div id="a">
  126. 口罩类型
  127. <select name="type">
  128. <option selected="selected">请选择 </option>
  129. <option value="医用外科口罩">医用外科口罩 </option>
  130. <option value="N95口罩">N95口罩 </option>
  131. <option value="活性碳口罩">活性碳口罩 </option>
  132. </select>
  133. </div>
  134. <div id="a">
  135. 预约个数
  136. <input type="number" name="num" placeholder="请填写数量(不超过20个)" min="1" max="20" required>
  137. </div>
  138. <div id="a">
  139. 期望到货日期
  140. <input type="date" name="date" placeholder="" required>
  141. </div>
  142. <div id="a">
  143. 详细地址
  144. <textarea id="textarea" name="address" cols="30" rows="4" placeholder="请填写配送详细地址" required> </textarea>
  145. <!--多行文本框-->
  146. </div>
  147. <div id="bt">
  148. <input type="submit" value="确定">
  149. <input type="reset" value="重置">
  150. </div>
  151. </form>
  152. </div>
  153. </div>
  154. </body>
  155. </html>

 可见HTML头部加入了session机制,防止未登录造成非法访问。然后从数据库中查询表记录,匹配用户登陆信息。

后端代码实现:

reserveorder.php 对用户提交的表单进行处理,用户 3 天之内只能预约一次,否则系统会将判定结果告诉用户,通过获取当前时间戳进行比较实现,这个功能看似简单,在具体实现的时候遇到一些小问题,比如从数据库的表中查询获取时间的数据类型与当前获取的时间如何进行比较。所以需要进行时间格式的设定。具体见代码部分:


  
  1. //reserveorder.php
  2. <?php
  3. session_start();
  4. require_once 'mysql_connect.php';
  5. $name = $_POST[ 'name' ];
  6. $userid = $_SESSION[ 'user_id' ];
  7. $phone = $_POST[ 'phone' ];
  8. $ID = $_POST[ 'ID' ];
  9. $type = $_POST[ 'type' ];
  10. $num = $_POST[ 'num' ];
  11. $date = $_POST[ 'date' ];
  12. $address = $_POST[ 'address' ];
  13. /*reserve表*/
  14. $query = "select * from reserve where user_id='$userid'";
  15. $result = mysqli_query( $link, $query ) or die( "打开数据库失败:" . mysqli_error() );
  16. $arr = mysqli_fetch_array( $result );
  17. $num_row = mysqli_num_rows( $result );
  18. //获取当前时间
  19. date_default_timezone_set( 'prc' ); //设置时区
  20. $check_date = date( "Y-m-d H:i:s", strtotime( '-3 day' ) ); //获取当前时间的3天前
  21. $date_db = $arr[ 're_date' ];
  22. if ( $check_date < $date_db ) {
  23. echo "<script language='javascript'>";
  24. echo "alert('预约失败,用户3天内已预约!');";
  25. echo "window.location.href='user.php';";
  26. echo "</script>";
  27. }
  28. else {
  29. /*订单表*/
  30. $q = "select * from info"; // where user_id='$userid'";
  31. $r = mysqli_query( $link, $q );
  32. $arrary = mysqli_fetch_array( $r );
  33. $row_num = mysqli_num_rows( $r );
  34. $order_id = 100001 + $row_num;
  35. $statue = "已预约";
  36. $insert_order = "insert into info values('" . $order_id . "','" . $userid . "','" . $name . "','" . $type . "','0','" . $phone . "','" . $address . "','" . $statue . "',now()" . ")";
  37. $result = mysqli_query( $link, $insert_order ) or die( "订单生成插入记录失败:" . mysqli_error() );
  38. $query = "insert into reserve(user_id,phone,ID,mask_type,r_num,ex_date,address,re_date) value('" . $userid . "','" . $phone . "','" . $ID . "','" . $type . "','" . $num . "','" . $date . "','" . $address . "',now()" . ")";
  39. $result = mysqli_query( $link, $query ) or die( "预约记录失败:" . mysqli_error() );
  40. echo "<script language='javascript'>";
  41. echo "alert('预约成功!');";
  42. echo "window.location.href='myorder.php';";
  43. echo "</script>";
  44. }
  45. mysqli_free_result( $result );
  46. mysqli_close( $link );
  47. ?>

 PHP后端主要的处理任务就是查询数据表数据,对表进行插入、更新和删除操作,以及实现简单的JS弹窗功能。

功能展示:

2、用户查看我的订单界面

由上一步预约成功之后会直接跳转我的订单界面,如下:

这部分前端实现简单,只需一个页面处理,前后端结合,将查询记录返回前端表单即可。


  
  1. <!--myorder.php-->
  2. <?php
  3. session_start();
  4. require_once 'mysql_connect.php';
  5. if ( !$_SESSION[ 'user_id' ] ) {
  6. header( "Location:maskorder.php" );
  7. exit( '非法访问!' );
  8. }
  9. error_reporting( E_ERROR );
  10. ?>
  11. <!doctype html>
  12. <html>
  13. <head>
  14. <meta charset="utf-8">
  15. <title>我的订单 </title>
  16. </head>
  17. <link rel="stylesheet" type="text/css" href="css/person.css">
  18. <style type="text/css">
  19. .table{
  20. position: relative;
  21. left: 100px;
  22. width: 1200px;
  23. }
  24. a{
  25. text-decoration: none;
  26. }
  27. #bt{
  28. border: 1px solid #000000;
  29. border-bottom-color: #000000;
  30. border-radius: 5px;
  31. }
  32. </style>
  33. <body>
  34. <h1 align="center">我的订单 </h1>
  35. <div>
  36. <form action="myorder.php" method="post" id="order">
  37. <table class="table" border="1">
  38. <thead>
  39. <tr>
  40. <th>订单号 </th>
  41. <th>预约人姓名 </th>
  42. <th>口罩类型 </th>
  43. <th>分配数量 </th>
  44. <th>预约数量 </th>
  45. <th>电话 </th>
  46. <th>地址 </th>
  47. <th>订单状态 </th>
  48. <th>预约日期 </th>
  49. <th>期望到货日期 </th>
  50. <th>修改 </th>
  51. </tr>
  52. </thead>
  53. <tbody>
  54. <?php
  55. $userid = $_SESSION[ 'user_id' ];
  56. /*订单表、预约表连接查询*/
  57. $query = "select * from info,reserve where info.user_id='$userid' and info.user_id=reserve.user_id and info.re_date=reserve.re_date";
  58. $result = mysqli_query( $link, $query );
  59. while ($arr = mysqli_fetch_array( $result )) {
  60. echo "<tr>";
  61. echo " <td>" . $arr[ 'order_id' ] . " </td>";
  62. echo " <td>" . $arr[ 'user_name' ] . " </td>";
  63. echo " <td>" . $arr[ 'mask_type' ] . " </td>";
  64. echo " <td>" . $arr['allocate_num'] ." </td>";
  65. echo " <td>" . $arr['r_num'] ." </td>";
  66. echo " <td>" . $arr[ 'phone' ] . " </td>";
  67. echo " <td>" . $arr[ 'address' ] . " </td>";
  68. echo " <td>" . $arr['statue'] ." </td>";
  69. echo " <td>" . $arr['re_date'] ." </td>";
  70. echo " <td>" . $arr['ex_date'] ." </td>";
  71. echo " <td> <a href='user_update.php?order_id=".$arr['order_id']."'>修改 </a> </td>";
  72. echo " </tr>";
  73. }
  74. ?>
  75. </tbody>
  76. </table>
  77. <button value="返回" id="bt"> <a href="user.php">返回 </a> </button>
  78. </form>
  79. </div>
  80. </body>
  81. </html>

3、用户修改预约信息

这部分继承预约页面的功能,稍微进行修改,实现功能主要是:类似网上购物,下单后只能修改手机号和收货地址而其他信息设置为只读状态。

代码实现:


  
  1. <!--user_update.php-->
  2. <?php
  3. //检查是否存在登录session,否则跳转登录界面
  4. session_start();
  5. require_once 'mysql_connect.php';
  6. if ( !isset( $_SESSION[ 'user_id' ] ) ) {
  7. header( "Location:maskorder.php" );
  8. exit( '非法访问!' );
  9. }
  10. error_reporting( E_ERROR );
  11. mysqli_query( $link, "set names 'utf8'" );
  12. $orderid=$_GET['order_id'];
  13. //已分配的订单用户无法再修改
  14. $id = $_SESSION[ 'user_id' ];
  15. $order_status =mysqli_query($link,"select statue from info where user_id='$id' and order_id='$orderid'");
  16. $status = mysqli_fetch_array($order_status);
  17. if($status['statue']!='已预约'){
  18. echo "<script language='javascript'>";
  19. echo "alert('订单已受理,无法修改!');";
  20. echo "window.location.href='myorder.php';";
  21. echo " </script>";
  22. }
  23. //如果用户预约了多个订单,通过自然连接,选择当前指定的订单号
  24. $query = "select * from (users natural join reserve)natural join info where users.user_id='$id' and users.user_id=reserve.user_id and reserve.user_id=info.user_id and info.order_id='$orderid'";
  25. $result = mysqli_query( $link, $query );
  26. $arr = mysqli_fetch_array( $result );
  27. ?>
  28. <!doctype html>
  29. <html>
  30. <head>
  31. <meta charset="utf-8">
  32. <title>修改订单信息 </title>
  33. <link rel="stylesheet" href="css/person.css" type="text/css">
  34. <style type="text/css">
  35. #res_form {
  36. /*表的宽度以及位置*/
  37. width: 500px;
  38. position: relative;
  39. left: 500px;
  40. top: 100px;
  41. }
  42. #a {
  43. /*调整input输入框与文字位置,显示同一行*/
  44. height: 50px;
  45. border: 1px;
  46. margin: 10px;
  47. text-align: left;
  48. }
  49. #a input {
  50. border: 1px solid #000000;
  51. border-radius: 5px;
  52. float: right;
  53. }
  54. #a select {
  55. border: 5px;
  56. width: 200px;
  57. border-color: #000000;
  58. border-radius: 5px;
  59. float: right;
  60. }
  61. /*form input{
  62. text-align: left;
  63. margin: 10px;
  64. }*/
  65. #textarea {
  66. float: right;
  67. width: 200px;
  68. }
  69. #bt input {
  70. float: left;
  71. margin: 10px;
  72. width: 50px;
  73. background-color: #3CF;
  74. border-bottom-color: #000000;
  75. border-radius: 5px;
  76. position: relative;
  77. top: 20px;
  78. left: 100px;
  79. }
  80. #bt input :hover {
  81. background-color: #F00;
  82. color: #FFF;
  83. cursor: pointer;
  84. }
  85. #out{
  86. display: block;
  87. position: relative;
  88. left: 10px;
  89. }
  90. img{
  91. position: relative;
  92. float: right;
  93. }
  94. #we{
  95. position: relative;
  96. right: 100px;
  97. }
  98. h1{
  99. position: absolute;
  100. float: left top;
  101. left: 660px;
  102. }
  103. </style>
  104. </head>
  105. <body>
  106. <div id="res">
  107. <ul id="item">
  108. <img src="images/2.png"> </img>
  109. <div id="out">
  110. <div id="we">欢迎您 &nbsp; &nbsp; <?php
  111. echo $id;
  112. ?> &nbsp;, </div>
  113. <li> <a href="login_out.php">退出登录 </a>
  114. </li>
  115. <li> <a href="adm_up_user.php">修改密码 </a>
  116. </li>
  117. <li> <a href="myorder.php">我的订单 </a>
  118. </li>
  119. </ul>
  120. </div>
  121. <h1>修改订单信息 </h1>
  122. <div id="res_form">
  123. <form action="update_order.php" method="post">
  124. <div id="a">
  125. 姓名
  126. <!--placeholder="预约人姓名" placeholder="身份证号"-->
  127. <input type="text" name="name" value="<?php echo $arr['user_name']; ?>" readonly="readonly" required="required">
  128. </div>
  129. <div id="a">
  130. 身份证号
  131. <input type="text" name="ID" value="<?php echo $arr['ID']; ?>" required readonly>
  132. </div>
  133. <div id="a">
  134. 联系方式
  135. <input type="text" name="phone" placeholder="修改手机号" required>
  136. </div>
  137. <div id="a">
  138. 口罩类型
  139. <input type="text" name="mask" value="<?php echo $arr['mask_type']; ?>" required readonly>
  140. </div>
  141. <div id="a">
  142. 预约个数
  143. <input type="number" name="num" value="<?php echo $arr['r_num']; ?>" min="1" max="20" required readonly>
  144. </div>
  145. <div id="a">
  146. 期望到货日期
  147. <input type="date" name="date" value="<?php echo $arr['ex_date']; ?>" required readonly>
  148. </div>
  149. <div id="a">
  150. 详细地址
  151. <textarea id="textarea" name="address" cols="30" rows="4" placeholder="修改配送地址" required> </textarea>
  152. <!--多行文本框-->
  153. </div>
  154. <div id="bt">
  155. <input type="submit" value="确定">
  156. <input type="reset" value="重置">
  157. </div>
  158. </form>
  159. </div>
  160. </div>
  161. </body>
  162. </html>

四、管理员模块

系统实现基本功能,对于页面布局未设计得很精美,所以接下来的管理员界面就是这样 V●ᴥ●V

首页包括修改和删除用户的功能。

1、管理员登陆界面

这里展示后端处理,前端部分比较容易实现。这里展示一个比较特别的功能,运用SQL语言实现模糊查询,演示如下:


  
  1. <!--admin.php-->
  2. <?php
  3. //检查是否存在登录session,否则跳转登录界面
  4. session_start();
  5. require_once 'mysql_connect.php';
  6. if ( !isset( $_SESSION[ 'work_id' ] ) ) {
  7. header( "Location:maskorder.php" );
  8. exit( '非法访问!' );
  9. }
  10. error_reporting( E_ERROR );
  11. mysqli_query( $link, "set names 'utf8'" );
  12. ?>
  13. <!DOCTYPE html>
  14. <html>
  15. <head>
  16. <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
  17. <!--link type="text/css" href="css/main.css" rel="stylesheet"-->
  18. <title>管理员 </title>
  19. <link type="text/css" href="css/person.css" rel="stylesheet">
  20. <style type="text/css">
  21. #store {
  22. float: left;
  23. position: absolute;
  24. left: 700px;
  25. top: - 200px;
  26. }
  27. .login1 {
  28. position: relative;
  29. top: 100px;
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <div id="page">
  35. <div id="out">
  36. <ul id="item">
  37. <li> <a href="adm_order.php">审核订单 </a>
  38. </li>
  39. <li> <a href="login_out.php">退出登录 </a>
  40. </li>
  41. </ul>
  42. </div>
  43. <h1 align="center">管理员登录界面 </h1>
  44. <div class="login1">
  45. <form action="admin.php" method="post">
  46. <select name="item">
  47. <option selected>请选择查询条件 </option>
  48. <option value="user_id">账号 </option>
  49. <option value="user_name">姓名 </option>
  50. <option value="ID">身份证号 </option>
  51. </select>
  52. <input type="text" name="val">
  53. <button type="submit" class="btn btn-info">查询 </button>
  54. <table class="table" border="1">
  55. <thead>
  56. <tr>
  57. <th>账号 </th>
  58. <th>密码 </th>
  59. <th>姓名 </th>
  60. <th>身份证号 </th>
  61. <th>注册时间 </th>
  62. <th>修改 </th>
  63. </tr>
  64. </thead>
  65. <tbody>
  66. <?php
  67. $item = $_POST[ 'item' ];
  68. $val = $_POST[ 'val' ];
  69. if ( !$val ) {
  70. $sql = "select * from users order by date desc";
  71. } else {
  72. $sql = "select * from users where $item like '%$val%' order by date desc";
  73. }
  74. mysqli_query( $link, "set names 'utf8'" );
  75. $res = mysqli_query( $link, $sql );
  76. while ( $arr = mysqli_fetch_array( $res ) ) {
  77. echo "<tr>";
  78. echo " <td>" . $arr[ 'user_id' ] . " </td>";
  79. echo " <td>" . $arr[ 'pwd' ] . " </td>";
  80. echo " <td>" . $arr[ 'user_name' ] . " </td>";
  81. echo " <td>" . $arr[ 'ID' ] . " </td>";
  82. echo " <td>" . $arr[ 'date' ] . " </td>";
  83. echo " <td> <a href='adm_up_user.php?user_id=" . $arr[ 'user_id' ] . "'>修改 </a>/ <a href='admin.php?user_id=" . $arr[ 'user_id' ] . "'>删除 </a> </td>";
  84. echo " </tr>";
  85. }
  86. ?>
  87. </tbody>
  88. </table>
  89. </form>
  90. <div id="store">
  91. <h2 align="center">口罩信息表 </h2>
  92. <table border="1">
  93. <tr>
  94. <th>口罩类型 </th>
  95. <th>仓库 </th>
  96. <th>剩余数量 </th>
  97. <th>单位价格 </th>
  98. </tr>
  99. <?php
  100. $ mask = mysqli_query( $ link, " select * from mask" );
  101. while ( $ maskarr = mysqli_fetch_array( $ mask ) ) {
  102. echo "< tr>";
  103. echo " <td>" . $maskarr[ 'mask_type' ] . " </td>";
  104. echo " <td>" . $maskarr[ 'store' ] . " </td>";
  105. echo " <td>" . $maskarr[ 'remain_num' ] . " </td>";
  106. echo " <td>" . $maskarr[ 'price' ] . " </td>";
  107. echo " </tr>";
  108. }
  109. ?>
  110. </table>
  111. </div>
  112. <?php
  113. $delete = $_GET[ 'user_id' ];
  114. mysqli_query( $link, "delete from users where user_id='$delete'" )or die( "删除失败" );
  115. ?>
  116. </div>
  117. </div>
  118. </body>
  119. </html>

 2、查看用户预约订单

细心的朋友可以看到管理员界面右上角有审核订单的按钮,这里就是查看用户预约订单的入口,进去后看到是这样的。

后端实现从数据库查询数据返回前端,另外,注意重要的一点,管理员只能审核已预约的订单,防止误操作多次审核订单,对之进行分配,所以后端需要做一点限制以及错误操作提醒。

后端实现具体代码:


  
  1. <?php
  2. //检查是否存在登录session,否则跳转登录界面
  3. session_start();
  4. require_once 'mysql_connect.php';
  5. if ( ! isset( $_SESSION[ 'work_id' ] ) ) {
  6. header( "Location:maskorder.php" );
  7. exit( '非法访问!' );
  8. }
  9. error_reporting( E_ERROR );
  10. mysqli_query( $link, "set names 'utf8'" );
  11. $id = $_SESSION[ 'work_id' ];
  12. $order_id = $_GET[ 'order_id'];
  13. //检查订单是否为预约状态
  14. $ch_re =mysqli_query($link, "select * from info where order_id='$order_id'");
  15. $ch_arr= mysqli_fetch_array($ch_re);
  16. if($ch_arr[ 'statue']!= '已预约'){
  17. echo "<script language='javascript'>";
  18. echo "alert('该订单已经审核过!');";
  19. echo "window.location.href='adm_order.php';";
  20. echo "</script>";
  21. }
  22. //如果用户预约了多个订单,通过自然连接,选择当前指定的订单号以及用户信息进行处理
  23. $query = "select * from (users natural join reserve)natural join info where users.user_id=reserve.user_id and reserve.user_id=info.user_id and info.order_id='$order_id'";
  24. $result = mysqli_query( $link, $query ) or die( "出错啦!");
  25. $arr = mysqli_fetch_array( $result );
  26. $address = $arr[ 'address'];
  27. $de = "select * from delivers";
  28. $de_re=mysqli_query($link,$de);
  29. ?>

 合法的审核订单则进入界面如下,管理员可操作订单信息只包括分配口罩数量、分配快递员,其他为只读状态,这样保证用户预约信息的正确性,防止管理员修改用户信息。

3、修改/删除用户信息


  
  1. <?php
  2. session_start();
  3. require_once 'mysql_connect.php';
  4. if (isset($_SESSION['work_id'])) {
  5. $id = $_GET['user_id'];
  6. $useinfo=mysqli_query($link,"select * from users where user_id='$id'");
  7. $userarr = mysqli_fetch_array($useinfo);
  8. error_reporting(E_ERROR);
  9. }
  10. elseif(isset($_SESSION['user_id'])){
  11. $id = $_SESSION['user_id'];
  12. $useinfo=mysqli_query($link,"select * from users where user_id='$id'");
  13. $userarr = mysqli_fetch_array($useinfo);
  14. error_reporting(E_ERROR);
  15. }
  16. else{
  17. header("Location:maskorder.php");
  18. exit('非法访问!');
  19. }
  20. ?>
  21. <!DOCTYPE html>
  22. <html>
  23. <head>
  24. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  25. <link rel="stylesheet" type="text/css" href="css/main.css">
  26. <title>修改用户信息 </title>
  27. <body>
  28. <div class="main">
  29. <h2 align="center">修改用户信息 </h2>
  30. <div id="page">
  31. <div class="login1">
  32. <form action="adm_up_user_sql.php" id="form1" method="post">
  33. <input type="text" name="name" class="name" value="<?php echo $userarr['user_id'];?>" required>
  34. <input type="text" name="username" class="username" value="<?php echo $userarr['user_name'];?>" required>
  35. <input type="text" name="ID" class="ID" value="<?php echo $userarr['ID'];?>" required>
  36. <input type="password" name="password" class="password" placeholder="修改密码" required>
  37. <div class="clear"> </div>
  38. <input type="submit" value="修改" >
  39. </form>
  40. </div>
  41. </div>
  42. </div>
  43. </body>
  44. </html>

五、快递员模块

1、快递员登录配送系统

快递员可以根据订单状态查询自己的订单

 使用视图从订单表中提取部分信息满足配送要求,保证用户信息安全,前端页面迭代之前,方法类似。

页面表单处理,使用之前建立的视图:


  
  1. <?php
  2. $search=$_POST[ 'item'];
  3. if(!$search){
  4. $query = "select * from deli_order,allocate where deli_order.order_id=allocate.order_id and deliver_id='$id'";
  5. }
  6. /*订单视图、接关单表连接查询,只能看到分配到当前快递员的订单*/
  7. else{
  8. $query = "select * from deli_order,allocate where deli_order.order_id=allocate.order_id and deliver_id='$id' and deli_order.statue='$search'";
  9. }
  10. $result = mysqli_query( $link, $query );
  11. while ( $arr = mysqli_fetch_array( $result ) ) {
  12. //快递员查看订单接关单时间
  13. $q_take= "select * from take where order_id='".$arr[ 'order_id'] . "'";
  14. $r_take=mysqli_query($link,$q_take);
  15. $arr_take=mysqli_fetch_array($r_take);
  16. echo "<tr>";
  17. echo "<td>" . $arr[ 'order_id' ] . "</td>";
  18. echo "<td>" . $arr[ 'mask_type' ] . "</td>";
  19. echo "<td>" . $arr[ 'allocate_num' ] . "</td>";
  20. echo "<td>" . $arr[ 'phone' ] . "</td>";
  21. echo "<td>" . $arr[ 'address' ] . "</td>";
  22. echo "<td><font color='red'>" . $arr[ 'statue' ] . "</font></td>";
  23. echo "<td>" . $arr[ 're_date' ] . "</td>";
  24. echo "<td>" . $arr_take[ 'take_date' ] . "</td>";
  25. echo "<td>" . $arr_take[ 'finish_date' ] . "</td>";
  26. echo "<td><a href='de_jie.php?order_id=".$arr[ 'order_id']. "'>接单</a>/<a href='de_guan.php?order_id=".$arr[ 'order_id']. "'>关单</a></td>";
  27. echo "</tr>";
  28. }
  29. ?>

2、接单

快递员只能接收已分配状态的订单,在代码中体现,使用判断语句判断所选订单的状态,并返回相应的提示。 


  
  1. <?php
  2. session_start();
  3. require_once( 'mysql_connect.php');
  4. if(!$_SESSION[ 'deliver_id']){
  5. header( "Location:maskorder.php");
  6. exit( "非法访问!");
  7. }
  8. error_reporting(E_ERROR);
  9. $deliverid=$_SESSION[ 'deliver_id'];
  10. $orderid=$_GET[ 'order_id'];
  11. //查询快递员姓名
  12. $de_info = mysqli_query($link, "select * from delivers");
  13. $arr_de = mysqli_fetch_array($de_info);
  14. //判断是否已经接过该订单
  15. $jie = "select * from take where order_id='$orderid'";
  16. $jie_re = mysqli_query($link,$jie);
  17. $jie_row = mysqli_num_rows($jie_re);
  18. if($jie_row){
  19. echo "<script language='javascript'>";
  20. echo "alert('已经接过此订单,请勿重复操作!');";
  21. echo "window.location.href='deliver.php';";
  22. echo "</script>";
  23. }
  24. else{
  25. //将配送员信息插入接关单表
  26. $in_take = "insert into take values('".$deliverid. "','".$orderid. "','".$arr_de[ 'deliver_name']. "',now(),null)";
  27. mysqli_query($link,$in_take) or die( "接单失败".mysqli_error());
  28. //更新订单表中的状态信息,只能接已分配的订单
  29. $de_or_st= "update info set statue='已接单' where order_id='$orderid'";
  30. mysqli_query($link,$de_or_st) or die( "接单失败".mysqli_error());
  31. echo "<script language='javascript'>";
  32. echo "alert('接单成功!');";
  33. echo "window.location.href='deliver.php';";
  34. echo "</script>";
  35. }
  36. mysqli_free_result($de_info);
  37. mysqli_close($link);
  38. ?>

3、关单

快递员只能关闭已接单状态的订单,表示完成配送,与接单的逻辑同理。


  
  1. <?php
  2. session_start();
  3. require_once( 'mysql_connect.php');
  4. if(!$_SESSION[ 'deliver_id']){
  5. header( "Location:maskorder.php");
  6. exit( "非法访问!");
  7. }
  8. error_reporting(E_ERROR);
  9. $deliverid=$_SESSION[ 'deliver_id'];
  10. $orderid=$_GET[ 'order_id'];
  11. //更新订单表中的状态信息,只能关已接单的订单
  12. $jie= "select * from info where order_id='$orderid'";
  13. $jie_re = mysqli_query($link,$jie);
  14. $jie_arr=mysqli_fetch_array($jie_re);
  15. if($jie_arr[ 'statue']== '已分配'){
  16. echo "<script language='javascript'>";
  17. echo "alert('未接该订单,无法关单!');";
  18. echo "window.location.href='deliver.php';";
  19. echo "</script>";
  20. }
  21. elseif($jie_arr[ 'statue']== '已关单'){
  22. echo "<script language='javascript'>";
  23. echo "alert('该订单已关闭,请勿重复操作!');";
  24. echo "window.location.href='deliver.php';";
  25. echo "</script>";
  26. }
  27. else{
  28. //更新接关单表,关单状态
  29. //关单时间
  30. $up_time = "update take set finish_date=now() where order_id='$orderid'";
  31. mysqli_query($link,$up_time) or die( "关单时间错误".mysqli_error());
  32. $de_or_st= "update info set statue='已关单' where order_id='$orderid' and statue='已接单'";
  33. mysqli_query($link,$de_or_st) or die( "关单失败".mysqli_error());
  34. echo "<script language='javascript'>";
  35. echo "alert('关单成功!');";
  36. echo "window.location.href='deliver.php';";
  37. echo "</script>";
  38. }
  39. mysqli_free_result($jie_re);
  40. mysqli_close($link);
  41. ?>

六、系统实现总结

1、安全性

在系统完成进入调试阶段的时候,发现页面在没有登录的情况下,可以直接访问,所以需要在每个页面的头部加一个验证标志,一旦发现没有登录后的 session,直接跳到登录页面,要求用户输入账号和密码登录。具体实现是这样的:


  
  1. <?php
  2. session_start();
  3. if((! isset($_SESSION[ 'work_id'])) || (! isset($_SESSION[ 'user_id']))){
  4. header( "Location:maskorder.php");
  5. exit;
  6. }
  7. ?>

另外,在快递员登录系统查看已经分配到自己的订单,为了用户信息的安全性,对订单数据表建立了视图,保留快递员配送过程需要的用户信息。 

2、用户预约时间

用户预约的操作,为了将具体时间保存到预约订单数据表,供后台管理员查看用户预约信息,这里我遇到了一个问题,如何获取当前时间插入到数据库中,后来使用了 mysql 数据库的系统函数 now(),获取当前时间戳来实现。

3、前后端与数据库交互

这一次数据库应用系统设计中,遇到另一个难点是:如何处理前端表单返回的数据,并且与 mysql 数据库交互。我用到了后端开发的 php 连接数据库,对前端表单返回数据进行处理,通过 sql 语言对数据库进行一系列操作(查询、修改、插入、删除),这个阶段花费的时间相对比较长,前期我实现基本功能的交互,后期在交互过程中发现一些细节问题,比如用户只能在订单为被管理员处理时候修改预约信息管理员不能重复审核订单快递员只能关闭已接单状态的订单不能重复接单关单等细节问题,我在测试系统功能的这个过程不断思考这些细节问题,保证系统具备最基本和最合理的功能和需求,这也让我认识到数据库应用系统设计地各种需要注意的问题,完善功能需求是一个开发过程的重点。

系列文章:

  1. 口罩预约管理系统——数据库设计(前端+PHP+MySQL)
  2. 口罩预约管理系统——系统网站实现(前端+PHP+MySQL)

我的CSDN博客:https://blog.csdn.net/Charzous/article/details/108619341 


转载:https://blog.csdn.net/Charzous/article/details/108619341
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场