公司使用的請假及寫週報系統一直都是網頁版的,以前咱們也有想過出一個移動端版本,但由於一些緣由沒有付諸行動。恰好最近 LeanCloud 新發布了 Flutter SDK,就決定用 Flutter 來開發這款 APP。html
之因此選擇 Flutter,主要緣由是一份代碼能夠同時知足 iOS 和 Android 兩大平臺,這樣全部同事均可以享受到這款 APP 帶來的便利。node
APP 的後端數據所有存放在 LeanCloud,不用擔憂後端系統的開發維護,實現起來也很簡單。git
App Store下載連接,或者 App Store 搜索 LeanCN
下載。github
Flutter 安裝和環境搭建直接查看: Flutter 文檔。
編輯器能夠選擇 Android Studio、Visual Studio Code 或者 Emacs,編輯器就根據我的喜愛和開發習慣選擇了。後端
Flutter 開發環境配置好之後,再來建立 LeanCloud 應用。安全
在控制檯 > 應用 > 設置 > 應用 Keys 頁面記錄 AppID、AppKey 與服務器地址備用,這裏的服務器地址就是 REST API 服務器地址。若是未綁定域名,控制檯相同的位置能夠獲取到免費的共享域名。服務器
在 pubspec.yaml 中,將 LeanCloud Flutter SDK:leancloud_storage 添加到依賴項列表:markdown
dependencies: flutter: sdk: flutter cupertino_icons: ^0.1.2 leancloud_storage: ^0.4.0 http: ^0.12.0+4 date_format: ^1.0.8 flutter_localizations: sdk: flutter fluttertoast: ^4.0.1 shared_preferences: ^0.5.7+3 flutter_markdown: ^0.4.2
其餘第三方插件的說明:數據結構
date_format: 請假頁面用到的日期相關格式化插件flutter_localizations:用於設置時間選擇器的中文顯示app
fluttertoast:相似 Android 中的 Toast 小插件
shared_preferences:本地數據存儲
flutter_markdown:展現週報內容時支持 markdown 格式
初始化 SDK
執行下面的代碼鏈接到在 LeanCloud 建立好的應用。
導入以下包:
import 'package:leancloud_storage/leancloud.dart';
初始化配置代碼:
Future initLeanCloud() async { LeanCloud.initialize( 'AppID', 'AppKey',//AppID 與 AppKey 在控制檯設置 > 應用 Keys 頁面獲取 server: 'https://e36trlaa.lc-cn-n1-shared.com',//這裏填控制檯綁定的域名或共享 API 域名 queryCache: new LCQueryCache()); }
設計數據結構
在 LeanCloud 控制檯 > 存儲 > 結構化數據中建立須要的 Class,並添加相關字段,好比請假表(Leave)中,須要有請假人姓名,請假時長,請假緣由,開始請假日期等。
客戶端保存數據時,若是 Class 不存在,系統也會自動生成對應的 Class。
LeanCloud 提供了 LCUser
類來方便使用用戶管理的功能,在控制檯對應 _User 表。註冊與登陸選擇了 用戶名+密碼 的方式。實現用戶註冊只須要執行如下代碼,就會在 _User 表新增一條用戶數據:
LCUser user = LCUser(); user.username = 'Tom'; user.password = 'cat!@#123'; await user.signUp();
用戶登陸也只須要傳入用戶名與密碼:
LCUser user = await LCUser.login('Tom', 'cat!@#123');
在應用中若是想要獲取當前登陸用戶,能夠用:
LCUser currentUser = await LCUser.getCurrent();
LCUser 還支持手機號 + 驗證碼註冊,更多登陸註冊方式能夠查看 LeanCloud 用戶文檔。
請假部分包含「提交一條請假記錄」、「查詢個人歷史請假記錄」與「查詢今日請假同事」這三個部分。
提交一條請假記錄
保存一條數據到 LeanCloud 後臺也很簡單,一條數據能夠當作一個 LCObject
對象,直接給 LCObject
對象賦值,save
成功之後能夠在 Leave
表中看到新增了一行數據。
//建立 Class 並保存一條數據,Leave 表用來存放請假員工數據 LCObject leave = LCObject('Leave'); leave['startTime'] = startTime;//請假的開始時間(AM/PM) leave['endTime'] = endTime;//請假結束時間(AM/PM) LCUser user = await LCUser.getCurrent(); leave['username'] = user.username;//請假員工用戶名 leave['startDate'] = startDate;//請假開始日期 leave['type'] = leaveType;//請假類型,病假、年假或產假等 leave['duration'] = duration;//請假時長 leave['note'] = note;//請假緣由 leave['endDate'] = endDate;//請假結束日期 await leave.save();//保存到 LeanCloud 後臺
查詢個人歷史請假記錄
查詢數據使用 LCQuery
,query.find()
返回符合條件的 List
:
LCUser user = await LCUser.getCurrent(); //查詢 Leave 表 LCQuery<LCObject> query = LCQuery('Leave'); query.whereEqualTo('username', user.username); //按照建立時間排序 query.orderByDescending('createdAt'); //leaves 是當前登陸用戶的所有請假記錄 List<LCObject> leaves = await query.find();
查詢今日請假同事
LCQuery<LCObject> query = LCQuery('Leave'); //查找 DateTime.now() 在請假開始日期與結束日期之間的數據 query.whereGreaterThanOrEqualTo('endDate', DateTime.now()); query.whereLessThanOrEqualTo('startDate', DateTime.now()); query.orderByDescending('createdAt'); List<LCObject> leaves = await query.find();
週報模塊分兩部分,保存一條週報和查詢歷史週報。展現週報支持 markdown 格式,因此在提交週報的時候,能夠設置默認週報格式,用三個單引號 '''
包起來的文本能夠保留原文本格式展現:
String text = ''' ### This week * done1 * done2 ### Next week * todo1 * todo2 ''';
保存週報
爲了區分提交週報的員工,建立一個 Pointer 類型字段指向 _User 表,字段名稱是 user
,保存數據時把當前用戶賦值給 user
便可。(Leave 表同理也能夠建立 Pointer 類型字段記錄請假員工)。
LCUser user = await LCUser.getCurrent(); //WeeklyPub 是存儲週報數據的表 LCObject obj = LCObject('WeeklyPub'); obj['content'] = text; // user 字段是 pointer 類型,指向 _User 表 obj['user'] = user; LCObject object = await obj.save();
查詢週報
查詢週報時,想要一併獲取員工信息,可使用 include
,這樣一次查詢就能夠查到這條週報的數據和員工(_User 表)的數據:
LCQuery<LCObject> query = LCQuery('WeeklyPub'); // 查詢結果同時包含用戶信息 query.include('user'); query.orderByDescending('createdAt'); query.whereGreaterThanOrEqualTo( 'createdAt', DateTime.parse('2020-06-01 00:00:00Z')); List<LCObject> weekly = await query.find();
聯繫人列表能夠經過查詢 _User 表獲取,但這裏會有一個問題。
爲了安全起見,LeanCloud 新建立的應用的 _User 表默認關閉了 find 權限。用戶只能查詢到本身在 _User 表中的數據,沒法查詢其餘用戶的數據。
解決辦法能夠是單首創建一張表來保存這類數據,並開放這張表的 find 查詢權限。或者能夠在 雲引擎 裏封裝用戶查詢的方法,這樣就無需開放 _User 表的 find 權限。
本 APP 採用的辦法是結合雲引擎,設置了查詢用戶表的雲函數,來保證數據安全。
queryUsers
:AV.Cloud.define('queryUsers', async function (request) { if (request.currentUser) { const userQuery = new AV.Query('_User'); userQuery.addDescending('createdAt'); return await userQuery.find(); } else { throw new AV.Cloud.Error('用戶未登陸'); } })
部署成功後,在移動端能夠直接調用雲函數,Flutter 代碼中能夠這樣調用雲函數:
Map<String, dynamic> userMap = await LCCloud.run('queryUsers'); //users 就是雲函數返回的用戶列表 List<dynamic> users = userMap['result'];
APP 項目完整代碼見 Github-FlutterLeaveDemo。