基于iOS的自行车租赁系统设计与实现

2018-10-11 08:49高鑫王法胜
电子元器件与信息技术 2018年7期
关键词:操作员用车单元格

高鑫,王法胜

(大连民族大学信息与通信工程学院,辽宁 大连 116600)

0 引言

随着人们生活水平的提高,私家车的数量也来越多。私家车普及的同时,对我们的生活环境造成了巨大的破坏,城市交通的压力越来愈大。为了缓解以上情况,公共交通逐渐流行起来,公交、轻轨、地铁相继出现。而近年来,公共自行车系统逐渐进入人们的视线,它可以有效减轻城市交通你那个压力,能做到真正意义上的节能减排,并且可以解决公共交通系统“最后一公里”的问题[1]。

本文为了为用户提供便利的公共自行车服务[2],方便管理人员们进行管理,设计并实现一套基于iOS系统的公共自行车租赁系统。使用本系统可以实现公共自行车租赁系统的基本操作,同时可以为用户提供路线规划、扫码用车等功能。

1 系统设计方案

根据需求分析结果,本系统可分为两大部分:用户端和权限端。本系统使用Xcode开发环境进行开发,采用Swift语言实现[3-4],通过LeanCloud[5]提供的后台服务,实现存储用户个人资料、用车记录等,也可以实现处理租赁请求等功能。系统整体框架图如图1所示。系统采用MVC模式设计[6],即模型层、视图层和控制层,从而实现数据和显示以及控制逻辑的分离。

2 系统的主要功能及实现

2.1 用户端的实现

2.1.1 登录及注册界面的实现

用户在未登录状态下打开App会首先进入登录及注册界面。当用户打开该软件时,首先加载的是SignInViewController。首次使用需要注册账户,点击该控制器中的注册按钮,会跳转至SignUpViewController,在该界面中,用户可输入想要注册的用户名和密码,点击完成注册按钮后,该数据会保存至LeanCloud中,并且该数据的position的值会默认设置为user。

图1 系统框架图Fig.1 Architecture of the system

完成注册后系统会自动返回登录控制器,在该控制器中用户可以输入用户名与密码,系统会将用户输入的值与数据库中的值进行比较,若用户名和密码均正确则会跳转至下一个UIViewController。

当用户成功登录后,使用UserDefaults保存一个用于判断是否成功登录的Key,Key的值为布尔型。当用户下一次打开软件时,会首先判断该Key的值,当值为true时则会自动登录。

2.1.2 地图界面的实现

用户成功登录后会进入地图界面,该界面及相关功能的运行效果如图2所示。登录成功后,会跳转至MapViewController。

本系统使用的地图服务是高德地图,导入高德地图SDK后,定义MAMap View类并将其添加至该控制器的view中。使用高德地图的地图代理(MAMap ViewDelegate)、搜索代理(AMapSearchDelegate)、步行导航代理(AMapNavi WalkManagerDelegate)并重写其相应代理方法,从而实现定位、查找自行车、路线规划等功能。

在重写步行导航代理方法时计算出距离与步行时间,并当成功规划出路线时,将其在自定义的NotificationView中显示。

图2 地图界面效果图Fig.2 Map interface

2.1.3 扫码界面的实现

用户点击扫码用车按钮进入扫码界面,如图3所示。

图3 扫码界面Fig.3 Scanning QR code interface

用户通过点击地图界面的扫码用车按钮跳转进入ScanViewController,在该控制器中,重写viewDidAppear方法,在该方法中调用系统摄像头用于二维码识别。

导入AVFoundation框架,通过重写AV Capture Metadata Output Objects Delegate的代理方法实现扫码功能。扫码成功后,在handleCodeResult方法中获取扫码结果即车牌号,基于该车牌号新建用车请求记录对象并保存至数据库的UsageRecord表中。

在viewDidLoad方法中,新建AVQuery类的变量query,初始化query的className为UsageRecord,并将其注册为AVLiveQuery类进行订阅,使用AVLiveQueryDelegate代理中的objectDidUpdate方法可以监控对象是否发生变化。

当操作员批准用车请求后,对象的isApproved值会发生改变,objectDidUpdate方法便会被调用。因此重写objectDidUpdate方法,当调用该方法时会将扫码成功时保存的对象传入下一个UIViewController中,并调用present方法进行跳转。

点击打开手电筒按钮可以打开手机的手电筒,该方法主要是通过更改AVCaptureDevice.TorchMode的状态实现对手电筒的监控。

2.1.4 手动输入车牌号界面的实现

用户点击手动输入车牌按钮进入该界面,如图4所示。

图4 手动输入车牌界面Fig.4 Input the plate number manually interface

在某些特殊情况下会出现无法进行扫码的情况,用户可以通过点击扫码界面的手动输入车牌按钮跳转至HandViewController。

该控制器同样需要订阅AVQuery为实时更新类AVLiveQuery,该部分的实现方法与扫码界面相同。

该控制器中的主要控件有输入框textField和用车按钮useButton。由于车牌号长度通常为4-8位,因此在重写该控制器的viewDidLoad方法时需要使用NotificationCenter对textField的字符长度进行监控:

(1)当textField输入字符的长度小于4时,useButton不可点击;

(2)当字符长度为4-8位时,useButton可以点击,点击事件与扫码界面的handleCodeResult方法一致;

(3)当输入字符大于8时,字符串将被截取前八位,从而实现字符限制功能。

2.1.5 获取解锁码界面的实现

用户提交的用车请求通过后会进入获取解锁码界面,如图5所示。

图5 获取解锁码界面Fig.5 Obtain the unlock code interface

当操作员审批通过用车请求时,系统会跳转至UnlockViewController,并在跳转方法实现的同时将上一控制器保存的对象赋值给本控制器的unlockObject变量。重写viewDidAppear方法,根据unlockObject的plate_number的值即车牌号,从数据库中获取相应的解锁码,并赋值给UILabel.text从而显示在界面上。当结束用车时,需要向操作员提交归还请求,实现方法与扫码界面和手动输入车牌界面中提交用车请求类似,当操作员处理归还请求后,会更改对象的isReturn的值,该控制器中的objectDidUpdate方法会被调用,弹出标题为“归还成功”的提示框。

2.1.6 报修界面的实现

用户点击立即报修按钮进入报修界面,如图6所示。点击获取解锁码界面的立即报修按钮跳转至RepairViewController。

图6 报修界面Fig.6 Request for repairing interface

跳转方法调用的同时,将UnlockViewController中unlockObject的plate_number的值传入该控制器中。用户可以在textView中对车辆情况进行描述。

点击submitButton可以将报修信息作为RepairRecord表的对象保存到数据库中。保存时该对象isRepaired的值默认保存为false。

2.2 权限端的实现

2.2.1 操作员端界面的实现

该界面的控制器为ListViewController。

在storyBoard中为该控制器拖入一个UITableView,并对将单元格进行自定义。新建ListTableViewCell类关联自定义的单元格,在控制器中调用cellForRowAt方法为tableView注册该自定义单元格。

当界面加载完成后,在cellForRowAt方法中获取UsageRecord表中的所有数据,并根据行数(indexPath.row)作为下标获取每一行需要显示的对象。

调用didSelectRowAt方法,根据对象isApproved和isReturn的值实现不同的点击方法:

(1)当isApproved值为false时,该记录为用车请求,单元格preview的背景颜色为红色,点击单元格会更改值为true,即批准用户用车;

(2)当isApproved值为true且isReturn值为false时,该记录为归还请求,单元格preview的背景颜色为蓝色,点击单元格会更改isReturn的值为true,即归还成功;

(3)当isApproved和isReturn的 值 均 为true时,意味该条记录已经过期,单元格preview的背景颜色为绿色,单元格无法点击。

操作员端界面及相关功能的运行效果如图7所示。

图7 操作员端界面Fig.7 Operator interface

2.2.2 维修员端界面的实现

该界面的控制器为RepairViewController。

该界面的详细设计与操作员端类似,新建RepairTableViewCell关联自定义单元格,在cellForRowAt方法中获取RepairRecord表中的所有数据。

在didSelectRowAt方法中,当对象isRepaired的值为false时,维修员可以通过点击单元格将值更改为true。当值为true时,意味着该报修记录已经处理,单元格无法点击。

创建refreshControl继承UIRefreshControl,重写viewDidLoad方法并将其与tableView进行关联。调用addTarget方法为下拉刷新组件添加方法,当维修员下拉列表时,会重新获取数据并刷新列表。

维修员端界面及相关功能的运行结果如图8所示。

图8 维修员端界面Fig.8 Repair man interface

2.2.3 管理员端界面的实现

该界面的主控制器为ManagerViewController,主界面如图9所示。

图9 管理员端主界面Fig.9 Administrator interface

该控制器中的主要组件为用于显示管理员端功能的静态UITableView。各功能具体设计如下:

(1)查询用户信息、操作员信息、维修员信息:点击这三个单元格时,控制器会调用UINavigationView Controller.pushViewController方法跳转至UserInfo ViewController。点击不同的单元格,会对该控制器中position变量进行不同的赋值。该控制器的设计与操作员端、维修员端基本相同,区别在于获取数据时会根据position的值获取相应身份的用户信息数据,如图10所示。

图10 查看用户、操作员、维修员信息Fig.10 View information of user, operator and repair man

(2)点击UserInfoViewController中addButton会跳转至CreateUserViewController,在该控制器中管理员可以创建新的权限端账号。两个UITextField分别用于输入用户名和密码,positionSegmentedCotrol用于选择账号身份。点击saveButton将调用AVOject.saveInBackground方法将新的账号信息保存至UserInfo表中。passwordTextField中的值可以为空,此时保存的默认密码为12345678,如图11所示。

图11 创建权限账户界面Fig.11 Create authority interface

(3)查询自行车信息:点击该单元格时会跳转至BicycleViewController,在该控制器加载完成时会获取所有自行车牌号和相应的解锁码,设计方法基本同上。点击车牌号单元格会跳转至BicycleManagerViewController,在该控制器中可以修改传入车牌号对应的解锁码,如图12所示。

图12 查看自行车信息界面Fig.12 View the information of bicycles

(4)查询用车记录、维修记录:点击这两个单元格会跳转至RecordViewController,根据点击的单元格索引,对该控制器中的record变量进行赋值。设计方法基本同上,在此不多赘述。与操作员端和维修员端不同的是,管理员只能对记录进行查看,因此该UITableView的单元格没有点击事件,如图13所示。

图13 查看用车报表、维修报表界面Fig.13 View the report of bicycle rental and repairing history

3 结论

本系统是基于iOS移动端操作系统设计并实现的一个使用方便,交互友好界,面简洁美观的公共自行车租赁系统。主要实现了用户查找自行车、扫码用车、提交用车请求、操作员处理请求、维修员处理报修、管理员查看信息等功能。使用本系统用户可以享受到便利的公共自行车服务,管理人员们也可以随时随地进行操作。与安卓类APP[7-9]相比,本文所设计和开发的APP具有更好的稳定性,经过功能测试后[10],该系统可以投入使用。

猜你喜欢
操作员用车单元格
美空军特种战术操作员正在进行军事自由落体跳伞
流水账分类统计巧实现
玩转方格
玩转方格
浅谈基于H3C云计算管理平台的系统管理功能
2019年全国两会用车“全面体检”
浅谈Excel中常见统计个数函数的用法
面向知识自动化的磨矿系统操作员脑认知特征与控制效果的相关分析
寻衅滋事大众T6对决奔驰V级
◆新疆青河:远教操作员“评星定级”激发远教工作活力