用例名称:IP网关
角色:用户
主要成功场景:
- 用户在左侧菜单栏里点击IPGW的按钮,跳转到IPGW页面
- 由于此时尚未登录,在应用右侧有一个弹出窗口要求登录,主页面本身模糊
- 用户输入用户名、密码,点击窗口中的“确认”按钮
- 用户成功登录时,主页面模糊解除,显示用户登陆账户的相关数据(已用流量、已用时长、账户余额、IP地址),在数据下面有一个注销按钮
- 登录之后用户点击“注销”按钮,界面恢复到登录之前的状态,即主界面模糊,右侧有一个登录的弹出窗口
异常情况:
- 需要网络请求的步骤都有可能会由于网络问题或者输入数据问题导致出错,此时弹窗提示错误信息,本次操作不产生任何效果
功能说明书
目标:实现到ipgw.neu.edu.cn的登录,以及账号管理操作
用户:希望登录IP网关的用户
典型场景:IP网关登录
用户操作:
- 打开应用
- 进入IPGW页面
- 登录上网账号
- 查看上网账号数据
- 已登录后,可点击“注销”按钮退出上网账号
边界条件:用户名和密码输入均不可为空
技术说明书
界面:
- 为实现页面间跳转,需要一个HamburgerMenu, 其中需要使用SplitView, SplitView.Pane设置为ListBox(ListView也可);列表的Item设置为PageButtonData(见下),内容利用ItemTemplate(DataTemplate)设置。SplitView.Content设置为一个Frame, 为了当内容过多时加上滚动条,Frame外部还需要包裹一个ScrollViewer。界面跳转使用Frame.Navigate实现
- 登录页面设计为从右侧弹出的附加窗口,并且当点击到功能页面时该附加窗口不应该收起,因此需要SplitView, 模式为CompactInline; 登录页面因为需要复用(教务处登录和IPGW登录并不是同一套密码),因此设计为单独的Control
- 登录页面的用户名输入框为TextBox(为了登录过的用户,之后可以改成AutoSuggestionBox), 密码输入框为PasswordBox, 保存密码设置选项为CheckBox,并取消IsThreeState
- 登录之后的数据展示为TextBlock, 内容使用Binding设置(x:Bind也可)
逻辑:
- 设置PageButtonData继承于DependencyObject,从而能添加可用于XAML的属性(参考文档attached property)。在此我们需要的是按钮的图标(Glyph: string)、文字标签(Label: string)、跳转目标页面(Page: System.Type)三个属性。
- 将页面和数据独立开,设置一个ViewModel, 并设置为页面的DataContext
- 登录控件设置一个事件Finished,当点击确定按钮时触发;其他使用者注册一个Finished事件的处理函数,接受登录页面传来的数据,在这个处理函数里面执行真正的登录操作
- 为了提示Binding数据已更新,ViewModel需要实现接口System.ComponentModel.INotifyPropertyChanged并在修改成员的地方手动NotifyPropertyChanged(参考文档INotifyPropertyChanged Interface)
- 为了保存用户的密码,需要在LocalFolder里使用自定义文件保存数据,或者使用Windows.Storage.ApplicationData.Current.LocalSettings利用Windows的数据存储API,我们选择了前者(参考文档store-and-retrieve-app-data)
- 登录时,需要使用一个单例(官方推荐使用方式)的Windows.Web.Http.HttpClient(System.Net.Http.HttpClient也可以,但是二者本身和配套设备的API有不小的区别)作为请求收发者,创建一个到http://ipgw.neu.edu.cn/include/auth_action.php的POST请求,组装成HttpRequestMessage发出去,处理返回的HttpResponseMessage
- 由于auth_action.php当登录错误(用户名或密码错误)时不返回任何数据,登录成功时也只是Response多了一个Set-Cookie HTTP头,因此将登录失败和网络问题导致的失败(超时、断连等等)视为同一种错误