搭建asp会议签到系统
第一章 账密登录
第二章 生成会议签到二维码
第三章 会议签到
第四章 会议统计
前言
前文已说如何登录以及如何生成会议二维码,本篇将继续说明如何进行签到。
原理很简单:手机(微信、支付宝等)通过扫一扫,识别并进入会议签到url。
提示:以下是本篇文章正文内容,下面案例可供参考
一、制作checkin前端页面
员工通过扫一扫进入到此页面,获取会议相关信息(如会议开始时间、会议主题等),以便让员工再次确认。
<asp:TextBox ID="REASON" runat="server" class="form-control"></asp:TextBox>
<script>
//JS前端实现palacehold,注意:MainContent的用法,这里不多作介绍。
jQuery(document).ready(function () {
$("#MainContent_REASON").attr('placeholder', '如缺席,请不要写类似:有事/请假等含糊理由。');
});
</script>
布置3个按钮:签到、请假、出差
(因实际情况,我本来设计是2个,签到和缺席,但后来公司管理需要把缺席拆为请假、出差)
<asp:Button ID="CIN" type="button" class="btn btn-success" runat="server" Text="签到" OnClick="Button1_Click"/>
<asp:Button ID="CLEA" type="button" class="btn btn-warning" runat="server" Text="请假" OnClick="Button1_Click"/>
<asp:Button ID="COUT" type="button" class="btn btn-info" runat="server" Text="出差" OnClick="Button1_Click"/>
虽然有3个按钮,但点击事件是同一个,以ID区分
protected void Button1_Click(object sender, EventArgs e)
{
var flag = ((Button)sender).ID;
CHECKID.Text = flag;
Checkin();
}
二、读取并展示历史会议签到信息
获取会议二维码的参数ID并同时展示该会议的历史签到信息。
//页面加载首先执行几个事件,下面具体方法会讲到
protected void Page_Load(object sender, EventArgs e)
{
meetid.Text = Request.QueryString["meetid"];
GetQRMeet();//获取历史会议签到信息
TimeCheck();//校验时间以控制会议签到
}
二.1 获取历史会议签到信息
private void GetQRMeet()
{
//获取当前页面的会议ID
var meeid = meetid.Text;
//获取当前页面的登录ID
var USERID = Context.User.Identity.Name;
string DC6;
DC6 = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DC6"].ToString();
using (SqlConnection conn = new SqlConnection(DC6))
{
conn.Open();
//这里隐去了几个获取项,按需从数据库取出即可
SqlCommand L4 = new SqlCommand("SELECT StartTime FROM VW_HYXX where MeeID = '" + meeid + "'", conn);
//meetcheck 这个表用于存放会议签到信息,下面会详细讲到
SqlCommand L5 = new SqlCommand("SELECT CASE WHEN STU='1' THEN '正常签到' WHEN STU='2' THEN '迟到' WHEN STU='3' THEN '请假' WHEN STU='5' THEN '出差' ELSE '暂无您的签到信息' END checkinfo,CHECKDT,REASON FROM meetcheck WHERE MEETID = '" + meeid + "' AND USERID= '" + USERID + "' ", conn);
object obj4 = L4.ExecuteScalar();
SqlDataReader sread = L5.ExecuteReader();
if (obj4 != null)
{
meetime.Text = obj4.ToString();
cksta.Text = "暂无您的签到信息";
cktime.Text = "";
if (sread.Read())
//如果该会议ID和员工ID已存在会议签到信息了,则代表员工已处理过签到,就把历史签到信息拉出来并存入相应前端控件
{
REASON.Text= sread["REASON"].ToString();
cksta.Text = sread["checkinfo"].ToString();
cktime.Text = sread["CHECKDT"].ToString();
}
}
conn.Close();
}
}
二.2 校验时间以控制会议签到
protected void TimeCheck()
{
var MEETBDT = meetime.Text;
var MEETTOP = meetsub.Text;
var CHECKDT = DateTime.Now.ToString();
DateTime startTime = Convert.ToDateTime(MEETBDT);
DateTime endTime = Convert.ToDateTime(CHECKDT);
TimeSpan ts = endTime - startTime;
if ((ts.TotalMinutes >= 5 & ts.TotalMinutes <= 30) || ts.TotalHours <= -0.5)
{
//如果当前签到时间 超出会议开始时间5分钟或早于会议开始时间半小时,签到按钮关闭,只允许请假和出差,以防提前签到和无限补签
CIN.Visible = false;
return;
}
if (ts.TotalMinutes > 30)
{
//如果当前签到时间 超出会议开始时间30分钟所有按钮关闭
CHECKINFO.Visible = true;
CHECKINFO.Text = "签到已结束,请联系会议组织者!";
CLEA.Visible = false;
COUT.Visible = false;
CIN.Visible = false;
}
}
三、签到信息存储
首先要去建一张表meetcheck ,
CREATE TABLE [dbo].[meetcheck](
[MEETID] [nvarchar](20) NOT NULL,//会议ID
[ROOMID] [nvarchar](20) NULL,//参会的会议室ID
[USERID] [nvarchar](20) NOT NULL,//员工ID
[MEETBDT] [datetime] NULL,//会议开始时间
[CHECKDT] [datetime] NULL,//签到时间
[DELFLAG] [int] NULL,//有效标志
[IP] [nvarchar](20) NULL,//手机端或PC端的IP,如果能再记录GPS就更好了
[HOSTNAME] [nvarchar](20) NULL,//主机名
[STU] [int] NULL,//签到状态,1代表正常签到,2迟到,3请假,5出差(为什么没有4……)
[REASON] [nvarchar](50) NULL,//理由
CONSTRAINT [PK_meetcheck] PRIMARY KEY CLUSTERED
(
[MEETID] ASC,
[USERID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
有了存储表后,下面就无非就是insert和update了
protected void Checkin()
{
var ctext = CHECKID.Text;
var MEETBDT = meetime.Text;
var MEETTOP = meetsub.Text;
var reason = REASON.Text;
var CHECKDT = DateTime.Now.ToString();
DateTime startTime = Convert.ToDateTime(MEETBDT);
DateTime endTime = Convert.ToDateTime(CHECKDT);
TimeSpan ts = endTime - startTime;
var stu = '1';
if (ctext== "CIN" & ts.TotalMinutes >= 1)
{
stu = '2';
//签到时间晚于开始时间1分钟后,就算按了签到,也算迟到
}
if (ctext == "CLEA")
{
stu = '3';
}
if (ctext == "COUT")
{
stu = '5';
}
if((stu == '3' || stu == '5') & reason == "")
{
//请假和出差的理由必填
Response.Write("<script>alert('请填写出差或请假事由!')</script>");
return;
}
else
{
var meeid = meetid.Text;
var ROOMID = ROOMIndex.Text;
var USERID = Context.User.Identity.Name;
//获取移动端和PC端的IP
var CIP = Page.Request.UserHostAddress;
//获取移动端和PC端的主机名
var CNAME = Page.Request.UserHostName;
string DC6;
DC6 = System.Web.Configuration.WebConfigurationManager.ConnectionStrings["DC6"].ToString();
using (SqlConnection conn = new SqlConnection(DC6))
{
conn.Open();
SqlCommand L2 = new SqlCommand("select CHECKDT from meetcheck where meetid = '" + meeid + "' AND USERID= '" + USERID + "' ", conn);
object obj2 = L2.ExecuteScalar();
if (obj2 != null)
{
//如果签到信息里有相关信息,则做更新
//有时候会出现先请假然后取消再出席的情况
SqlCommand U2 = new SqlCommand("UPDATE meetcheck SET CHECKDT='" + CHECKDT + "' ,ROOMID='" + ROOMID + "',STU='" + stu + "',IP='" + CIP + "',HOSTNAME='" + CNAME + "',REASON='" + reason + "' where meetid = '" + meeid + "' AND USERID= '" + USERID + "' ", conn);
object obj3 = U2.ExecuteScalar();
Response.Write("<script>alert('成功更新签到信息!')</script>");
}
else
{
//如果签到信息里没有相关信息,则做插入
SqlCommand I2 = new SqlCommand("INSERT INTO meetcheck (MEETID,ROOMID,USERID,MEETBDT,CHECKDT,DELFLAG,IP,HOSTNAME,STU,REASON) VALUES ('" + meeid + "' ,'" + ROOMID + "','" + USERID + "','" + MEETBDT + "' ,'" + CHECKDT + "' ,'0' ,'" + CIP + "' ,'" + CNAME + "' ,'" + stu + "' ,'" + reason + "') ", conn);
object obj3 = I2.ExecuteScalar();
Response.Write("<script>alert('成功记录会议签到信息!')</script>");
//刷新当前页面
Response.Redirect(Request.Url.ToString());
}
conn.Close();
}
}
}