AI预警修改保存目录

This commit is contained in:
GUO 2024-06-01 19:41:18 +08:00
parent c734368723
commit 0bc230dd45
7 changed files with 92 additions and 44 deletions

View File

@ -6,6 +6,7 @@ import cn.hutool.core.convert.Convert;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil; import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.xuyanwu.spring.file.storage.FileStorageService;
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
@ -21,6 +22,7 @@ import com.zhgd.xmgl.async.AsyncHikvision;
import com.zhgd.xmgl.base.*; import com.zhgd.xmgl.base.*;
import com.zhgd.xmgl.call.entity.ChargeDeletionParam; import com.zhgd.xmgl.call.entity.ChargeDeletionParam;
import com.zhgd.xmgl.constant.Cts; import com.zhgd.xmgl.constant.Cts;
import com.zhgd.xmgl.modules.basicdata.service.UploadFileService;
import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl; import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl;
import com.zhgd.xmgl.modules.car.entity.CarCamera; import com.zhgd.xmgl.modules.car.entity.CarCamera;
import com.zhgd.xmgl.modules.car.entity.CarInfo; import com.zhgd.xmgl.modules.car.entity.CarInfo;
@ -37,7 +39,9 @@ import com.zhgd.xmgl.modules.frontierprotectionnonet.mapper.FrontierProtectionNo
import com.zhgd.xmgl.modules.frontierprotectionnonet.service.IFrontierProtectionNoNetDevService; import com.zhgd.xmgl.modules.frontierprotectionnonet.service.IFrontierProtectionNoNetDevService;
import com.zhgd.xmgl.modules.frontierprotectionnonet.service.impl.FrontierProtectionNoNetDataServiceImpl; import com.zhgd.xmgl.modules.frontierprotectionnonet.service.impl.FrontierProtectionNoNetDataServiceImpl;
import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo;
import com.zhgd.xmgl.modules.project.mapper.ProjectMapper; import com.zhgd.xmgl.modules.project.mapper.ProjectMapper;
import com.zhgd.xmgl.modules.project.service.impl.ProjectServiceImpl;
import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareAlarmRecord; import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareAlarmRecord;
import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareRecord; import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareRecord;
import com.zhgd.xmgl.modules.video.mapper.AiAnalyseHardWareAlarmRecordMapper; import com.zhgd.xmgl.modules.video.mapper.AiAnalyseHardWareAlarmRecordMapper;
@ -52,10 +56,10 @@ import com.zhgd.xmgl.modules.worker.mapper.WorkerInfoMapper;
import com.zhgd.xmgl.modules.worker.service.IWorkerAttendancePresenceService; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendancePresenceService;
import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService; import com.zhgd.xmgl.modules.worker.service.IWorkerAttendanceService;
import com.zhgd.xmgl.modules.worker.service.impl.WorkerAttendanceServiceImpl; import com.zhgd.xmgl.modules.worker.service.impl.WorkerAttendanceServiceImpl;
import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionCompareDataMapper;
import com.zhgd.xmgl.modules.xz.service.IXzHikvisionCompareDataService;
import com.zhgd.xmgl.modules.xz.entity.XzHikvisionSync; import com.zhgd.xmgl.modules.xz.entity.XzHikvisionSync;
import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionCompareDataMapper;
import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionSyncMapper; import com.zhgd.xmgl.modules.xz.mapper.XzHikvisionSyncMapper;
import com.zhgd.xmgl.modules.xz.service.IXzHikvisionCompareDataService;
import com.zhgd.xmgl.modules.xz.service.impl.XzHikvisionSyncServiceImpl; import com.zhgd.xmgl.modules.xz.service.impl.XzHikvisionSyncServiceImpl;
import com.zhgd.xmgl.security.util.SecurityUtils; import com.zhgd.xmgl.security.util.SecurityUtils;
import com.zhgd.xmgl.util.*; import com.zhgd.xmgl.util.*;
@ -90,6 +94,15 @@ public class HikvisionCall {
XzHikvisionSyncServiceImpl xzHikvisionSyncService; XzHikvisionSyncServiceImpl xzHikvisionSyncService;
@Lazy @Lazy
@Autowired @Autowired
UploadFileService uploadFileService;
@Lazy
@Autowired
ProjectServiceImpl projectService;
@Lazy
@Autowired
FileStorageService fileStorageService;
@Lazy
@Autowired
CarPassRecordServiceImpl carPassRecordService; CarPassRecordServiceImpl carPassRecordService;
@Lazy @Lazy
@Autowired @Autowired
@ -385,6 +398,7 @@ public class HikvisionCall {
log.info("重复的ai预警数据不保存deviceID{},createTime:{}", deviceID, createTime); log.info("重复的ai预警数据不保存deviceID{},createTime:{}", deviceID, createTime);
return; return;
} }
ProjectInfoExtVo projectInfoBySn = projectService.getProjectInfoBySn(dev.getProjectSn());
AiAnalyseHardWareAlarmRecord aiAnalyseHardWareAlarmRecord = new AiAnalyseHardWareAlarmRecord(); AiAnalyseHardWareAlarmRecord aiAnalyseHardWareAlarmRecord = new AiAnalyseHardWareAlarmRecord();
aiAnalyseHardWareAlarmRecord.setCreateTime(createTime); aiAnalyseHardWareAlarmRecord.setCreateTime(createTime);
aiAnalyseHardWareAlarmRecord.setAlarmType(Integer.valueOf(eventType)); aiAnalyseHardWareAlarmRecord.setAlarmType(Integer.valueOf(eventType));
@ -393,7 +407,8 @@ public class HikvisionCall {
aiAnalyseHardWareAlarmRecord.setLocation(srcName); aiAnalyseHardWareAlarmRecord.setLocation(srcName);
aiAnalyseHardWareAlarmRecord.setProjectSn(dev.getProjectSn()); aiAnalyseHardWareAlarmRecord.setProjectSn(dev.getProjectSn());
aiAnalyseHardWareAlarmRecord.setStatus(1); aiAnalyseHardWareAlarmRecord.setStatus(1);
aiAnalyseHardWareAlarmRecord.setImageUrl(saveToLocal(imageUrl)); String relativePath = projectInfoBySn.getProjectName() + "/" + DateUtil.today();
aiAnalyseHardWareAlarmRecord.setImageUrl(uploadFileService.uploadUrlReturnFileName(imageUrl, relativePath));
aiAnalyseHardWareAlarmRecordMapper.insert(aiAnalyseHardWareAlarmRecord); aiAnalyseHardWareAlarmRecordMapper.insert(aiAnalyseHardWareAlarmRecord);
//将数据通过MQTT转发到前台 //将数据通过MQTT转发到前台
asyncAiAnalyse.sendAiAnalyse(aiAnalyseHardWareAlarmRecord, Cts.PROJECT_LEVEL_AND_CHILDREN); asyncAiAnalyse.sendAiAnalyse(aiAnalyseHardWareAlarmRecord, Cts.PROJECT_LEVEL_AND_CHILDREN);
@ -1294,9 +1309,9 @@ public class HikvisionCall {
if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) { if (project == null || !Objects.equals(project.getSyncHikvision(), 1)) {
return; return;
} }
deleteWorkerFace(uniqueId,workerInfo, project); deleteWorkerFace(uniqueId, workerInfo, project);
deleteWorkerFromHttp(uniqueId,workerInfo, project); deleteWorkerFromHttp(uniqueId, workerInfo, project);
} }
public void deleteWorkerFromHttp(String uniqueId, WorkerInfo workerInfo, Project project) throws Exception { public void deleteWorkerFromHttp(String uniqueId, WorkerInfo workerInfo, Project project) throws Exception {
@ -2261,17 +2276,7 @@ public class HikvisionCall {
public String saveToLocal(String url) { public String saveToLocal(String url) {
if (StringUtils.isBlank(url)) { return UrlUtil.saveToLocal(url, basePath, IdUtil.simpleUUID() + ".png");
return null;
}
String fileName = IdUtil.simpleUUID() + ".png";
try {
X509TrustManagerUtil.downLoadFromUrl(url, fileName, basePath);
} catch (Exception e) {
log.error("下载海康图片出现异常:" + e);
return null;
}
return fileName;
} }
/** /**

View File

@ -34,17 +34,28 @@ public interface UploadFileService {
FileInfo uploadFileBase64Image(String base64Image); FileInfo uploadFileBase64Image(String base64Image);
/**
* 上传url返回文件名称
*
* @param url
* @return
*/
String uploadUrlReturnFileName(String url);
/**
* 上传url返回文件名称
*
* @param url
* @param relativePath 相对路径
* @return
*/
String uploadUrlReturnFileName(String url, String relativePath);
FileInfo uploadFileBufferedImage(BufferedImage bufferedImage); FileInfo uploadFileBufferedImage(BufferedImage bufferedImage);
Map<String, Object> uploadUrlResource(String url); Map<String, Object> uploadUrlResource(String url);
String uploadUrlResourceRtName(String url);
/**
* 异步文件上传
*
* @param file
*/
void uploadAsync(MultipartFile file); void uploadAsync(MultipartFile file);
Result<UploadImageVo> uploadSjImage(MultipartFile file); Result<UploadImageVo> uploadSjImage(MultipartFile file);

View File

@ -5,7 +5,6 @@ import cn.xuyanwu.spring.file.storage.FileInfo;
import cn.xuyanwu.spring.file.storage.FileStorageService; import cn.xuyanwu.spring.file.storage.FileStorageService;
import com.zhgd.file.FileUtil; import com.zhgd.file.FileUtil;
import com.zhgd.jeecg.common.api.vo.Result; import com.zhgd.jeecg.common.api.vo.Result;
import com.zhgd.jeecg.common.execption.OpenAlertException;
import com.zhgd.xmgl.modules.basicdata.entity.vo.UploadImageVo; import com.zhgd.xmgl.modules.basicdata.entity.vo.UploadImageVo;
import com.zhgd.xmgl.modules.basicdata.service.UploadFileService; import com.zhgd.xmgl.modules.basicdata.service.UploadFileService;
import com.zhgd.xmgl.util.MessageUtil; import com.zhgd.xmgl.util.MessageUtil;
@ -38,8 +37,7 @@ public class UploadFileServiceImpl implements UploadFileService {
private FileStorageService fileStorageService; private FileStorageService fileStorageService;
/** /**
* @throws Exception * @throws Exception 2017年7月20日 下午5:17:36 @throws
* 2017年7月20日 下午5:17:36 @throws
*/ */
@Override @Override
public Map<String, Object> uploadImage(MultipartFile[] files) throws Exception { public Map<String, Object> uploadImage(MultipartFile[] files) throws Exception {
@ -146,7 +144,7 @@ public class UploadFileServiceImpl implements UploadFileService {
} }
@Override @Override
public String uploadUrlResourceRtName(String url) { public String uploadUrlReturnFileName(String url) {
try { try {
return ((List<Map<String, Object>>) uploadUrlResource(url).get("data")).get(0).get("imageUrl").toString(); return ((List<Map<String, Object>>) uploadUrlResource(url).get("data")).get(0).get("imageUrl").toString();
} catch (Exception e) { } catch (Exception e) {
@ -155,6 +153,12 @@ public class UploadFileServiceImpl implements UploadFileService {
throw new RuntimeException("转码错误!"); throw new RuntimeException("转码错误!");
} }
@Override
public String uploadUrlReturnFileName(String url, String relativePath) {
FileInfo fileInfo = fileStorageService.of(UrlUtil.uploadImgUrlToMultipartFile(url)).setPath(relativePath).upload();
return relativePath + "/" + fileInfo.getFilename();
}
/** /**
* 异步文件上传 * 异步文件上传
*/ */

View File

@ -3,6 +3,7 @@ package com.zhgd.xmgl.modules.video.service.impl;
import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil; import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.xuyanwu.spring.file.storage.FileInfo; import cn.xuyanwu.spring.file.storage.FileInfo;
import cn.xuyanwu.spring.file.storage.FileStorageService; import cn.xuyanwu.spring.file.storage.FileStorageService;
@ -32,6 +33,7 @@ import com.zhgd.xmgl.modules.basicdata.service.UploadFileService;
import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl; import com.zhgd.xmgl.modules.basicdata.service.impl.NoticeServiceImpl;
import com.zhgd.xmgl.modules.project.entity.Project; import com.zhgd.xmgl.modules.project.entity.Project;
import com.zhgd.xmgl.modules.project.entity.ProjectJqmDev; import com.zhgd.xmgl.modules.project.entity.ProjectJqmDev;
import com.zhgd.xmgl.modules.project.entity.vo.ProjectInfoExtVo;
import com.zhgd.xmgl.modules.project.service.IProjectService; import com.zhgd.xmgl.modules.project.service.IProjectService;
import com.zhgd.xmgl.modules.project.service.ProjectJqmDevService; import com.zhgd.xmgl.modules.project.service.ProjectJqmDevService;
import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareAlarmRecord; import com.zhgd.xmgl.modules.video.entity.AiAnalyseHardWareAlarmRecord;
@ -202,16 +204,18 @@ public class AiAnalyseHardWareAlarmRecordServiceImpl extends ServiceImpl<AiAnaly
aiAnalyseHardWareAlarmRecord.setHardwareId(aiAnalyseHardWareRecord.getHardwareId()); aiAnalyseHardWareAlarmRecord.setHardwareId(aiAnalyseHardWareRecord.getHardwareId());
aiAnalyseHardWareAlarmRecord.setHardwareName(aiAnalyseHardWareRecord.getHardwareName()); aiAnalyseHardWareAlarmRecord.setHardwareName(aiAnalyseHardWareRecord.getHardwareName());
String alarmVideo = body.getString("alarmVideo"); String alarmVideo = body.getString("alarmVideo");
ProjectInfoExtVo projectInfoBySn = projectService.getProjectInfoBySn(aiAnalyseHardWareRecord.getProjectSn());
String relativePath = projectInfoBySn.getProjectName() + "/AI推送列表/" + DateUtil.today();
if (StringUtils.isNotEmpty(alarmVideo)) { if (StringUtils.isNotEmpty(alarmVideo)) {
FileInfo alarmVideoInfo = fileStorageService.of(UrlUtil.uploadImgUrlToMultipartFile(alarmVideo)).setPath(DateUtil.today()).upload(); FileInfo alarmVideoInfo = fileStorageService.of(UrlUtil.uploadImgUrlToMultipartFile(alarmVideo)).setPath(relativePath).upload();
aiAnalyseHardWareAlarmRecord.setAlarmVideo(DateUtil.today() + "/" + alarmVideoInfo.getFilename()); aiAnalyseHardWareAlarmRecord.setAlarmVideo(relativePath + "/" + alarmVideoInfo.getFilename());
} }
aiAnalyseHardWareAlarmRecord.setProjectSn(aiAnalyseHardWareRecord.getProjectSn()); aiAnalyseHardWareAlarmRecord.setProjectSn(aiAnalyseHardWareRecord.getProjectSn());
aiAnalyseHardWareAlarmRecord.setStatus(1); aiAnalyseHardWareAlarmRecord.setStatus(1);
String alarmImage = body.getString("alarmImage"); String alarmImage = body.getString("alarmImage");
if (StringUtils.isNotEmpty(alarmImage)) { if (StringUtils.isNotEmpty(alarmImage)) {
FileInfo alarmImageInfo = fileStorageService.of(UrlUtil.uploadImgUrlToMultipartFile(alarmImage)).setPath(DateUtil.today()).upload(); FileInfo alarmImageInfo = fileStorageService.of(UrlUtil.uploadImgUrlToMultipartFile(alarmImage)).setPath(relativePath).upload();
aiAnalyseHardWareAlarmRecord.setImageUrl(DateUtil.today() + "/" + alarmImageInfo.getFilename()); aiAnalyseHardWareAlarmRecord.setImageUrl(relativePath + "/" + alarmImageInfo.getFilename());
} }
aiAnalyseHardWareAlarmRecord.setAlarmDesc(body.getString("alarmDesc")); aiAnalyseHardWareAlarmRecord.setAlarmDesc(body.getString("alarmDesc"));
@ -594,6 +598,10 @@ public class AiAnalyseHardWareAlarmRecordServiceImpl extends ServiceImpl<AiAnaly
throw new OpenAlertException("未找到该记录"); throw new OpenAlertException("未找到该记录");
} }
record.setIsPushed(true); record.setIsPushed(true);
ProjectInfoExtVo projectInfoBySn = projectService.getProjectInfoBySn(record.getProjectSn());
String relativePath = projectInfoBySn.getProjectName() + "/AI预警列表/" + DateUtil.today();
FileUtil.copy(PathUtil.getBasePath() + "/" + record.getImageUrl(), PathUtil.getBasePath() + "/" + relativePath, false);
FileUtil.copy(PathUtil.getBasePath() + "/" + record.getAlarmVideo(), PathUtil.getBasePath() + "/" + relativePath, false);
baseMapper.updateById(record); baseMapper.updateById(record);
UserInfo user = SecurityUtils.getUser(); UserInfo user = SecurityUtils.getUser();

View File

@ -36,7 +36,6 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled; import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -194,7 +193,7 @@ public class JzgTask {
workerAttendance.setProjectSn(projectSn); workerAttendance.setProjectSn(projectSn);
workerAttendance.setPassType(Integer.valueOf(jzg.getDirection())); workerAttendance.setPassType(Integer.valueOf(jzg.getDirection()));
workerAttendance.setCardType(getCardType(jzg.getAttendType())); workerAttendance.setCardType(getCardType(jzg.getAttendType()));
workerAttendance.setImageUrl(uploadFileService.uploadUrlResourceRtName(jzg.getImageUrl())); workerAttendance.setImageUrl(uploadFileService.uploadUrlReturnFileName(jzg.getImageUrl()));
for (UfaceDev ufaceDev : ufaceDevs) { for (UfaceDev ufaceDev : ufaceDevs) {
Integer passType = workerAttendance.getPassType(); Integer passType = workerAttendance.getPassType();
if (Objects.equals(passType, 1) && Objects.equals(ufaceDev.getIsEnter(), 1)) { if (Objects.equals(passType, 1) && Objects.equals(ufaceDev.getIsEnter(), 1)) {
@ -302,25 +301,25 @@ public class JzgTask {
if (owi != null) { if (owi != null) {
deleteFile(owi.getFieldAcquisitionUrl()); deleteFile(owi.getFieldAcquisitionUrl());
} }
wi.setFieldAcquisitionUrl(uploadFileService.uploadUrlResourceRtName(jzg.getIssueCardPicUrl())); wi.setFieldAcquisitionUrl(uploadFileService.uploadUrlReturnFileName(jzg.getIssueCardPicUrl()));
} }
if (StrUtil.isNotBlank(jzg.getHeadImageUrl())) { if (StrUtil.isNotBlank(jzg.getHeadImageUrl())) {
if (owi != null) { if (owi != null) {
deleteFile(owi.getIdCardBigPhotoUrl()); deleteFile(owi.getIdCardBigPhotoUrl());
} }
wi.setIdCardBigPhotoUrl(uploadFileService.uploadUrlResourceRtName(jzg.getHeadImageUrl())); wi.setIdCardBigPhotoUrl(uploadFileService.uploadUrlReturnFileName(jzg.getHeadImageUrl()));
} }
if (StrUtil.isNotBlank(jzg.getPositiveIdCardImageUrl())) { if (StrUtil.isNotBlank(jzg.getPositiveIdCardImageUrl())) {
if (owi != null) { if (owi != null) {
deleteFile(owi.getIdCardUpPhotoUrl()); deleteFile(owi.getIdCardUpPhotoUrl());
} }
wi.setIdCardUpPhotoUrl(uploadFileService.uploadUrlResourceRtName(jzg.getPositiveIdCardImageUrl())); wi.setIdCardUpPhotoUrl(uploadFileService.uploadUrlReturnFileName(jzg.getPositiveIdCardImageUrl()));
} }
if (StrUtil.isNotBlank(jzg.getNegativeIdCardImageUrl())) { if (StrUtil.isNotBlank(jzg.getNegativeIdCardImageUrl())) {
if (owi != null) { if (owi != null) {
deleteFile(owi.getIdCardDownPhotoUrl()); deleteFile(owi.getIdCardDownPhotoUrl());
} }
wi.setIdCardDownPhotoUrl(uploadFileService.uploadUrlResourceRtName(jzg.getNegativeIdCardImageUrl())); wi.setIdCardDownPhotoUrl(uploadFileService.uploadUrlReturnFileName(jzg.getNegativeIdCardImageUrl()));
} }
wi.setPhoneNumber(jzg.getCellPhone()); wi.setPhoneNumber(jzg.getCellPhone());
wi.setIssuingAuthorityForIdcard(jzg.getGrantOrg()); wi.setIssuingAuthorityForIdcard(jzg.getGrantOrg());

View File

@ -1,16 +1,12 @@
package com.zhgd.xmgl.util; package com.zhgd.xmgl.util;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
public class PathUtil { public class PathUtil {
private static String basePath; private static String basePath;
@Value("${basePath}")
public void setBasePath(String basePath) {
basePath = basePath;
}
/** /**
* 删除多余的斜杠 * 删除多余的斜杠
* *
@ -30,6 +26,11 @@ public class PathUtil {
} }
public static String getBasePath() { public static String getBasePath() {
return basePath; return StrUtil.removeSuffix(basePath, "/");
}
@Value("${basePath}")
public void setBasePath(String basePath) {
basePath = basePath;
} }
} }

View File

@ -188,11 +188,31 @@ public class UrlUtil {
return mapRequest; return mapRequest;
} }
/**
* 保存图片到本地
*
* @param url
* @param savePath
* @param fileName
* @return
*/
public static String saveToLocal(String url, String savePath, String fileName) {
if (StringUtils.isBlank(url)) {
return null;
}
try {
X509TrustManagerUtil.downLoadFromUrl(url, fileName, savePath);
} catch (Exception e) {
log.error("下载图片出现异常:" + e);
return null;
}
return fileName;
}
public static void main(String[] args) { public static void main(String[] args) {
HashMap<String, Object> map = new HashMap<>(); HashMap<String, Object> map = new HashMap<>();
map.put("k1", "v1"); map.put("k1", "v1");
map.put("k", "v"); map.put("k", "v");
System.out.println(urlJoin("http://baidu.com", map)); System.out.println(urlJoin("http://baidu.com", map));
} }
} }