标签:summary ice font nav 场景 实现 progress tin ram
背景:
1) 典型用户: 郭靖(主要),黄蓉(主要)
2) 用户的需求/迫切需要解决的问题
a. 黄蓉:你都打了一天游戏了,什么时候写个人技术文档呀?明天就要交了,小心老师不给你过!
b. 郭靖:哎呀,我玩着玩着就给忘了...都怪这游戏太好玩了,早上就想写来着,不知不觉就玩到晚上了。
c. 黄蓉:我也不能一直管着你,还得靠你自觉呀。
3) 假设:
a. 用户有一定自制力、愧疚感。
b. 用户想要在一段时间内专注工作或学习。
场景:
郭靖打开了LovelyMother App,登录了自己的GitHub账号,粗略估计自己的个人技术文档需要写两个小时,于是他拨动了主页面的时钟,设置时间为两小时,根据提醒打开了不想干扰自己的游戏以及软件等,根据提示关闭了这些软件,选择这些软件加入黑名单,点击开始!工作了一小时后想打会游戏安慰一下自己,偷偷打开了游戏,突然弹出置顶窗口,开始播放音乐,他发现这根本没办法玩游戏,无奈只能关闭游戏,一切恢复平静,他再次回到了工作状态,又过了一小时,郭靖完成了个人技术文档,任务计时完成。他打开了好友排行榜,看到自己因为又工作了两小时而获得榜首,开心的笑了~
标题:专心工作
角色:用户
主要成功场景:
1. 打开软件
2. 登录GitHub账号
3. 查看历史任务
4. 返回主界面
5. 设置任务时长
6. 选取黑名单
7.开始计时
8.计时完成
9.查看关注列表
10.关注/取关好友
11.查看排行榜
扩展场景:
2.1. GitHub账号无法登录
6.1 黑名单列表过长,服务器响应缓慢
9.1关注列表过长,服务器响应缓慢
11.1关注过多,服务器响应缓慢
1. 界面
因可视化课程上学习过界面设计,所以本次实习我专注于负责后台代码实现,此处就不附界面截图了。
2. 服务器与服务器端数据库
(1) IdentityService4.0
采用IdentityService4.0进行身份验证,用户登录行为交由GitHub代理,实现安全登录验证,服务器端IdentityService4.0架构搭建参考了张老师的项目。
<1>注入证书
<2>修改Config.cs中的回调地址
<3>用于身份验证自动生成的类。
<4>在IdentityService4.0身份验证时需要运行回调函数 ExternalLoginCallback(),我在其准备创建用户时将GitHub用户信息读出,并将其注册到我们App的服务器数据库中。
<5>在某个Controller中需要读取当前登录用户信息时,需要通过依赖注入的方式将UserManager注入进来,并在开头声明授权方式。
<6>UserManager获得当前用户的ApplicationUserID
(2)EFCore SQL Server
<1>数据类
<2>数据上下文
服务器端采用EFCore SQL Server 搭建数据库,和SQLite方法类似,但由于不会自动识别出有歧义的外键关联,需要手动声明:
<3>Migration
通过程序包管理器控制台输入命令:Add-Migration [MigrationName](Remove-Migration) 来加入或删除迁移。
若数据库有所改动,需要先清除迁移 --> 删除数据库 --> 加入迁移 --> 更新数据库。
(3)Controller处理请求
<1> Get方法
Get方法我使用了三种:
①[HttpGet] 方法中不传入参数,URL请求访问Route即可
②[HttpGet] 方法中传入参数,URL请求格式:[Route]?[NameofParameter]=[Parameter]
注:与第一种Get请求不能同时出现
③[HttpGet("{id}")] 需要配合[FromRoute]使用,URL请求格式: [Route]/[Parameter]
<2>Post请求
配合[FromBody]使用,可传入参数和一个Json
<3>Put请求
与Post请求类似
<4>Delete请求
与Get请求类似
2. 客户端与本地服务
(1) MVVM设计模式
将软件设计为MVVM模式,即M——Model V——View VM——ViewModel 。Model即数据类,View为界面视图,ViewModel为数据管理与显示模块,通过注入Service服务,用Service服务提供对数据的读取修改等操作,再将包装好的数据绑定在前端View上显示,完美的将业务逻辑从前端分离出来。
(2)Simpleioc 依赖注入容器
由于我们的项目中包含大量Service以及ViewModel,每次需要使用时需要实例化一个对象,重复代码多,并且每个对象互相独立,不方便管理,于是决定采用MvvmLight提供的Simpleioc容器(类似于单件模式),初始化一个容器,在其中注入所有的Service,并注入ViewModel,这样在ViewModel想要服务时容器会从注入的服务中寻找并返回给它,这样所有的对象都只被实例化一次且每次需要用的时候也将其返回。
/// <summary> /// ViewModel定位器。 /// </summary> public class ViewModelLocator { /// <summary> /// ViewModel定位器单件。 /// </summary> public static readonly ViewModelLocator Instance = new ViewModelLocator(); /// <summary> /// 构造函数。 /// </summary> private ViewModelLocator() { SimpleIoc.Default.Register<ILocalTaskService, LocalTaskService>(); SimpleIoc.Default.Register<ILocalBlackListProgressService, LocalBlackListProgressService>(); SimpleIoc.Default.Register<IRootNavigationService, RootNavigationService>(); SimpleIoc.Default.Register<IIdentityService, IdentityService>(); SimpleIoc.Default.Register<IDialogService, DialogService>(); SimpleIoc.Default.Register<IUserService, UserService>(); SimpleIoc.Default.Register<IProcessService, ProcessService>(); SimpleIoc.Default.Register<IUserService, UserService>(); SimpleIoc.Default.Register<IWebTaskService, WebTaskService>(); SimpleIoc.Default.Register<IFriendService, FriendService>(); SimpleIoc.Default.Register<LoginViewModel>(); SimpleIoc.Default.Register<UpdateUserViewModel>(); SimpleIoc.Default.Register<CountDownViewModel>(); SimpleIoc.Default.Register<WebTaskViewModel>(); SimpleIoc.Default.Register<TaskViewModel>(); SimpleIoc.Default.Register<FriendAndRankListViewModel>(); SimpleIoc.Default.Register<AddProgressViewModel>(); } /// <summary> /// 获得登录ViewModel。 /// </summary> public LoginViewModel LoginViewModel => SimpleIoc.Default.GetInstance<LoginViewModel>(); /// <summary> /// 获得倒计时ViewModel /// </summary> public CountDownViewModel CountDownViewModel => SimpleIoc.Default.GetInstance<CountDownViewModel>(); /// <summary> /// 获得进程管理服务ViewModel /// </summary> public AddProgressViewModel AddProgressViewModel => SimpleIoc.Default.GetInstance<AddProgressViewModel>(); /// <summary> /// 获得日程ViewModel /// </summary> public TaskViewModel TaskViewModel => SimpleIoc.Default.GetInstance<TaskViewModel>(); public UpdateUserViewModel UpdateUserViewModel => SimpleIoc.Default.GetInstance<UpdateUserViewModel>(); public FriendAndRankListViewModel FriendAndRankListViewModel => SimpleIoc.Default.GetInstance<FriendAndRankListViewModel>(); public WebTaskViewModel WebTaskViewModel => SimpleIoc.Default.GetInstance<WebTaskViewModel>(); }
(3)Service服务
客户端服务中我负责与服务器通信部分,包含登录、任务、默认黑名单等服务。红色标注为我负责部分。
<1>IdentityService服务
IdentityService主要功能是身份验证,将GitHub登录结果保留下来,即accessToken 和 refreshToken,并不用传输用户名和密码,极大的保证了用户的安全性。
<2>UserService服务
UserService主要功能是提供用户服务,包括:获取当前用户,修改当前用户的用户名、头像、任务时长
<3>WebTaskService服务
WebTaskService主要功能是与服务器通信,对服务器数据库中保存的用户的历史任务进行增删改查
<4>FriendService服务
FriendService主要功能是提供好友服务,包括:关注某个用户,取关某个用户,获取当前排行榜
<5>WebBlackListProgressService服务
WebBlackListProgressService主要功能是与服务器通信,对服务器数据库中保存的默认黑名单进行增删改查,只对管理员开放,因为目前还在调试阶段,所以还未设置权限
<6>RootNavigationService服务
RootNavigationService提供页面跳转服务,将页面跳转逻辑从View层分离出来,进一步解耦
<7>DialogService服务
DialogService提供弹窗服务,将弹窗功能也从View层分离,进一步解耦
<8>ServiceResult类
将服务器返回结果与返回信息进行包装,并巧妙的运用了重载的原理,此处借鉴老师的demo
(4)ViewModel
<1>LoginViewModel
提供了登录命令
<2>UpdateUserViewModel
提供了刷新用户命令,更新用户命令,跳转命令
<3>WebTaskViewModel
提供了刷新任务列表命令,新增任务命令,删除任务命令
<4>FriendAndRankListViewModel
提供了刷新关注列表命令,关注用户命令,取关用户命令,获取排行榜命令
由于β版本实现时与我们预先设计发生了严重冲突,需要彻底重构框架,时间匆忙,没来得及写单元测试,但α版本的单元测试比较完善,见我上一篇博客:
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
thank you for watching
标签:summary ice font nav 场景 实现 progress tin ram
原文地址:https://www.cnblogs.com/yh2480444683/p/9393759.html