一,绘制UML图
1.用例图:
本系统的使用者(User)主要分为用户(Patient)和管理者(Manager),用户无需登录,只需输入身份信息就可以预约核酸检测和查看检测结果。管理员需要正确输入密码才可开启权限,修改限制预约人数和上传检测结果。
2.类图
3.时序图
二,利用超过两种模式进行设计
1.模板模式:定义一个操作中的算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以不改变一个算法的结构即可重定义该算法的某些特定步骤。
建立抽象类User,声明用户和管理员共有属性身份证号(IDNumber),姓名(Name)和密码(Pin),并设置他们可被读取。声明抽象函数doResult,在Patient和Manager类中实例化。
public abstract class User{protected int IDNumber;protected string name;protected int Pin;public int PIN{get {return Pin; }}public int IDNUMBER{get {return IDNumber; }}public string NAME{get {return name; }}public abstract bool doResult(string a,string b);}
Patient类中的实例化
public override bool doResult(string IDNum,string b){string sql = "SELECT * FROM Message where IDNum=" + this.IDNumber;DataSet ds = DBHelper.Getlist(sql);if (ds.Tables[0].Rows.Count > 0){string str = "";for (int i = 0; i < ds.Tables[0].Rows.Count; i++){str += $"身份证号:{ds.Tables[0].Rows[i][0].ToString()},结果:{ds.Tables[0].Rows[i][2].ToString()}\r\n";}return true ;}else{return false ;}}
在Manager类中的实例化
public override bool doResult(string IDNum,string result){string sql = $"UPDATE Message SET result = '{result}'WHERE IDNum ={IDNum}";bool re = DBHelper.Excute(sql);return re;}
2.工厂模式:简单工厂模式概念(Simple Factory Pattern):定义一个工厂类,它可以根据参数的不同返回不同类的实例,被创建的实例通常都具有共同的父类。因为在简单工厂模式中用于创建实例的方法是静态(static)方法,因此简单工厂模式又被称为静态工厂方法(Static Factory Method)模式,它属于类创建型模式。
基类为:用户类User
派生类为:管理员类Manage,用户类Patient
构建简单工厂:
public class UserFactory{public UserFactory(){}public static User choose(int IDNumber, string name, int Pin){if(IDNumber==1123) return new Manager(1123, "Surilly", 1234);elsereturn new Patient(IDNumber, name);}}
包含了创建具体类的静态方法,通过传入的参数来选择需要创建的对象是管理员还是预约者
不使用工厂创建对象:
public static Manager ma = new Manager(001, "Surilly", 1234);
通过工厂来创建对象:
创建管理员对象,管理员账号密码为确定值
UserFactory UserFact = new UserFactory();public static User ma = UserFactory.choose(1123, "Surilly", 1234);
创建用户对象,用户身份证号和姓名需要从textbox获取
int pID = int.Parse(textBox1.Text);string pName = textBox2.Text;UserFactory UserFact = new UserFactory();User p = UserFactory.choose(pID,pName,1);
3.实现功能展示
主界面
用户预约检测
管理员登录
管理员提交检测结果
用户查询结果
三,Web服务开发实验
通过C#实现SOAP并成功用客户端进行调用
创建webService工程,发布WebMethod,主要功能为检查用户输入的身份证号是否合法以及根据身份证号获取信息
public class WebService1 : System.Web.Services.WebService{[WebMethod]public string HelloWorld(){return "Hello World";}[WebMethod]public bool CheckIDNum(string Id){int l = Id.Length;if (l != 18){return false;}long n = 0;if (long.TryParse(Id.Remove(17), out n) == false || n < Math.Pow(10, 16) || long.TryParse(Id.Replace('x', '0').Replace('X', '0'), out n) == false){return false;//数字验证}string address = "11x22x35x44x53x12x23x36x45x54x13x31x37x46x61x14x32x41x50x62x15x33x42x51x63x21x34x43x52x64x65x71x81x82x91";if (address.IndexOf(Id.Remove(2)) == -1){return false;//省份验证}string birth = Id.Substring(6, 8).Insert(6, "-").Insert(4, "-");DateTime time = new DateTime();if (DateTime.TryParse(birth, out time) == false){return false;//生日验证}string[] arrVarifyCode = ("1,0,x,9,8,7,6,5,4,3,2").Split(',');string[] Wi = ("7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2").Split(',');char[] Ai = Id.Remove(17).ToCharArray();int sum = 0;for (int i = 0; i < 17; i++){sum += int.Parse(Wi[i]) * int.Parse(Ai[i].ToString());}int y = -1;Math.DivRem(sum, 11, out y);if (arrVarifyCode[y] != Id.Substring(17, 1).ToLower()){return false;//校验码验证}return true;//符合GB11643-1999标准}[WebMethod]public string[] GetCardIdInfo(string cardId){string[] info = new string[4];info.SetValue(cardId.Substring(0, 6), 0);info.SetValue(cardId.Substring(6, 8), 1);info.SetValue(cardId.Substring(14, 3), 2);info.SetValue(Convert.ToInt32(info[2]) % 2 != 0 ? "男" : "女", 3);return info;}}
webService发布成功展示
发送Soap请求(以GetCardIdInfo为例)
POST /WebService1.asmx HTTP/1.1Host: localhostContent-Type: text/xml; charset=utf-8Content-Length: lengthSOAPAction: "/GetCardIdInfo"<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:soap="/soap/envelope/"><soap:Body><GetCardIdInfo xmlns="/"><cardId>string</cardId></GetCardIdInfo></soap:Body></soap:Envelope>
响应SOAP请求
HTTP/1.1 200 OKContent-Type: text/xml; charset=utf-8Content-Length: length<?xml version="1.0" encoding="utf-8"?><soap:Envelope xmlns:xsi="/2001/XMLSchema-instance" xmlns:xsd="/2001/XMLSchema" xmlns:soap="/soap/envelope/"><soap:Body><GetCardIdInfoResponse xmlns="/"><GetCardIdInfoResult><string>string</string><string>string</string></GetCardIdInfoResult></GetCardIdInfoResponse></soap:Body></soap:Envelope>
成果展示
当输入正确身份证时,显示姓名性别
当身份证不合法时,无法进行预约
当年龄不够时,无法进行疫苗接种