作者簡介:全棧開發工程,從事Java、Python、前端、小程式方面的開發和研究,對大資料應用與開發比較感興趣,
主要内容:Java項目、前端項目、Python項目、小程式開發、大資料項目、單片機
收藏點贊不迷路 關注作者有好處
文末擷取源碼
感謝您的關注,請收藏以免忘記,點贊以示鼓勵,評論給以建議,愛你喲
項目編号:BS-XX-183
前言:
随着我國教育制度的改革的發展,各大高校的學生數量也在不斷的增加。目前大學生的生活和消費習慣等導緻他們更喜歡通過網絡來擷取自己想要的商品和服務,這也是導緻目前校園跑腿盛行的主要原因。為了能夠讓更多的學生享受到校園跑腿的服務,我們通過springboot架構開發了本次的基于springboot的校園跑腿管理系統。
本系統從使用者的角度出發,結合目前的校園環境而開發的,在開發語言上是使用的Java語言,在架構上我們是使用的springboot架構,資料庫方面使用的是MySQL資料庫,開發工具為IDEA。
基于springboot的校園跑腿管理系統根據實際情況分為前背景兩部分,前台部分主要是讓使用者購物使用的,包括使用者的注冊登入,檢視公告,檢視招聘資訊,檢視配送訂單并,對個人注冊資訊進行管理等功能;背景部分功能主要包括使用者資訊管理,配送員管理,釋出訂單管理,接取訂單管理,配送訂單管理,評價資訊管理,招聘資訊管理,線上留言,系統管理等功能。通過這些功能基本可以滿足一個校園跑腿管理系統的需求。
一,項目簡介
基于springboot的校園跑腿管理系統根據實際情況分為前背景兩部分,前台部分主要是讓使用者購物使用的,包括使用者的注冊登入,檢視公告,檢視招聘資訊,檢視配送訂單并,對個人注冊資訊進行管理等功能;背景部分功能主要包括使用者資訊管理,配送員管理,釋出訂單管理,接取訂單管理,配送訂單管理,評價資訊管理,招聘資訊管理,線上留言,系統管理等功能。通過這些功能基本可以滿足一個校園跑腿管理系統的需求。基于springboot的校園跑腿管理系統具體功能如下圖所示
二,環境介紹
語言環境:Java: jdk1.8
資料庫:Mysql: mysql5.7
應用伺服器:Tomcat: tomcat8.5.31
開發工具:IDEA或eclipse
開發技術:springboot+mybatis-plus+vue+ElementUI
前後端分離
三,系統展示
5.1 基于springboot的校園跑腿管理系統使用者部分設計
5.1.1 系統首頁
通過在浏覽器中輸入http://localhost:8080/springbootd7kmt/front/index.html打開本系統的首頁部分,在首頁部分們我設定了網站的導航,導航下面是圖檔輪播的功能,然後下面是推薦的一些招聘資訊,新聞公告等内容。基于springboot的校園跑腿管理系統首頁部分具體效果如圖5-1所示
圖5-1 基于springboot的校園跑腿管理系統首頁界面
5.1.2使用者注冊登入
當校園内的學生想要釋出配送訂單的時候一定要注冊登入否則是不可以釋出訂單資訊的。在使用者注冊界面中輸入使用者的基本資訊并點選[注冊]按鈕即可完成注冊功能,為了讓注冊界面看起來更加的美觀大方我們加入了一個校園的圖檔,這樣更符合我們的主題。基于springboot的校園跑腿管理系統使用者注冊效果如圖5-2所示
圖5-2 基于springboot的校園跑腿管理系統使用者注冊界面
基于springboot的校園跑腿管理系統的使用者在注冊之後點選注冊按鈕下方的[已有賬号登入]即可跳轉到使用者登入界面,在使用者登入界面中輸入上一步中注冊的賬号+密碼然後點選[登入]按鈕即可完成登入操作。基于springboot的校園跑腿管理系統使用者登陸界面如圖5-3所示
圖5-3 基于springboot的校園跑腿管理系統使用者登陸界面
5.1.3釋出訂單
使用者通過本基于springboot的校園跑腿管理系統的釋出訂單子產品,可以看到其他使用者釋出的訂單資訊,在釋出訂單子產品中我們通過圖檔+任務标題的方式進行展示,使用者通過點選圖檔可以看到任務的詳細内容,基于springboot的校園跑腿管理系統任務資訊效果如圖5-4所示
圖5-4 基于springboot的校園跑腿管理系統釋出訂單界面
當使用者在上一步中的釋出訂單中點選了訂單任務的圖檔之後系統會根據參數自動的跳轉到釋出訂單的詳細界面中來,在訂單詳情中可以看到訂單的具體内容和懸賞金額等資訊,基于springboot的校園跑腿管理系統商品詳情界面如圖5-5所示
圖5-5 基于springboot的校園跑腿管理系統釋出訂單詳情界面
5.1.4招聘資訊
基于springboot的校園跑腿管理系統的用于還可以檢視招聘資訊,在招聘資訊中我們通過圖檔+标題的形式對招聘資訊進行了展示,使用者通過點選招聘的圖檔可以檢視招聘的詳情資訊,基于springboot的校園跑腿管理系統招聘資訊界面如圖5-6所示
圖5-6基于springboot的校園跑腿管理系統招聘資訊界面
當使用者在上一步中點選了招聘資訊的圖檔之後可以看到招聘資訊的詳細資訊,基于springboot的校園跑腿管理系統招聘資訊的詳細界面如圖5-7所示
圖5-7基于springboot的校園跑腿管理系統招聘資訊詳情界面
5.1.5訂單資訊管理
當使用者有需要配送的訂單的時候可以在釋出訂單管理子產品中釋出自己的需求,在新增的配送任務中輸入物品名稱+物品封面+懸賞金額和具體内容等資訊之後點選[送出]按鈕即可完成配送訂單的釋出操作。基于springboot的校園跑腿管理系統訂單資訊界面如圖5-8所示
圖5-8基于springboot的校園跑腿管理系統訂單添加界面
當使用者在上一步中添加了訂單之後還可以檢視和管理自己的訂單資訊,在包括根據關鍵字查詢自己的訂單,對有誤的訂單進行修改很删除已經完成的訂單等操作。基于springboot的校園跑腿管理系統訂單管理如圖5-9所示
圖5-9 基于springboot的校園跑腿管理系統訂單管理界面
當配送員接取了自己的訂單自後可以在訂單管理中檢視已經被接取的訂單資訊。基于springboot的校園跑腿管理系統接取訂單管理如圖5-10所示
圖5-10 基于springboot的校園跑腿管理系統接取訂單管理界面
當配送員已經完成了對訂單的配送之後使用者可以在配送訂單中看到自己的已經被配送的訂單資訊,同時可以對訂單進行評價。基于springboot的校園跑腿管理系統配送單理如圖5-11所示
圖5-11 基于springboot的校園跑腿管理系統配送訂單管理界面
當配送員已經完成了對訂單的配送之後使用者可以對訂單進行評價。基于springboot的校園跑腿管理系統訂單評價管理如圖5-12所示
圖5-12 基于springboot的校園跑腿管理系統評價管理界面
5.2 基于springboot的校園跑腿管理系統管理者部分設計
5.2.1背景登入子產品的實作
基于springboot的校園跑腿管理系統中的管理者+配送+使用者都可以在背景登入。在本登入界面中輸入賬号+密碼,并選擇角色即可完成登入,同時配送員還可以在本界面中進行注冊。基于springboot的校園跑腿管理系統管理者登陸界面如圖5-13所示
圖5-13基于springboot的校園跑腿管理系統管理者登入頁面
5.2.2 使用者資訊管理
基于springboot的校園跑腿管理系統的管理人員登入之後可以對系統内的使用者資訊進行管理,主要包括對使用者資訊的增删改查等操作。當有新的使用者需要添加的時候基于springboot的校園跑腿管理系統的管理人員輸入使用者賬号+使用者昵稱+密碼+性别+手機+頭像等内容之後點選[送出]按鈕即可完成對新的使用者的添加工作。基于springboot的校園跑腿管理系統景點資訊管理界面如圖5-14
圖5-14基于springboot的校園跑腿管理系統使用者資訊添加頁面
在上一部中管理人員完成了對新使用者的添加工作,此外還需要對使用者進行檢視,修改和删除等操作。當管理者打開使用者管理清單時可以看都目前已經添加好的使用者清單,并可以根據使用者賬号關鍵字進行模糊查詢,同時可對不需要的使用者進行删除,當使用者有誤的時候可以通過編輯按鈕對其進行修改操作。基于springboot的校園跑腿管理系統使用者資訊清單界面如圖5-15所示
圖5-15基于springboot的校園跑腿管理系統使用者資訊管理頁面
5.2.3配送員管理
基于springboot的校園跑腿管理系統的管理者使用者可以管理配送員,在配送員管理中輸入對應的配送工号,密碼,配送姓名,性别,配送電話,頭像等基本資訊後點選配送員管理中的[立即送出]按鈕,系統會将使用者輸入的資訊通過peisongyuanControl中的peisongyuanadd()方法将資料添加到資料庫peisongyuan表中,在頁面中我們通過required來進行控件的非空驗證,這樣使用者在沒有輸入資訊的時候系統會給出對應的提示。基于springboot的校園跑腿管理系統配送員資訊添加界面如圖 5-16
圖5-16配送員添加頁面
基于springboot的校園跑腿管理系統的管理者在上一步中對配送員資訊進行了添加操作之後還根據對配送員資訊進行管理的操作,主要包括根據關鍵字對配送員資訊進行查詢,對有誤的資訊進行修改,對不需要的配送員資訊進行删除等操作。基于springboot的校園跑腿管理系統配送員管理界面如圖5-17所示
圖5-17配送員管理清單頁面
5.2.4公告資訊管理
基于springboot的校園跑腿管理系統的管理者使用者可以管理公告資訊,在公告資訊管理中輸入對應的标題,簡介,圖檔,内容等基本資訊後點選公告資訊管理中的[立即送出]按鈕,系統會将使用者輸入的資訊通過newsControl中的newsadd()方法将資料添加到資料庫news表中,在頁面中我們通過required來進行控件的非空驗證,這樣使用者在沒有輸入資訊的時候系統會給出對應的提示。基于springboot的校園跑腿管理系統公告資訊添加界面如圖 5-18
圖5-18公告資訊添加頁面
基于springboot的校園跑腿管理系統的管理者在上一步中對公告資訊進行了添加操作之後還根據對公告資訊進行管理的操作,主要包括根據關鍵字對公告資訊進行查詢,對有誤的資訊進行修改,對不需要的公告資訊進行删除等操作。基于springboot的校園跑腿管理系統公告資訊管理界面如圖5-19所示
圖5-19公告資訊管理清單頁面
5.2.5招聘資訊管理
基于springboot的校園跑腿管理系統的管理者使用者可以管理招聘資訊,在招聘資訊管理中輸入對應的招聘崗位,招聘類型,工作地點,崗位封面,薪資待遇,結算類型,工作時間,釋出日期,負責人,聯系電話,工作内容,最近點選時間,點選次數等基本資訊後點選招聘資訊管理中的[立即送出]按鈕,系統會将使用者輸入的資訊通過zhaopinxinxiControl中的zhaopinxinxiadd()方法将資料添加到資料庫zhaopinxinxi表中,在頁面中我們通過required來進行控件的非空驗證,這樣使用者在沒有輸入資訊的時候系統會給出對應的提示。基于springboot的校園跑腿管理系統招聘資訊添加界面如圖 5-20
圖5-20招聘資訊添加頁面
基于springboot的校園跑腿管理系統的管理者在上一步中對招聘資訊進行了添加操作之後還根據對招聘資訊進行管理的操作,主要包括根據關鍵字對招聘資訊進行查詢,對有誤的資訊進行修改,對不需要的招聘資訊進行删除等操作。基于springboot的校園跑腿管理系統招聘資訊管理界面如圖5-20所示
圖5-21招聘資訊管理清單頁面
5.3 基于springboot的校園跑腿管理系統配送員部分設計
5.3.1接取任務管理
當配送人員登入之後可以檢視使用者釋出的配送任務,并可以點選後面的接取按鈕線上進行接單。基于springboot的校園跑腿管理系統配送員接單界面如圖 5-22
圖5-22配送員接單界面
5.3.2已接取訂單管理
當配送人員在上一步中接取了自己的任務之後可以可以檢視和管理自己的任務,并可以安排配送。基于springboot的校園跑腿管理系統配送員已接取訂單管理界面如圖 5-23
圖5-23配送員已接取訂單管理界面
5.3.3已配送訂單管理
當配送人員在上一步中完成了配送之後可以檢視已經完成的配送的訂單資訊。基于springboot的校園跑腿管理系統配送員已配送界面如圖 5-24
圖5-24配送員已配送界面
5.3.4已評價訂單管理
當配送人員在完成了訂單之後用于可以對配送員進行評價,配送員可以看到他人對自己的評價資訊。基于springboot的校園跑腿管理系統配送員已配送界面如圖 5-25
圖5-25配送員已評價訂單界面
四,核心代碼展示
package com.controller;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import org.apache.commons.lang3.StringUtils;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.ResourceUtils;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import com.annotation.IgnoreAuth;
import com.baidu.aip.face.AipFace;
import com.baidu.aip.face.MatchRequest;
import com.baidu.aip.util.Base64Util;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.entity.ConfigEntity;
import com.service.CommonService;
import com.service.ConfigService;
import com.utils.BaiduUtil;
import com.utils.FileUtil;
import com.utils.R;
/**
* 通用接口
*/
@RestController
public class CommonController{
@Autowired
private CommonService commonService;
private static AipFace client = null;
@Autowired
private ConfigService configService;
/**
* 擷取table表中的column清單(關聯接口)
* @param table
* @param column
* @return
*/
@IgnoreAuth
@RequestMapping("/option/{tableName}/{columnName}")
public R getOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,String level,String parent) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
if(StringUtils.isNotBlank(level)) {
params.put("level", level);
}
if(StringUtils.isNotBlank(parent)) {
params.put("parent", parent);
}
List<String> data = commonService.getOption(params);
return R.ok().put("data", data);
}
/**
* 根據table中的column擷取單條記錄
* @param table
* @param column
* @return
*/
@IgnoreAuth
@RequestMapping("/follow/{tableName}/{columnName}")
public R getFollowByOption(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName, @RequestParam String columnValue) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
params.put("columnValue", columnValue);
Map<String, Object> result = commonService.getFollowByOption(params);
return R.ok().put("data", result);
}
/**
* 修改table表的sfsh狀态
* @param table
* @param map
* @return
*/
@RequestMapping("/sh/{tableName}")
public R sh(@PathVariable("tableName") String tableName, @RequestBody Map<String, Object> map) {
map.put("table", tableName);
commonService.sh(map);
return R.ok();
}
/**
* 擷取需要提醒的記錄數
* @param tableName
* @param columnName
* @param type 1:數字 2:日期
* @param map
* @return
*/
@IgnoreAuth
@RequestMapping("/remind/{tableName}/{columnName}/{type}")
public R remindCount(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName,
@PathVariable("type") String type,@RequestParam Map<String, Object> map) {
map.put("table", tableName);
map.put("column", columnName);
map.put("type", type);
if(type.equals("2")) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Calendar c = Calendar.getInstance();
Date remindStartDate = null;
Date remindEndDate = null;
if(map.get("remindstart")!=null) {
Integer remindStart = Integer.parseInt(map.get("remindstart").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindStart);
remindStartDate = c.getTime();
map.put("remindstart", sdf.format(remindStartDate));
}
if(map.get("remindend")!=null) {
Integer remindEnd = Integer.parseInt(map.get("remindend").toString());
c.setTime(new Date());
c.add(Calendar.DAY_OF_MONTH,remindEnd);
remindEndDate = c.getTime();
map.put("remindend", sdf.format(remindEndDate));
}
}
int count = commonService.remindCount(map);
return R.ok().put("count", count);
}
/**
* 單列求和
*/
@IgnoreAuth
@RequestMapping("/cal/{tableName}/{columnName}")
public R cal(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
Map<String, Object> result = commonService.selectCal(params);
return R.ok().put("data", result);
}
/**
* 分組統計
*/
@IgnoreAuth
@RequestMapping("/group/{tableName}/{columnName}")
public R group(@PathVariable("tableName") String tableName, @PathVariable("columnName") String columnName) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("column", columnName);
List<Map<String, Object>> result = commonService.selectGroup(params);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* (按值統計)
*/
@IgnoreAuth
@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}")
public R value(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
List<Map<String, Object>> result = commonService.selectValue(params);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* (按值統計)時間統計類型
*/
@IgnoreAuth
@RequestMapping("/value/{tableName}/{xColumnName}/{yColumnName}/{timeStatType}")
public R valueDay(@PathVariable("tableName") String tableName, @PathVariable("yColumnName") String yColumnName, @PathVariable("xColumnName") String xColumnName, @PathVariable("timeStatType") String timeStatType) {
Map<String, Object> params = new HashMap<String, Object>();
params.put("table", tableName);
params.put("xColumn", xColumnName);
params.put("yColumn", yColumnName);
params.put("timeStatType", timeStatType);
List<Map<String, Object>> result = commonService.selectTimeStatValue(params);
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
for(Map<String, Object> m : result) {
for(String k : m.keySet()) {
if(m.get(k) instanceof Date) {
m.put(k, sdf.format((Date)m.get(k)));
}
}
}
return R.ok().put("data", result);
}
/**
* 人臉比對
*
* @param face1 人臉1
* @param face2 人臉2
* @return
*/
@RequestMapping("/matchFace")
@IgnoreAuth
public R matchFace(String face1, String face2,HttpServletRequest request) {
if(client==null) {
/*String AppID = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "AppID")).getValue();*/
String APIKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "APIKey")).getValue();
String SecretKey = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "SecretKey")).getValue();
String token = BaiduUtil.getAuth(APIKey, SecretKey);
if(token==null) {
return R.error("請在配置管理中正确配置APIKey和SecretKey");
}
client = new AipFace(null, APIKey, SecretKey);
client.setConnectionTimeoutInMillis(2000);
client.setSocketTimeoutInMillis(60000);
}
JSONObject res = null;
try {
File path = new File(ResourceUtils.getURL("classpath:static").getPath());
if(!path.exists()) {
path = new File("");
}
File upload = new File(path.getAbsolutePath(),"/upload/");
File file1 = new File(upload.getAbsolutePath()+"/"+face1);
File file2 = new File(upload.getAbsolutePath()+"/"+face2);
String img1 = Base64Util.encode(FileUtil.FileToByte(file1));
String img2 = Base64Util.encode(FileUtil.FileToByte(file2));
MatchRequest req1 = new MatchRequest(img1, "BASE64");
MatchRequest req2 = new MatchRequest(img2, "BASE64");
ArrayList<MatchRequest> requests = new ArrayList<MatchRequest>();
requests.add(req1);
requests.add(req2);
res = client.match(requests);
System.out.println(res.get("result"));
} catch (FileNotFoundException e) {
e.printStackTrace();
return R.error("檔案不存在");
} catch (IOException e) {
e.printStackTrace();
}
return R.ok().put("data", com.alibaba.fastjson.JSONObject.parse(res.get("result").toString()));
}
}
package com.controller; import java.util.Arrays; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import com.annotation.IgnoreAuth; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.entity.ConfigEntity; import com.service.ConfigService; import com.utils.MPUtil; import com.utils.PageUtils; import com.utils.R; import com.utils.ValidatorUtils; /** * 登入相關 */ @RequestMapping("config") @RestController public class ConfigController{ @Autowired private ConfigService configService; /** * 清單 */ @RequestMapping("/page") public R page(@RequestParam Map<String, Object> params,ConfigEntity config){ EntityWrapper<ConfigEntity> ew = new EntityWrapper<ConfigEntity>(); PageUtils page = configService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, config), params), params)); return R.ok().put("data", page); } /** * 清單 */ @IgnoreAuth @RequestMapping("/list") public R list(@RequestParam Map<String, Object> params,ConfigEntity config){ EntityWrapper<ConfigEntity> ew = new EntityWrapper<ConfigEntity>(); PageUtils page = configService.queryPage(params, MPUtil.sort(MPUtil.between(MPUtil.likeOrEq(ew, config), params), params)); return R.ok().put("data", page); } /** * 資訊 */ @RequestMapping("/info/{id}") public R info(@PathVariable("id") String id){ ConfigEntity config = configService.selectById(id); return R.ok().put("data", config); } /** * 詳情 */ @IgnoreAuth @RequestMapping("/detail/{id}") public R detail(@PathVariable("id") String id){ ConfigEntity config = configService.selectById(id); return R.ok().put("data", config); } /** * 根據name擷取資訊 */ @RequestMapping("/info") public R infoByName(@RequestParam String name){ ConfigEntity config = configService.selectOne(new EntityWrapper<ConfigEntity>().eq("name", "faceFile")); return R.ok().put("data", config); } /** * 儲存 */ @PostMapping("/save") public R save(@RequestBody ConfigEntity config){ // ValidatorUtils.validateEntity(config); configService.insert(config); return R.ok(); } /** * 修改 */ @RequestMapping("/update") public R update(@RequestBody ConfigEntity config){ // ValidatorUtils.validateEntity(config); configService.updateById(config);//全部更新 return R.ok(); } /** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody Long[] ids){ configService.deleteBatchIds(Arrays.asList(ids)); return R.ok(); } }