最新后端代码

master
zhanglinhao 1 year ago
parent bfa49ec0eb
commit 89c2fba28a

@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/
### VS Code ###
.vscode/

@ -0,0 +1,25 @@
package com.softegg.freetogo.Api.authencation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.IOException;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/23 15:47
*/
@RestController
@RequestMapping("/api")
public class authenticationController {
@Autowired
com.softegg.freetogo.Api.authencation.authenticationService authenticationService;
@GetMapping("authenticate")
public void authenticate(String idc, String phone, String name) throws IOException {
authenticationService.authenticate(idc, phone, name);
}
}

@ -0,0 +1,56 @@
package com.softegg.freetogo.Api.authencation;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.Response;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* @description: api
* @author: zhanglinhao
* @date: 2024/5/23 15:12
*/
@Service
public class authenticationService {
public void authenticate(String idc, String phone, String name) throws IOException {
String url = "https://mobile3elements.shumaidata.com/mobile/verify_real_name";
String appCode = "15704c321ae8459bb36fcadd888d67c4";
Map<String, String> params = new HashMap<>();
params.put("idcard", idc);
params.put("mobile", phone);
params.put("name", name);
String result = postForm(appCode, url, params);
System.out.println(result);
}
/**
* HTTPokhttp 3.13.1
* <dependency>
* <groupId>com.squareup.okhttp3</groupId>
* <artifactId>okhttp</artifactId>
* <version>3.13.1</version>
* </dependency>
*/
public static String postForm(String appCode, String url, Map<String, String> params) throws IOException {
OkHttpClient client = new OkHttpClient.Builder().build();
FormBody.Builder formbuilder = new FormBody.Builder();
Iterator<String> it = params.keySet().iterator();
while (it.hasNext()) {
String key = it.next();
formbuilder.add(key, params.get(key));
}
FormBody body = formbuilder.build();
Request request = new Request.Builder().url(url).addHeader("Authorization", "APPCODE " + appCode).post(body).build();
Response response = client.newCall(request).execute();
System.out.println("返回状态码" + response.code() + ",message:" + response.message());
String result = response.body().string();
return result;
}
}

@ -0,0 +1,40 @@
package com.softegg.freetogo.Api.captcha;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/24 9:54
*/
@RestController
@RequestMapping("/api")
public class captchaController {
@Autowired
private RedisUtil redisUtil;
@RequestMapping("/captcha")
public JsonResult captcha(HttpServletRequest request, HttpServletResponse response) throws Exception {
SpecCaptcha specCaptcha = new SpecCaptcha(130, 48, 5);
String verCode = specCaptcha.text().toLowerCase();
String key = UUID.randomUUID().toString();
// 存入redis并设置过期时间为30分钟
redisUtil.setEx(key, verCode, 30, TimeUnit.MINUTES);
// 将key和base64返回给前端
return JsonResult.ok().put("key", key).put("image", specCaptcha.toBase64());
}
@ResponseBody
@PostMapping("/login")
public JsonResult login(String username,String password,String verCode,String verKey){
// 获取redis中的验证码
String redisCode = redisUtil.get(verKey);
// 判断验证码
if (verCode==null || !redisCode.equals(verCode.trim().toLowerCase())) {
return JsonResult.error("验证码不正确");
}
}
}

@ -0,0 +1,18 @@
package com.softegg.freetogo.Api.captcha;
import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.geom.GeneralPath;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.Random;
import java.util.UUID;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/24 9:27
*/
public class captchaService {
}

@ -0,0 +1,316 @@
package com.softegg.freetogo.Api.phoneVerification;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.apache.commons.lang.StringUtils;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.methods.HttpPut;
import org.apache.http.conn.ClientConnectionManager;
import org.apache.http.conn.scheme.Scheme;
import org.apache.http.conn.scheme.SchemeRegistry;
import org.apache.http.conn.ssl.SSLSocketFactory;
import org.apache.http.entity.ByteArrayEntity;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
/**
* @description: http
* @author: aliyun
* @date: 2024/5/29 15:36
*/
public class HttpUtils {
/**
* get
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @return
* @throws Exception
*/
public static HttpResponse doGet(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpGet request = new HttpGet(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
return httpClient.execute(request);
}
/**
* post form
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param bodys
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
Map<String, String> bodys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (bodys != null) {
List<NameValuePair> nameValuePairList = new ArrayList<NameValuePair>();
for (String key : bodys.keySet()) {
nameValuePairList.add(new BasicNameValuePair(key, bodys.get(key)));
}
UrlEncodedFormEntity formEntity = new UrlEncodedFormEntity(nameValuePairList, "utf-8");
formEntity.setContentType("application/x-www-form-urlencoded; charset=UTF-8");
request.setEntity(formEntity);
}
return httpClient.execute(request);
}
/**
* Post String
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
String body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (StringUtils.isNotBlank(body)) {
request.setEntity(new StringEntity(body, "utf-8"));
}
return httpClient.execute(request);
}
/**
* Post stream
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPost(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
byte[] body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPost request = new HttpPost(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (body != null) {
request.setEntity(new ByteArrayEntity(body));
}
return httpClient.execute(request);
}
/**
* Put String
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPut(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
String body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPut request = new HttpPut(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (StringUtils.isNotBlank(body)) {
request.setEntity(new StringEntity(body, "utf-8"));
}
return httpClient.execute(request);
}
/**
* Put stream
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @param body
* @return
* @throws Exception
*/
public static HttpResponse doPut(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys,
byte[] body)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpPut request = new HttpPut(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
if (body != null) {
request.setEntity(new ByteArrayEntity(body));
}
return httpClient.execute(request);
}
/**
* Delete
*
* @param host
* @param path
* @param method
* @param headers
* @param querys
* @return
* @throws Exception
*/
public static HttpResponse doDelete(String host, String path, String method,
Map<String, String> headers,
Map<String, String> querys)
throws Exception {
HttpClient httpClient = wrapClient(host);
HttpDelete request = new HttpDelete(buildUrl(host, path, querys));
for (Map.Entry<String, String> e : headers.entrySet()) {
request.addHeader(e.getKey(), e.getValue());
}
return httpClient.execute(request);
}
private static String buildUrl(String host, String path, Map<String, String> querys) throws UnsupportedEncodingException {
StringBuilder sbUrl = new StringBuilder();
sbUrl.append(host);
if (!StringUtils.isBlank(path)) {
sbUrl.append(path);
}
if (null != querys) {
StringBuilder sbQuery = new StringBuilder();
for (Map.Entry<String, String> query : querys.entrySet()) {
if (0 < sbQuery.length()) {
sbQuery.append("&");
}
if (StringUtils.isBlank(query.getKey()) && !StringUtils.isBlank(query.getValue())) {
sbQuery.append(query.getValue());
}
if (!StringUtils.isBlank(query.getKey())) {
sbQuery.append(query.getKey());
if (!StringUtils.isBlank(query.getValue())) {
sbQuery.append("=");
sbQuery.append(URLEncoder.encode(query.getValue(), "utf-8"));
}
}
}
if (0 < sbQuery.length()) {
sbUrl.append("?").append(sbQuery);
}
}
return sbUrl.toString();
}
private static HttpClient wrapClient(String host) {
HttpClient httpClient = new DefaultHttpClient();
if (host.startsWith("https://")) {
sslClient(httpClient);
}
return httpClient;
}
private static void sslClient(HttpClient httpClient) {
try {
SSLContext ctx = SSLContext.getInstance("TLS");
X509TrustManager tm = new X509TrustManager() {
public X509Certificate[] getAcceptedIssuers() {
return null;
}
public void checkClientTrusted(X509Certificate[] xcs, String str) {
}
public void checkServerTrusted(X509Certificate[] xcs, String str) {
}
};
ctx.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory ssf = new SSLSocketFactory(ctx);
ssf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
ClientConnectionManager ccm = httpClient.getConnectionManager();
SchemeRegistry registry = ccm.getSchemeRegistry();
registry.register(new Scheme("https", 443, ssf));
} catch (KeyManagementException ex) {
throw new RuntimeException(ex);
} catch (NoSuchAlgorithmException ex) {
throw new RuntimeException(ex);
}
}
}

@ -0,0 +1,48 @@
package com.softegg.freetogo.Api.phoneVerification;
import org.apache.http.HttpResponse;
import java.util.HashMap;
import java.util.Map;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/29 15:11
*/
public class phoneVerification {
public void sendVerificationCode(String phone) {
String host = "https://gyytz.market.alicloudapi.com";
String path = "/sms/smsSend";
String method = "POST";
String appcode = "15704c321ae8459bb36fcadd888d67c4";
Map<String, String> headers = new HashMap<String, String>();
//最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
headers.put("Authorization", "APPCODE " + appcode);
Map<String, String> querys = new HashMap<String, String>();
querys.put("mobile", phone);
querys.put("param", "**code**:12345,**minute**:5");
//smsSignId短信前缀和templateId短信模板可登录国阳云控制台自助申请。参考文档http://help.guoyangyun.com/Problem/Qm.html
querys.put("smsSignId", "2e65b1bb3d054466b82f0c9d125465e2");
querys.put("templateId", "908e94ccf08b4476ba6c876d13f084ad");
Map<String, String> bodys = new HashMap<String, String>();
try {
/**
* :
* HttpUtils\r\n\t \t* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/src/main/java/com/aliyun/api/gateway/demo/util/HttpUtils.java\r\n\t \t* 下载
*
*
* https://github.com/aliyun/api-gateway-demo-sign-java/blob/master/pom.xml
*/
HttpResponse response = HttpUtils.doPost(host, path, method, headers, querys, bodys);
System.out.println(response.toString());
//获取response的body
//System.out.println(EntityUtils.toString(response.getEntity()));
} catch (Exception e) {
e.printStackTrace();
}
}
}

@ -0,0 +1,118 @@
package com.softegg.freetogo.Api.weather;
import com.google.gson.*;
import com.softegg.freetogo.Debug.utils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDate;
import java.time.temporal.ChronoUnit;
import java.util.ArrayList;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/28 21:13
*/
@RestController
@RequestMapping("/api")
public class weatherController {
private static final String weatherApiForWeek = "https://v1.yiketianqi.com/free/week?appid=84598529&appsecret=Z1hFDcbI&unescape=1&city=";
private static final String weatherApiForMonth = "https://v1.yiketianqi.com/free/month?appid=84598529&appsecret=Z1hFDcbI&unescape=1&city=";
private final utils util = new utils();
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/29 14:49
*/
private static int dateGap(String now, String expect) {
String[] nowList = now.split("-");
String[] expectList = expect.split("-");
LocalDate dateNow = LocalDate.of(Integer.parseInt(nowList[0]), Integer.parseInt(nowList[1]), Integer.parseInt(nowList[2]));
LocalDate dateExpect = LocalDate.of(Integer.parseInt(expectList[0]), Integer.parseInt(expectList[1]), Integer.parseInt(expectList[2]));
return (int) ChronoUnit.DAYS.between(dateNow, dateExpect);
}
@GetMapping("weather")
public String weatherForecast(String begin, String end, String city) {
int nowToBegin = dateGap(util.getToday(), begin);
int nowToEnd = dateGap(util.getToday(), end);
Pattern patternP = Pattern.compile("\\[(.*?)\\]");
String json = getWeather(begin, end, city);
Matcher matcher = patternP.matcher(getWeather(begin, end, city));
List<String> matches = new ArrayList<>();
while (matcher.find()) {
matches.add(matcher.group(1)); // 捕获组1是我们想要的内部字符串
}
// 使用Gson解析JSON字符串
JsonParser parser = new JsonParser();
JsonArray jsonArray = parser.parse('[' + matches.get(0) + ']').getAsJsonArray();
// 创建一个Gson实例用于将JsonElement对象转换为Java对象
Gson gson = new GsonBuilder().setPrettyPrinting().create();
List<String> cleanedWeatherData = new ArrayList<>();
for (JsonElement element : jsonArray) {
// 简单地将每个元素转换为字符串并添加到列表中
cleanedWeatherData.add(gson.toJson(element));
}
// 判断天气情况
for (String data : cleanedWeatherData) {
if (nowToBegin <= 0 && nowToEnd >= 0) {
if (data.contains("雨"))
return "旅行期间有雨";
}
nowToBegin--;
nowToEnd--;
}
return "天气不错,适合出行";
}
/**
* @description: 730
* @author: zhanglinhao
* @date: 2024/5/29 14:48
*/
private String getWeather(String begin, String end, String city) {
try {
String today = util.getToday();
StringBuilder response = new StringBuilder();
URL url;
//如果结束日期距离今日小于7天使用未来7天天气预报否则使用未来30天天气预报
if (dateGap(today, end) <= 7) {
url = new URL(weatherApiForWeek + city);
} else {
url = new URL(weatherApiForMonth + city);
}
HttpURLConnection con = (HttpURLConnection) url.openConnection();
con.setRequestMethod("GET");
int responseCode = con.getResponseCode();
util.printInfo("Response Code : " + responseCode);
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
util.printInfo(response.toString());
return response.toString();
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
}

@ -0,0 +1,27 @@
package com.softegg.freetogo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
/**
* @description:http使
* @author:zhanglinhao
* @date:2024/5/9 15:20
*/
@Configuration
public class Configurer implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
//是否发送Cookie
.allowCredentials(true)
//放行哪些原始域
.allowedOriginPatterns("*")
.allowedMethods("GET", "POST", "PUT", "DELETE")
.allowedHeaders("*")
.exposedHeaders("*");
// registry.addMapping("/**").allowedOrigins("http://106.52.218.118:8090");
}
}

@ -0,0 +1,37 @@
package com.softegg.freetogo.Debug;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/29 8:41
*/
public class utils {
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/29 14:52
*/
public <T> void printInfo(T text){
Date currentDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd|HH:mm:ss");
StackTraceElement[] stackTrace = Thread.currentThread().getStackTrace();
StackTraceElement element = stackTrace[2]; // 获取调用printFileAndLine方法的方法的堆栈信息
String fileName = element.getFileName();
int lineNumber = element.getLineNumber();
System.out.println("["+sdf.format(currentDate)+"]"+"File: " + fileName + ", Line: " + lineNumber + ", Info: "+ text);
}
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/29 14:52
*/
public String getToday(){
Date currentDate = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(currentDate);
}
}

@ -0,0 +1,19 @@
package com.softegg.freetogo.Demand.Dao;
import com.softegg.freetogo.Demand.bean.Demands;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* @description:Jpa
* @author:wuyifan
* @date:2024/5/10 19:50
*/
public interface DemandsRepository extends JpaRepository<Demands, Integer> {
List<Demands> findByPhone(String phone);
List<Demands> findByCity(String city);
List<Demands> findByProvince(String province);
}

@ -0,0 +1,53 @@
package com.softegg.freetogo.Demand.bean;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
/**
* @description:demand
* @author:wuyifan
* @date:2024/5/10 11:36
*/
@Entity
@Table(name = "demands")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Demands {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer did;
@Column
private String phone;//游客手机号码
@Column(name = "tourist_gender")
private String touristGender;//游客性别 ture:male, false:female
@Column
private String nickname;//发布需求的游客昵称信息
@Column(name = "create_time")
private String createTime;//需求发布时间
@Column(name = "departure_date")
private String departureDate;//游客需求起始日期
@Column(name = "end_date")
private String endDate;//游客需求结束日期
@Column(name = "sum_day")
private String sumDay;//游客旅游总天数
@Column
private String province;//发布需求的目的省份
@Column
private String city;//发布需求的目的城市
@Column
private String message;//需求备注内容
@Column
private Integer status;//游客需求状态 0未匹配 1请求匹配 2已完成匹配 3已完成所有服务
@Column
private Integer guideServiceId;//游客需求最终匹配到的导游服务id
@ElementCollection
@Column(name = "guide_service_id_list")
private List<Integer> guideServiceIdList;//游客需求申请匹配到的导游服务id
}

@ -0,0 +1,107 @@
package com.softegg.freetogo.Demand.controller;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.Demand.service.DemandsService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/**
* @description:Demand
* @author:wuyifan
* @date:2024/5/10 11:40
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/demands")
public class DemandsController {
@Autowired
private DemandsService demandsService;
@GetMapping("findAllRandom")
public List<Demands> findAllRandom() {
List<Demands> dlist = demandsService.findAll();
Collections.shuffle(dlist);
return dlist;
}
@GetMapping("add")
public String add(String phone,
String tGender,
String nkn,
String ct,
String dDate,
String eDate,
String sDay,
String province,
String city,
String message,
Integer status,
Integer guideServiceId,
List<Integer> guideServiceIdList) {
Demands demand = new Demands();
setDemands(phone, tGender, nkn, ct, dDate, eDate, sDay, province, city, message, status, demand, guideServiceId, guideServiceIdList);
demandsService.add(demand);
return "添加成功";
}
@PostMapping("delbyid")
public int delById(@RequestBody Map<String, Object> map) {
int did = Integer.parseInt(map.get("did").toString());
demandsService.deleteById(did);
return 1;
}
@GetMapping("findbyid")
public Demands getUserById(int id) {
return demandsService.getDemandById(id);
}
@GetMapping("update")
public String update(int id,
String phone,
String tGender,
String nkn,
String ct,
String dDate,
String eDate,
String sDay,
String province,
String city,
String message,
Integer status,
Integer guideServiceId,
List<Integer> guideServiceIdList) {
Demands demand = demandsService.getDemandById(id);
setDemands(phone, tGender, nkn, ct, dDate, eDate, sDay, province, city, message, status, demand, guideServiceId, guideServiceIdList);
demandsService.update(demand);
return "更新成功";
}
@GetMapping("getByPhone")
public List<Demands> getByPhone(String phone) {
System.out.println("根据手机号获取游客需求信息:" + phone);
return demandsService.getDemandsByPhone(phone);
}
private void setDemands(String phone, String tGender, String nkn, String ct, String dDate, String eDate, String sDay, String province, String city, String message, Integer status, Demands demand,Integer guideServiceId,List<Integer> guideServiceIdList) {
demand.setPhone(phone);
demand.setTouristGender(tGender);
demand.setNickname(nkn);
demand.setCreateTime(ct);
demand.setDepartureDate(dDate);
demand.setEndDate(eDate);
demand.setSumDay(sDay);
demand.setProvince(province);
demand.setCity(city);
demand.setMessage(message);
demand.setStatus(status);
demand.setGuideServiceId(guideServiceId);
demand.setGuideServiceIdList(guideServiceIdList);
}
}

@ -0,0 +1,28 @@
package com.softegg.freetogo.Demand.service;
import com.softegg.freetogo.Demand.bean.Demands;
import java.util.List;
/**
* @description:
* @author:wuyifan
* @date:2024/5/10 2059
*/
public interface DemandsService {
List<Demands> findAll();//查找所有需求
void add(Demands demand);//以demand为用户入库
void deleteById(int id);//删除对应id需求
Demands getDemandById(int id);//获得对应id需求
void update(Demands demand);//更新需求信息
List<Demands> getDemandsByPhone(String phone);//根据手机号获得对应游客用户的服务
List<Demands> getDemandsByCity(String city);//根据手机号获得对应游客用户的服务
List<Demands> getDemandsByProvince(String province);//根据手机号获得对应游客用户的服务
}

@ -0,0 +1,119 @@
package com.softegg.freetogo.Demand.service;
import com.softegg.freetogo.Demand.Dao.DemandsRepository;
import com.softegg.freetogo.Demand.bean.Demands;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Iterator;
import java.util.List;
/**
* @description:
* @author:wuyifan
* @date:2024/5/10 19:50
*/
@Component
public class DemandsServiceImpl implements DemandsService {
@Autowired
private DemandsRepository DemandsRepository;
/**
* @description:
* @param: null
* @return: java.util.List<com.softegg.freetogo.Demand.Bean.Demands>
* @author: wuyifan
* @date: 2024/5/10 19:53
*/
public List<Demands> findAll() {
System.out.println("查询成功");
return DemandsRepository.findAll();
}
/**
* @description: demand
* @param: demand
* @return: void
* @author: wuyifan
* @date: 2024/5/10 19:55
*/
public void add(Demands demand) {
DemandsRepository.save(demand);
System.out.println("添加成功");
}
/**
* @description: id
* @param: id
* @return: void
* @author: wuyifan
* @date: 2024/5/10 19:59
*/
public void deleteById(int did) {
DemandsRepository.deleteById(did);
System.out.println("删除成功对应did:");
}
/**
* @description:
* @param: id
* @return: com.softegg.freetogo.Demand.Bean.Demands
* @author: wuyifan
* @date: 2024/5/10 20:02
*/
public Demands getDemandById(int id) {
return DemandsRepository.findById(id).orElse(null);
}
/**
* @description:
* @param: demand
* @return: void
* @author: wuyifan
* @date: 2024/5/10 20:05
*/
public void update(Demands demand) {
DemandsRepository.save(demand);
System.out.println("需求更新成功");
}
/**
* @description:
* @param: phone
* @return: com.softegg.freetogo.GuideService.Bean.GuideService
* @author: wuyifan
* @date: 2024/5/15 20:18
*/
public List<Demands> getDemandsByPhone(String phone) {
List<Demands> demandsList = DemandsRepository.findByPhone(phone);
// 使用迭代器的 remove 方法
demandsList.removeIf(demand -> demand.getStatus() == 4);
return demandsList;
}
/**
* @description:
* @param: city
* @return: com.softegg.freetogo.GuideService.Bean.GuideService
* @author: wuyifan
* @date: 2024/5/15 20:18
*/
public List<Demands> getDemandsByCity(String city) {
return DemandsRepository.findByCity(city);
}
/**
* @description:
* @param: city
* @return: com.softegg.freetogo.GuideService.Bean.GuideService
* @author: wuyifan
* @date: 2024/5/15 20:18
*/
public List<Demands> getDemandsByProvince(String province) {
return DemandsRepository.findByProvince(province);
}
}

@ -0,0 +1,140 @@
package com.softegg.freetogo.DemandMatch.controller;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.DemandMatch.service.DemandMatchService;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author:wuyifan
* @date:2024/6/4 14:47
*/
@RestController
@RequestMapping("/DemandMatch")
public class DemandMatchController {
@Autowired
DemandMatchService demandMatchService;
@Autowired
UsersService usersService;
@Autowired
GuideServiceService guideServiceService;
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/4 14:48
*/
@GetMapping("register")
public List<GuideService> GuideMatch(int did) {
System.out.println("接收的did:"+did);
return demandMatchService.guideMatchAccount(did);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/4 14:48
*/
@GetMapping("specific")
public List<GuideService> specific(int did, int gid) {
System.out.println("接收的did:"+did);
return demandMatchService.guideMatchAccount(did);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("match")
public int Match(@RequestBody Map<String, Object> map) {
int did = (int) map.get("did");
System.out.println("接收的did:"+did);
int gid = (int) map.get("gid");
System.out.println("接收的did:"+did);
return demandMatchService.match(did, gid);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@GetMapping("confirmedPage")
public List<GuideService> confirmedpage(int did) {
System.out.println("接收的did:"+did);
return demandMatchService.confirmedPage(did);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("confirmed")
public int confirmed(@RequestBody Map<String, Object> map) {
int did = Integer.parseInt(map.get("did").toString());
System.out.println("接收的did:"+did);
int gid = Integer.parseInt(map.get("gid").toString());
System.out.println("接收的did:"+gid);
return demandMatchService.confirmed(did, gid);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("refuse")
public int refuse(@RequestBody Map<String, Object> map) {
int did = (int) map.get("did");
System.out.println("接收的did:"+did);
return demandMatchService.refuse(did);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("finish")
public int finish(@RequestBody Map<String, Object> map) {
int did = (int) map.get("did");
System.out.println("接收的did:"+did);
return demandMatchService.finish(did);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("delete")
public int delete(@RequestBody Map<String, Object> map) {
int did = (int) map.get("did");
System.out.println("接收的did:"+did);
return demandMatchService.delete(did);
}
}

@ -0,0 +1,26 @@
package com.softegg.freetogo.DemandMatch.service;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.bean.GuideService;
import java.util.List;
public interface DemandMatchService {
List<GuideService> guideMatchAccount(int did);
int match(int did, int gid);
int confirmed(int did, int gid);
List<GuideService> confirmedPage(int did);
int refuse(int did);
int finish(int did);
int delete(int did);
double timeScore(int gsum, String gddate, String gedate, int dsum, String dddate, String dedate);
double messageScore(String gmessage, String dmessage);
}

@ -0,0 +1,401 @@
package com.softegg.freetogo.DemandMatch.service;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.Demand.service.DemandsService;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.User.service.UsersService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.format.DateTimeFormatter;
import java.util.*;
import static java.lang.Math.abs;
import java.time.LocalDate;
/**
* description:
* @author:wuyifan
* date:2024/5/28 19:51
*/
@Component
public class DemandMatchServiceImpl implements DemandMatchService{
@Autowired
DemandsService demandsService;
@Autowired
UsersService usersService;
@Autowired
GuideServiceService guideServiceService;
/**
* @description:
* @param: city
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public List<GuideService> guideMatchAccount(int did){
Demands demand = demandsService.getDemandById(did);
int demandSumDay = Integer.parseInt(demand.getSumDay());
String demandDepartureDate = demand.getDepartureDate();
String demandEndDate = demand.getEndDate();
String demandMessage = demand.getMessage();
List<GuideService> guideServiceList = guideServiceService.getGuideServiceByCity(demand.getCity());
// 使用迭代器的 remove 方法
guideServiceList.removeIf(guideService -> guideService.getStatus() > 1);
int length = guideServiceList.size();
double[] sumScores = new double[length];
int i = 0;
for (GuideService guideService : guideServiceList) {
double sumScore = 0;
int guideServiceSumDay = Integer.parseInt(guideService.getSumDay());
String guideServiceDepartureDate = guideService.getDepartureDate();
String guideServiceEndDate = guideService.getEndDate();
String guideServiceMessage = guideService.getMessage();
double timeScore = timeScore(guideServiceSumDay, guideServiceDepartureDate, guideServiceEndDate, demandSumDay, demandDepartureDate, demandEndDate);
double messageScore = messageScore(guideServiceMessage, demandMessage);
sumScore += timeScore + messageScore;
sumScores[i] = sumScore;
i++;
}
// 创建一个包含索引和值的列表
List<Map.Entry<Double, GuideService>> list = new ArrayList<>();
for (int j = 0; j < sumScores.length; j++) {
list.add(new AbstractMap.SimpleEntry<>(sumScores[j], guideServiceList.get(j)));
}
// 根据sumScores的元素大小对 list 进行排序
list.sort((o1, o2) -> o2.getKey().compareTo(o1.getKey()));
List<GuideService> newgList = new ArrayList<>();
for (Map.Entry<Double, GuideService> entry : list) {
newgList.add(entry.getValue());
}
return newgList;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int match(int did, int gid){
Demands demand = demandsService.getDemandById(did);
GuideService guideService = guideServiceService.getGuideServiceById(gid);
List<Integer> demandIdList = guideService.getDemandIdList();
if (demandIdList == null) {
demandIdList = new ArrayList<>();
}
if(!demandIdList.contains(did)) {
demandIdList.add(did);
}
guideService.setStatus(1);
guideService.setDemandIdList(demandIdList);
demandsService.update(demand);
guideServiceService.update(guideService);
System.out.println(guideService.getDemandIdList());
return 1006;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int confirmed(int did, int gid){
Demands demand = demandsService.getDemandById(did);
GuideService guideService = guideServiceService.getGuideServiceById(gid);
demand.setStatus(2);
demand.setGuideServiceId(gid);
guideService.setStatus(2);
guideService.setDemandId(did);
demandsService.update(demand);
guideServiceService.update(guideService);
return 1007;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public List<GuideService> confirmedPage(int did){
Demands demand = demandsService.getDemandById(did);
List<Integer> guideServiceIdList = demand.getGuideServiceIdList();
List<GuideService> guideServiceList = new ArrayList<>();
for(int number : guideServiceIdList) {
GuideService guideService = guideServiceService.getGuideServiceById(number);
guideServiceList.add(guideService);
}
return guideServiceList;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int refuse(int did){
Demands demand = demandsService.getDemandById(did);
int gid = demand.getGuideServiceId();
GuideService guideService = guideServiceService.getGuideServiceById(gid);
List<Integer> demandIdList = guideService.getDemandIdList();
if (demandIdList == null) {
guideService.setStatus(0);
}else {
guideService.setStatus(1);
}
List<Integer> guideServiceIdList = demand.getGuideServiceIdList();
if(guideServiceIdList == null){
demand.setStatus(0);
}else {
demand.setStatus(1);
}
demand.setGuideServiceId(null);
guideService.setDemandId(null);
demandsService.update(demand);
guideServiceService.update(guideService);
return 1;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int finish(int did){
Demands demand = demandsService.getDemandById(did);
int gid = demand.getGuideServiceId();
GuideService guideService = guideServiceService.getGuideServiceById(gid);
demand.setStatus(3);
demand.setGuideServiceIdList(null);
guideService.setStatus(3);
guideService.setDemandIdList(null);
demandsService.update(demand);
guideServiceService.update(guideService);
return 1;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int delete(int did){
Demands demand = demandsService.getDemandById(did);
demand.setStatus(4);
demandsService.update(demand);
return 1;
}
public static boolean isRangeWithinRange(LocalDate startDate1, LocalDate endDate1, LocalDate startDate2, LocalDate endDate2) {
// 第一个范围的起始日期必须在第二个范围内或与其起始日期相同
return !startDate1.isBefore(startDate2) && !endDate1.isAfter(endDate2);
}
/**
* @description:
* @param: gsumdsumddateedate
* @return: float
* @author: wuyifan
* @date: 2024/5/28 20:35
*/
@Override
public double timeScore(int gsum, String gddate, String gedate, int dsum, String dddate, String dedate){
double score = 0;
int difference = gsum - dsum;
if (abs(difference) < 15 ){
score += 10 / (float)(abs(difference) + 1);
}
// 使用DateTimeFormatter将字符串转换为LocalDate对象
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate1 = LocalDate.parse(dddate, formatter);
LocalDate endDate1 = LocalDate.parse(dedate, formatter);
LocalDate startDate2 = LocalDate.parse(gddate, formatter);
LocalDate endDate2 = LocalDate.parse(gedate, formatter);
// 判断第一个范围是否在第二个范围内
boolean isRange1WithinRange2 = isRangeWithinRange(startDate1, endDate1, startDate2, endDate2);
if (isRange1WithinRange2){
score += 100;
}
return score;
}
/**
* @description: Jaccard
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:35
*/
public static double jaccardSimilarity(String s1, String s2) {
if (s1 == null || s2 == null ) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Set<Character> set1 = new HashSet<>();
Set<Character> set2 = new HashSet<>();
for (char c : s1.toCharArray()) {
set1.add(c);
}
for (char c : s2.toCharArray()) {
set2.add(c);
}
Set<Character> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
Set<Character> union = new HashSet<>(set1);
union.addAll(set2);
return (double) intersection.size() / union.size();
}
/**
* @description:
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:35
*/
private static Map<Character, Integer> getCharacterFrequency(String s) {
Map<Character, Integer> frequencyMap = new HashMap<>();
for (char c : s.toCharArray()) {
frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
}
return frequencyMap;
}
public static double cosineSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Map<Character, Integer> freq1 = getCharacterFrequency(s1);
Map<Character, Integer> freq2 = getCharacterFrequency(s2);
double dotProduct = 0.0;
double mag1 = 0.0;
double mag2 = 0.0;
for (char c : freq1.keySet()) {
if (freq2.containsKey(c)) {
dotProduct += freq1.get(c) * freq2.get(c);
}
mag1 += Math.pow(freq1.get(c), 2);
}
for (char c : freq2.keySet()) {
mag2 += Math.pow(freq2.get(c), 2);
}
mag1 = Math.sqrt(mag1);
mag2 = Math.sqrt(mag2);
return dotProduct / (mag1 * mag2);
}
/**
* @description: Dice
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:25
*/
public static double diceCoefficient(String s1, String s2) {
if (s1 == null || s2 == null ) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
int intersection = 0;
for (int i = 0; i < s1.length() - 1; i++) {
String bigram = s1.substring(i, i + 2);
if (s2.contains(bigram)) {
intersection++;
}
}
int union = s1.length() + s2.length() - intersection;
return (double) (2 * intersection) / union;
}
/**
* @description: N-gram
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:22
*/
private static Set<String> generateNGrams(String s, int n) {
if (s == null || s.length() < n || n <= 0) {
throw new IllegalArgumentException("Invalid input string or n-gram size");
}
Set<String> nGrams = new HashSet<>();
for (int i = 0; i <= s.length() - n; i++) {
nGrams.add(s.substring(i, i + n));
}
return nGrams;
}
public static double bigramSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Set<String> bigrams1 = generateNGrams(s1, 2);
Set<String> bigrams2 = generateNGrams(s2, 2);
Set<String> commonBigrams = new HashSet<>(bigrams1);
commonBigrams.retainAll(bigrams2);
Set<String> allBigrams = new HashSet<>(bigrams1);
allBigrams.addAll(bigrams2);
return (double) commonBigrams.size() / allBigrams.size();
}
/**
* @description:
* @param: gmessagedmessage
* @return: float
* @author: wuyifan
* @date: 2024/5/28 20:35
*/
@Override
public double messageScore(String gmessage, String dmessage){
double score;
double similarity1 = jaccardSimilarity(gmessage, dmessage);
double similarity2 = cosineSimilarity(gmessage, dmessage);
double similarity3 = diceCoefficient(gmessage, dmessage);
double similarity4 = bigramSimilarity(gmessage, dmessage);
score = similarity1 + similarity2 + similarity3 + similarity4;
return score;
}
}

@ -0,0 +1,15 @@
package com.softegg.freetogo.Evaluate.Dao;
import com.softegg.freetogo.Evaluate.bean.Evaluations;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @description: Jpa
* @author: zhanglinhao
* @date: 2024/5/10 9:27
*/
public interface EvaluateRepository extends JpaRepository<Evaluations, Integer> {
// List<Evaluations> findByEditorPhone(String phone);
// List<Evaluations> findByEditedPhone(String phone);
}

@ -0,0 +1,32 @@
package com.softegg.freetogo.Evaluate.bean;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @description:
* @author:zhanglinhao
* @date:2024/5/10 9:07
*/
@Entity
@Table(name = "evaluation")
@Setter
@Getter
@AllArgsConstructor
@NoArgsConstructor
public class Evaluations {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private int eid;//评价id
@Column(name = "createtime")
private String ct;//创建日期
@Column(name = "modifytime")
private String mt;//编辑日期
@Column
private String ebody;//评价本体
@Column
private int satisfaction;//满意度整数1-5
}

@ -0,0 +1,115 @@
package com.softegg.freetogo.Evaluate.controller;
import com.softegg.freetogo.Evaluate.bean.Evaluations;
import com.softegg.freetogo.Evaluate.service.EvaluateService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/11 17:33
*/
@RestController
@RequestMapping("/evaluate")
public class EvaluationController {
@Autowired
EvaluateService evaluateService;
/**
* @description:
* @param: null
* @return: java.util.List<com.softegg.freetogo.Evaluate.bean.Evaluations>
* @author: zhanglinhao
* @date: 2024/5/12 0:11
*/
@GetMapping("findAllEvaluation")
public List<Evaluations> findAllEvaluation() {
return evaluateService.evaluationList();
}
/**
* @description:
* @param: ebody
* @return: void
* @author: zhanglinhao
* @date: 2024/5/12 0:28
*/
@PostMapping("addEvaluation")
public void addEvaluation(@RequestBody Map<String, String> ebody) {
LocalDateTime currentTime = LocalDateTime.now();
Evaluations evaluation = new Evaluations();
evaluation.setEid(Integer.parseInt(ebody.get("eid")));
evaluation.setEbody(ebody.get("ebody"));
evaluation.setSatisfaction(Integer.parseInt(ebody.get("satisfaction")));
evaluation.setCt(currentTime.toString());
evaluation.setMt(currentTime.toString());
evaluateService.addEvaluation(evaluation);
}
/**
* @description:
* @param: phone
* @return: java.util.List<com.softegg.freetogo.Evaluate.bean.Evaluations>
* @author: zhanglinhao
* @date: 2024/5/12 0:30
*/
// @GetMapping("evaluationByPhone")
// public List<Evaluations> evaluationByPhone(String phone) {
// return evaluateService.getEListByPhone(phone);
// }
@GetMapping("getEvaluation")
public Evaluations getEvaluation(int eid) {
return evaluateService.getEvaluationById(eid);
}
/**
* @description:
* @param: eid
* @param: ebody
* @return: void
* @author: zhanglinhao
* @date: 2024/5/12 13:31
*/
@PostMapping("editEvaluation")
public void editEvaluation(@RequestBody Map<String, String> ebody) {
System.out.println("接收的json:" + ebody);
LocalDateTime currentTime = LocalDateTime.now();
Evaluations evaluation = new Evaluations(Integer.parseInt(ebody.get("eid")), ebody.get("ct"), currentTime.toString(), ebody.get("ebody"), Integer.parseInt(ebody.get("satisfaction")));
evaluateService.editEvaluation(evaluation);
}
/**
* @description:
* @param: eid
* @return: void
* @author: zhanglinhao
* @date: 2024/5/12 13:32
*/
@GetMapping("deleteEvaluation")
public void deleteEvaluation(int eid) {
evaluateService.deleteEvaluation(eid);
}
/**
* @description:
* @param: phone
* @return: int
* @author: zhanglinhao
* @date: 2024/5/12 13:39
*/
// @GetMapping("getSatisfaction")
// public String getSatisfaction(String phone) {
// List<Evaluations> elist = evaluateService.getEvaluatedByPhone(phone);
// float sumOfSatisfaction = 0;
// for (Evaluations evaluation : elist) {
// sumOfSatisfaction += evaluation.getSatisfaction();
// }
// System.out.println("查询满意度:"+ sumOfSatisfaction);
// return Float.toString(sumOfSatisfaction /elist.size());
// }
}

@ -0,0 +1,27 @@
package com.softegg.freetogo.Evaluate.service;
import com.softegg.freetogo.Evaluate.bean.Evaluations;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @description:
* @author:zhanglinhao
* @date:2024/5/10 8:52
*/
@Service
public interface EvaluateService {
List<Evaluations> evaluationList();//获取所有评论
// List<Evaluations> getEListByPhone(String phone);//根据电话筛选评价
// List<Evaluations> getEvaluatedByPhone(String phone);
Evaluations getEvaluationById(int eid);//根据id获取评论
void addEvaluation(Evaluations evaluation);//添加评论
void editEvaluation(Evaluations evaluation);//编辑评论
void deleteEvaluation(int eid);//删除评论
}

@ -0,0 +1,143 @@
package com.softegg.freetogo.Evaluate.service;
import com.softegg.freetogo.Demand.service.DemandsService;
import com.softegg.freetogo.Evaluate.Dao.EvaluateRepository;
import com.softegg.freetogo.Evaluate.bean.Evaluations;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.User.service.GuidesService;
import com.softegg.freetogo.User.service.UsersService;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.User.service.GuidesService;
import com.softegg.freetogo.User.Dao.GuidesRepository;
import com.softegg.freetogo.User.bean.Guides;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.GuideService.bean.GuideService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @description:
* @author:zhanglinhao
* @date:2024/5/10 9:25
*/
@Component
public class EvaluateServiceImpl implements EvaluateService {
@Autowired
EvaluateRepository evaluateRepository;
@Autowired
GuideServiceService guideServiceService;
@Autowired
UsersService usersService;
@Autowired
DemandsService demandsService;
@Autowired
GuidesService guidesService;
/**
* @description:
* @param: null
* @return: void
* @author: zhanglinhao
* @date: 2024/5/10 9:25
*/
@Override
public List<Evaluations> evaluationList() {
System.out.println("查询评论");
return evaluateRepository.findAll();
}
/**
* @description: id
* @param: eid
* @return: com.softegg.freetogo.Evaluate.bean.Evaluations
* @author: zhanglinhao
* @date: 2024/5/15 8:13
*/
@Override
public Evaluations getEvaluationById(int eid) {
return evaluateRepository.findById(eid).get();
}
/**
* @description:
* @param: phone
* @return: java.util.List<com.softegg.freetogo.Evaluate.bean.Evaluations>
* @author: zhanglinhao
* @date: 2024/5/11 16:28
*/
// @Override
// public List<Evaluations> getEListByPhone(String phone) {
// System.out.println("查询" + phone + "的评论");
// return evaluateRepository.findByEditorPhone(phone);
// }
/**
* @description:
* @param: phone
* @return: java.util.List<com.softegg.freetogo.Evaluate.bean.Evaluations>
* @author: zhanglinhao
* @date: 2024/5/12 21:21
*/
// @Override
// public List<Evaluations> getEvaluatedByPhone(String phone) {
// return evaluateRepository.findByEditedPhone(phone);
// }
/**
* @description:
* @param: evaluation
* @return: void
* @author: zhanglinhao
* @date: 2024/5/10 21:20
*/
@Override
public void addEvaluation(Evaluations evaluation) {
evaluateRepository.save(evaluation);
int did = evaluation.getEid();
Demands demands = demandsService.getDemandById(did);
int gid = demands.getGuideServiceId();
GuideService guideService = guideServiceService.getGuideServiceById(gid);
String phone = guideService.getPhone();
Users user = usersService.getUserByPhone(phone);
Guides guide = guidesService.getGuideById(user.getUid()).get();
int stars = evaluation.getSatisfaction();
int sum = guide.getSum();
sum++;
int guideStars = guide.getStars();
guideStars = (guideStars + stars) / sum;
// guidesService.update()
System.out.println("添加评论:" + evaluation.getEbody());
}
/**
* @description:
* @param: eid
* @return: void
* @author: zhanglinhao
* @date: 2024/5/11 17:10
*/
@Override
public void editEvaluation(Evaluations evaluation) {
int eid = evaluation.getEid();
System.out.println("编辑评论:" + eid);
evaluateRepository.save(evaluation);
System.out.println("编辑成功:" + eid);
}
/**
* @description:
* @param: eid
* @return: void
* @author: zhanglinhao
* @date: 2024/5/11 17:28
*/
@Override
public void deleteEvaluation(int eid) {
evaluateRepository.deleteById(eid);
System.out.println("删除评论:" + eid);
}
}

@ -0,0 +1,9 @@
package com.softegg.freetogo.FeedBack;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/20 11:14
*/
public class bean {
}

@ -0,0 +1,13 @@
package com.softegg.freetogo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class FreeToGoApplication {
public static void main(String[] args) {
SpringApplication.run(FreeToGoApplication.class, args);
}
}

@ -0,0 +1,119 @@
package com.softegg.freetogo.GuideMatch.controller;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.GuideMatch.service.GuideMatchService;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author:wuyifan
* @date:2024/5/30 10:47
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/GuideMatch")
public class GuideMatchController {
@Autowired
GuideMatchService guideMatchService;
@Autowired
UsersService usersService;
@Autowired
GuideServiceService guideServiceService;
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/30 20:48
*/
@GetMapping("register")
public List<Demands> GuideMatch(int gid) {
System.out.println("需匹配的gid:" + gid);
return guideMatchService.guideMatchAccount(gid);
}
/**
* @description:
* @param: map
* @return: java.lang.int
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("match")
public int Match(@RequestBody Map<String, Object> map) {
int gid = Integer.parseInt(map.get("gid").toString());
System.out.println("接收的gid:"+gid);
int did = Integer.parseInt(map.get("did").toString());
System.out.println("接收的did:"+did);
return guideMatchService.match(gid, did);
}
/**
* @description:
* @param: gid
* @return: java.lang.Demands
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@GetMapping("confirmedPage")
public List<Demands> confirmedpage(int gid) {
System.out.println("接收的gid:"+gid);
return guideMatchService.confirmedPage(gid);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("confirmed")
public int confirmed(@RequestBody Map<String, Object> map) {
int gid = Integer.parseInt(map.get("gid").toString());
System.out.println("接收的did:"+gid);
int did = Integer.parseInt(map.get("did").toString());
System.out.println("接收的did:"+did);
return guideMatchService.confirmed(gid, did);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("refuse")
public int refuse(@RequestBody Map<String, Object> map) {
int gid = (int) map.get("gid");
System.out.println("接收的gid:"+gid);
return guideMatchService.refuse(gid);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("delete")
public int delete(@RequestBody Map<String, Object> map) {
int gid = (int) map.get("gid");
System.out.println("接收的gid:"+gid);
return guideMatchService.delete(gid);
}
}

@ -0,0 +1,31 @@
package com.softegg.freetogo.GuideMatch.service;
import com.softegg.freetogo.Demand.bean.Demands;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @description:
* @author:wuyifan
* @date:2024/5/28 19:45
*/
@Service
public interface GuideMatchService {
List<Demands> guideMatchAccount(int gid);
int match(int gid, int did);
List<Demands> confirmedPage(int gid);
int confirmed(int did, int gid);
int refuse(int gid);
int delete(int gid);
double timeScore(int gsum, String gddate, String gedate, int dsum, String dddate, String dedate);
double messageScore(String gmessage, String dmessage);
}

@ -0,0 +1,386 @@
package com.softegg.freetogo.GuideMatch.service;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.Demand.service.DemandsService;
import com.softegg.freetogo.User.service.UsersService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import static java.lang.Math.abs;
/**
* description:
* @author:wuyifan
* date:2024/5/28 19:51
*/
@Component
public class GuideMatchServiceImpl implements GuideMatchService {
@Autowired
DemandsService demandsService;
@Autowired
UsersService usersService;
@Autowired
GuideServiceService guideServiceService;
/**
* @description:
* @param: city
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public List<Demands> guideMatchAccount(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
int guideServiceSumDay = Integer.parseInt(guideService.getSumDay());
String guideServiceDepartureDate = guideService.getDepartureDate();
String guideServiceEndDate = guideService.getEndDate();
String guideServiceMessage = guideService.getMessage();
List<Demands> dlist = demandsService.getDemandsByCity(guideService.getCity());
// 使用迭代器的 remove 方法
dlist.removeIf(demand -> demand.getStatus() > 1);
int length = dlist.size();
double[] sumScores = new double[length];
int i = 0;
for (Demands demands : dlist) {
double sumScore = 0;
int demandsSumDay = Integer.parseInt(demands.getSumDay());
String demandsDepartureDate = demands.getDepartureDate();
String demandsEndDate = demands.getEndDate();
String demandsMessage = demands.getMessage();
double timeScore = timeScore(guideServiceSumDay,guideServiceDepartureDate,guideServiceEndDate,demandsSumDay,demandsDepartureDate,demandsEndDate);
double messageScore = messageScore(guideServiceMessage, demandsMessage);
sumScore += timeScore + messageScore;
sumScores[i] = sumScore;
i++;
}
// 创建一个包含索引和值的列表
List<Map.Entry<Double, Demands>> list = new ArrayList<>();
for (int j = 0; j < sumScores.length; j++) {
list.add(new AbstractMap.SimpleEntry<>(sumScores[j], dlist.get(j)));
}
// 根据sumScores的元素大小对 list 进行排序
list.sort((o1, o2) -> o2.getKey().compareTo(o1.getKey()));
List<Demands> newdList = new ArrayList<>();
for (Map.Entry<Double, Demands> entry : list) {
System.out.println(entry.getValue());
newdList.add(entry.getValue());
}
return newdList;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int match(int gid, int did){
Demands demand = demandsService.getDemandById(did);
GuideService guideService = guideServiceService.getGuideServiceById(gid);
demand.setStatus(1);
List<Integer> guideServiceIdList = demand.getGuideServiceIdList();
if (guideServiceIdList == null) {
guideServiceIdList = new ArrayList<>();
}
if(!guideServiceIdList.contains(gid)){
guideServiceIdList.add(gid);
}
demand.setGuideServiceIdList(guideServiceIdList);
// List<Integer> demandIdList = guideService.getDemandIdList();
// if (demandIdList == null) {
// demandIdList = new ArrayList<>();
// }
// demandIdList.add(did);
// guideService.setDemandIdList(demandIdList);
demandsService.update(demand);
guideServiceService.update(guideService);
System.out.println(demand.getGuideServiceIdList());
return 1006;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public List<Demands> confirmedPage(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
List<Integer> demandIdList = guideService.getDemandIdList();
List<Demands> demandsList = new ArrayList<>();
for(int number : demandIdList) {
Demands demand = demandsService.getDemandById(number);
demandsList.add(demand);
}
return demandsList;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int confirmed(int gid, int did){
Demands demand = demandsService.getDemandById(did);
GuideService guideService = guideServiceService.getGuideServiceById(gid);
demand.setStatus(2);
demand.setGuideServiceId(gid);
guideService.setStatus(2);
guideService.setDemandId(did);
demandsService.update(demand);
guideServiceService.update(guideService);
return 1007;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int refuse(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
int did = guideService.getDemandId();
Demands demand = demandsService.getDemandById(did);
List<Integer> demandIdList = guideService.getDemandIdList();
if (demandIdList == null) {
guideService.setStatus(0);
}else {
guideService.setStatus(1);
}
List<Integer> guideServiceIdList = demand.getGuideServiceIdList();
if(guideServiceIdList == null){
demand.setStatus(0);
}else {
demand.setStatus(1);
}
guideService.setDemandId(null);
demand.setGuideServiceId(null);
demandsService.update(demand);
guideServiceService.update(guideService);
return 1;
}
@Override
public int delete(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
guideService.setStatus(4);
guideServiceService.update(guideService);
return 1;
}
public static boolean isRangeWithinRange(LocalDate startDate1, LocalDate endDate1, LocalDate startDate2, LocalDate endDate2) {
return !startDate1.isBefore(startDate2) && !endDate1.isAfter(endDate2);
}
/**
* @description:
* @param: gsumdsumddateedate
* @return: float
* @author: wuyifan
* @date: 2024/5/28 20:35
*/
@Override
public double timeScore(int gsum, String gddate, String gedate, int dsum, String dddate, String dedate){
double score = 0;
int difference = gsum - dsum;
if (abs(difference) < 15 ){
score += 10 / (float)(abs(difference) + 1);
}
// 使用DateTimeFormatter将字符串转换为LocalDate对象
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate1 = LocalDate.parse(dddate, formatter);
LocalDate endDate1 = LocalDate.parse(dedate, formatter);
System.out.println(startDate1);
System.out.println(endDate1);
LocalDate startDate2 = LocalDate.parse(gddate, formatter);
LocalDate endDate2 = LocalDate.parse(gedate, formatter);
System.out.println(startDate2);
System.out.println(endDate2);
// 判断第一个范围是否在第二个范围内
boolean isRange1WithinRange2 = isRangeWithinRange(startDate1, endDate1, startDate2, endDate2);
if (isRange1WithinRange2){
score += 100;
}
return score;
}
/**
* @description: Jaccard
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:35
*/
public static double jaccardSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Set<Character> set1 = new HashSet<>();
Set<Character> set2 = new HashSet<>();
for (char c : s1.toCharArray()) {
set1.add(c);
}
for (char c : s2.toCharArray()) {
set2.add(c);
}
Set<Character> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
Set<Character> union = new HashSet<>(set1);
union.addAll(set2);
return (double) intersection.size() / union.size();
}
/**
* @description:
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:35
*/
private static Map<Character, Integer> getCharacterFrequency(String s) {
Map<Character, Integer> frequencyMap = new HashMap<>();
for (char c : s.toCharArray()) {
frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
}
return frequencyMap;
}
public static double cosineSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Map<Character, Integer> freq1 = getCharacterFrequency(s1);
Map<Character, Integer> freq2 = getCharacterFrequency(s2);
double dotProduct = 0.0;
double mag1 = 0.0;
double mag2 = 0.0;
for (char c : freq1.keySet()) {
if (freq2.containsKey(c)) {
dotProduct += freq1.get(c) * freq2.get(c);
}
mag1 += Math.pow(freq1.get(c), 2);
}
for (char c : freq2.keySet()) {
mag2 += Math.pow(freq2.get(c), 2);
}
mag1 = Math.sqrt(mag1);
mag2 = Math.sqrt(mag2);
return dotProduct / (mag1 * mag2);
}
/**
* @description: Dice
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:25
*/
public static double diceCoefficient(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
int intersection = 0;
for (int i = 0; i < s1.length() - 1; i++) {
String bigram = s1.substring(i, i + 2);
if (s2.contains(bigram)) {
intersection++;
}
}
int union = s1.length() + s2.length() - intersection;
return (double) (2 * intersection) / union;
}
/**
* @description: N-gram
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:22
*/
private static Set<String> generateNGrams(String s, int n) {
if (s == null || s.length() < n || n <= 0) {
throw new IllegalArgumentException("Invalid input string or n-gram size");
}
Set<String> nGrams = new HashSet<>();
for (int i = 0; i <= s.length() - n; i++) {
nGrams.add(s.substring(i, i + n));
}
return nGrams;
}
public static double bigramSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Set<String> bigrams1 = generateNGrams(s1, 2);
Set<String> bigrams2 = generateNGrams(s2, 2);
Set<String> commonBigrams = new HashSet<>(bigrams1);
commonBigrams.retainAll(bigrams2);
Set<String> allBigrams = new HashSet<>(bigrams1);
allBigrams.addAll(bigrams2);
return (double) commonBigrams.size() / allBigrams.size();
}
/**
* @description:
* @param: gmessagedmessage
* @return: float
* @author: wuyifan
* @date: 2024/5/28 20:35
*/
@Override
public double messageScore(String gmessage, String dmessage){
double score;
double similarity1 = jaccardSimilarity(gmessage, dmessage);
double similarity2 = cosineSimilarity(gmessage, dmessage);
double similarity3 = diceCoefficient(gmessage, dmessage);
double similarity4 = bigramSimilarity(gmessage, dmessage);
score = similarity1 + similarity2 + similarity3 + similarity4;
return score;
}
}

@ -0,0 +1,20 @@
package com.softegg.freetogo.GuideService.Dao;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.bean.GuideService;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
/**
* @description:Jpa
* @author:wuyifan
* @date:2024/5/13 9:17
*/
public interface GuideServiceRepository extends JpaRepository<GuideService, Integer> {
List<GuideService> findByPhone(String phone);
List<GuideService> findByCity(String city);
List<GuideService> findByProvince(String province);
}

@ -0,0 +1,53 @@
package com.softegg.freetogo.GuideService.bean;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.List;
/**
* @description:guideService
* @author:wuyifan
* @date:2024/5/13 9:14
*/
@Entity
@Table(name = "guideService")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class GuideService {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer gid;
@Column
private String phone;//导游手机号码
@Column(name = "guide_gender")
private String guideGender;//导游性别 ture:male, false:female
@Column
private String nickname;//发布需求的导游昵称信息
@Column(name = "create_time")
private String createTime;//服务发布时间
@Column(name = "departure_date")
private String departureDate;//导游服务起始日期
@Column(name = "end_date")
private String endDate;//导游服务结束日期
@Column(name = "sum_day")
private String sumDay;//导游服务总天数
@Column
private String province;//导游服务的目的省份
@Column
private String city;//导游服务的目的城市
@Column
private String message;//导游服务备注内容
@Column
private Integer status;//导游服务状态 0未匹配 1请求匹配 2已完成匹配 3已完成所有服务
@Column
private Integer demandId;//导游服务最终匹配到的游客需求id
@ElementCollection
@Column
private List<Integer> demandIdList;//游客需求申请匹配到的导游服务id
}

@ -0,0 +1,103 @@
package com.softegg.freetogo.GuideService.controller;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @description:Guide
* @author:wuyifan
* @date:2024/5/13 9:26
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/guideService")
public class GuideServiceController {
@Autowired
private GuideServiceService guideServiceService;
@GetMapping("findAll")
public List<GuideService> findAll() {
return guideServiceService.findAll();
}
@GetMapping("add")
public String add(String phone,
String gGender,
String nkn,
String ct,
String dDate,
String eDate,
String sDay,
String procvince,
String city,
String message,
Integer status,
Integer demandId,
List<Integer> demandIdList) {
GuideService guideService = new GuideService();
setDemands(phone, gGender, nkn, ct, dDate, eDate, sDay, procvince, city, message, status, guideService, demandId, demandIdList);
guideServiceService.add(guideService);
return "添加成功";
}
@PostMapping("delbyid")
public String delById(@RequestBody Map<String, Object> map) {
int gid = (int) map.get("gid");
guideServiceService.deleteById(gid);
return "1";
}
@GetMapping("findbyid")
public GuideService getUserById(int gid) {
return guideServiceService.getGuideServiceById(gid);
}
@GetMapping("getByPhone")
public List<GuideService> getByPhone(String phone) {
System.out.println("根据手机号获取游客需求信息:" + phone);
return guideServiceService.getGuideServiceByPhone(phone);
}
@GetMapping("update")
public String update(int id,
String phone,
String gGender,
String nkn,
String ct,
String dDate,
String eDate,
String sDay,
String province,
String city,
String message,
Integer status,
Integer demandId,
List<Integer> demandIdList) {
GuideService guideService = guideServiceService.getGuideServiceById(id);
setDemands(phone, gGender, nkn, ct, dDate, eDate, sDay, province, city, message, status, guideService, demandId, demandIdList);
guideServiceService.update(guideService);
return "更新成功";
}
private void setDemands(String phone, String gGender, String nkn, String ct, String dDate, String eDate, String sDay, String province, String city, String message, Integer status, GuideService guideservice, Integer demandId, List<Integer> demandIdList) {
guideservice.setPhone(phone);
guideservice.setGuideGender(gGender);
guideservice.setNickname(nkn);
guideservice.setCreateTime(ct);
guideservice.setDepartureDate(dDate);
guideservice.setEndDate(eDate);
guideservice.setSumDay(sDay);
guideservice.setProvince(province);
guideservice.setCity(city);
guideservice.setMessage(message);
guideservice.setStatus(status);
guideservice.setDemandId(demandId);
guideservice.setDemandIdList(demandIdList);
}
}

@ -0,0 +1,28 @@
package com.softegg.freetogo.GuideService.service;
import com.softegg.freetogo.GuideService.bean.GuideService;
import java.util.List;
/**
* @description:
* @author:wuyifan
* @date:2024/5/10 2059
*/
public interface GuideServiceService {
List<GuideService> findAll();//查找所有需求
void add(GuideService guideService);//以demand为用户入库
void deleteById(int id);//删除对应id需求
GuideService getGuideServiceById(int id);//获得对应id需求
void update(GuideService guideService);//更新需求信息
List<GuideService> getGuideServiceByPhone(String phone);//获得对应手机号的导游用户的所有服务
List<GuideService> getGuideServiceByCity(String city);//根据所选城市获得导游服务列表
List<GuideService> getGuideServiceByProvince(String province);//根据所选城市获得导游服务列表
}

@ -0,0 +1,123 @@
package com.softegg.freetogo.GuideService.service;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.Dao.GuideServiceRepository;
import com.softegg.freetogo.GuideService.bean.GuideService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Iterator;
import java.util.List;
/**
* @description:
* @author:wuyifan
* @date:2024/5/13 9:19
*/
@Component
public class GuideServiceServiceImpl implements GuideServiceService {
@Autowired
private GuideServiceRepository GuideServiceRepository;
@Autowired
private GuideServiceRepository guideServiceRepository;
/**
* @description:
* @param: null
* @return: java.util.List<com.softegg.freetogo.GuideService.Bean.GuideService>
* @author: wuyifan
* @date: 2024/5/13 9:21
*/
public List<GuideService> findAll() {
System.out.println("查询成功");
return GuideServiceRepository.findAll();
}
/**
* @description: guideService
* @param: guideService
* @return: void
* @author: wuyifan
* @date: 2024/5/13 922
*/
public void add(GuideService guideService) {
GuideServiceRepository.save(guideService);
System.out.println("添加成功");
}
/**
* @description: id
* @param: id
* @return: com.softegg.freetogo.GuideService.Bean.GuideService
* @author: wuyifan
* @date: 2024/5/10 20:02
*/
public GuideService getGuideServiceById(int id) {
return GuideServiceRepository.findById(id).orElse(null);
}
/**
* @description: gid
* @param: id
* @return: void
* @author: zhanglinhao
* @date: 2024/5/9 22:53
*/
public void deleteById(int gid) {
guideServiceRepository.deleteById(gid);
System.out.println("删除成功:" + gid);
}
/**
* @description:
* @param: guideService
* @return: void
* @author: wuyifan
* @date: 2024/5/10 20:05
*/
public void update(GuideService guideService) {
GuideServiceRepository.save(guideService);
System.out.println("服务更新成功");
}
/**
* @description:
* @param: phone
* @return: com.softegg.freetogo.GuideService.Bean.GuideService
* @author: wuyifan
* @date: 2024/5/16 15:18
*/
public List<GuideService> getGuideServiceByPhone(String phone) {
List<GuideService> guideServiceList = GuideServiceRepository.findByPhone(phone);
// 使用迭代器的 remove 方法
guideServiceList.removeIf(guideService -> guideService.getStatus() == 4);
return guideServiceList;
}
/**
* @description:
* @param: city
* @return: com.softegg.freetogo.GuideService.Bean.GuideService
* @author: wuyifan
* @date: 2024/5/16 15:30
*/
public List<GuideService> getGuideServiceByCity(String city) {
return GuideServiceRepository.findByCity(city);
}
/**
* @description:
* @param: city
* @return: com.softegg.freetogo.GuideService.Bean.GuideService
* @author: wuyifan
* @date: 2024/5/16 15:30
*/
public List<GuideService> getGuideServiceByProvince(String province) {
return GuideServiceRepository.findByProvince(province);
}
}

@ -0,0 +1,47 @@
package com.softegg.freetogo.HeatMap.bean;
public class HeatMap {
// 定义字段
private String name; // 省的名称
private int sum; // 省中的一些数据示例中使用int可以根据需求修改为其他类型
// 构造方法
public HeatMap(String name, int sum) {
this.name = name;
this.sum = sum;
}
// Getter和Setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getData() {
return sum;
}
public void setData(int data) {
this.sum = data;
}
// 可以添加其他方法,比如打印省的信息等
@Override
public String toString() {
return "Province{" +
"name='" + name + '\'' +
", sum=" + sum +
'}';
}
// 示例:打印省的信息
public void printInfo() {
System.out.println("Province Name: " + name + ", sum: " + sum);
}
}

@ -0,0 +1,78 @@
package com.softegg.freetogo.HeatMap.controller;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.HeatMap.bean.HeatMap;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.GuideMatch.service.GuideMatchService;
import com.softegg.freetogo.HeatMap.service.HeatMapService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/HeatMap")
public class HeatMapController {
@Autowired
GuideMatchService guideMatchService;
@Autowired
GuideServiceService guideServiceService;
@Autowired
HeatMapService heatMapService;
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/30 20:48
*/
@GetMapping("guideServiceHeatMapRegister")
public List<HeatMap> GuideServiceHeatMapRegister() {
return heatMapService.provinceGuideServiceHeatMap();
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/30 20:48
*/
@GetMapping("demandsHeatMapRegister")
public List<HeatMap> DemandsHeatMapRegister() {
return heatMapService.provinceDemandsHeatMap();
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/30 20:48
*/
@PostMapping("demandsCityHeatMap")
public int[] DemandsProvinceHeatMap(@RequestBody Map<String, Object> map) {
String province = map.get("province").toString();
return heatMapService.cityDemandsHeatMap(province);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/30 20:48
*/
@PostMapping("guideServiceCityHeatMap")
public int[] GuideServiceProvinceHeatMap(@RequestBody Map<String, Object> map) {
String province = map.get("province").toString();
return heatMapService.cityGuideServiceHeatMap(province);
}
}

@ -0,0 +1,15 @@
package com.softegg.freetogo.HeatMap.service;
import com.softegg.freetogo.HeatMap.bean.HeatMap;
import java.util.List;
public interface HeatMapService {
List<HeatMap> provinceDemandsHeatMap();//获得每个省份的游客需求数目
int[] cityDemandsHeatMap(String province);//获得目标省份的游客需求数目
List<HeatMap> provinceGuideServiceHeatMap();//获得每个省份的导游服务数目
int[] cityGuideServiceHeatMap(String province);//获得目标省份的游客服务数目
}

@ -0,0 +1,208 @@
package com.softegg.freetogo.HeatMap.service;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.Demand.service.DemandsService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.HeatMap.bean.HeatMap;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
import org.json.simple.parser.ParseException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* description:
* @author:wuyifan
* date:2024/6/6 10:51
*/
@Component
public class HeatMapServiceImpl implements HeatMapService {
@Autowired
DemandsService demandsService;
@Autowired
GuideServiceService guideServiceService;
// public static void main(String[] args) {
// List<String> provinceList = new ArrayList<>();
// JSONParser parser = new JSONParser();
//
// try {
// // 读取 JSON 文件内容并解析为 JSONObject
// Object obj = parser.parse(new FileReader("C:/Users/WYF/Desktop/软件体系结构/FreeToGo/src/main/java/com/softegg/freetogo/HeatMap/service/area.json")); // 直接使用文件名表示相对路径
// JSONObject jsonObject = (JSONObject) obj;
//
// for (Object province : jsonObject.keySet()) {
// provinceList.add(province.toString());
// }
// System.out.println("所有省份列表:");
// for (String province : provinceList) {
// System.out.println(province);
// }
// } catch (IOException | ParseException e) {
// e.printStackTrace();
// }
// }
/**
* @description: List
* @param: null
* @return: List<String>
* @author: wuyifan
* @date: 2024/6/6 15:48
*/
public List<String> getAllProvinces() {
List<String> provinceList = new ArrayList<>();
JSONParser parser = new JSONParser();
try {
// 读取 JSON 文件内容并解析为 JSONObject
// String json = String.valueOf(new FileReader("D:/Code/FreeToGo/src/main/java/com/softegg/freetogo/HeatMap/service/area.json"));
String filePath = "D:/Code/FreeToGo/src/main/java/com/softegg/freetogo/HeatMap/service/area.json"; // 修改为你的文件路径
BufferedReader reader = new BufferedReader(new FileReader(filePath));
System.out.println(String.valueOf(reader));
Object obj = parser.parse(reader);
JSONObject jsonObject = (JSONObject) obj;
// 遍历每个省份
for (Object province : jsonObject.keySet()) {
// 将省份添加到列表中
provinceList.add(province.toString());
}
} catch (IOException | ParseException e) {
e.printStackTrace();
}
return provinceList;
}
/**
* @description: List
* @param: String
* @return: List<String>
* @author: wuyifan
* @date: 2024/6/6 15:48
*/
public List<String> getCitiesInProvince(String province) {
List<String> cityList = new ArrayList<>();
JSONParser parser = new JSONParser();
try {
// 读取 JSON 文件内容并解析为 JSONObject
Object obj = parser.parse(new FileReader("D:/Code/FreeToGo/src/main/java/com/softegg/freetogo/HeatMap/service/area.json"));
JSONObject jsonObject = (JSONObject) obj;
// 获取湖南省的城市信息
JSONObject hunanCities = (JSONObject) jsonObject.get(province);
// 遍历每个城市并将城市名称添加到列表中
for (Object city : hunanCities.keySet()) {
cityList.add(city.toString());
}
} catch (IOException | ParseException e) {
e.printStackTrace();
}
return cityList;
}
/**
* @description:
* @param: null
* @return: int[]
* @author: wuyifan
* @date: 2024/6/6 15:48
*/
@Override
public List<HeatMap> provinceDemandsHeatMap(){
List<String> provinceList = getAllProvinces();
List<HeatMap> dataList = new ArrayList<>();
for (String province : provinceList) {
List<Demands> demandsList = demandsService.getDemandsByProvince(province);
System.out.println(province);
dataList.add(new HeatMap(province, demandsList.size()));
System.out.println(demandsList.size());
}
return dataList;
}
/**
* @description:
* @param: String
* @return: int[]
* @author: wuyifan
* @date: 2024/6/6 15:48
*/
@Override
public int[] cityDemandsHeatMap(String province){
List<String> cityList = getCitiesInProvince(province);
int[] sum = new int[cityList.size()];
int i = 0;
for (String city : cityList) {
List<Demands> demandsList = demandsService.getDemandsByCity(city);
sum[i] = demandsList.size();
i++;
}
return sum;
}
/**
* @description:
* @param: null
* @return: int[]
* @author: wuyifan
* @date: 2024/6/6 15:48
*/
@Override
public List<HeatMap> provinceGuideServiceHeatMap(){
List<String> provinceList = getAllProvinces();
List<HeatMap> dataList = new ArrayList<>();
int max=0;
for (String province : provinceList) {
List<GuideService> guideServiceList = guideServiceService.getGuideServiceByProvince(province);
dataList.add(new HeatMap(province, guideServiceList.size()));
if (guideServiceList.size() > max) {
max = guideServiceList.size();
}
}
dataList.add(new HeatMap("最大", max));
for (HeatMap heatMap : dataList) {
System.out.println(heatMap);
}
return dataList;
}
/**
* @description:
* @param: String
* @return: int[]
* @author: wuyifan
* @date: 2024/6/6 15:48
*/
@Override
public int[] cityGuideServiceHeatMap(String province){
List<String> cityList = getCitiesInProvince(province);
int[] sum = new int[cityList.size()];
int i = 0;
for (String city : cityList) {
List<GuideService> guideServiceList = guideServiceService.getGuideServiceByCity(city);
sum[i] = guideServiceList.size();
i++;
}
return sum;
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

@ -0,0 +1,77 @@
package com.softegg.freetogo.Login.controller;
import com.softegg.freetogo.Login.service.LoginService;
import com.softegg.freetogo.User.Dao.GuidesRepository;
import org.springframework.beans.factory.annotation.Autowired;
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.RestController;
import java.util.Map;
/**
* @description:
* @author:zhanglinhao
* @date:2024/5/9 9:35
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/Login")
public class LoginController {
@Autowired
LoginService loginService;
@Autowired
GuidesRepository guidesRepository;
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: zhanglinhao
* @date: 2024/5/9 22:44
*/
@PostMapping("login")
public int Login(@RequestBody Map<String, Object> map) {
System.out.println(map);
System.out.println("phone:" + map.get("phone").toString());
System.out.println("password" + map.get("password").toString());
int tag = loginService.loginAccount(map.get("phone").toString(), map.get("password").toString());
System.out.println("LoginTag:" + tag);
return switch (tag) {
case 1000 -> 1;//登陆成功
case 1001 -> 2;//密码或账号错误
case 1002 -> 3;//该账户未注册
case 1005 -> 6;//未输入账号密码
case 1006 -> 7;//未输入账号
case 1007 -> 8;//未输入密码
default -> 0;
};
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: zhanglinhao
* @date: 2024/5/9 22:45
*/
@PostMapping("register")
public int Register(@RequestBody Map<String, Object> map) {
System.out.println(map);
int tag = loginService.registerAccount((String) map.get("name"), (String) map.get("password"), (String) map.get("phone"), (String) map.get("nickname"), (String) map.get("IDCard"));
System.out.println("RegisterTag:" + tag);
return switch (tag) {
case 1003 -> 4;//该账户已经注册
case 1004 -> 5;//注册成功
case 1008 -> 9;//身份证输入错误18位
case 1010 -> 11;//手机号输入错误11位
case 1011 -> 12;//密码过短最少8位
case 1012 -> 13;//姓名未输入
default -> 0;
};
}
}

@ -0,0 +1,21 @@
package com.softegg.freetogo.Login.service;
import org.springframework.stereotype.Service;
/**
* @description:
* @author:zhanglinhao
* @date:2024/5/9 8:37
*/
@Service
public interface LoginService {
int loginAccount(String phone, String password);//登录
// int registerAccount(String phone, String password);
int registerAccount(String name,
String password,
String phone,
String nickname,
String IDCard);//注册
}

@ -0,0 +1,98 @@
package com.softegg.freetogo.Login.service;
import com.softegg.freetogo.User.Dao.GuidesRepository;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
/**
* @description:
* @author:zhanglinhao
* @date:2024/5/9 9:33
*/
@Component
public class LoginServiceImpl implements LoginService {
@Autowired
UsersService usersService;
@Autowired
GuidesRepository guidesRepository;
/**
* @description:
* @param: phone
* @param: password
* @return: int
* @author: zhanglinhao
* @date: 2024/5/9 22:46
*/
@Override
public int loginAccount(String phone, String password) {
if (phone.isEmpty() && password.isEmpty())
return 1005;//未输入账号密码
else if (phone.isEmpty())
return 1006;//未输入账号
else if (password.isEmpty())
return 1007;//未输入密码
if (usersService.isRegister(phone)) {
if (usersService.getUserByPhone(phone).getPassword().equals(password))
return 1000;//登录成功
else
return 1001;//密码或账号错误
} else
return 1002;//该账户未注册
}
/**
* @description:
* @param: name
* @param: password
* @param: phone
* @param: nickname
* @param: IDCard
* @return: int
* @author: zhanglinhao
* @date: 2024/5/11 15:57
*/
@Override
public int registerAccount(String name,
String password,
String phone,
String nickname,
String IDCard) {
if (usersService.isRegister(phone))
return 1003;//该账户已经注册
else if(name.isEmpty())
return 1012;//姓名未输入
else if (IDCard.length() != 18)
return 1008;//身份证输入错误
else if (phone.length() != 11)
return 1010;//手机号输入错误
else if (password.length() < 8)
return 1011;//密码过于简单
else {
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("注册信息:姓名:" + name + "密码:" + password + "电话:" + phone + "昵称:" + nickname + "身份证:" + IDCard);
Users user = new Users();
user.setPhone(phone);
user.setPassword(password);
user.setNickname(nickname);
user.setIdcard(IDCard);
user.setName(name);
user.setCreatetime((currentTime.getYear() + "-" + currentTime.getMonthValue() + "-" + currentTime.getDayOfMonth()));
user.setGender(isMale(IDCard));
user.setStatus(0);
user.setReputation(60);
user.setMembertype(false);
usersService.add(user);
return 1004;//注册成功
}
}
boolean isMale(String IDCard) {
System.out.println("根据身份证判断性别:" + IDCard + " 第17位:" + IDCard.charAt(16));
return (int) IDCard.charAt(16) % 2 != 0;
}
}

@ -0,0 +1,13 @@
1000->1 登录成功
1001->2 密码或账号错误
1002->3 该账户未注册
1003->4 该账户已经注册
1004->5 注册成功
1005->6 未输入账号密码
1006->7 未输入账号
1007->8 身份证输入错误
1008->9 成功注册导游
1009->10 已是导游
1010->11 手机号输入错误
1011->12 密码过短
1012->13 未输入姓名

@ -0,0 +1,120 @@
package com.softegg.freetogo.Search.controller;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.GuideMatch.service.GuideMatchService;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author:wuyifan
* @date:2024/5/30 10:47
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/Search")
public class SearchController {
@Autowired
GuideMatchService guideMatchService;
@Autowired
UsersService usersService;
@Autowired
GuideServiceService guideServiceService;
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/30 20:48
*/
@GetMapping("register")
public List<Demands> GuideMatch(int gid) {
System.out.println("需匹配的gid:" + gid);
return guideMatchService.guideMatchAccount(gid);
}
/**
* @description:
* @param: map
* @return: java.lang.int
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("match")
public int Match(@RequestBody Map<String, Object> map) {
int gid = Integer.parseInt(map.get("gid").toString());
System.out.println("接收的gid:"+gid);
int did = Integer.parseInt(map.get("did").toString());
System.out.println("接收的did:"+did);
return guideMatchService.match(gid, did);
}
/**
* @description:
* @param: gid
* @return: java.lang.Demands
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@GetMapping("confirmedPage")
public List<Demands> confirmedpage(int gid) {
System.out.println("接收的gid:"+gid);
return guideMatchService.confirmedPage(gid);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("confirmed")
public int confirmed(@RequestBody Map<String, Object> map) {
int gid = Integer.parseInt(map.get("gid").toString());
System.out.println("接收的did:"+gid);
int did = Integer.parseInt(map.get("did").toString());
System.out.println("接收的did:"+did);
return guideMatchService.confirmed(gid, did);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("refuse")
public int refuse(@RequestBody Map<String, Object> map) {
int gid = (int) map.get("gid");
System.out.println("接收的gid:"+gid);
return guideMatchService.refuse(gid);
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/11 1012
*/
@PostMapping("delete")
public int delete(@RequestBody Map<String, Object> map) {
int gid = (int) map.get("gid");
System.out.println("接收的gid:"+gid);
return guideMatchService.delete(gid);
}
}

@ -0,0 +1,32 @@
package com.softegg.freetogo.Search.service;
import com.softegg.freetogo.Demand.bean.Demands;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @description:
* @author:wuyifan
* @date:2024/5/28 19:45
*/
@Service
public interface SearchService {
List<Demands> guideMatchAccount(int gid);
int match(int gid, int did);
List<Demands> confirmedPage(int gid);
int confirmed(int did, int gid);
int refuse(int gid);
int delete(int gid);
double timeScore(int gsum, String gddate, String gedate, int dsum, String dddate, String dedate);
double messageScore(String gmessage, String dmessage);
}

@ -0,0 +1,384 @@
package com.softegg.freetogo.Search.service;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.GuideMatch.service.GuideMatchService;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.Demand.service.DemandsService;
import com.softegg.freetogo.User.service.UsersService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.*;
import static java.lang.Math.abs;
/**
* description:
* @author:wuyifan
* date:2024/5/28 19:51
*/
@Component
public class SearchServiceImpl implements SearchService {
@Autowired
DemandsService demandsService;
@Autowired
UsersService usersService;
@Autowired
GuideServiceService guideServiceService;
/**
* @description:
* @param: city
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public List<Demands> guideMatchAccount(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
int guideServiceSumDay = Integer.parseInt(guideService.getSumDay());
String guideServiceDepartureDate = guideService.getDepartureDate();
String guideServiceEndDate = guideService.getEndDate();
String guideServiceMessage = guideService.getMessage();
List<Demands> dlist = demandsService.getDemandsByCity(guideService.getCity());
// 使用迭代器的 remove 方法
dlist.removeIf(demand -> demand.getStatus() > 1);
int length = dlist.size();
double[] sumScores = new double[length];
int i = 0;
for (Demands demands : dlist) {
double sumScore = 0;
int demandsSumDay = Integer.parseInt(demands.getSumDay());
String demandsDepartureDate = demands.getDepartureDate();
String demandsEndDate = demands.getEndDate();
String demandsMessage = demands.getMessage();
double timeScore = timeScore(guideServiceSumDay,guideServiceDepartureDate,guideServiceEndDate,demandsSumDay,demandsDepartureDate,demandsEndDate);
double messageScore = messageScore(guideServiceMessage, demandsMessage);
sumScore += timeScore + messageScore;
sumScores[i] = sumScore;
i++;
}
// 创建一个包含索引和值的列表
List<Map.Entry<Double, Demands>> list = new ArrayList<>();
for (int j = 0; j < sumScores.length; j++) {
list.add(new AbstractMap.SimpleEntry<>(sumScores[j], dlist.get(j)));
}
// 根据sumScores的元素大小对 list 进行排序
list.sort((o1, o2) -> o2.getKey().compareTo(o1.getKey()));
List<Demands> newdList = new ArrayList<>();
for (Map.Entry<Double, Demands> entry : list) {
newdList.add(entry.getValue());
}
return newdList;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int match(int gid, int did){
Demands demand = demandsService.getDemandById(did);
GuideService guideService = guideServiceService.getGuideServiceById(gid);
demand.setStatus(1);
List<Integer> guideServiceIdList = demand.getGuideServiceIdList();
if (guideServiceIdList == null) {
guideServiceIdList = new ArrayList<>();
}
if(!guideServiceIdList.contains(gid)){
guideServiceIdList.add(gid);
}
demand.setGuideServiceIdList(guideServiceIdList);
// List<Integer> demandIdList = guideService.getDemandIdList();
// if (demandIdList == null) {
// demandIdList = new ArrayList<>();
// }
// demandIdList.add(did);
// guideService.setDemandIdList(demandIdList);
demandsService.update(demand);
guideServiceService.update(guideService);
System.out.println(demand.getGuideServiceIdList());
return 1006;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public List<Demands> confirmedPage(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
List<Integer> demandIdList = guideService.getDemandIdList();
List<Demands> demandsList = new ArrayList<>();
for(int number : demandIdList) {
Demands demand = demandsService.getDemandById(number);
demandsList.add(demand);
}
return demandsList;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int confirmed(int gid, int did){
Demands demand = demandsService.getDemandById(did);
GuideService guideService = guideServiceService.getGuideServiceById(gid);
demand.setStatus(2);
demand.setGuideServiceId(gid);
guideService.setStatus(2);
guideService.setDemandId(did);
demandsService.update(demand);
guideServiceService.update(guideService);
return 1007;
}
/**
* @description:
* @param: did,gid
* @return: int
* author: wuyifan
* @date: 2024/5/28 19:52
*/
@Override
public int refuse(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
int did = guideService.getDemandId();
Demands demand = demandsService.getDemandById(gid);
List<Integer> demandIdList = guideService.getDemandIdList();
if (demandIdList == null) {
guideService.setStatus(0);
}else {
guideService.setStatus(1);
}
List<Integer> guideServiceIdList = demand.getGuideServiceIdList();
if(guideServiceIdList == null){
demand.setStatus(0);
}else {
demand.setStatus(1);
}
guideService.setDemandId(null);
demand.setGuideServiceId(null);
demandsService.update(demand);
guideServiceService.update(guideService);
return 1;
}
@Override
public int delete(int gid){
GuideService guideService = guideServiceService.getGuideServiceById(gid);
guideService.setStatus(4);
guideServiceService.update(guideService);
return 1;
}
public static boolean isRangeWithinRange(LocalDate startDate1, LocalDate endDate1, LocalDate startDate2, LocalDate endDate2) {
return !startDate1.isBefore(startDate2) && !endDate1.isAfter(endDate2);
}
/**
* @description:
* @param: gsumdsumddateedate
* @return: float
* @author: wuyifan
* @date: 2024/5/28 20:35
*/
@Override
public double timeScore(int gsum, String gddate, String gedate, int dsum, String dddate, String dedate){
double score = 0;
int difference = gsum - dsum;
if (abs(difference) < 15 ){
score += 10 / (float)(abs(difference) + 1);
}
// 使用DateTimeFormatter将字符串转换为LocalDate对象
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate1 = LocalDate.parse(dddate, formatter);
LocalDate endDate1 = LocalDate.parse(dedate, formatter);
System.out.println(startDate1);
System.out.println(endDate1);
LocalDate startDate2 = LocalDate.parse(gddate, formatter);
LocalDate endDate2 = LocalDate.parse(gedate, formatter);
System.out.println(startDate2);
System.out.println(endDate2);
// 判断第一个范围是否在第二个范围内
boolean isRange1WithinRange2 = isRangeWithinRange(startDate1, endDate1, startDate2, endDate2);
if (isRange1WithinRange2){
score += 100;
}
return score;
}
/**
* @description: Jaccard
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:35
*/
public static double jaccardSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Set<Character> set1 = new HashSet<>();
Set<Character> set2 = new HashSet<>();
for (char c : s1.toCharArray()) {
set1.add(c);
}
for (char c : s2.toCharArray()) {
set2.add(c);
}
Set<Character> intersection = new HashSet<>(set1);
intersection.retainAll(set2);
Set<Character> union = new HashSet<>(set1);
union.addAll(set2);
return (double) intersection.size() / union.size();
}
/**
* @description:
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:35
*/
private static Map<Character, Integer> getCharacterFrequency(String s) {
Map<Character, Integer> frequencyMap = new HashMap<>();
for (char c : s.toCharArray()) {
frequencyMap.put(c, frequencyMap.getOrDefault(c, 0) + 1);
}
return frequencyMap;
}
public static double cosineSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Map<Character, Integer> freq1 = getCharacterFrequency(s1);
Map<Character, Integer> freq2 = getCharacterFrequency(s2);
double dotProduct = 0.0;
double mag1 = 0.0;
double mag2 = 0.0;
for (char c : freq1.keySet()) {
if (freq2.containsKey(c)) {
dotProduct += freq1.get(c) * freq2.get(c);
}
mag1 += Math.pow(freq1.get(c), 2);
}
for (char c : freq2.keySet()) {
mag2 += Math.pow(freq2.get(c), 2);
}
mag1 = Math.sqrt(mag1);
mag2 = Math.sqrt(mag2);
return dotProduct / (mag1 * mag2);
}
/**
* @description: Dice
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:25
*/
public static double diceCoefficient(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
int intersection = 0;
for (int i = 0; i < s1.length() - 1; i++) {
String bigram = s1.substring(i, i + 2);
if (s2.contains(bigram)) {
intersection++;
}
}
int union = s1.length() + s2.length() - intersection;
return (double) (2 * intersection) / union;
}
/**
* @description: N-gram
* @param: String
* @return: float
* @author: wuyifan
* @date: 2024/5/30 20:22
*/
private static Set<String> generateNGrams(String s, int n) {
if (s == null || s.length() < n || n <= 0) {
throw new IllegalArgumentException("Invalid input string or n-gram size");
}
Set<String> nGrams = new HashSet<>();
for (int i = 0; i <= s.length() - n; i++) {
nGrams.add(s.substring(i, i + n));
}
return nGrams;
}
public static double bigramSimilarity(String s1, String s2) {
if (s1 == null || s2 == null || s1.isEmpty() || s2.isEmpty()) {
return 0.0; // 如果任何一个字符串为空直接返回0
}
Set<String> bigrams1 = generateNGrams(s1, 2);
Set<String> bigrams2 = generateNGrams(s2, 2);
Set<String> commonBigrams = new HashSet<>(bigrams1);
commonBigrams.retainAll(bigrams2);
Set<String> allBigrams = new HashSet<>(bigrams1);
allBigrams.addAll(bigrams2);
return (double) commonBigrams.size() / allBigrams.size();
}
/**
* @description:
* @param: gmessagedmessage
* @return: float
* @author: wuyifan
* @date: 2024/5/28 20:35
*/
@Override
public double messageScore(String gmessage, String dmessage){
double score;
double similarity1 = jaccardSimilarity(gmessage, dmessage);
double similarity2 = cosineSimilarity(gmessage, dmessage);
double similarity3 = diceCoefficient(gmessage, dmessage);
double similarity4 = bigramSimilarity(gmessage, dmessage);
score = similarity1 + similarity2 + similarity3 + similarity4;
return score;
}
}

@ -0,0 +1,72 @@
package com.softegg.freetogo.SendDemand.controller;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.Demand.service.DemandsService;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.SendDemand.service.SendDemandService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author:wuyifan
* @date:2024/5/10 23:09
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/SendDemand")
public class SendDemandController {
@Autowired
SendDemandService sendDemandService;
@Autowired
DemandsService demandsService;
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/10 22:45
*/
@PostMapping("register")
public String SendDemand(@RequestBody Map<String, Object> map) {
return switch (sendDemandService.sendnewDemandAccount(map.get("province").toString(), map.get("city").toString(), map.get("phone").toString(), map.get("time").toString(), (String) map.get("remark"))) {
case 1005 -> "1";//需求发送成功
default -> "0";
};
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/16 11:01
*/
@GetMapping("sendAllDemands")
public List<Demands> sendAllDemand(String phone) {
System.out.println("收到目标用户手机号:" + phone);
List<Demands> dlist = demandsService.getDemandsByPhone(phone);
System.out.println(dlist);
return dlist;
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/4 16:12
*/
@GetMapping("demand")
public Demands demand(int did) {
System.out.println("需求did:"+did);
return demandsService.getDemandById(did);
}
}

@ -0,0 +1,13 @@
package com.softegg.freetogo.SendDemand.service;
import org.springframework.stereotype.Service;
/**
* @description:
* @author:wuyifan
* @date:2024/5/10 23:31
*/
@Service
public interface SendDemandService {
int sendnewDemandAccount(String province, String city, String phone, String date, String message);
}

@ -0,0 +1,78 @@
package com.softegg.freetogo.SendDemand.service;
import com.softegg.freetogo.Demand.bean.Demands;
import com.softegg.freetogo.Demand.service.DemandsService;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
/**
* @description:
* @author:wuyifan
* @date:2024/5/10 23:10
*/
@Component
public class SendDemandServiceImpl implements SendDemandService {
@Autowired
DemandsService demandsService;
@Autowired
UsersService usersService;
/**
* @description:
* @param: city
* @return: int
* @author: wuyifan
* @date: 2024/5/10 23:25
*/
@Override
public int sendnewDemandAccount(String province, String city, String phone, String date, String message) {
LocalDateTime currentDateTime = LocalDateTime.now();
//对获取的date信息进行处理
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter1);
date = date.replace("[", "");
date = date.replace("]", "");
String[] parts = date.split(",");
String dDate = parts[0];
String eDate = parts[1];
//获取整个导游服务的总天数
eDate = eDate.trim();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(dDate, formatter2);
LocalDate endDate = LocalDate.parse(eDate, formatter2);
String departureTime = startDate.format(formatter2);
String endTime = endDate.format(formatter2);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate) + 1;
//根据收到的消息,初始化游客需求内容
Demands demand = new Demands();
Users user = usersService.getUserByPhone(phone);
demand.setPhone(phone);
demand.setCity(city);
demand.setProvince(province);
String gender;
if(user.isGender()){
gender = "男性";
}
else{
gender = "女性";
}
demand.setTouristGender(gender);
demand.setNickname(user.getNickname());
demand.setCreateTime(formattedDateTime);
demand.setDepartureDate(departureTime);
demand.setEndDate(endTime);
demand.setSumDay(String.valueOf(daysBetween));
demand.setMessage(message);
demand.setStatus(0);
demandsService.add(demand);
return 1005;//添加游客需求成功
}
}

@ -0,0 +1,76 @@
package com.softegg.freetogo.SendGuideService.controller;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.SendGuideService.service.SendGuideServiceService;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @description:
* @author:wuyifan
* @date:2024/5/13 10:47
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/SendGuideService")
public class SendGuideServiceController {
@Autowired
SendGuideServiceService sendGuideServiceService;
@Autowired
UsersService usersService;
@Autowired
GuideServiceService guideServiceService;
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/13 10:48
*/
@PostMapping("register")
public int SendDemand(@RequestBody Map<String, Object> map) {
String phone = map.get("phone").toString();
Users user = usersService.getUserByPhone(phone);
if (user.isMembertype()) {
return switch (sendGuideServiceService.sendnewGuideServiceAccount(map.get("province").toString(), map.get("city").toString(), map.get("phone").toString(), map.get("time").toString(), (String) map.get("remark"))) {
case 1005 -> 1;//服务发送成功
default -> 0;
};
} else {
return 2;//用户非导游
}
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/5/16 11:01
*/
@GetMapping("sendAllGuideService")
public List<GuideService> sendAllGuideService(String phone) {
List<GuideService> glist = guideServiceService.getGuideServiceByPhone(phone);
return glist;
}
/**
* @description:
* @param: map
* @return: java.lang.String
* @author: wuyifan
* @date: 2024/6/4 16:10
*/
@GetMapping("GuideService")
public GuideService GuideService(int gid) {
return guideServiceService.getGuideServiceById(gid);
}
}

@ -0,0 +1,14 @@
package com.softegg.freetogo.SendGuideService.service;
import org.springframework.stereotype.Service;
/**
* @description:
* @author:wuyifan
* @date:2024/5/13 11:11
*/
@Service
public interface SendGuideServiceService {
int sendnewGuideServiceAccount(String province, String city, String phone, String date, String message);
}

@ -0,0 +1,84 @@
package com.softegg.freetogo.SendGuideService.service;
import com.softegg.freetogo.GuideService.bean.GuideService;
import com.softegg.freetogo.GuideService.service.GuideServiceService;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.temporal.ChronoUnit;
/**
* @description:
* @author:wuyifan
* @date:2024/5/13 10:53
*/
@Component
public class SendGuideServiceServiceImpl implements SendGuideServiceService {
@Autowired
GuideServiceService guideServiceService;
@Autowired
UsersService usersService;
/**
* @description:
* @param: city
* @return: int
* @author: wuyifan
* @date: 2024/5/10 23:25
*/
@Override
public int sendnewGuideServiceAccount(String province, String city, String phone, String date, String message) {
LocalDateTime currentDateTime = LocalDateTime.now();
//对获取的date信息进行处理
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String formattedDateTime = currentDateTime.format(formatter1);
date = date.replace("[", "");
date = date.replace("]", "");
String[] parts = date.split(",");
String dDate = parts[0];
String eDate = parts[1];
//获取整个导游服务的总天数
System.out.println(dDate);
System.out.println(eDate);
dDate = dDate.trim();
eDate = eDate.trim();
dDate = dDate.substring(0, 10);
eDate = eDate.substring(0, 10);
System.out.println(dDate);
System.out.println(eDate);
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
LocalDate startDate = LocalDate.parse(dDate, formatter2);
LocalDate endDate = LocalDate.parse(eDate, formatter2);
String departureTime = startDate.format(formatter2);
String endTime = endDate.format(formatter2);
long daysBetween = ChronoUnit.DAYS.between(startDate, endDate) + 1;
//根据收到的消息,初始化导游服务内容
GuideService guideService = new GuideService();
Users user = usersService.getUserByPhone(phone);
guideService.setPhone(phone);
guideService.setCity(city);
guideService.setProvince(province);
String gender;
if(user.isGender()){
gender = "男性";
}
else{
gender = "女性";
}
guideService.setGuideGender(gender);
guideService.setNickname(user.getNickname());
guideService.setCreateTime(user.getCreatetime());//formattedDateTime);
guideService.setDepartureDate(departureTime);
guideService.setEndDate(endTime);
guideService.setSumDay(String.valueOf(daysBetween));
guideService.setMessage(message);
guideService.setStatus(0);
guideServiceService.add(guideService);
return 1006;//添加导游服务成功
}
}

@ -0,0 +1,12 @@
package com.softegg.freetogo.User.Dao;
import com.softegg.freetogo.User.bean.Guides;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @description: Jpa
* @author: zhanglinhao
* @date: 2024/5/16 10:44
*/
public interface GuidesRepository extends JpaRepository<Guides, Integer> {
}

@ -0,0 +1,13 @@
package com.softegg.freetogo.User.Dao;
import com.softegg.freetogo.User.bean.Users;
import org.springframework.data.jpa.repository.JpaRepository;
/**
* @description:Jpa
* @author:zhanglinhao
* @date:2024/5/8 8:50
*/
public interface UsersRepository extends JpaRepository<Users, Integer> {
Users findByPhone(String phone);//自定义函数,根据手机号进行查找返回对应对象
}

@ -0,0 +1,35 @@
package com.softegg.freetogo.User.bean;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/16 10:33
*/
@Entity
@Table(name = "guides")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Guides {
@Id
private Integer uid;
@Column(name = "residence")
private String rsd;
@Column(name = "familiarareas")
private String fa;
@Column(name = "synopsis")
private String syns;
@Column(name = "experance")
private boolean re;
@Column(name = "stars")
private int stars;
@Column(name = "sum")
private int sum;
}

@ -0,0 +1,60 @@
package com.softegg.freetogo.User.bean;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
/**
* @description:users
* @author:zhanglinhao
* @date:2024/5/7 15:36
*/
@Entity
@Table(name = "users")
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class Users {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Integer uid;
@Column
private String name;
@Column
private String email;
@Column
private String password;
@Column
private String createtime;
@Column(name="IDCard")
private String idcard;
@Column
private int reputation;
@Column
private boolean gender;//ture:male, false:female
@Column
private boolean membertype;//true:guide, false:visitor
@Column
private String phone;
@Column
private String nickname;
@Column
private int status;
public Users(String name, String email, String psw, String ct, int rpt, String phone, String nkn, String idc, boolean gender, boolean type, int status) {
this.name = name;
this.email = email;
this.password = psw;
this.createtime = ct;
this.reputation = rpt;
this.phone = phone;
this.nickname = nkn;
this.idcard = idc;
this.gender = gender;
this.membertype = type;
this.status = status;
}
}

@ -0,0 +1,243 @@
package com.softegg.freetogo.User.controller;
import com.softegg.freetogo.User.bean.Guides;
import com.softegg.freetogo.User.bean.Users;
import com.softegg.freetogo.User.service.GuidesService;
import com.softegg.freetogo.User.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import java.util.Map;
/**
* @description:Users
* @author:zhanglinhao
* @date:2024/5/8 8:28
*/
@RestController
//@CrossOrigin(origins = "*")
@RequestMapping("/users")
public class UsersController {
@Autowired
UsersService usersService;
@Autowired
GuidesService guidesService;
/**
* @description: users
* @param: null
* @return: java.util.List<com.softegg.freetogo.User.bean.Users>
* @author: zhanglinhao
* @date: 2024/5/10 8:16
*/
@GetMapping("findAll")
public List<Users> findAll() {
System.out.println("响应查找所有数据");
return usersService.findAll();
}
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/10 8:17
*/
@GetMapping("add")
public String add(String name,
String email,
String password,
String createtime,
int reputation,
String phone,
String nickname,
String IDCard,
boolean gender,
boolean type,
int status) {
Users user = new Users(name, email, password, createtime, reputation, phone, nickname, IDCard, gender, type, status);
usersService.add(user);
System.out.println("添加用户");
return "添加成功";
}
/**
* @description: id
* @param: id
* @return: java.lang.String
* @author: zhanglinhao
* @date: 2024/5/10 8:17
*/
@GetMapping("delbyid")
public String delById(int id) {
usersService.deleteById(id);
System.out.println("通过id删除用户");
return "删除成功";
}
/**
* @description: id
* @param: id
* @return: com.softegg.freetogo.User.bean.Users
* @author: zhanglinhao
* @date: 2024/5/10 8:17
*/
@GetMapping("findbyid")
public Users getUserById(int id) {
System.out.println("通过id获取用户数据");
return usersService.getUserById(id);
}
/**
* @description: 使GET
* @author: zhanglinhao
* @date: 2024/5/10 8:17
*/
@GetMapping("update")
public String update(String name,
String email,
String password,
String createtime,
int reputation,
String phone,
String nickname,
String IDCard,
boolean gender,
boolean type,
int status) {
Users User = usersService.getUserByPhone(phone);
System.out.println(User);
setUsers(name, email, password, createtime, reputation, phone, nickname, IDCard, gender, type, status, User);
usersService.update(User);
System.out.println("更新用户信息:" + User);
return "更新成功";
}
/**
* @description: 使POST
* @param: user
* @return: void
* @author: zhanglinhao
* @date: 2024/5/10 19:45
*/
@PostMapping("Pupdate")
public boolean Pupdate(@RequestBody Map<String, Users> user) {
Users ubody = user.get("user");
System.out.println(ubody);
// System.out.println(ubody.get("uid"));
Users User = new Users(ubody.getUid(), ubody.getName(), ubody.getEmail(), ubody.getPassword(), ubody.getCreatetime(), ubody.getIdcard(), ubody.getReputation(), ubody.isGender(), ubody.isMembertype(), ubody.getPhone(), ubody.getNickname(), ubody.getStatus());
usersService.update(User);
return true;
}
/**
* @description:
* @param: phone
* @return: com.softegg.freetogo.User.bean.Users
* @author: zhanglinhao
* @date: 2024/5/10 8:17
*/
@GetMapping("getByPhone")
public Users getByPhone(String phone) {
System.out.println("根据手机号获取用户信息:" + phone);
System.out.println(usersService.getUserByPhone(phone));
return usersService.getUserByPhone(phone);
}
/**
* @description:
* @param: phone
* @return: boolean
* @author: zhanglinhao
* @date: 2024/5/15 20:03
*/
@GetMapping("isGuide")
public boolean isGuide(String phone) {
System.out.println("查寻是否是导游:" + phone);
return usersService.isGuide(phone);
}
/**
* @description: id
* @param: phone
* @return: int
* @author: zhanglinhao
* @date: 2024/5/16 11:13
*/
@GetMapping("getUid")
public int getUid(String phone) {
System.out.println("搜索uid使用的电话:" + phone);
return usersService.getIdByPhone(phone);
}
/**
* @description:
* @param: guide
* @return: int
* @author: zhanglinhao
* @date: 2024/5/16 10:15
*/
// @PostMapping("registerToGuide")
// public int registerToGuide(@RequestBody Map<String,Map<String,String>> grequesting) {//Map<String, Map<String, Object>> gbody) {
// System.out.println("接收的注册请求:"+grequesting);
// Map<String,String> gbody = grequesting.get("registerToGuide");
// System.out.println("处理后的注册请求:"+gbody);
// Guides guide = new Guides();
// guide.setUid(Integer.parseInt(gbody.get("uid")));
// guide.setRsd(gbody.get("rsd"));
// guide.setFa(gbody.get("fa"));
// guide.setSyns(gbody.get("syns"));
// guide.setRe(Boolean.parseBoolean(gbody.get("re")));
// if(guidesService.registerToGuide(guide))
// return 1;
// else
// return 0;
// }
@PostMapping("registerToGuide")
public int registerToGuide(@RequestBody Map<String,Guides> grequesting) {//Map<String, Map<String, Object>> gbody) {
System.out.println(grequesting);
Guides guide = grequesting.get("registerToGuide");
System.out.println(guide);
if(guidesService.registerToGuide(guide))
return 1;
else
return 0;
}
/**
* @description: user
* @author: zhanglinhao
* @date: 2024/5/10 8:18
*/
private void setUsers(String name,
String email,
String psw,
String ct,
int rpt,
String phone,
String nkn,
String idc,
boolean gender,
boolean type,
int status,
Users user) {
user.setName(name);
user.setGender(gender);
user.setPassword(psw);
user.setEmail(email);
user.setReputation(rpt);
user.setMembertype(type);
user.setCreatetime(ct);
user.setPhone(phone);
user.setNickname(nkn);
user.setIdcard(idc);
user.setStatus(status);
}
@GetMapping("guideInfo")
public Users guideInfo(int id) {
return getUserById(id);
}
}

@ -0,0 +1,17 @@
package com.softegg.freetogo.User.service;
import com.softegg.freetogo.User.bean.Guides;
import org.springframework.stereotype.Service;
import java.util.Optional;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/16 10:45
*/
@Service
public interface GuidesService {
boolean registerToGuide(Guides guide);//注册成为导游,将导游注册信息入库
Optional<Guides> getGuideById(int id);
}

@ -0,0 +1,56 @@
package com.softegg.freetogo.User.service;
import com.softegg.freetogo.User.Dao.GuidesRepository;
import com.softegg.freetogo.User.bean.Guides;
import com.softegg.freetogo.User.bean.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Optional;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/16 10:46
*/
@Component
public class GuidesServiceImpl implements GuidesService {
@Autowired
GuidesRepository guidesRepository;
@Autowired
UsersService usersService;
//
// @Override
// public void registerToGuide(Guides guide) {
// guidesRepository.save(guide);
// System.out.println("成功保存注册导游信息!");
// }
/**
* @description:
* @param: guide
* @return: int
* @author: zhanglinhao
* @date: 2024/5/15 21:19
*/
@Override
public boolean registerToGuide(Guides guide) {
System.out.println("注册成为导游id:" + guide.getUid());
Users user = usersService.getUserById(guide.getUid());
user.setMembertype(true);
guidesRepository.save(guide);
if (user.isMembertype()) {
System.out.println("注册成功!");
return true;
}else{
System.out.println("注册失败!");
return false;
}
}
@Override
public Optional<Guides> getGuideById(int id) {
return guidesRepository.findById(id);
}
}

@ -0,0 +1,169 @@
package com.softegg.freetogo.User.service;
import com.softegg.freetogo.User.Dao.UsersRepository;
import com.softegg.freetogo.User.bean.Users;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/8 8:50
*/
@Component
public class UserServiceImpl implements UsersService {
@Autowired
private UsersRepository usersRepository;
/**
* @description:
* @param: null
* @return: java.util.List<com.softegg.freetogo.User.Bean.Users>
* @author: zhanglinhao
* @date: 2024/5/9 22:52
*/
public List<Users> findAll() {
System.out.println("查询成功");
return usersRepository.findAll();
}
/**
* @description: user
* @param: user
* @return: void
* @author: zhanglinhao
* @date: 2024/5/9 22:53
*/
public void add(Users user) {
usersRepository.save(user);
System.out.println("添加成功:" + user);
}
/**
* @description: id
* @param: id
* @return: void
* @author: zhanglinhao
* @date: 2024/5/9 22:53
*/
public void deleteById(int id) {
usersRepository.deleteById(id);
System.out.println("删除成功:" + id);
}
/**
* @description: id
* @param: id
* @return: com.softegg.freetogo.User.Bean.Users
* @author: zhanglinhao
* @date: 2024/5/9 22:54
*/
public Users getUserById(int id) {
return usersRepository.findById(id).orElse(null);
}
/**
* @description:
* @param: user
* @return: void
* @author: zhanglinhao
* @date: 2024/5/9 22:54
*/
public void update(Users user) {
usersRepository.save(user);
System.out.println("更新成功:");
showInfo(user);
}
/**
* @description:
* @param: phone
* @return: boolean
* @author: zhanglinhao
* @date: 2024/5/9 22:54
*/
public boolean isRegister(String phone) {
Users users = usersRepository.findByPhone(phone);
System.out.println("正在验证用户是否注册:" + users);
if (users == null) {
System.out.println("用户未注册");
return false;
} else {
System.out.println("用户已注册");
return true;
}
}
/**
* @description:
* @param: phone
* @return: com.softegg.freetogo.User.Bean.Users
* @author: zhanglinhao
* @date: 2024/5/9 22:55
*/
public Users getUserByPhone(String phone) {
System.out.println("通过手机号查找用户:" + phone);
return usersRepository.findByPhone(phone);
}
/**
* @description:
* @param: phone
* @return: boolean
* @author: zhanglinhao
* @date: 2024/5/15 21:32
*/
@Override
public boolean isGuide(String phone) {
System.out.println("判断是不是导游:" + phone);
Users user = getUserByPhone(phone);
if (user.isMembertype()) {
System.out.println("是导游:" + phone);
return true;
} else {
System.out.println("不是导游:" + phone);
return false;
}
}
/**
* @description: uid
* @param: phone
* @return: int
* @author: zhanglinhao
* @date: 2024/5/16 10:54
*/
@Override
public int getIdByPhone(String phone) {
Users user = usersRepository.findByPhone(phone);
if (user == null) {
System.out.println("该电话号码未注册");
return -1;
} else {
System.out.println("查询到的id:" + user.getUid());
return user.getUid();
}
}
/**
* @description:
* @author: zhanglinhao
* @date: 2024/5/16 15:55
*/
@Override
public void showInfo(Users user) {
System.out.println(user.getUid());
System.out.println(user.getName());
System.out.println(user.getPhone());
System.out.println(user.getPassword());
System.out.println(user.getNickname());
System.out.println(user.getCreatetime());
System.out.println(user.getIdcard());
System.out.println(user.getReputation());
System.out.println(user.getStatus());
System.out.println(user.isGender());
System.out.println(user.isMembertype());
}
}

@ -0,0 +1,33 @@
package com.softegg.freetogo.User.service;
import com.softegg.freetogo.User.bean.Users;
import org.springframework.stereotype.Service;
import java.util.List;
/**
* @description:
* @author:zhanglinhaon
* @date:2024/5/7 16:06
*/
@Service
public interface UsersService {
List<Users> findAll();//查找所有用户
void add(Users user);//以user为用户入库
void deleteById(int id);//删除对应id用户
Users getUserById(int id);//获得对应id用户
void update(Users user);//更新用户信息
boolean isRegister(String phone);//判断该手机号(账号)是否已经入库
Users getUserByPhone(String phone);//根据手机号获得用户
boolean isGuide(String phone);//查询是否是导游
int getIdByPhone(String phone);//查找uid
void showInfo(Users user);//打印所有信息
}

@ -0,0 +1,17 @@
package com.softegg.freetogo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* @description
* @author:zhanglinhao
* @date:2024/5/7 23:40
*/
@RestController
public class helloController {
@GetMapping("/hello")
public String hello() {
return "hello world!";
}
}

250
src/后端/mvnw vendored

@ -0,0 +1,250 @@
#!/bin/sh
# ----------------------------------------------------------------------------
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
# ----------------------------------------------------------------------------
# ----------------------------------------------------------------------------
# Apache Maven Wrapper startup batch script, version 3.3.1
#
# Optional ENV vars
# -----------------
# JAVA_HOME - location of a JDK home dir, required when download maven via java source
# MVNW_REPOURL - repo url base for downloading maven distribution
# MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
# MVNW_VERBOSE - true: enable verbose log; debug: trace the mvnw script; others: silence the output
# ----------------------------------------------------------------------------
set -euf
[ "${MVNW_VERBOSE-}" != debug ] || set -x
# OS specific support.
native_path() { printf %s\\n "$1"; }
case "$(uname)" in
CYGWIN* | MINGW*)
[ -z "${JAVA_HOME-}" ] || JAVA_HOME="$(cygpath --unix "$JAVA_HOME")"
native_path() { cygpath --path --windows "$1"; }
;;
esac
# set JAVACMD and JAVACCMD
set_java_home() {
# For Cygwin and MinGW, ensure paths are in Unix format before anything is touched
if [ -n "${JAVA_HOME-}" ]; then
if [ -x "$JAVA_HOME/jre/sh/java" ]; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
JAVACCMD="$JAVA_HOME/jre/sh/javac"
else
JAVACMD="$JAVA_HOME/bin/java"
JAVACCMD="$JAVA_HOME/bin/javac"
if [ ! -x "$JAVACMD" ] || [ ! -x "$JAVACCMD" ]; then
echo "The JAVA_HOME environment variable is not defined correctly, so mvnw cannot run." >&2
echo "JAVA_HOME is set to \"$JAVA_HOME\", but \"\$JAVA_HOME/bin/java\" or \"\$JAVA_HOME/bin/javac\" does not exist." >&2
return 1
fi
fi
else
JAVACMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v java
)" || :
JAVACCMD="$(
'set' +e
'unset' -f command 2>/dev/null
'command' -v javac
)" || :
if [ ! -x "${JAVACMD-}" ] || [ ! -x "${JAVACCMD-}" ]; then
echo "The java/javac command does not exist in PATH nor is JAVA_HOME set, so mvnw cannot run." >&2
return 1
fi
fi
}
# hash string like Java String::hashCode
hash_string() {
str="${1:-}" h=0
while [ -n "$str" ]; do
char="${str%"${str#?}"}"
h=$(((h * 31 + $(LC_CTYPE=C printf %d "'$char")) % 4294967296))
str="${str#?}"
done
printf %x\\n $h
}
verbose() { :; }
[ "${MVNW_VERBOSE-}" != true ] || verbose() { printf %s\\n "${1-}"; }
die() {
printf %s\\n "$1" >&2
exit 1
}
# parse distributionUrl and optional distributionSha256Sum, requires .mvn/wrapper/maven-wrapper.properties
while IFS="=" read -r key value; do
case "${key-}" in
distributionUrl) distributionUrl="${value-}" ;;
distributionSha256Sum) distributionSha256Sum="${value-}" ;;
esac
done <"${0%/*}/.mvn/wrapper/maven-wrapper.properties"
[ -n "${distributionUrl-}" ] || die "cannot read distributionUrl property in ${0%/*}/.mvn/wrapper/maven-wrapper.properties"
case "${distributionUrl##*/}" in
maven-mvnd-*bin.*)
MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/
case "${PROCESSOR_ARCHITECTURE-}${PROCESSOR_ARCHITEW6432-}:$(uname -a)" in
*AMD64:CYGWIN* | *AMD64:MINGW*) distributionPlatform=windows-amd64 ;;
:Darwin*x86_64) distributionPlatform=darwin-amd64 ;;
:Darwin*arm64) distributionPlatform=darwin-aarch64 ;;
:Linux*x86_64*) distributionPlatform=linux-amd64 ;;
*)
echo "Cannot detect native platform for mvnd on $(uname)-$(uname -m), use pure java version" >&2
distributionPlatform=linux-amd64
;;
esac
distributionUrl="${distributionUrl%-bin.*}-$distributionPlatform.zip"
;;
maven-mvnd-*) MVN_CMD=mvnd.sh _MVNW_REPO_PATTERN=/maven/mvnd/ ;;
*) MVN_CMD="mvn${0##*/mvnw}" _MVNW_REPO_PATTERN=/org/apache/maven/ ;;
esac
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
[ -z "${MVNW_REPOURL-}" ] || distributionUrl="$MVNW_REPOURL$_MVNW_REPO_PATTERN${distributionUrl#*"$_MVNW_REPO_PATTERN"}"
distributionUrlName="${distributionUrl##*/}"
distributionUrlNameMain="${distributionUrlName%.*}"
distributionUrlNameMain="${distributionUrlNameMain%-bin}"
MAVEN_HOME="$HOME/.m2/wrapper/dists/${distributionUrlNameMain-}/$(hash_string "$distributionUrl")"
exec_maven() {
unset MVNW_VERBOSE MVNW_USERNAME MVNW_PASSWORD MVNW_REPOURL || :
exec "$MAVEN_HOME/bin/$MVN_CMD" "$@" || die "cannot exec $MAVEN_HOME/bin/$MVN_CMD"
}
if [ -d "$MAVEN_HOME" ]; then
verbose "found existing MAVEN_HOME at $MAVEN_HOME"
exec_maven "$@"
fi
case "${distributionUrl-}" in
*?-bin.zip | *?maven-mvnd-?*-?*.zip) ;;
*) die "distributionUrl is not valid, must match *-bin.zip or maven-mvnd-*.zip, but found '${distributionUrl-}'" ;;
esac
# prepare tmp dir
if TMP_DOWNLOAD_DIR="$(mktemp -d)" && [ -d "$TMP_DOWNLOAD_DIR" ]; then
clean() { rm -rf -- "$TMP_DOWNLOAD_DIR"; }
trap clean HUP INT TERM EXIT
else
die "cannot create temp dir"
fi
mkdir -p -- "${MAVEN_HOME%/*}"
# Download and Install Apache Maven
verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
verbose "Downloading from: $distributionUrl"
verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
# select .zip or .tar.gz
if ! command -v unzip >/dev/null; then
distributionUrl="${distributionUrl%.zip}.tar.gz"
distributionUrlName="${distributionUrl##*/}"
fi
# verbose opt
__MVNW_QUIET_WGET=--quiet __MVNW_QUIET_CURL=--silent __MVNW_QUIET_UNZIP=-q __MVNW_QUIET_TAR=''
[ "${MVNW_VERBOSE-}" != true ] || __MVNW_QUIET_WGET='' __MVNW_QUIET_CURL='' __MVNW_QUIET_UNZIP='' __MVNW_QUIET_TAR=v
# normalize http auth
case "${MVNW_PASSWORD:+has-password}" in
'') MVNW_USERNAME='' MVNW_PASSWORD='' ;;
has-password) [ -n "${MVNW_USERNAME-}" ] || MVNW_USERNAME='' MVNW_PASSWORD='' ;;
esac
if [ -z "${MVNW_USERNAME-}" ] && command -v wget >/dev/null; then
verbose "Found wget ... using wget"
wget ${__MVNW_QUIET_WGET:+"$__MVNW_QUIET_WGET"} "$distributionUrl" -O "$TMP_DOWNLOAD_DIR/$distributionUrlName" || die "wget: Failed to fetch $distributionUrl"
elif [ -z "${MVNW_USERNAME-}" ] && command -v curl >/dev/null; then
verbose "Found curl ... using curl"
curl ${__MVNW_QUIET_CURL:+"$__MVNW_QUIET_CURL"} -f -L -o "$TMP_DOWNLOAD_DIR/$distributionUrlName" "$distributionUrl" || die "curl: Failed to fetch $distributionUrl"
elif set_java_home; then
verbose "Falling back to use Java to download"
javaSource="$TMP_DOWNLOAD_DIR/Downloader.java"
targetZip="$TMP_DOWNLOAD_DIR/$distributionUrlName"
cat >"$javaSource" <<-END
public class Downloader extends java.net.Authenticator
{
protected java.net.PasswordAuthentication getPasswordAuthentication()
{
return new java.net.PasswordAuthentication( System.getenv( "MVNW_USERNAME" ), System.getenv( "MVNW_PASSWORD" ).toCharArray() );
}
public static void main( String[] args ) throws Exception
{
setDefault( new Downloader() );
java.nio.file.Files.copy( java.net.URI.create( args[0] ).toURL().openStream(), java.nio.file.Paths.get( args[1] ).toAbsolutePath().normalize() );
}
}
END
# For Cygwin/MinGW, switch paths to Windows format before running javac and java
verbose " - Compiling Downloader.java ..."
"$(native_path "$JAVACCMD")" "$(native_path "$javaSource")" || die "Failed to compile Downloader.java"
verbose " - Running Downloader.java ..."
"$(native_path "$JAVACMD")" -cp "$(native_path "$TMP_DOWNLOAD_DIR")" Downloader "$distributionUrl" "$(native_path "$targetZip")"
fi
# If specified, validate the SHA-256 sum of the Maven distribution zip file
if [ -n "${distributionSha256Sum-}" ]; then
distributionSha256Result=false
if [ "$MVN_CMD" = mvnd.sh ]; then
echo "Checksum validation is not supported for maven-mvnd." >&2
echo "Please disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
elif command -v sha256sum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | sha256sum -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
elif command -v shasum >/dev/null; then
if echo "$distributionSha256Sum $TMP_DOWNLOAD_DIR/$distributionUrlName" | shasum -a 256 -c >/dev/null 2>&1; then
distributionSha256Result=true
fi
else
echo "Checksum validation was requested but neither 'sha256sum' or 'shasum' are available." >&2
echo "Please install either command, or disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties." >&2
exit 1
fi
if [ $distributionSha256Result = false ]; then
echo "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised." >&2
echo "If you updated your Maven version, you need to update the specified distributionSha256Sum property." >&2
exit 1
fi
fi
# unzip and move
if command -v unzip >/dev/null; then
unzip ${__MVNW_QUIET_UNZIP:+"$__MVNW_QUIET_UNZIP"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -d "$TMP_DOWNLOAD_DIR" || die "failed to unzip"
else
tar xzf${__MVNW_QUIET_TAR:+"$__MVNW_QUIET_TAR"} "$TMP_DOWNLOAD_DIR/$distributionUrlName" -C "$TMP_DOWNLOAD_DIR" || die "failed to untar"
fi
printf %s\\n "$distributionUrl" >"$TMP_DOWNLOAD_DIR/$distributionUrlNameMain/mvnw.url"
mv -- "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" "$MAVEN_HOME" || [ -d "$MAVEN_HOME" ] || die "fail to move MAVEN_HOME"
clean || :
exec_maven "$@"

146
src/后端/mvnw.cmd vendored

@ -0,0 +1,146 @@
<# : batch portion
@REM ----------------------------------------------------------------------------
@REM Licensed to the Apache Software Foundation (ASF) under one
@REM or more contributor license agreements. See the NOTICE file
@REM distributed with this work for additional information
@REM regarding copyright ownership. The ASF licenses this file
@REM to you under the Apache License, Version 2.0 (the
@REM "License"); you may not use this file except in compliance
@REM with the License. You may obtain a copy of the License at
@REM
@REM https://www.apache.org/licenses/LICENSE-2.0
@REM
@REM Unless required by applicable law or agreed to in writing,
@REM software distributed under the License is distributed on an
@REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
@REM KIND, either express or implied. See the License for the
@REM specific language governing permissions and limitations
@REM under the License.
@REM ----------------------------------------------------------------------------
@REM ----------------------------------------------------------------------------
@REM Apache Maven Wrapper startup batch script, version 3.3.1
@REM
@REM Optional ENV vars
@REM MVNW_REPOURL - repo url base for downloading maven distribution
@REM MVNW_USERNAME/MVNW_PASSWORD - user and password for downloading maven
@REM MVNW_VERBOSE - true: enable verbose log; others: silence the output
@REM ----------------------------------------------------------------------------
@IF "%__MVNW_ARG0_NAME__%"=="" (SET __MVNW_ARG0_NAME__=%~nx0)
@SET __MVNW_CMD__=
@SET __MVNW_ERROR__=
@SET __MVNW_PSMODULEP_SAVE=%PSModulePath%
@SET PSModulePath=
@FOR /F "usebackq tokens=1* delims==" %%A IN (`powershell -noprofile "& {$scriptDir='%~dp0'; $script='%__MVNW_ARG0_NAME__%'; icm -ScriptBlock ([Scriptblock]::Create((Get-Content -Raw '%~f0'))) -NoNewScope}"`) DO @(
IF "%%A"=="MVN_CMD" (set __MVNW_CMD__=%%B) ELSE IF "%%B"=="" (echo %%A) ELSE (echo %%A=%%B)
)
@SET PSModulePath=%__MVNW_PSMODULEP_SAVE%
@SET __MVNW_PSMODULEP_SAVE=
@SET __MVNW_ARG0_NAME__=
@SET MVNW_USERNAME=
@SET MVNW_PASSWORD=
@IF NOT "%__MVNW_CMD__%"=="" (%__MVNW_CMD__% %*)
@echo Cannot start maven from wrapper >&2 && exit /b 1
@GOTO :EOF
: end batch / begin powershell #>
$ErrorActionPreference = "Stop"
if ($env:MVNW_VERBOSE -eq "true") {
$VerbosePreference = "Continue"
}
# calculate distributionUrl, requires .mvn/wrapper/maven-wrapper.properties
$distributionUrl = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionUrl
if (!$distributionUrl) {
Write-Error "cannot read distributionUrl property in $scriptDir/.mvn/wrapper/maven-wrapper.properties"
}
switch -wildcard -casesensitive ( $($distributionUrl -replace '^.*/','') ) {
"maven-mvnd-*" {
$USE_MVND = $true
$distributionUrl = $distributionUrl -replace '-bin\.[^.]*$',"-windows-amd64.zip"
$MVN_CMD = "mvnd.cmd"
break
}
default {
$USE_MVND = $false
$MVN_CMD = $script -replace '^mvnw','mvn'
break
}
}
# apply MVNW_REPOURL and calculate MAVEN_HOME
# maven home pattern: ~/.m2/wrapper/dists/{apache-maven-<version>,maven-mvnd-<version>-<platform>}/<hash>
if ($env:MVNW_REPOURL) {
$MVNW_REPO_PATTERN = if ($USE_MVND) { "/org/apache/maven/" } else { "/maven/mvnd/" }
$distributionUrl = "$env:MVNW_REPOURL$MVNW_REPO_PATTERN$($distributionUrl -replace '^.*'+$MVNW_REPO_PATTERN,'')"
}
$distributionUrlName = $distributionUrl -replace '^.*/',''
$distributionUrlNameMain = $distributionUrlName -replace '\.[^.]*$','' -replace '-bin$',''
$MAVEN_HOME_PARENT = "$HOME/.m2/wrapper/dists/$distributionUrlNameMain"
$MAVEN_HOME_NAME = ([System.Security.Cryptography.MD5]::Create().ComputeHash([byte[]][char[]]$distributionUrl) | ForEach-Object {$_.ToString("x2")}) -join ''
$MAVEN_HOME = "$MAVEN_HOME_PARENT/$MAVEN_HOME_NAME"
if (Test-Path -Path "$MAVEN_HOME" -PathType Container) {
Write-Verbose "found existing MAVEN_HOME at $MAVEN_HOME"
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"
exit $?
}
if (! $distributionUrlNameMain -or ($distributionUrlName -eq $distributionUrlNameMain)) {
Write-Error "distributionUrl is not valid, must end with *-bin.zip, but found $distributionUrl"
}
# prepare tmp dir
$TMP_DOWNLOAD_DIR_HOLDER = New-TemporaryFile
$TMP_DOWNLOAD_DIR = New-Item -Itemtype Directory -Path "$TMP_DOWNLOAD_DIR_HOLDER.dir"
$TMP_DOWNLOAD_DIR_HOLDER.Delete() | Out-Null
trap {
if ($TMP_DOWNLOAD_DIR.Exists) {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
}
New-Item -Itemtype Directory -Path "$MAVEN_HOME_PARENT" -Force | Out-Null
# Download and Install Apache Maven
Write-Verbose "Couldn't find MAVEN_HOME, downloading and installing it ..."
Write-Verbose "Downloading from: $distributionUrl"
Write-Verbose "Downloading to: $TMP_DOWNLOAD_DIR/$distributionUrlName"
$webclient = New-Object System.Net.WebClient
if ($env:MVNW_USERNAME -and $env:MVNW_PASSWORD) {
$webclient.Credentials = New-Object System.Net.NetworkCredential($env:MVNW_USERNAME, $env:MVNW_PASSWORD)
}
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$webclient.DownloadFile($distributionUrl, "$TMP_DOWNLOAD_DIR/$distributionUrlName") | Out-Null
# If specified, validate the SHA-256 sum of the Maven distribution zip file
$distributionSha256Sum = (Get-Content -Raw "$scriptDir/.mvn/wrapper/maven-wrapper.properties" | ConvertFrom-StringData).distributionSha256Sum
if ($distributionSha256Sum) {
if ($USE_MVND) {
Write-Error "Checksum validation is not supported for maven-mvnd. `nPlease disable validation by removing 'distributionSha256Sum' from your maven-wrapper.properties."
}
Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash
if ((Get-FileHash "$TMP_DOWNLOAD_DIR/$distributionUrlName" -Algorithm SHA256).Hash.ToLower() -ne $distributionSha256Sum) {
Write-Error "Error: Failed to validate Maven distribution SHA-256, your Maven distribution might be compromised. If you updated your Maven version, you need to update the specified distributionSha256Sum property."
}
}
# unzip and move
Expand-Archive "$TMP_DOWNLOAD_DIR/$distributionUrlName" -DestinationPath "$TMP_DOWNLOAD_DIR" | Out-Null
Rename-Item -Path "$TMP_DOWNLOAD_DIR/$distributionUrlNameMain" -NewName $MAVEN_HOME_NAME | Out-Null
try {
Move-Item -Path "$TMP_DOWNLOAD_DIR/$MAVEN_HOME_NAME" -Destination $MAVEN_HOME_PARENT | Out-Null
} catch {
if (! (Test-Path -Path "$MAVEN_HOME" -PathType Container)) {
Write-Error "fail to move MAVEN_HOME"
}
} finally {
try { Remove-Item $TMP_DOWNLOAD_DIR -Recurse -Force | Out-Null }
catch { Write-Warning "Cannot remove $TMP_DOWNLOAD_DIR" }
}
Write-Output "MVN_CMD=$MAVEN_HOME/bin/$MVN_CMD"

@ -0,0 +1,88 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.2.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.softegg</groupId>
<artifactId>FreeToGo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>FreeToGo</name>
<description>FreeToGo</description>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.squareup.okhttp3</groupId>
<artifactId>okhttp</artifactId>
<version>4.12.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>

@ -0,0 +1,31 @@
#-------------------------------------------------------------------------------#
# Qodana analysis is configured by qodana.yaml file #
# https://www.jetbrains.com/help/qodana/qodana-yaml.html #
#-------------------------------------------------------------------------------#
version: "1.0"
#Specify inspection profile for code analysis
profile:
name: qodana.starter
#Enable inspections
#include:
# - name: <SomeEnabledInspectionId>
#Disable inspections
#exclude:
# - name: <SomeDisabledInspectionId>
# paths:
# - <path/where/not/run/inspection>
projectJDK: 17 #(Applied in CI/CD pipeline)
#Execute shell command before Qodana execution (Applied in CI/CD pipeline)
#bootstrap: sh ./prepare-qodana.sh
#Install IDE plugins before Qodana execution (Applied in CI/CD pipeline)
#plugins:
# - id: <plugin.id> #(plugin id can be found at https://plugins.jetbrains.com)
#Specify Qodana linter for analysis (Applied in CI/CD pipeline)
linter: jetbrains/qodana-jvm:latest

@ -0,0 +1,2 @@
spring.application.name=FreeToGo
server.port=8080

@ -0,0 +1,10 @@
spring:
jpa:
hibernate:
ddl-auto: update
show-sql: true
datasource:
username: root
password: zlh1260788704
url: jdbc:mysql://localhost:3306/freetogo?useSSL=false&useUnicode=true&characterEncoding=utf-8
driverClassName: com.mysql.cj.jdbc.Driver
Loading…
Cancel
Save