编可视化程序设计技术及应用培训
01
HelloWorld
环境安装
课程简介
平台简介
HelloWorld
Hello World(小程序)
02
控件
参考代码
网格布局
堆栈布局
滚动视图
超链接按钮
弹出信息
开关
滑块与数据绑定
网格布局(小程序)
开关(小程序)
03
高级控件
参考代码
VisualStateManager
显示一组数据
控件的套路
显示一组数据(小程序)
04
管理数据
数据的类型
管理零散的数据:偏好存储
管理批量的数据:数据库
访问远程数据:Web服务
管理零散的数据:偏好存储(小程序)
管理批量的数据:数据库(小程序)
访问远程数据:Web服务(小程序)
参考代码
05
Model-View-ViewModel(MVVM)模式
MVVM模式简介
ViewModel与可绑定属性
可绑定命令
ViewModelLocator与依赖注入
全局资源与数据绑定
重新审视MVVM
数据绑定的技术本质
可绑定命令的技术本质
MVVM的小程序实现(小程序)
参考代码
06
MVVM + IService架构
重构Database项目
RelayCommand与Live Template
IService
实现IService
整合ViewModel与IService
View与ViewModelLocator
反思MVVM + IService架构
定义并实现Service(小程序)
整合ViewModel与Service(小程序)
参考代码
07
开启Dpx项目:重新审视数据库
项目模板
参考代码
主从项目模板
了解诗词数据库
诗词类与实体关系映射
布局属性与字符串常量
预览属性与可忽略映射
设计诗词存储服务接口
编码规范
实现诗词存储1:const与static readonly
实现诗词存储2:创建嵌入式资源文件
实现诗词存储3:部署嵌入式资源文件
实现诗词存储4:追踪数据库版本
实现诗词存储5:操作数据库
08
源代码管理
简介
创建项目
同步代码
解决冲突
撤销更改
分支开发
09
单元测试数据库
创建测试项目
断言文件是否存在
测试初始化数据库
为测试而修改设计1:剥离无法测试的代码
Mock接口与清理副作用
测算代码覆盖率
验证Mock函数调用
Mock函数功能
测试帮助类
为测试而修改设计2:关闭数据库
完成测试
10
搜索结果页View与ViewModel
搜索结果页View:准备工作
设计时数据
在ListView的底端显示数据
搜索结果页ViewModel:准备工作
无限滚动:准备工作
无限滚动:实现
在页面显示时加载数据
单元测试可绑定属性
单元测试可绑定命令
连接View与ViewModel:准备工作
将命令关联到事件
为测试运行而修改设计
无限滚动:设置控件行为
11
开启Dpx-Mini项目:小程序数据库(小程序)
创建项目(小程序)
数据库服务(小程序)
诗词存储服务:定义成员变量(小程序)
诗词存储服务:获取一条数据(小程序)
诗词存储服务:获取一组数据(小程序)
搜索结果页:定义成员变量(小程序)
搜索结果页:在页面显示时加载数据(小程序)
搜索结果页:为无限滚动载入数据(小程序)
搜索结果页:关联View与ViewModel(小程序)
搜索结果页:使用wxs处理View数据
搜索结果页:界面美化
12
导航
导航服务接口
导航功能介绍
访问MainPage
Xamarin.Forms的NavigationPage
导航与MVVM + ISerivce架构
定义页面键
创建页面实例:不优雅的做法
缓存页面实例
使用内容导航服务
创建页面实例:优雅的做法
带参数导航:介绍
带参数导航:自定义可绑定属性
带参数导航:绑定到自定义可绑定属性
带参数导航:赋值到自定义可绑定属性
13
值转换器
诗词详情页
定义值转换器
单元测试值转换器
使用值转换器
向可绑定命令传递参数
带参数的可绑定命令
单元测试带参数的可绑定命令
使用值转换器向可绑定命令传递参数
反思带参数导航与值转换器
14
导航(小程序)
准备工作(小程序)
内容导航服务(小程序)
诗词详情页:按条件生成CSS(小程序)
诗词详情页:处理缩进(小程序)
调用导航服务(小程序)
测试导航服务(小程序)
15
收藏存储
设计收藏存储服务
设计收藏Model
更新收藏存储服务的设计
实现收藏存储服务
准备单元测试
测试收藏存储
在诗词结果页上显示收藏状态:ViewModel部分
在诗词结果页上显示收藏状态:View部分
Switch控件的神奇问题
修复收藏存储的错误
16
收藏存储(小程序)
收藏存储:读取数据(小程序)
收藏存储:保存数据(小程序)
在诗词结果页上显示收藏状态:读取数据(小程序)
在诗词结果页上显示收藏状态:保存数据(小程序)
17
LINQ、线程安全与事件
准备诗词收藏页ViewModel
LINQ与await
诗词收藏页View
诗词收藏页的数据重复加载问题
线程安全问题
两阶段加锁
跨页面同步数据:简介
跨页面同步数据:定义事件
跨页面同步数据:处理事件
跨页面同步数据:单元测试事件
18
事件(小程序)
诗词收藏页(小程序)
在回调函数中关联数据(小程序)
回调函数与变量的作用域(小程序)
利用回调函数实现事件(小程序)
19
根导航
设计根导航服务
实现根页面激活服务
实现根导航服务
导航菜单页View
导航菜单页ViewModel
整合导航菜单页View与ViewModel
初始化App:初始化页ViewModel
初始化App:初始化页View
解决根导航的错误
20
根导航(小程序)
小程序根导航(小程序)
21
跨设备同步数据
跨设备同步功能介绍
为同步更新设计:本地数据
设计远程收藏存储服务
设计同步服务接口
实现同步服务
同步算法
单元测试同步服务
22
与OneDrive同步
安装Microsoft Graph客户端
注册App ID
基于OneDrive的远程收藏存储
登录到OneDrive
测试登录
其他与登录有关的函数
压缩收藏数据
上传收藏数据到OneDrive
从OneDrive下载收藏数据
数据同步页ViewModel
数据同步页View
23
访问Web服务
设计诗词推荐服务接口
可以使用拼音命名变量么?
访问Web服务:错误的方法
HttpClient存在的问题
处理网络异常
在主线程上执行UI交互
优雅地生成错误信息
将非正常HTTP状态码处理为异常
简测GetToken函数
获取诗词推荐
简测GetTodayPoetry函数
生成随机推荐
总结
24
单元测试Web服务
简介
使用SoapUI Mock Web服务
使用SwitchHosts解析域名
反向代理服务器:简介
安装node-http-proxy
准备KeyTool
使用KeyTool生成密钥存储
使用KeyStore Explorer生成p12文件
将p12证书导入到操作系统
为服务器生成证书
Mock HTTPS Web服务
单元测试Web服务客户端
Mock并测试Sentence服务客户端
总结
25
文件的下载与缓存
简介
设计今日图片服务
设计今日图片存储服务
利用图片存储服务读取图片
理解必应每日图片服务
检查图片更新的策略与方法
测试TodayImageService
实现图片存储服务
诗词推荐页ViewModel
诗词推荐页View
将字节数组转换为图像源
多线程
深入await/async
深入依赖注入
26
访问Web服务(小程序)
警告服务(小程序)
偏好存储(小程序)
生成错误信息(小程序)
访问今日诗词服务:准备工作(小程序)
访问今日诗词服务:获得Token(小程序)
访问今日诗词服务:获得诗词推荐(小程序)
生成随机推荐(小程序)
27
显示图片与检查更新(小程序)
图片信息存储服务(小程序)
今日图片服务(小程序)
今日推荐页ViewModel(小程序)
今日推荐页View(小程序)
28
服务器端身份验证
服务器端开发的基础设施:自有服务器
服务器端开发的基础设施:云服务器
服务器端开发的平台选择:XaaS
服务器端开发的平台选择:Azure Functions
身份验证服务提供商:Auth0
设计服务器端身份验证服务
为安卓项目准备身份验证
安卓项目的身份验证服务
注册Auth0
注册GitHub APP ID
获得访问Token
认识JWT Token
iOS项目的身份验证服务
UWP项目的身份验证服务
实现自己的身份验证服务:使用IdentityServer
准备Azure远程收藏存储
实现Azure远程收藏存储
测试客户端
设计服务器端身份验证服务
实现服务器端身份验证服务
首个Function:Ping
29
服务器端授权
简介
服务器端键值存储:Azure Table Storage
连接到Table Storage:使用AzureStorageAccountProvider
服务器端授权服务
准备授权数据库
测试服务器端授权服务
30
服务器端函数
设计并实现服务器端收藏存储服务
服务器端依赖注入
实现保存函数
测试保存函数
实现读取函数
完成客户端
测试客户端
31
ViewModel in ViewModel
小ViewModel
大ViewModel
用于ViewModel in ViewModel的View
动态LINQ简介
实现动态LINQ
测试动态LINQ
完结项目
32
ViewModel in ViewModel(小程序)
实现VM in VM(小程序)
用于VM in VM的View(小程序)
支持VM in VM的事件(小程序)
生成动态查询(小程序)
云函数概览(小程序)