博主介绍:专注于Java .net php phython 小程序 等诸多技术领域和毕业项目实战、企业信息化系统建设,从业十五余年开发设计教学工作
☆☆☆ 精彩专栏推荐订阅☆☆☆☆☆不然下次找不到哟
我的博客空间发布了1000+毕设题目 方便大家学习使用
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,希望帮助更多的人
3 系统详细设计与实现
3.1系统详细设计
个人信息管理系统的时序图如图3.1所示,系统里界面之间的跳转,数据在各模块的传输和消息传输的时间顺序以及多个对象之间的动态协作和控件的各项触发事件,基本使用的是Async异步方法以确保整个应用的各功能能够流畅地运行。
图3.1 系统时序图
个人信息管理系统的各个子功能都是在各自模块下进行本地的数据存储,当用户输入登录信息后,系统匹配用户名和密码,如果匹配成功将进入功能选择主界面,在各功能的主页面可以使用相应的功能,例如登录成功,添加收支数据,必须先进入记账本总界面,选择添加功能才可以跳转到收支存储界面。
系统重要方法包括数据XML序列化和反序列化以XML文件的方式存储数据。个人信息管理系统的本地与云端存储主要通过密钥的链接,获取从 Windows 装载文件共享的命令行,设置AzureStorageFileContent 的Share $s -Source 为相应的存储地址来上载文件,在创立链接之后使用net use 命令根据存储帐户名称,文件存储共享名称来装载文件,实现了云端文件与本地的数据存储共享,保持数据一致性。
3.1.1联系人信息管理模块设计
联系人信息管理流程图(如图3.2),主要采用vCard格式创建联系人,从而限制电话字段,其他功能包括添加、删除或者联系人信息(姓名和联系方式),查看已经存储的联系人数据以及查询号码的归属地信息。
图3.2 联系人信息管理模块流程图
在联系人模块中对手机号码的信息查询,要获取用户输入的手机号码属于什么省份、什么地区和SIM卡种类的信息,就必须在项目里提前引入Web Service服务,再通过网络 service接口,实例化一个代理对象,最后通过调用getMobileCodeInfo方法联网查询返回一个包含在应用中所输入号码信息的字符串。
联系人功能的软件程序时序图就如图3.3所示。
图3.3 联系人模块时序图
用户在进入联系人模块后点击添加联系人信息按钮,按要求输入联系人的信息,点击保存触发事件,将联系人的信息使用vCard格式存储在本地,也使用云存储。当用户要使用查询功能时,调用相应查询方法,通过Web服务获取信息,将号码信息返回到联系人模块进行显示。
3.1.2备忘录模块设计
备忘录模块里的具体功能流程如图3.4所示。用户可对备忘录信息进行添加、删除以及查看,而且对已经保存的备忘录数据可以语音播放。其中文本记录里主要使用 JSON进行数据存储,经过将文件数据序列化存储,使用时,再反序列化得到文件数据。
图3.4 备忘录功能流程图
备忘录里的文本消息可以通过Text-To-Speech(TTS)技术,使用内置的语音引擎转换成语音播放,并可更新和删除记录。其中最主要的是实例化speechSynthesier对象,调用synthesierTextToStreamAsync方法,根据给定的文本生成语音流,保存在speechSynthesisStream实例中,随后就对生成的语音数据进行播放。
3.1.3记账本功能模块设计
记账本功能模块是系统里比较重要的功能模块,主要是对用户日常的收支数据进行保存,辅助用户对收支管理分析,更好的实现收支数据可视化,其基本功能流程图如图3.5所示。
图3.5 记账本功能流程图
收支管理:基本的添加收入支出数据,保存之后的删除或者查看收入支出,以及筛选收支数据记录,为用户提供基本的收支管理功能。
收支报表:提供日、月、年三种报表,统计用户的开支,供查询。
收支分析:在得到用户日常生活里的收支数据之后,对保存的收入支出数据进行统计和分析。根据用户的收支记录,生成相应的饼状图,从不同方面直观展示用户的收支情况,饼图控件是利用构造饼图piece来创建的,之后用Grid面板里面的userControl控件来加载饼状图形状。
3.1.4发现附近好友功能模块设计
发现好友的模块通过软件应用查找附近已开启的蓝牙设备和进行对等项的匹配连接,如果匹配连接成功,然后就可在应用间发送接收文本消息,进行信息交互,功能流程图如图3.6。
图3.6 发现好友功能模块流程图
主要利用peerFinder类的finderAllPeersAsync方法进行查找附近相同应用的蓝牙设备和对等项,然后返回peerInformation数据,里面保存的是通过应用查找到的对等项列表信息,最后进行匹配对等项,使用Socket编程的相关知识发送基于TCP协议的文本消息。
3.1.5个人中心模块设计
个人中心模块是用户最先使用的的功能模块,只有登录成功了才可以选择其他功能模块,同时,个人中心的数据同步和消息推送用到Azure,其具体流程图如图3.7所示。
图3.7 个人中心模块流程图
注册和登录:用户在登录的主界面进行输入姓名以及密码,系统首先从数据中查找用户名,如果用户不存在给出相应提示。用户名存在则取出对应的密码,后台程序将两个密码进行比对,通过应用的认证之后,进入个人中心功能模块。
个人中心模块的功能时序图如图3.8所示。
图3.8 个人中心模块时序图
当进行同步数据时,异地的相同应用可以实现数据库同步的功能,只要是将UWP应用的本地数据库设为主库,把云端设为从库,通过共享文件,将本地数据文件上载云端,再从云端下载文件,从而更好地实现同步本地应用与云端的数据,达到用户数据一致的功能需求。
个人中心的消息推送功能是第二个基于Azure的功能,是为了方便开发者在后台进行相关信息的推送,做到一次发送,所有应用都能收到消息通知,其通知中心功能流程图如图3.9所示。
图3.9通知推送功能流程图
从上图可以得知,云端消息通知推送是利用云端作为发送服务后台对所有安装此应用的设备进行一对多的消息推送,该功能是放在后台处理,不显现给用户,需要利用开发者的权限,关联好整个系统与应用商店,之后,开发者还需要从云端的仪表板里进行编码发送推送内容。
3.2系统实现
根据前期的需求分析,以及系统的总体设计和详细设计,按照模块功能联系人信息历、备忘录、记账本、发现好友和个人中心的顺序逐步进行实现。系统重要方法除了数据XML序列化和反序列化以XML文件的方式存储数据,还有收支数据同一页面不同时间数据的查看,数据的条件查询(关键字和时间段),备忘录里的数据存储方法和发现好友里蓝牙对等项的查找与匹配等,详细内容如表3.1所示。
表3.1 系统部分方法表
方法 | 参数 | 返回值 | 描述 |
Account_load | object sender, RoutedEventArgs e | void | 获取收支数据,并与功能首页绑定显示 |
Buttons_click | object sender, RoutedEventArgs e | void | 跳转到其他功能页面 |
save_cher() | 无 | Task<bool> | 存储记账记录数据 |
Back_click | object sender, RoutedEventArgs e | void | 返回到上一界面 |
getThisYear_record() | int year | Task< voucher> | 获取某年数据记录 |
getThisMonth_record () | int month, int year | Task< voucher> | 获取某月数据记录 |
getThisDay_record() | int day, int month, int year | Task< voucher> | 获取某日数据记录 |
Monthbar_click/Yearbar_click() | object sender, RoutedEventArgs e | void | 月/年查询界面返回/进入前后时间 |
readFAsync() | string fileName | Task<string> | 读取本地文件 |
writeFAsync() | string fileName, string content | Task | 写入本地文件 |
writeAsync() | T data, string filename | Task | 将实体类对象序列化成XML格式,然后存储到文件 |
readAsync() | string filename | Task | 获取文件,反序列化XML文件 |
search_Data() | DateTime? begin, DateTime? end, string keyWords | Task< voucher> | 按时间和关键字查询收支记录 |
get_Contact() | 无 | void | 获取联系人信息 |
get_Contact() | string id | void | 获取需要编辑的联系人信息 |
Text_Save() | object sender, RoutedEventArgs e | void | 备忘录信息存储 |
find_bluetooth() | object sender, RoutedEventArgs e | void | 查找蓝牙对等项 |
InitNotificationsAsync() | 无 | Void | 消息通知发送 |
同时,个人信息管理系统在数据存储方面,本地与云端存储主要通过密钥的链接,获取从 Windows 装载文件共享的命令行,设置AzureStorageFileContent 的Share $s -Source 为相应的存储地址来上载文件,在创立链接之后使用net use 命令根据存储帐户名称,文件存储共享名称来装载文件,从而实现本地与云端数据一致。将整个系统应用配置好。
3.2.1联系人信息管理模块实现
对联系人信息管理模块地设计思路与实现进行分析,实现增删联系人信息以及号码归属地查询。其使用Grid里面的RowDefinitions来定义两行标注姓名和手机号码,并且将手机号码TextBox的inputScop属性设置为手机号码格式。
当用户打开添加界面,输入将要添加的联系人姓名以及手机号码后,点击保存按钮,后台会先判断用户是否已经填写了姓名或电话,不为空则先使用ContactInformation()新创建联系人对象cInfo,通过异步获得属性值的方法getproperties()得到联系人的属性字典,接着传递和添加联系人的相关属性,使用的是properties里的Add(KnownContactProperties.GivenName)。在创建或者获取联系人存储数据时,如果发生了错误,应用会进行报错,例如:姓名或联系电话不能为空,以及一些系统错误。可以在CsLists.xaml下对已保存的联系人信息进行查看,通过对页面代码中TextBlock的Text属性设置为Binding并加上数据源,从而完成数据绑定,实现控件在联系人的主界面可以显示数据,可以删除联系人信息,也可跳转到编辑联系人界面。
查询电话号码归属地的功能,需要先在该系统工程项目中添加输入web服务的相应网站引用。
同时,用MobileCodeServiceReference.MobileCodeWSSoapClient()方法实例化了一个web service代理的对象,再调用web service的getMobileCodeInfoAsync()方法获取电话号码的归属地,最后将得到的一维字符串数组(省份、城市等)赋给控件的Text属性,从而实现号码归属地的查询。
联系人模块界面如图3.10。
图3.10 联系人主界面
整个联系人模块的功能都根据需求分析和系统详细设计的要求实现,具体的核心代码见附录A。
3.2.2备忘录模块实现
采用 XML文件序列化和反序列化来存储备忘录信息的数据,在备忘录主界面可以通过Page里的BottomAppBar的添加按钮,增添一条新信息,同时使用系统Icon的Add图标;在备忘录主界面的XAML文件里,构建一个动态Grid,同时添加一个hyperlink按钮,链接到备忘录信息展示界面,如图3.11。
图3.11备忘录主界面
点击Add添加按钮之后,跳转到AddItem添加项目页面(如图3.12),通过cs文件里的save事件,使用异步getfolder ()方法获取备忘录的文件对象, XML对象由XmlDoucument()方法创建,使用setAttribute()设置其属性作为信息的标识符,用属性的值来保存信息,之后调用createFilederAsync()来创建应用文件,最后将这些处理好的XML数据存储到相应文件里。
图3.12 备忘录增加界面
而要查看已保存的信息,在主界面里面点击查看详细,跳转到display界面,并传递一个数据存储对象,从对象中获取相应的文件名,调用XmlDoucument的LoadFromFileAsync()函数将备忘录的相关应用文件信息保存到相应的XML文档里,最后通过文件元素Attributes里面获得元素名getnamedItem().NodeValue的方法将XML文档数据相应地赋给控件的Text,备忘录信息显示界面如图3.13。
图3.13 信息详细信息
TTS的实现首先需要在项目工程清单文件里,在Capabilities节点里设置deviceCapability的Name为microphone来获取麦克风权限。通过实例化一个speechSynthesis对象,然后调用synthesizeTextToStreamAsync()函数来根据文本数据生成相应的数据语音流,之后,返回一个speechSynthesisStream实例,用于让系统从其的Text属性获取识别出来,最后使用多媒体的Element控件对获取保存的数据语音流进行播放。
备忘录模块的功能根据需求分析和系统详细设计的要求都已实现,具体的核心代码见附录B。
3.2.3记账本功能模块实现
记账本功能是一项主要功能,在主界面,通过修改按钮的默认样式,把点击状态和间隔属性取消,将宽度和高度设置一致,实现磁贴风格的自定义控件,将Style的目标类型设置为Button,自定义了按钮功能,并命名其为“ButtonStyle”作为新的控件模型。之后在其控件模型上将内容呈现控件里的各属性使用相关模版Binding绑定到相应的数据源上,让记账的收入支出记录以及年月结余数据相应地动态显示到主界面磁贴按钮的上方。如图3.14所示,当用户点击记账本主界面的磁贴控件,将跳转到用户相应点击的功能界面,而且,主界面上动态显示了该磁贴控件绑定的数据信息,同时获取今日的账单记录,并绑定到首页的列表控件进行显示,使用Common类的getSummaryIncome()方法计算总收入数据,getSummaryExpenses()计算总支出,通过getThisMouthSummaryIncome()的值减去getThisMouthSummaryExpenses()的值计算出月结余,年结余与月的方法类似,传递给getThisDayAllRecords()的参数为DateTime.Now.Day/Month/Year用于在记账本功能主界面显示当日收入支出数据的账单。
图3.14 记账本主界面
添加收入支出的功能,通过Pivot控件的两个页签来显示,使用Appbar来实现保存和取消功能,如图3.15所示。至于在数据存储方面,管理系统里收入支出的数据都是使用同种数据对象类型,而用0表示收入,1表示支出以作区分,记账本功能模块里用于收入支出数据存储的辅助类和收入支出数据对象实体类共同协作完成对用户日常收入支出数据的存储,在添加收入和支出数据时可以选择所添加的类别,并且可以填写对收支的说明,说明的内容是可以用于后面的查询功能,除此之外,还要选择添加的日期和时间,默认添加为当时系统日期时间。
图3.15 收支添加
首先,用pivot.SelectedIndex根据所传递的参数值来判断是显示收入页面(0)还是支出页面(1)。而在辅助类里,传递过来的是vCher类,即在Addnew(vCher item)里使用Getdata()进行添加数据,保存数据。通过调用storageFileHelper的ReadAsync()方法来进行读取收入和支出的记账数据列表。
当有收入或者支出数据保存之后,就生成相应的月收入支出报表和年收入支出报表,而且可以在查询功能界面分别按照月份和年份分类查询记账的数据记录。通过Common类的getMouthSummaryIncome()方法获取月收入,SummaryExpenses获取月支出,传递mouth和year 给etThisMonthAllRecords()得到本月所有数据,还传递到PageTitle赋给其Text值,最后将数据给ItemsSource,完成月报表数据的绑定,从而实现整个月收入支出报表的收支数据显示,实现效果图如图3.16所示(年报表类似)。
图3.16 月报表
为了适配顶部的查询条件排列,所以系统采用适配触发器,而使用LINQ语句来实现关键字查询,除此之外还可以使用时间段来查询。系统里使用DatePickerBegin和DatePickerEnd来获取begin开始日期以及end结束日期的时间点值,传递到Common类的search()函数里的是begin、end和KeyWords关键字的Text值。LINQ语句部分先判断是否关键字KeyWords值是否为空,为空则计算收支数据开始点和收支数据结束点之间的时间段,从通过Getdata()方法获得的数据里查找出符合在时间段的数据,而在有关键字时,既有时间段的,还使用IndexOf(KeyWords)来实现数据查询,最后将查询到的记账数据记录返回到查询界面相应的控件上显示,记账本收支数据查询的页面设计如图3.17所示。
图3.17 查询界面
对记账类应用来说,图表是直观显示数据的重要功能,通过饼状图和柱状图来显示不同类别的账目数据和其所占比例。主要利用QuickCharts图表控件库,首先要将图表的UI设计进行绑定,在Chartdata类里声明了sum和typeName两个属性,用于存储不同类别和其相应的数据,使用自定义集合类的<ChartData>()来创建图表的数据源对象,接着通过Common类的getAllRecords()函数获取所有的记账记录数据,使用LINQ语句从所有记账记录数据里按Category条件来获取数据的类别,再将饼图的数据源DataSource设置为枚举的数据集合COLlecion,最后形成相应的图表,生成具体效果如图3.18。
图3.18 饼状图
记账本功能模块里的收支数据对象都是通过DataContractSerializer类序列化形成一个XML文件,然后保存到本地应用文件夹里面。系统应用先通过getDataFolder()获取需要存储数据的文件夹,然后异步传递文件名的方法getFile (filename)得到里面的文件,获取其数据流,初始化流阅读器对象需要先将irandomAccess流对象转化成流对象。实体类对象序列化成XML格式存储到文件里面,也是先有存储的文件夹,再用FileIO类把字符串数据写入文件,之后使用DataContractSerializer(typeof(T))创建序列化对象,再将数据录入进去,完成XML序列化存储。而StorageFileHelper类是负责数据文件读写操作的独立存储公共类。
大家点赞、收藏、关注、评论啦 其他的定制服务 下方联系卡片↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 或者私信作者