z1.php 登录页面
<body> <h1>登录页面</h1> <form action="z2.php" method="post"> <div>用户名:<input type="text" name="uid" /></div> <div>密码:<input type="password" name="pwd" /></div> <input type="submit" value="登录" /> </form> </body> </html>
z2.php 登录后台处理页面
<?php session_start(); //如果登录成功把用户名和密码存放在session里面 $uid = $_POST["uid"]; $pwd = $_POST["pwd"]; require "./DBDA.class.php"; $db= new DBDA(); $sql = "select pwd from users where uid='{$uid}'"; $mm = $db->strquery($sql); if($pwd == $mm && !empty($pwd)) { $_SESSION["uid"]= $uid; header("location:z3.php"); }
z3.php 主页面
<body> <h1>主页面</h1> <div><a href="z4.php">发起流程</a> <a href="z6.php">审核流程</a></div> </body> </html>
z4.php 发起流程页面
<h1>发起流程</h1> <form action="z5.php" method="post"> <div>请选择发起的流程: <select name="lc"> <?php require "./DBDA.class.php"; $db = new DBDA(); $sql = "select * from liucheng"; $arr = $db->query($sql); foreach($arr as $v) { echo "<option value='{$v[0]}'>{$v[1]}</option>"; } ?> </select> </div> <br /> <div> 请输入发起的内容:<textarea name="nr"></textarea> </div> <input type="submit" value="发起" /> </form> </body> </html>
z5.php 发起流程后台处理页面
<?php session_start(); //这个页面需要当前登录的用户者的用户名,因为要存一下是谁发起的。 //这个页面数据还要往数据库里面送 $code = $_POST["lc"]; $nr = $_POST["nr"]; $uid = $_SESSION["uid"]; $time = date("Y-m-d H:i:s",time()); require "./DBDA.class.php"; $db = new DBDA(); $sql = "insert into userflow values('','{$code}','{$uid}','{$nr}',0,'{$time}',0)"; $db->query($sql,0); //发起一个流程就跳转到主页面 header("location:z3.php");
z6.php 流程审核页面
<title>无标题文档</title> </head> <body> <h1>流程审核页面</h1> <?php //这个页面还是显示userflow这张表的数据,只不过当流程没有走过这个人的时候不能显示, //只有走到他或者走过去了才能显示一下 session_start(); $uid = $_SESSION["uid"]; require "./DBDA.class.php"; $db= new DBDA(); //这个流程应该包含当前这个人才能显示,也就是说如果当前这个人不在这个流程节点里面的话就不用显示 //需判断包含当前这个人,可以用流程代号code来判断 //select code from flowpath where uids='{$uid}';这句话的意思是 //根据当前登录者查询流程节点表查出来有他参与的流程代号。 //查到有这个人的流程代号,然后再去查发起的流程中是这个流程代号的所有信息。就是这个人所参与过的。 //第一个条件是做当前登陆者参与的 //第二个条件是流程走到或者走过当前登陆者。可根据userflow表中towhere字段来表示 //第二个towhere的条件中code的条件需要用到相关子查询。 //相关子查询:子查询的条件要用到父查询的内容,子查询不能单独执行。 //无关子查询:子查询和父查询没有关系,子查询可以单独执行的。 //一上来先看父查询,select * from userflow a 只要执行这个查询,就会把userflow表中的所有数据都查看一遍 //看第一条数据请假流程的时候,去执行and的两个条件,去判断第一个条件和第二个条件都满不满足。 //在判断第二个条件满不满足的时候,执行第二个条件的时候外层是卡住的也就是在父查询有的前提下,并且满足第一个条件的时候才过来判断第二个条件。
第二个子查询在执行中他需要使用code值,他可以从父查询卡住的这条数据里面取。 $sql = "select * from userflow a where code in(select code from flowpath where uids='{$uid}')
and towhere >=(select orders from flowpath b where b.code=a.code and uids='{$uid}')"; $arr = $db->query($sql); //查到数据之后就可以显示了 //做个表头 echo "<table width='100%' border='1' cellpadding='0' cellspacing='0'> <tr> <td>流程代号</td> <td>发起者</td> <td>发起内容</td> <td>是否结束</td> <td>发起时间</td> <td>操作</td> </tr>"; //上面是做一个表头,下面是可以输出每一个tr了 foreach($arr as $v) { //如果当前这个张三审核通过了,那就显示一个已审核通过了。如果没审核,就显示一个a标签。 $zt = "<a href='z7.php?code={$v[0]}'>通过</a>"; //在这里判断一下,这个流程是刚好走到这个人的位置,还是已经走过了。 $sql = "select orders from flowpath where code='{$v[1]}' and uids='{$uid}'"; $wz = $db->strquery($sql); if($v[6]>$wz) { //当前的人流程走到的位置大于当前人的位置就说明这个人点过通过了。 //如果通过了的话就不显示这个a标签了,就显示一个已通过 $zt = "<span style='color:green'>已通过</span>"; } echo "<tr> <td>{$v[1]}</td> <td>{$v[2]}</td> <td>{$v[3]}</td> <td>{$v[4]}</td> <td>{$v[5]}</td> <td>{$zt}</td> </tr>"; } echo "</table>"; ?>
z7.php
<?php $ids = $_GET["code"]; //这个张三一点击通过,这个流程应该走到下一个审核的人,也就是towhere加个1 require "./DBDA.class.php"; $db= new DBDA(); $sql = "update userflow set towhere = towhere+1 where ids='{$ids}'"; $db->query($sql,0); //判断流程是否结束 //逻辑就是需要根据流程代号取flowpath表里找最大的orders,如果发现towhere大于3了就结束了。 //如果要找到最大orders也就是最后一个审核人的话,就要知道流程代号code,通过ids来找code $sql = "select max(orders) from flowpath where code=(select code from userflow where ids='{$ids}')";//这句话就可以找到,该流程下的这个人的最大顺序。 $maxsx = $db->strquery($sql); $sql = "select towhere from userflow where ids='{$ids}'"; $towhere = $db->strquery($sql); if($towhere>$maxsx) { //如果结束了,修改状态 $sql = "update userflow set isok = 1 where ids='{$ids}'"; $db->query($sql,0); } header("location:z6.php");