[第五组] 于浩——个人技术文档

场景

  

背景:

  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

        提供了刷新关注列表命令,关注用户命令,取关用户命令,获取排行榜命令

测试文档

  由于β版本实现时与我们预先设计发生了严重冲突,需要彻底重构框架,时间匆忙,没来得及写单元测试,但α版本的单元测试比较完善,见我上一篇博客:

  LovelyMother——α版本发布报告

    

 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

thank you for watching

      

猜你喜欢

转载自www.cnblogs.com/yh2480444683/p/9393759.html