Merge pull request 'zhaoyuyan_zhushi' (#9) from branch_zhaoyuyan into develop

develop
m4bagu2fl 7 months ago
commit 67c0ba3094

@ -1,20 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="RemoteRepositoriesConfiguration">
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Central Repository" />
<option name="url" value="https://repo.maven.apache.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="central" />
<option name="name" value="Maven Central repository" />
<option name="url" value="https://repo1.maven.org/maven2" />
</remote-repository>
<remote-repository>
<option name="id" value="jboss.community" />
<option name="name" value="JBoss Community repository" />
<option name="url" value="https://repository.jboss.org/nexus/content/repositories/public/" />
</remote-repository>
</component>
</project>

@ -1,14 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ExternalStorageConfigurationManager" enabled="true" />
<component name="MavenProjectsManager">
<option name="originalFiles">
<list>
<option value="$PROJECT_DIR$/sky/pom.xml" />
</list>
</option>
</component>
<component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
<component name="ProjectRootManager">
<output url="file://$PROJECT_DIR$/out" />
</component>
</project>

@ -2,7 +2,7 @@
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/cangqiong-takeout-master.iml" filepath="$PROJECT_DIR$/.idea/cangqiong-takeout-master.iml" />
<module fileurl="file://$PROJECT_DIR$/.idea/homework.iml" filepath="$PROJECT_DIR$/.idea/homework.iml" />
</modules>
</component>
</project>

@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$" vcs="Git" />
<mapping directory="" vcs="Git" />
</component>
</project>

@ -0,0 +1,109 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="AutoImportSettings">
<option name="autoReloadType" value="SELECTIVE" />
</component>
<component name="ChangeListManager">
<list default="true" id="4e31bd9e-b27b-473d-8d9f-11aae099774a" name="更改" comment="init" />
<option name="SHOW_DIALOG" value="false" />
<option name="HIGHLIGHT_CONFLICTS" value="true" />
<option name="HIGHLIGHT_NON_ACTIVE_CHANGELIST" value="false" />
<option name="LAST_RESOLUTION" value="IGNORE" />
</component>
<component name="Git.Settings">
<option name="RECENT_GIT_ROOT_PATH" value="$PROJECT_DIR$" />
</component>
<component name="MarkdownSettingsMigration">
<option name="stateVersion" value="1" />
</component>
<component name="ProjectId" id="2qMnnEMaBral5NxjSrqulllL9dd" />
<component name="ProjectViewState">
<option name="hideEmptyMiddlePackages" value="true" />
<option name="showLibraryContents" value="true" />
</component>
<component name="PropertiesComponent"><![CDATA[{
"keyToString": {
"RunOnceActivity.OpenProjectViewOnStart": "true",
"RunOnceActivity.ShowReadmeOnStart": "true",
"WebServerToolWindowFactoryState": "false",
"node.js.detected.package.eslint": "true",
"node.js.detected.package.tslint": "true",
"node.js.selected.package.eslint": "(autodetect)",
"node.js.selected.package.tslint": "(autodetect)",
"nodejs_package_manager_path": "npm",
"vue.rearranger.settings.migration": "true"
}
}]]></component>
<component name="RunManager">
<configuration default="true" type="JetRunConfigurationType">
<module name="homework" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
<configuration default="true" type="KotlinStandaloneScriptRunConfigurationType">
<module name="homework" />
<option name="filePath" />
<method v="2">
<option name="Make" enabled="true" />
</method>
</configuration>
</component>
<component name="SpellCheckerSettings" RuntimeDictionaries="0" Folders="0" CustomDictionaries="0" DefaultDictionary="应用程序级" UseSingleDictionary="true" transferred="true" />
<component name="TaskManager">
<task active="true" id="Default" summary="默认任务">
<changelist id="4e31bd9e-b27b-473d-8d9f-11aae099774a" name="更改" comment="" />
<created>1734481479677</created>
<option name="number" value="Default" />
<option name="presentableId" value="Default" />
<updated>1734481479677</updated>
<workItem from="1734481481002" duration="215000" />
<workItem from="1734481709837" duration="161000" />
<workItem from="1734481891271" duration="303000" />
</task>
<task id="LOCAL-00001" summary="init">
<option name="closed" value="true" />
<created>1734481658673</created>
<option name="number" value="00001" />
<option name="presentableId" value="LOCAL-00001" />
<option name="project" value="LOCAL" />
<updated>1734481658673</updated>
</task>
<task id="LOCAL-00002" summary="init">
<option name="closed" value="true" />
<created>1734481925729</created>
<option name="number" value="00002" />
<option name="presentableId" value="LOCAL-00002" />
<option name="project" value="LOCAL" />
<updated>1734481925729</updated>
</task>
<task id="LOCAL-00003" summary="init">
<option name="closed" value="true" />
<created>1734481967448</created>
<option name="number" value="00003" />
<option name="presentableId" value="LOCAL-00003" />
<option name="project" value="LOCAL" />
<updated>1734481967448</updated>
</task>
<option name="localTasksCounter" value="4" />
<servers />
</component>
<component name="TypeScriptGeneratedFilesManager">
<option name="version" value="3" />
</component>
<component name="Vcs.Log.Tabs.Properties">
<option name="TAB_STATES">
<map>
<entry key="MAIN">
<value>
<State />
</value>
</entry>
</map>
</option>
</component>
<component name="VcsManagerConfiguration">
<MESSAGE value="init" />
<option name="LAST_COMMIT_MESSAGE" value="init" />
</component>
</project>

@ -0,0 +1,16 @@
package com.sky.constant;
/**
*
* 便
*/
public class PasswordConstant {
/**
* 使 "123456"
*
* 使
*/
public static final String DEFAULT_PASSWORD = "123456";
}

@ -0,0 +1,28 @@
package com.sky.exception;
/**
*
*
* BaseException便
*/
public class AccountLockedException extends BaseException {
/**
*
* 使
*/
public AccountLockedException() {
}
/**
*
* msg
* 便BaseException
*
* @param msg
*/
public AccountLockedException(String msg) {
super(msg);
}
}

@ -0,0 +1,22 @@
package com.sky.exception;
/**
*
*
*
* BaseException便
*/
public class DeletionNotAllowedException extends BaseException {
/**
*
* msg
*
* BaseException便
*
* @param msg
*/
public DeletionNotAllowedException(String msg) {
super(msg);
}
}

@ -0,0 +1,30 @@
package com.sky.exception;
/**
*
*
* BaseException便
*/
public class PasswordErrorException extends BaseException {
/**
*
* 使
*
*/
public PasswordErrorException() {
}
/**
*
* msg
* BaseException
* 便
*
* @param msg
*/
public PasswordErrorException(String msg) {
super(msg);
}
}

@ -0,0 +1,77 @@
package com.sky.json;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.module.SimpleModule;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalDateTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.deser.LocalTimeDeserializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalDateTimeSerializer;
import com.fasterxml.jackson.datatype.jsr310.ser.LocalTimeSerializer;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import static com.fasterxml.jackson.databind.DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES;
/**
* JacksonObjectMapperObjectMapperJavaJSONJackson
* JSONJava [JSONJava]JavaJSON [JavaJSON]
* JSONJava
*/
public class JacksonObjectMapper extends ObjectMapper {
/**
* LocalDate "yyyy-MM-dd"
* 便JSONJavaLocalDate
*/
public static final String DEFAULT_DATE_FORMAT = "yyyy-MM-dd";
/**
* "yyyy-MM-dd HH:mm:ss" "yyyy-MM-dd HH:mm"LocalDateTime
* 便
*/
public static final String DEFAULT_DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm";
/**
* LocalTime "HH:mm:ss"
* JSONJava
*/
public static final String DEFAULT_TIME_FORMAT = "HH:mm:ss";
/**
* JacksonObjectMapper
*/
public JacksonObjectMapper() {
super();
// 配置在接收到未知属性时不报异常的特性。
// 在JSON数据转换为Java对象时如果JSON中包含了Java对象对应类中不存在的属性默认情况下Jackson会抛出异常
// 通过设置此项为false使得在遇到这种情况时能够进行兼容处理避免因未知属性导致转换失败提高了对不同格式JSON数据的兼容性。
this.configure(FAIL_ON_UNKNOWN_PROPERTIES, false);
// 进一步设置反序列化时属性不存在的兼容处理。
// 确保在反序列化过程中即使遇到JSON中的属性在Java对象对应类里不存在的情况也能平稳进行处理不会因这种差异而中断转换流程
// 这是对反序列化兼容性的再次强化和上面的配置一起保障了在接收不同结构JSON数据时的稳健性。
this.getDeserializationConfig().withoutFeatures(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
SimpleModule simpleModule = new SimpleModule()
// 为LocalDateTime类型添加反序列化器使用指定的日期时间格式由DEFAULT_DATE_TIME_FORMAT定义来解析JSON中的日期时间字符串将其转换为Java的LocalDateTime对象。
.addDeserializer(LocalDateTime.class, new LocalDateTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
// 为LocalDate类型添加反序列化器按照默认的日期格式DEFAULT_DATE_FORMAT把JSON中的日期字符串反序列化为Java的LocalDate对象。
.addDeserializer(LocalDate.class, new LocalDateDeserializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
// 为LocalTime类型添加反序列化器依据默认的时间格式DEFAULT_TIME_FORMAT将JSON中的时间字符串转换为Java的LocalTime对象。
.addDeserializer(LocalTime.class, new LocalTimeDeserializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)))
// 为LocalDateTime类型添加序列化器将Java的LocalDateTime对象按照指定的日期时间格式DEFAULT_DATE_TIME_FORMAT转换为JSON中的日期时间字符串进行输出。
.addSerializer(LocalDateTime.class, new LocalDateTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_TIME_FORMAT)))
// 为LocalDate类型添加序列化器把Java的LocalDate对象依照默认的日期格式DEFAULT_DATE_FORMAT序列化为JSON中的日期字符串。
.addSerializer(LocalDate.class, new LocalDateSerializer(DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT)))
// 为LocalTime类型添加序列化器使用默认的时间格式DEFAULT_TIME_FORMAT将Java的LocalTime对象转换为JSON中的时间字符串方便在JSON数据中呈现。
.addSerializer(LocalTime.class, new LocalTimeSerializer(DateTimeFormatter.ofPattern(DEFAULT_TIME_FORMAT)));
// 注册功能模块通过注册这个自定义的SimpleModule使得添加的针对时间类型的序列化器和反序列化器生效
// 同时也可以在后续根据需要添加更多自定义的序列化器和反序列化器扩展该对象映射器的功能以满足不同业务场景下对JSON与Java对象转换的特殊要求。
this.registerModule(simpleModule);
}
}

@ -0,0 +1,74 @@
package com.sky.properties;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* WeChatProperties便
* 使Springapplication.propertiesapplication.yml便使
*/
@Component
@ConfigurationProperties(prefix = "sky.wechat")
@Data
@NoArgsConstructor
@AllArgsConstructor
public class WeChatProperties {
/**
* appid
* appid
*/
private String appid;
/**
*
* 访access token访
*/
private String secret;
/**
*
* 退
*/
private String mchid;
/**
* APIAPI
* 使
*/
private String mchSerialNo;
/**
*
* 使
*/
private String privateKeyFilePath;
/**
*
* 使使使
*/
private String apiV3Key;
/**
*
*
*/
private String weChatPayCertFilePath;
/**
* URL
* 便
*/
private String notifyUrl;
/**
* 退退退URL
* 退退退
*/
private String refundNotifyUrl;
}

@ -0,0 +1,205 @@
package com.sky.utils;
import com.alibaba.fastjson.JSONObject;
import org.apache.http.NameValuePair;
import org.apache.http.client.config.RequestConfig;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.client.utils.URIBuilder;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import java.io.IOException;
import java.net.URI;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
* HttpClientUtilHttpJava便HTTPGETPOST
* HTTP使便HTTP
*/
public class HttpClientUtil {
/**
* 55 * 1000HTTP
*
*/
static final int TIMEOUT_MSEC = 5 * 1000;
/**
* GETURLGET
*
* @param url url访API
* @param paramMap Map便
* @return JSONHTML
*/
public static String doGet(String url, Map<String, String> paramMap) {
// 创建Httpclient对象通过HttpClients.createDefault()方法获取默认配置的可关闭的HttpClient实例用于后续发起HTTP请求它是整个请求操作的基础客户端对象。
CloseableHttpClient httpClient = HttpClients.createDefault();
String result = "";
CloseableHttpResponse response = null;
try {
// 创建URIBuilder对象用于构建完整的URI统一资源标识符可以方便地在给定基础URL的基础上添加各种参数构造出符合要求的请求地址。
URIBuilder builder = new URIBuilder(url);
if (paramMap!= null) {
// 遍历请求参数Map将每个参数添加到URIBuilder中使其构建的URI包含相应的查询参数按照参数名和参数值的对应关系进行添加形成完整的带参请求地址。
for (String key : paramMap.keySet()) {
builder.addParameter(key, paramMap.get(key));
}
}
// 根据构建好的URIBuilder生成最终的URI对象该对象完整地描述了请求的目标资源位置及相关参数信息。
URI uri = builder.build();
// 创建GET请求对象使用生成的URI来初始化HttpGet实例明确此次请求的方式为GET以及请求的具体目标地址。
HttpGet httpGet = new HttpGet(uri);
// 发送请求通过之前创建的HttpClient实例执行HttpGet请求获取服务器返回的响应对象CloseableHttpResponse此对象包含了响应的状态码、响应头以及响应体等重要信息。
response = httpClient.execute(httpGet);
// 判断响应状态获取响应的状态码若状态码为200表示请求成功此时将响应体内容通过EntityUtils.toString方法指定编码为"UTF-8"读取出来赋值给result变量作为最终的响应结果返回若状态码不是200则返回空字符串。
if (response.getStatusLine().getStatusCode() == 200) {
result = EntityUtils.toString(response.getEntity(), "UTF-8");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
// 关闭响应对象,释放相关资源,避免资源泄漏,无论请求是否成功都需要执行此操作。
response.close();
// 关闭HttpClient对象释放其占用的网络连接等资源确保程序的资源管理良好。
httpClient.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return result;
}
/**
* POSTPOSTURLPOSTIO
*
* @param url URLGETurl
* @param paramMap MapPOST
* @return POST
* @throws IOException I/O
*/
public static String doPost(String url, Map<String, String> paramMap) throws IOException {
// 创建Httpclient对象获取默认配置的可关闭的HttpClient实例用于后续发起HTTP的POST请求操作作为请求的客户端基础对象。
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求对象使用给定的URL初始化HttpPost实例明确此次请求的方式为POST以及请求的目标地址后续将在此基础上添加请求参数等内容。
HttpPost httpPost = new HttpPost(url);
// 创建参数列表若传入的请求参数Map不为空则遍历该Map将每个参数转换为NameValuePair对象并添加到List中NameValuePair用于表示键值对形式的参数方便后续构建表单形式的请求实体。
if (paramMap!= null) {
List<NameValuePair> paramList = new ArrayList<>();
for (Map.Entry<String, String> param : paramMap.entrySet()) {
paramList.add(new BasicNameValuePair(param.getKey(), param.getValue()));
}
// 模拟表单通过将参数列表转换为UrlEncodedFormEntity对象来构建表单形式的请求实体它会对参数进行适当的编码处理例如对中文等特殊字符进行URL编码符合HTTP表单提交的规范然后将该请求实体设置到HttpPost请求对象中使得请求携带相应的参数信息。
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(paramList);
httpPost.setEntity(entity);
}
// 设置请求配置通过调用builderRequestConfig方法构建请求配置对象并设置到HttpPost请求中该配置包含了连接超时时间、请求获取连接的超时时间以及套接字超时时间等设置确保请求在合理的时间范围内进行避免长时间等待。
httpPost.setConfig(builderRequestConfig());
// 执行http请求使用HttpClient实例执行HttpPost请求获取服务器返回的响应对象CloseableHttpResponse其中包含了响应的各种关键信息如状态码、响应头和响应体等。
response = httpClient.execute(httpPost);
// 将响应体内容通过EntityUtils.toString方法指定编码为"UTF-8"读取出来赋值给resultString变量作为最终的响应结果返回若响应体为空或者读取出现异常等情况会按照相应逻辑处理。
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
throw e;
} finally {
try {
// 关闭响应对象,释放相关资源,确保资源正确回收,避免资源泄漏,无论请求是否成功都需要执行此操作。
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
/**
* POSTJSONPOSTURLPOSTJSONIO
*
* @param url URLPOSTurl
* @param paramMap MapJSONJSON便JSONPOST
* @return JSONPOSTJSON
* @throws IOException JSONI/O
*/
public static String doPost4Json(String url, Map<String, String> paramMap) throws IOException {
// 创建Httpclient对象获取默认配置的可关闭的HttpClient实例作为发起HTTP的JSON格式POST请求的客户端基础对象。
CloseableHttpClient httpClient = HttpClients.createDefault();
CloseableHttpResponse response = null;
String resultString = "";
try {
// 创建Http Post请求对象使用给定的URL初始化HttpPost实例明确此次请求的方式为POST以及请求的目标地址后续在此基础上构建JSON格式的请求数据。
HttpPost httpPost = new HttpPost(url);
if (paramMap!= null) {
// 构造json格式数据通过遍历请求参数Map将每个参数添加到JSONObject中形成一个JSON格式的对象其中参数名作为JSON对象的属性名参数值作为对应属性的值方便以JSON格式向服务器传递数据符合现在很多基于RESTful API等交互中常用的JSON数据传输规范。
JSONObject jsonObject = new JSONObject();
for (Map.Entry<String, String> param : paramMap.entrySet()) {
jsonObject.put(param.getKey(), param.getValue());
}
// 创建StringEntity对象将JSON对象转换为字符串形式并指定编码为"utf-8",然后设置其内容编码和数据类型(设置为"application/json"表明这是一个JSON格式的数据最后将该请求实体设置到HttpPost请求对象中使得请求携带JSON格式的参数信息。
StringEntity entity = new StringEntity(jsonObject.toString(), "utf-8");
// 设置请求编码,明确请求实体的编码方式为"utf-8",确保数据在传输过程中的编码一致性,便于服务器正确解析接收到的数据。
entity.setContentEncoding("utf-8");
// 设置数据类型,将请求实体的数据类型设置为"application/json"告知服务器此次请求发送的数据是JSON格式的方便服务器按照相应的解析方式处理接收到的数据。
entity.setContentType("application/json");
httpPost.setEntity(entity);
}
// 设置请求配置调用builderRequestConfig方法构建请求配置对象并设置到HttpPost请求中该配置包含了连接超时时间、请求获取连接的超时时间以及套接字超时时间等设置保证请求能在合理的时间范围内完成避免因网络等问题导致请求长时间无响应。
httpPost.setConfig(builderRequestConfig());
// 执行http请求使用HttpClient实例执行HttpPost请求获取服务器返回的响应对象CloseableHttpResponse该对象包含了响应的状态码、响应头以及响应体等重要信息用于后续获取响应结果。
response = httpClient.execute(httpPost);
// 将响应体内容通过EntityUtils.toString方法指定编码为"UTF-8"读取出来赋值给resultString变量作为最终的响应结果返回若响应体为空或者读取出现异常等情况会按照相应逻辑处理。
resultString = EntityUtils.toString(response.getEntity(), "UTF-8");
} catch (Exception e) {
throw e;
} finally {
try {
// 关闭响应对象,释放相关资源,避免资源泄漏,无论请求是否成功都需要执行此操作。
response.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return resultString;
}
/**
* RequestConfig使TIMEOUT_MSEC5
* HTTPHttpGetHttpPost
*
* @return RequestConfig使
*/
private static RequestConfig builderRequestConfig() {
return RequestConfig.custom()
.setConnectTimeout(TIMEOUT_MSEC)
.setConnectionRequestTimeout(TIMEOUT_MSEC)
.setSocketTimeout(TIMEOUT_MSEC).build();
}
}

@ -0,0 +1,67 @@
package com.sky.dto;
import com.sky.entity.DishFlavor;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.List;
/**
* DishDTOData Transfer Object
* 便
* Serializable
* 使Lombok@DataGetterSettertoStringequalshashCode使
*/
@Data
public class DishDTO implements Serializable {
/**
* id
* 便
*/
private Long id;
/**
*
*
*/
private String name;
/**
* id
* id便
*/
private Long categoryId;
/**
* 使BigDecimal
*
*/
private BigDecimal price;
/**
*
*
*/
private String image;
/**
*
* 便便
*/
private String description;
/**
* 0
* 1便
*/
private Integer status;
/**
* ListDishFlavorDishFlavor
* 便
*/
private List<DishFlavor> flavors = new ArrayList<>();
}

@ -0,0 +1,33 @@
package com.sky.dto;
import lombok.Data;
import java.io.Serializable;
/**
* EmployeePageQueryDTOData Transfer Object
* 便
* Serializable使便使
* 使Lombok@DataGetterSettertoStringequalshashCode便
*/
@Data
public class EmployeePageQueryDTO implements Serializable {
/**
*
* 便
*/
private String name;
/**
*
* 便便
*/
private int page;
/**
*
* 便便
*/
private int pageSize;
}

@ -0,0 +1,135 @@
package com.sky.dto;
import com.sky.entity.OrderDetail;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;
/**
* OrdersDTOData Transfer Object
* 使便使
* Serializable
* 使Lombok@DataGetterSettertoStringequalshashCode使便
*/
@Data
public class OrdersDTO implements Serializable {
/**
* id
* 便
*/
private Long id;
/**
*
* 便
*/
private String number;
/**
*
* 1
* 2
* 3
* 4
* 5退
* 便
*/
private Integer status;
/**
* idid便
*
*/
private Long userId;
/**
*
*
*/
private int tablewareNumber;
/**
*
* 1
* 0便
*/
private Integer tablewareStatus;
/**
* idid
*
*/
private Long addressBookId;
/**
* 使LocalDateTime
*
*/
private LocalDateTime orderTime;
/**
* 使LocalDateTime
*
*/
private LocalDateTime checkoutTime;
/**
*
* 1
* 2使便
*/
private Integer payMethod;
/**
* 使BigDecimal
*
*/
private BigDecimal amount;
/**
*
*
*/
private String remark;
/**
* 便
* 便
*/
private String userName;
/**
*
*
*/
private String phone;
/**
* 便
* id
*/
private String address;
/**
*
*
*/
private String consignee;
/**
* OrderDetailOrderDetail
* 便
*/
private List<OrderDetail> orderDetails;
/**
*
* 1
* 0便
*/
private Integer deliveryStatus;
}

@ -0,0 +1,75 @@
package com.sky.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* OrdersSubmitDTOData Transfer Object
* 便
* 使
* Serializable使便使
* 使Lombok@DataGetterSettertoStringequalshashCode便
*/
@Data
public class OrdersSubmitDTO implements Serializable {
/**
* 簿id簿id
* 便
*/
private Long addressBookId;
/**
* 12
* 便
*/
private int payMethod;
/**
*
* 便
*/
private String remark;
/**
* 使LocalDateTime@JsonFormat"yyyy-MM-dd HH:mm:ss"
* 便
*/
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime estimatedDeliveryTime;
/**
*
* 1
* 0便
*/
private Integer deliveryStatus;
/**
*
*
*/
private Integer tablewareNumber;
/**
*
* 1
* 0便
*/
private Integer tablewareStatus;
/**
*
*
*/
private Integer packAmount;
/**
* 使BigDecimal
*
*/
private BigDecimal amount;
}

@ -0,0 +1,33 @@
package com.sky.dto;
import lombok.Data;
import java.io.Serializable;
/**
* ShoppingCartDTOData Transfer Object
* 便
* Serializable
* 使Lombok@DataGetterSettertoStringequalshashCode使
*/
@Data
public class ShoppingCartDTO implements Serializable {
/**
* idid
* 便
*/
private Long dishId;
/**
* idid
* id便
*/
private Long setmealId;
/**
*
* 使
*/
private String dishFlavor;
}

@ -0,0 +1,93 @@
package com.sky.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* Dish
* 便使
* Serializable使
* 使LombokGetter/Setter
* @DataGetterSettertoStringequalshashCode
* @Builder便使使
* @NoArgsConstructor@AllArgsConstructor
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Dish implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
* 便
*/
private Long id;
/**
*
* 便
*/
private String name;
/**
* id
* id便
*/
private Long categoryId;
/**
* 使BigDecimal
*
*/
private BigDecimal price;
/**
*
* 广
*/
private String image;
/**
*
* 便便
*/
private String description;
/**
* 0
* 1便
*/
private Integer status;
/**
* 使LocalDateTime
*
*/
private LocalDateTime createTime;
/**
* 使LocalDateTime
* 便
*/
private LocalDateTime updateTime;
/**
* id
* 便
*/
private Long createUser;
/**
* id
*
*/
private Long updateUser;
}

@ -0,0 +1,205 @@
package com.sky.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
/**
* Orders
*
*
* Serializable使
* 便
* 使LombokGetter/Setter
* @DataGetterSettertoStringequalshashCode
* @Builder便使使
* @NoArgsConstructor@AllArgsConstructor
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class Orders implements Serializable {
/**
* 便使
*
* 1
* 2
* 3
* 4
* 5
* 6退
* 7退退退退退
*/
public static final Integer PENDING_PAYMENT = 1;
public static final Integer TO_BE_CONFIRMED = 2;
public static final Integer CONFIRMED = 3;
public static final Integer DELIVERY_IN_PROGRESS = 4;
public static final Integer COMPLETED = 5;
public static final Integer CANCELLED = 6;
/**
* 便
*
* 0
* 1
* 2退退退退
*/
public static final Integer UN_PAID = 0;
public static final Integer PAID = 1;
public static final Integer REFUND = 2;
private static final long serialVersionUID = 1L;
/**
* id
* 便
*/
private Long id;
/**
*
* 便
*/
private String number;
/**
* PENDING_PAYMENTTO_BE_CONFIRMED
* 便
*/
private Integer status;
/**
* idid便
*
*/
private Long userId;
/**
* idid
*
*/
private Long addressBookId;
/**
* 使LocalDateTime
*
*/
private LocalDateTime orderTime;
/**
* 使LocalDateTime
*
*/
private LocalDateTime checkoutTime;
/**
*
* 1
* 2使便
*/
private Integer payMethod;
/**
* UN_PAIDPAIDREFUND
* 退便
*/
private Integer payStatus;
/**
* 使BigDecimal
*
*/
private BigDecimal amount;
/**
*
*
*/
private String remark;
/**
* 便
* 便
*/
private String userName;
/**
*
*
*/
private String phone;
/**
* 便
* id
*/
private String address;
/**
*
*
*/
private String consignee;
/**
*
* 退
*/
private String cancelReason;
/**
*
* 便
*/
private String rejectionReason;
/**
* 使LocalDateTime退
* 线
*/
private LocalDateTime cancelTime;
/**
* 使LocalDateTime
* 便
*/
private LocalDateTime estimatedDeliveryTime;
/**
*
* 1
* 0便
*/
private Integer deliveryStatus;
/**
* 使LocalDateTime
*
*/
private LocalDateTime deliveryTime;
/**
*
*
*/
private int packAmount;
/**
*
*
*/
private int tablewareNumber;
/**
*
* 1
* 0便
*/
private Integer tablewareStatus;
}

@ -0,0 +1,72 @@
package com.sky.entity;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* User
* openid
*
* Serializable使
*
* 使LombokGetter/Setter
* @DataGetterSettertoStringequalshashCode
* @Builder便使使
* @NoArgsConstructor@AllArgsConstructor
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class User implements Serializable {
private static final long serialVersionUID = 1L;
/**
* id
* 便
*/
private Long id;
/**
* openid
* openid
*/
private String openid;
/**
* 便使
*/
private String name;
/**
*
*/
private String phone;
/**
* 01
*
*/
private String sex;
/**
*
*/
private String idNumber;
/**
*
*/
private String avatar;
/**
* 使LocalDateTime
*
*/
private LocalDateTime createTime;
}

@ -0,0 +1,92 @@
package com.sky.vo;
import com.sky.entity.DishFlavor;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
/**
* DishVOValue Object
* 便使
* 使
* Serializable使使
* 使LombokGetter/Setter
* @DataGetterSettertoStringequalshashCode
* @Builder便使
* @NoArgsConstructor@AllArgsConstructor
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DishVO implements Serializable {
/**
* id
* 便
*/
private Long id;
/**
*
* 便
*/
private String name;
/**
* id
* id便
*/
private Long categoryId;
/**
* 使BigDecimal
*
*/
private BigDecimal price;
/**
*
* 广
*/
private String image;
/**
*
* 便便
*/
private String description;
/**
* 0
* 1便
*/
private Integer status;
/**
* 使LocalDateTime
* 便
*/
private LocalDateTime updateTime;
/**
* id便
* id使
*/
private String categoryName;
/**
* ListDishFlavorDishFlavor
* 便
*/
private List<DishFlavor> flavors = new ArrayList<>();
//private Integer copies;
}

@ -0,0 +1,59 @@
package com.sky.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* OrderReportVOValue Object
* 便
* Serializable使使
* 使LombokGetter/Setter
* @DataGetterSettertoStringequalshashCode
* @Builder便使
* @NoArgsConstructor@AllArgsConstructor
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class OrderReportVO implements Serializable {
/**
* "2022-10-01,2022-10-02,2022-10-03"
* 便
*/
private String dateList;
/**
* "260,210,215"
* List便
*/
private String orderCountList;
/**
* "20,21,10"
*
*/
private String validOrderCountList;
/**
*
* orderCountList
*/
private Integer totalOrderCount;
/**
*
* validOrderCountList
*/
private Integer validOrderCount;
/**
* Double /
* 100便
*/
private Double orderCompletionRate;
}

@ -0,0 +1,35 @@
package com.sky.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* SalesTop10ReportVOValue Object
* 便
* Serializable使使
* 使LombokGetter/Setter
* @DataGetterSettertoStringequalshashCode
* @Builder便使
* @NoArgsConstructor@AllArgsConstructor
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SalesTop10ReportVO implements Serializable {
/**
* "鱼香肉丝,宫保鸡丁,水煮鱼"
* 便
*/
private String nameList;
/**
* "260,215,200"
* 便
*/
private String numberList;
}

@ -0,0 +1,41 @@
package com.sky.vo;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
/**
* UserLoginVOValue Object
* 便访
* Serializable使使
* 使LombokGetter/Setter
* @DataGetterSettertoStringequalshashCode
* @Builder便使
* @NoArgsConstructor@AllArgsConstructor
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class UserLoginVO implements Serializable {
/**
* id
* 便
*/
private Long id;
/**
* openid
* openid
*/
private String openid;
/**
* token访
* tokentoken
*/
private String token;
}

@ -0,0 +1,132 @@
package com.sky.config;
import com.sky.interceptor.JwtTokenAdminInterceptor;
import com.sky.interceptor.JwtTokenUserInterceptor;
import com.sky.json.JacksonObjectMapper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import java.util.List;
/**
* WebMvcConfigurationweb
* WebMvcConfigurationSupportSpringSpring MVC
* WebWebHTTP
*/
@Configuration
@Slf4j
public class WebMvcConfiguration extends WebMvcConfigurationSupport {
/**
* JwtTokenAdminInterceptor
*
*/
@Autowired
private JwtTokenAdminInterceptor jwtTokenAdminInterceptor;
/**
* JwtTokenUserInterceptor
* 访访
*/
@Autowired
private JwtTokenUserInterceptor jwtTokenUserInterceptor;
/**
* InterceptorRegistry
*
*
* @param registry
*/
protected void addInterceptors(InterceptorRegistry registry) {
log.info("开始注册自定义拦截器...");
// 为管理员拦截器添加拦截路径规则,对以"/admin/"开头的所有路径进行拦截,意味着这些路径下的请求在到达具体的处理方法之前,会先经过这个拦截器进行相关处理。
// 同时排除"/admin/employee/login"路径,即该登录接口不进行拦截,方便管理员进行登录操作,避免登录请求也被拦截导致无法正常登录的情况。
registry.addInterceptor(jwtTokenAdminInterceptor)
.addPathPatterns("/admin/**")
.excludePathPatterns("/admin/employee/login");
// 为用户拦截器添加拦截路径规则,对以"/user/"开头的所有路径进行拦截,使得普通用户相关请求先经过此拦截器验证等操作。
// 排除"/user/user/login"路径,保障普通用户的登录接口能正常访问不受拦截;同时排除"/user/shop/status"路径,该路径对应的功能可能不需要拦截验证等情况,具体根据业务需求而定。
registry.addInterceptor(jwtTokenUserInterceptor)
.addPathPatterns("/user/**")
.excludePathPatterns("/user/user/login")
.excludePathPatterns("/user/shop/status");
}
/**
* knife4jSwagger 2
* Docket
*
* @return Docketknife4j
*/
@Bean
public Docket docket() {
// 创建ApiInfo对象用于设置接口文档的标题、版本以及描述等基本信息这些信息会展示在接口文档页面的头部等位置方便使用者了解接口文档的整体情况。
ApiInfo apiInfo = new ApiInfoBuilder()
.title("接口文档")
.version("2.0")
.description("接口文档")
.build();
// 创建Docket对象指定文档类型为DocumentationType.SWAGGER_2即基于Swagger 2规范来生成文档并设置之前构建好的ApiInfo对象包含了文档的基本描述信息。
// 通过.select()方法开始配置选择哪些接口要生成文档,先指定要扫描的接口所在的基础包路径(这里是"com.sky.controller",意味着该包及其子包下的符合条件的接口会被扫描到),
// 然后通过.paths(PathSelectors.any())表示只要是符合前面包路径下的任何路径对应的接口都会被包含进文档中最后构建出完整的Docket对象。
Docket docket = new Docket(DocumentationType.SWAGGER_2)
.apiInfo(apiInfo)
.select()
.apis(RequestHandlerSelectors.basePackage("com.sky.controller"))
.paths(PathSelectors.any())
.build();
return docket;
}
/**
* addResourceHandlers
* 使Web访HTMLJavaScriptCSS
*
* @param registry
*/
@Override
protected void addResourceHandlers(ResourceHandlerRegistry registry) {
// 将请求路径"/doc.html"映射到类路径下的"/META-INF/resources/"目录通常用于将接口文档相关的HTML页面等资源正确映射以便在访问该路径时能展示对应的接口文档页面。
registry.addResourceHandler("/doc.html").addResourceLocations("classpath:/META-INF/resources/");
// 将以"/webjars/**"开头的请求路径映射到类路径下的"/META-INF/resources/webjars/"目录,"webjars"一般用于管理Web项目中的前端依赖库等静态资源通过这样的映射确保这些资源能被正确访问和使用。
registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/");
super.addResourceHandlers(registry);
}
/**
* spring MVCSpring MVC
* 使JSONJava
*
* @param converters Spring MVC
*/
protected void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
log.info("扩展消息转换器....");
// 创建一个MappingJackson2HttpMessageConverter类型的消息转换器对象它是Spring框架中用于处理JSON数据与Java对象转换的常用消息转换器基于Jackson库实现。
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
// 需要为这个消息转化器设置一个对象转换器这里使用自定义的JacksonObjectMapper它继承自ObjectMapper并且配置了一些特定的序列化和反序列化规则
// 比如对日期时间类型等的处理方式通过设置它可以让消息转换器按照项目的特定需求将Java对象准确地序列化为JSON数据以及将接收到的JSON数据反序列化为Java对象。
converter.setObjectMapper(new JacksonObjectMapper());
// 将自己创建并配置好的消息转换器添加到容器中即原有的消息转换器列表里添加到索引为0的位置确保它在处理消息转换时能优先被使用按照自定义的规则进行数据转换操作。
converters.add(0, converter);
}
}

@ -0,0 +1,186 @@
package com.sky.controller.admin;
import com.github.pagehelper.Page;
import com.sky.dto.CategoryDTO;
import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import com.sky.vo.SetmealVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CachePut;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.*;
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
import static jdk.nashorn.internal.runtime.regexp.joni.Config.log;
/**
* DishControllerSpring MVCHTTP
* DishService使RedisTemplate
* 便便
*/
@RestController()
@RequestMapping("/admin/dish")
@Slf4j
@Api("菜品相关接口")
public class DishController {
/**
* DishService
* DishService
*/
@Autowired
DishService dishService;
/**
* RedisTemplateRedis
* RedisTemplate
*/
@Autowired
RedisTemplate redisTemplate;
/**
* DishPageQueryDTO
* DishServicepageQueryPageResult便
*
* @param dishPageQueryDTO
* @return ResultPageResultResultPageResult
*/
@GetMapping("/page")
@ApiOperation("菜品分页查询")
public Result<PageResult> pageQuery(DishPageQueryDTO dishPageQueryDTO) {
log.info("菜品分页查询:{}", dishPageQueryDTO);
PageResult pageResult = dishService.pageQuery(dishPageQueryDTO);
return Result.success(pageResult);
}
/**
* DishDTOJSON@RequestBody
* DishServicesaveWithFlavercleanCache
* Result
*
* @param dishDTO
* @return ResultResult
*/
@PostMapping
@ApiOperation("新增菜品")
public Result save(@RequestBody DishDTO dishDTO) {
log.info("新增菜品:{}", dishDTO);
dishService.saveWithFlaver(dishDTO);
cleanCache("dish_"+dishDTO.getCategoryId());
return Result.success();
}
/**
* idArrayList<Long>@RequestParam使
* idDishServicedeleteBatchcleanCache使"dish_*"
* Result
*
* @param ids id
* @return ResultResult
*/
@DeleteMapping
@ApiOperation("批量删除菜品")
public Result deleteBatch(@RequestParam ArrayList<Long> ids) {
log.info("批量删除菜品:{}", ids);
dishService.deleteBatch(ids);
cleanCache("dish_*");
return Result.success();
}
/**
* idid@PathVariable
* idDishServicegetByIdDishVOResult便
*
* @param id id
* @return ResultDishVOResultDishVO
*/
@GetMapping("/{id}")
public Result<DishVO> getByDishId(@PathVariable Long id) {
log.info("根据id获取菜品:{}", id);
DishVO dish = dishService.getById(id);
return Result.success(dish);
}
/**
* DishDTOJSON@RequestBody
* DishServiceupdateDishcleanCache使"dish_*"
* Result
*
* @param dishDTO
* @return ResultResult
*/
@PutMapping()
@ApiOperation("修改菜品")
public Result updateDish(@RequestBody DishDTO dishDTO) {
log.info("修改菜品:{}", dishDTO);
dishService.updateDish(dishDTO);
cleanCache("dish_*");
return Result.success();
}
/**
* idid
* idDishServicegetByCategoryIdArrayList<Dish>Result
* 便
*
* @param categoryId id
* @return ResultArrayListResultArrayList
*/
@GetMapping("/list")
@ApiOperation("根据分类id查询菜品")
public Result<ArrayList> getByCategoryId(Long categoryId) {
log.info("根据分类id查询菜品");
ArrayList<Dish> dishes = dishService.getByCategoryId(categoryId);
return Result.success(dishes);
}
/**
* id@PathVariableid
* DishServicestartOrStopcleanCache使"dish_*"
* 使@CachePut
* Result
*
* @param id id
* @param status 10
* @return ResultResult
*/
@CachePut
@PostMapping("/status/{status}")
public Result startOrStop(Long id, @PathVariable Integer status) {
log.info("起售停售菜品id:{},status:{}", id, status);
dishService.startOrStop(id, status);
cleanCache("dish_*");
return Result.success();
}
/**
* RedisRedisTemplatekeys使"dish_*""dish_"
* 使RedisTemplatedelete
*
* @param pattern 使
*/
private void cleanCache(String pattern) {
Set keys = redisTemplate.keys(pattern);
redisTemplate.delete(keys);
}
}

@ -0,0 +1,149 @@
package com.sky.controller.admin;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.dto.SetmealDTO;
import com.sky.dto.SetmealPageQueryDTO;
import com.sky.entity.Category;
import com.sky.result.PageResult;
import com.sky.result.Result;
import com.sky.service.CategoryService;
import com.sky.service.SetmealService;
import com.sky.vo.SetmealVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.annotations.Delete;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.CachePut;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
/**
* SetmealControllerSpring MVCHTTP
* SetmealServiceid
* Spring@CacheEvict便
*/
@RestController
@Api("套餐相关接口")
@Slf4j
@RequestMapping("/admin/setmeal")
public class SetmealController {
/**
* SetmealServiceSetmealService
*
*/
@Autowired
SetmealService setmealService;
/**
* SetmealPageQueryDTO
* SetmealServicepageQuery
* PageResultResult便
*
* @param setmealPageQueryDTO 便
* @return ResultPageResultResultPageResult
*/
@GetMapping("/page")
@ApiOperation("分页查询套餐")
public Result<PageResult> pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
log.info("分页查询套餐:{}", setmealPageQueryDTO);
PageResult result = setmealService.pageQuery(setmealPageQueryDTO);
return Result.success(result);
}
/**
* @PathVariable10
* idSetmealServicestartOrStop
* 使@CacheEvict"setmealCache"allEntriestrue
* Result
*
* @param status 便
* @param id id
* @return ResultResult
*/
@PostMapping("/status/{status}")
@ApiOperation("起售停售套餐")
@CacheEvict(cacheNames = "setmealCache", allEntries = true)
public Result startOrStop(@PathVariable Integer status, Long id) {
log.info("{}套餐id={}", status == 1? "起售" : "停售", id);
setmealService.startOrStop(status, id);
return Result.success();
}
/**
* SetmealDTOJSON@RequestBody
* SetmealServiceupdateSetmeal使@CacheEvict"setmealCache"allEntriestrue
* Result
*
* @param setmealDTO
* @return ResultResult
*/
@PutMapping
@ApiOperation("修改套餐信息")
@CacheEvict(cacheNames = "setmealCache", allEntries = true)
public Result updateSetmeal(@RequestBody SetmealDTO setmealDTO) {
log.info("修改套餐信息:{}", setmealDTO);
setmealService.updateSetmeal(setmealDTO);
return Result.success();
}
/**
* idid@PathVariable
* idSetmealServicegetDishByIdSetmealVO
* Result便
*
* @param id id
* @return ResultSetmealVOResultSetmealVO
*/
@GetMapping("/{id}")
@ApiOperation("根据id查询套餐")
public Result<SetmealVO> getDishById(@PathVariable Long id) {
log.info("根据套餐id查询套餐");
SetmealVO setmealVO = setmealService.getDishById(id);
return Result.success(setmealVO);
}
/**
* ididArrayList<Long>@RequestParam使
* idSetmealServicebatchDeleteById使@CacheEvict"setmealCache"allEntriestrue
* Result
*
* @param ids id
* @return ResultResult
*/
@DeleteMapping
@ApiOperation("根据id批量删除套餐")
@CacheEvict(cacheNames = "setmealCache", allEntries = true)
public Result batchDeleteById(@RequestParam ArrayList<Long> ids) {
log.info("根据id批量删除套餐:{}", ids);
setmealService.batchDeleteById(ids);
return Result.success();
}
/**
* SetmealDTOJSON@RequestBody
* SetmealServiceinsert使@CacheEvictSetmealDTOcategoryId
* Result
*
* @param setmealDTO categoryId
* @return ResultResult
*/
@CacheEvict(cacheNames = "setmealCache", key = "#setmealDTO.categoryId")
@PostMapping
@ApiOperation("新增套餐")
public Result insert(@RequestBody SetmealDTO setmealDTO) {
log.info("新增套餐:{}", setmealDTO);
setmealService.insert(setmealDTO);
return Result.success();
}
}

@ -0,0 +1,149 @@
package com.sky.controller.user;
import com.sky.context.BaseContext;
import com.sky.entity.AddressBook;
import com.sky.result.Result;
import com.sky.service.AddressBookService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
/**
* AddressBookControllerSpring MVCC簿HTTP
* AddressBookServiceid//
* 便簿便使
*/
@RestController
@RequestMapping("/user/addressBook")
@Api(tags = "C端地址簿接口")
@Slf4j
public class AddressBookController {
/**
* AddressBookServiceAddressBookService簿
* 簿
*/
@Autowired
private AddressBookService addressBookService;
/**
* AddressBook
* BaseContext.getCurrentId()BaseContextididAddressBook
* AddressBookServicelistList<AddressBook>Result
* 便
*
* @return ResultList<AddressBook>ResultList<AddressBook>
*/
@GetMapping("/list")
@ApiOperation("查询当前登录用户的所有地址信息")
public Result<List<AddressBook>> list() {
log.info("查询当前登录用户的所有地址信息");
AddressBook addressBook = new AddressBook();
addressBook.setUserId(BaseContext.getCurrentId());
List<AddressBook> list = addressBookService.list(addressBook);
return Result.success(list);
}
/**
* AddressBookJSON@RequestBody
* AddressBookServicesaveResult便
*
* @param addressBook
* @return ResultResult
*/
@PostMapping
@ApiOperation("新增地址")
public Result save(@RequestBody AddressBook addressBook) {
log.info("新增地址:{}", addressBook);
addressBookService.save(addressBook);
return Result.success();
}
/**
* idid@PathVariable
* idAddressBookServicegetByIdAddressBook
* Result便使
*
* @param id id
* @return ResultAddressBookResultAddressBook
*/
@GetMapping("/{id}")
@ApiOperation("根据id查询地址")
public Result<AddressBook> getById(@PathVariable Long id) {
log.info("根据id查询地址,id:{}", id);
AddressBook addressBook = addressBookService.getById(id);
return Result.success(addressBook);
}
/**
* idAddressBookJSON@RequestBody
* AddressBookServiceupdateResult便
*
* @param addressBook
* @return ResultResult
*/
@PutMapping
@ApiOperation("根据id修改地址")
public Result update(@RequestBody AddressBook addressBook) {
log.info("根据id修改地址:{}", addressBook);
addressBookService.update(addressBook);
return Result.success();
}
/**
* AddressBookJSON@RequestBody
* AddressBookServicesetDefaultAddressBookService
* Result便便使
*
* @param addressBook id
* @return ResultResult
*/
@PutMapping("/default")
@ApiOperation("设置默认地址")
public Result setDefault(@RequestBody AddressBook addressBook) {
log.info("设置默认地址:{}", addressBook);
addressBookService.setDefault(addressBook);
return Result.success();
}
/**
* idid
* idAddressBookServicedeleteByIdResult便
*
* @param id id
* @return ResultidResult
*/
@DeleteMapping
@ApiOperation("根据id删除地址")
public Result deleteById(Long id) {
log.info("根据id删除地址,id:{}", id);
addressBookService.deleteById(id);
return Result.success();
}
/**
* AddressBookisDefault1BaseContext.getCurrentId()idAddressBook
* AddressBookServicelistResult
* Result便使
*/
@GetMapping("default")
@ApiOperation("查询默认地址")
public Result<AddressBook> getDefault() {
log.info("查询默认地址");
// SQL:select * from address_book where user_id =? and is_default = 1
AddressBook addressBook = new AddressBook();
addressBook.setIsDefault(1);
addressBook.setUserId(BaseContext.getCurrentId());
List<AddressBook> list = addressBookService.list(addressBook);
if (list!= null && list.size() == 1) {
return Result.success(list.get(0));
}
return Result.error("没有查询到默认地址");
}
}

@ -0,0 +1,81 @@
package com.sky.controller.user;
import com.sky.constant.StatusConstant;
import com.sky.entity.Setmeal;
import com.sky.result.Result;
import com.sky.service.SetmealService;
import com.sky.vo.DishItemVO;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
* SetmealControllerSpring MVCCHTTP
* SetmealServiceidid
* Spring@Cacheable便便
*/
@RestController("userSetmealController")
@RequestMapping("/user/setmeal")
@Api(tags = "C端-套餐浏览接口")
@Slf4j
public class SetmealController {
/**
* SetmealServiceSetmealService
*
*/
@Autowired
private SetmealService setmealService;
/**
* idid
* SetmealidStatusConstant.ENABLE
* SetmealSetmealServicelistList<Setmeal>Result
* 便
* 使@Cacheable"setmealCache"idid
*
* @param categoryId id便
* @return ResultList<Setmeal>ResultList<Setmeal>
*/
@GetMapping("/list")
@ApiOperation("根据分类id查询起售套餐")
@Cacheable(cacheNames = "setmealCache", key = "#categoryId")
public Result<List<Setmeal>> list(Long categoryId) {
log.info("根据分类id查询起售套餐:{}", categoryId);
Setmeal setmeal = new Setmeal();
setmeal.setCategoryId(categoryId);
setmeal.setStatus(StatusConstant.ENABLE);
List<Setmeal> list = setmealService.list(setmeal);
return Result.success(list);
}
/**
* idid@PathVariable"id"
* idSetmealServicegetDishItemByIdList<DishItemVO>
* Result便使
*
* @param id id
* @return ResultList<DishItemVO>ResultList<DishItemVO>
*/
@GetMapping("/dish/{id}")
@ApiOperation("根据套餐id查询包含的菜品列表")
public Result<List<DishItemVO>> dishList(@PathVariable("id") Long id) {
log.info("根据套餐id查询包含的菜品列表{}", id);
List<DishItemVO> list = setmealService.getDishItemById(id);
return Result.success(list);
}
}

@ -0,0 +1,61 @@
package com.sky.handler;
import com.sky.constant.MessageConstant;
import com.sky.exception.BaseException;
import com.sky.result.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import java.sql.SQLIntegrityConstraintViolationException;
/**
* GlobalExceptionHandler
* 使Spring@RestControllerAdvice使@RestController
*
*/
@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
/**
* 使@ExceptionHandlerBaseException
* BaseException
* ResultResult.errorResult
* 使
*
* @param ex BaseException
* @return Result便
*/
@ExceptionHandler(BaseException.class)
public Result exceptionHandler(BaseException ex) {
log.error("异常信息:{}", ex.getMessage());
return Result.error(ex.getMessage());
}
/**
* SQL使@ExceptionHandlerSQLIntegrityConstraintViolationException
* SQLIntegrityConstraintViolationException
*
* "Duplicate entry"
* MessageConstant.ALREADY_EXISTS
* MessageConstant.UNKNOWN_ERRORResultMessageConstant.ALREADY_EXISTS
*
*
* @param exception SQLIntegrityConstraintViolationException
* @return ResultSQL便
*/
@ExceptionHandler
public Result SQLExceptionHandler(SQLIntegrityConstraintViolationException exception) {
System.out.println(exception);
String msg = exception.getMessage();
String[] split = msg.split(" ");
if (msg.contains("Duplicate entry")) {
String name = split[2];
log.error("异常信息:{}", name + MessageConstant.ALREADY_EXISTS);
} else {
log.error("异常信息:{}", MessageConstant.UNKNOWN_ERROR);
}
return Result.error(MessageConstant.ALREADY_EXISTS);
}
}

@ -0,0 +1,78 @@
package com.sky.mapper;
import com.github.pagehelper.Page;
import com.sky.annotation.AutoFill;
import com.sky.dto.CategoryDTO;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.entity.Category;
import com.sky.enumeration.OperationType;
import com.sky.result.PageResult;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Insert;
import org.apache.ibatis.annotations.Mapper;
import org.aspectj.weaver.ast.Or;
import java.util.List;
/**
* CategoryMapperMyBatisCategory
* MyBatis
* MyBatisSQL便
*/
@Mapper
public interface CategoryMapper {
/**
* CategoryPageQueryDTO
* MyBatisSQLMyBatisSQLPage<Category>
* Page<Category>便
*
* @param categoryPageQueryDTO 便
* @return Page<Category>Category
*/
Page<Category> pageQuery(CategoryPageQueryDTO categoryPageQueryDTO);
/**
* CategoryDTOCategoryDTO
* MyBatisSQLList<Category>
* List<Category>便
*
* @param categoryDTO 便
* @return List<Category>Category
*/
List<Category> query(CategoryDTO categoryDTO);
/**
* idLongMyBatis@DeleteSQL
* "delete from category where id=#{id}"SQLcategoryid
*
*
* @param id idcategory
*/
@Delete("delete from category where id=#{id}")
void delete(Long id);
/**
* Category
* 使@AutoFillOperationType.UPDATE
* MyBatisSQL
*
*
* @param category
*/
@AutoFill(OperationType.UPDATE)
void updateCategory(Category category);
/**
* Category
* 使@AutoFillOperationType.INSERT@Insert
* @InsertSQLSQLCategorycategory
*
*
* @param category SQLcategory
*/
@AutoFill(OperationType.INSERT)
@Insert("insert into category(type,name,sort,status,create_time,create_user,update_time,update_user)" +
"values (#{type},#{name},#{sort},#{status},#{createTime},#{createUser},#{updateTime},#{updateUser})")
void save(Category category);
}

@ -0,0 +1,125 @@
package com.sky.mapper;
import com.github.pagehelper.Page;
import com.sky.dto.OrdersPageQueryDTO;
import com.sky.entity.OrderDetail;
import com.sky.entity.Orders;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.time.LocalDateTime;
import java.util.List;
import java.util.Map;
/**
* OrderMapperMyBatisOrders
* MyBatisSQL
*
*/
@Mapper
public interface OrderMapper {
/**
* 使@SelectSQLordersstatus
* Integerstatus"select count(id) from orders where status = #{status}"SQL
* Integer便
*
* @param status 01
* @return Integer便
*/
@Select("select count(id) from orders where status = #{status}")
Integer countStatus(Integer status) ;
/**
* OrdersPageQueryDTO
* MyBatisSQLOrdersPageQueryDTOSQLPage<Orders>
* Page<Orders>便便
*
* @param ordersPageQueryDTO 便
* @return Page<Orders>Orders
*/
Page<Orders> pageQuery(OrdersPageQueryDTO ordersPageQueryDTO);
/**
* Orders
* MyBatisSQLOrders@InsertSQLMyBatis
* Ordersorders
*
* @param orders MyBatisorders
*/
void insert(Orders orders);
/**
* 使@SelectSQLordersorderNumber
* StringorderNumber"select * from orders where number = #{orderNumber}"SQL
* Orders
*
* @param orderNumber orders
* @return Orders
*/
@Select("select * from orders where number = #{orderNumber}")
Orders getByNumber(String orderNumber);
/**
* Orders
* MyBatisSQL
*
*
* @param orders
*/
void update(Orders orders);
/**
* IntegerpendingPayment
* LocalDateTimetimeMyBatis@Param使SQL
* SQLList<Orders>
* 便
*
* @param pendingPayment
* @param time
* @return List<Orders>Orders便
*/
List<Orders> getByStatusAndOrderTimeLT(@Param("pendingPayment") Integer pendingPayment, @Param("time") LocalDateTime time);
/**
* List<Orders>ordersListOrdersid
* IntegerstatusMyBatis@Param使SQL
* SQL
*
* @param ordersList
* @param status ordersList使10
*/
void updateBatchStatus(@Param("ordersList") List<Orders> ordersList, @Param("status") Integer status);
/**
* orderId使@SelectSQLordersidid
* Longid"select * from orders where id=#{id}"SQL
* Ordersidid
*
* @param id orders
* @return Ordersid
*/
@Select("select * from orders where id=#{id}")
Orders getById(Long id);
/**
* MapmapMap
* MyBatis@Param"map"使SQLSQLMapSQL
* Integer便
*
* @param map Map
* @return Integer便
*/
Integer countByMap(@Param("map") Map map);
/**
* MapmapMap
* MyBatis@Param"map"使SQLSQLMapSQL
* Double便
*
* @param map Map
* @return Double便
*/
Double sumByMap(@Param("map") Map map);
}

@ -0,0 +1,59 @@
package com.sky.mapper;
import com.sky.entity.User;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import java.util.Map;
/**
* UserMapperMyBatisUser
* openididMyBatisSQL
*
*/
@Mapper
public interface UserMapper {
/**
* openid使@SelectSQLuseropenidopenid
* Stringopenidopenidopenid使
* "select * from user where openid=#{openid}"SQLUseropenid
* openid
*
* @param openid user
* @return Useropenid
*/
@Select("select * from user where openid=#{openid}")
User getByOpenId(String openid);
/**
* User
* MyBatisSQL@InsertSQLMyBatis
* Useruser
*
* @param user MyBatisuser
*/
void insertUser(User user);
/**
* id使@SelectSQLuseriduserId
* LonguserId"select * from user where id=#{userId}"SQL
* Useridid
*
* @param userId user
* @return Userid
*/
@Select("select * from user where id=#{userId}")
User getById(Long userId);
/**
* MapmapMap
* MyBatis@Param"map"使SQLSQLMapSQL
* Integer便
*
* @param map Map
* @return Integer便
*/
Integer countByMap(@Param("map") Map map);
}

@ -0,0 +1,63 @@
package com.sky.service;
import com.sky.entity.AddressBook;
import java.util.List;
/**
* AddressBookService簿AddressBook
* 簿使
* 簿便
*/
public interface AddressBookService {
/**
* AddressBookid簿
* List<AddressBook>AddressBook
* 便使
*
* @param addressBook 簿id
* @return List<AddressBook>簿AddressBook簿
*/
List<AddressBook> list(AddressBook addressBook);
/**
* AddressBook
* 簿
*
* @param addressBook 簿
*/
void save(AddressBook addressBook);
/**
* idLongidAddressBook
* 便使
*
* @param id id簿
* @return AddressBookid
*/
AddressBook getById(Long id);
/**
* AddressBook
* id
*
* @param addressBook
*/
void update(AddressBook addressBook);
/**
* AddressBookid
* 簿便便使
*
* @param addressBook id
*/
void setDefault(AddressBook addressBook);
/**
* idLongid簿id
*
*
* @param id id簿
*/
void deleteById(Long id);
}

@ -0,0 +1,70 @@
package com.sky.service;
import com.sky.dto.EmployeeDTO;
import com.sky.dto.EmployeeLoginDTO;
import com.sky.dto.EmployeePageQueryDTO;
import com.sky.entity.Employee;
import com.sky.result.PageResult;
/**
* EmployeeServiceEmployee
* 使
* 便id
*/
public interface EmployeeService {
/**
* EmployeeLoginDTO
* Employee
*
*
* @param employeeLoginDTO
* @return Employeenull
*/
Employee login(EmployeeLoginDTO employeeLoginDTO);
/**
* EmployeeDTO
*
*
* @param employeeDTO
*/
void save(EmployeeDTO employeeDTO);
/**
* EmployeePageQueryDTO
* PageResultPageResult
* 便
*
* @param employeePageQueryDTO 便
* @return PageResulttotalrecords便
*/
PageResult pageQuery(EmployeePageQueryDTO employeePageQueryDTO);
/**
* Integerstatus10
* Longididid
* 使使
*
* @param status
* @param id id
*/
void startOrStop(Integer status, Long id);
/**
* idLongid
* idEmployee
* 便使
*
* @param id id
*/
Employee getById(Long id);
/**
* EmployeeDTO
* id
*
* @param employeeDTO
*/
void update(EmployeeDTO employeeDTO);
}

@ -0,0 +1,43 @@
package com.sky.service;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.ShoppingCart;
import java.util.List;
/**
* ShoppingCartServiceShoppingCart
* 使
* 便
*/
public interface ShoppingCartService {
/**
* ShoppingCartDTOidid
*
*
* @param shoppingCartDTO idid
*/
void add(ShoppingCartDTO shoppingCartDTO);
/**
* id
* List<ShoppingCart>ShoppingCartid便使
*
* @return List<ShoppingCart>ShoppingCart
*/
List<ShoppingCart> list();
/**
* ShoppingCartDTOidid
*
*
* @param shoppingCartDTO idid
*/
void delete(ShoppingCartDTO shoppingCartDTO);
/**
* id
* 便
*/
void clean();
}

@ -0,0 +1,221 @@
package com.sky.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.DishDTO;
import com.sky.dto.DishPageQueryDTO;
import com.sky.entity.Dish;
import com.sky.entity.DishFlavor;
import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.DishMapper;
import com.sky.result.PageResult;
import com.sky.service.DishService;
import com.sky.vo.DishVO;
import com.sky.vo.SetmealVO;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
/**
* DishServiceImplDishServiceDish
* DishMapper访DishMapper
*
*/
@Service
public class DishServiceImpl implements DishService {
/**
* DishMapperDishMapper
*
*/
@Autowired
DishMapper dishMapper;
/**
* DishServicepageQueryDishPageQueryDTO
* DishPageQueryDTOpagepageSizePageHelperMyBatis便
* DishMapperpageQueryPage<Dish>
* Page<Dish>totaldishesPageResultPageResult
* 便
*
* @param dishPageQueryDTO
* @return PageResulttotalrecords便
*/
@Override
public PageResult pageQuery(DishPageQueryDTO dishPageQueryDTO) {
int page = dishPageQueryDTO.getPage();
int pageSize = dishPageQueryDTO.getPageSize();
// 开始分页查询通过PageHelper设置当前页码和每页显示数量后续执行的数据库查询会自动按照此分页设置进行操作
PageHelper.startPage(page, pageSize);
Page<Dish> pageResult = dishMapper.pageQuery(dishPageQueryDTO);
// 取出查询总数即满足查询条件的所有记录数量通过Page对象的getTotal方法获取
long total = pageResult.getTotal();
// 取出查询结果即当前页的菜品数据列表通过Page对象的getResult方法获取
List<Dish> dishes = pageResult.getResult();
// 构建查询结果对象,用于将分页相关的数据按照统一的格式返回给上层调用者
PageResult pageResult1 = new PageResult();
pageResult1.setTotal(total);
pageResult1.setRecords(dishes);
return pageResult1;
}
/**
* 使@Transactional
*
* DishDTODishBeanUtils.copyPropertiesStatusConstant.ENABLE
* DishMappersaveidDishDTOflavors
* idDishMapperinsertBatchFlavors
*
*
* @param dishDTO
*/
@Transactional
public void saveWithFlaver(DishDTO dishDTO) {
// 向菜品表添加一条数据创建一个新的Dish实体对象用于接收从DishDTO拷贝过来的属性值
Dish dish = new Dish();
BeanUtils.copyProperties(dishDTO, dish);
dish.setStatus(StatusConstant.ENABLE);
dishMapper.save(dish);
// 向口味表添加n条数据获取刚插入菜品的id后续用于关联口味与菜品
Long dishId = dish.getId();
List<DishFlavor> flavors = dishDTO.getFlavors();
if (flavors!= null && flavors.size() > 0) {
flavors.forEach(dishFlavor -> {
dishFlavor.setDishId(dishId);
});
dishMapper.insertBatchFlavors(flavors);
}
}
/**
*
* DishMappergetByIdBatchidids
* StatusConstant.ENABLEDeletionNotAllowedExceptionMessageConstant.DISH_ON_SALE
* DishMappercountMealDishid0DeletionNotAllowedExceptionMessageConstant.DISH_BE_RELATED_BY_SETMEAL
* DishMapperdeleteBatchid使
*
* @param ids id
*/
public void deleteBatch(ArrayList<Long> ids) {
// 判断菜品是否在起售,起售期间不能被删除,通过查询数据库获取对应菜品列表,遍历检查状态
ArrayList<Dish> dishs = dishMapper.getByIdBatch(ids);
for (Dish dish : dishs) {
if (dish.getStatus() == StatusConstant.ENABLE) {
throw new DeletionNotAllowedException(MessageConstant.DISH_ON_SALE);
}
}
// 判断菜品是否被套餐绑定,绑定期间不能被删除,通过查询统计与菜品关联的套餐菜品数量来判断
Integer count = dishMapper.countMealDish(ids);
if (count > 0) {
throw new DeletionNotAllowedException(MessageConstant.DISH_BE_RELATED_BY_SETMEAL);
}
dishMapper.deleteBatch(ids);
}
/**
* 使@Transactional
* DishDTODishBeanUtils.copyPropertiesDishDTOflavorsidid
* DishMapperupdateDishDishMapperdeleteBatchFlavorsinsertBatchFlavors
*
*
* @param dishDTO
*/
@Transactional
public void updateDish(DishDTO dishDTO) {
Dish dish = new Dish();
BeanUtils.copyProperties(dishDTO, dish);
List<DishFlavor> flavors = dishDTO.getFlavors();
flavors.forEach(dishFlavor -> {
dishFlavor.setDishId(dish.getId());
});
// 更新菜品,调用数据访问层方法更新菜品基本信息
dishMapper.updateDish(dish);
// 更新菜品对应的口味,先删除原有的口味数据,再插入更新后的口味数据
dishMapper.deleteBatchFlavors(flavors);
dishMapper.insertBatchFlavors(flavors);
}
/**
* idid
* idArrayList<Long>便DishMappergetByIdBatchidid
* DishMappergetFlavorByIdidDishVO
* BeanUtils.copyPropertiesDishVODishVODishVO
* 便
*
* @param id id
* @return DishVO便
*/
public DishVO getById(Long id) {
ArrayList<Long> ids = new ArrayList<>();
ids.add(id);
// 根据id获取菜品调用数据访问层方法获取对应菜品对象
Dish dish = dishMapper.getByIdBatch(ids).get(0);
// 根据菜品id获取该菜品的口味调用数据访问层方法获取菜品对应的口味列表
ArrayList<DishFlavor> dishFlavors = dishMapper.getFlavorById(id);
DishVO dishVO = new DishVO();
BeanUtils.copyProperties(dish, dishVO);
dishVO.setFlavors(dishFlavors);
return dishVO;
}
/**
* idDishMappergetByCategoryIdidnull
* ArrayList<Dish>便
*
*
* @param categoryId id
* @return ArrayList<Dish>idDish
*/
public ArrayList<Dish> getByCategoryId(Long categoryId) {
return dishMapper.getByCategoryId(categoryId, null);
}
/**
* Dishididstatus
* DishMapperupdateDishidDish
* 便
*
* @param id id
* @param status 10
*/
public void startOrStop(Long id, Integer status) {
Dish dish = new Dish();
dish.setStatus(status);
dish.setId(id);
dishMapper.updateDish(dish);
}
/**
* Dishiddish.getCategoryId()dish.getStatus()DishMappergetByCategoryIdArrayList<Dish>
* DishVOBeanUtils.copyPropertiesDishVOidDishMappergetFlavorByIdDishVO
* DishVOArrayList<DishVO>DishVO
* 便
*
* @param dish id

@ -0,0 +1,205 @@
package com.sky.service.impl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.sky.constant.MessageConstant;
import com.sky.constant.StatusConstant;
import com.sky.dto.CategoryPageQueryDTO;
import com.sky.dto.SetmealDTO;
import com.sky.dto.SetmealPageQueryDTO;
import com.sky.entity.Setmeal;
import com.sky.entity.SetmealDish;
import com.sky.exception.DeletionNotAllowedException;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.result.PageResult;
import com.sky.service.SetmealService;
import com.sky.vo.DishItemVO;
import com.sky.vo.SetmealVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;
/**
* SetmealServiceImplSetmealServiceSetmeal
* SetmealMapperDishMapper
* Mapperid
*/
@Service
@Slf4j
public class SetmealServiceImpl implements SetmealService {
/**
* SetmealMapperSetmealMapper
* id
*/
@Autowired
private SetmealMapper setmealMapper;
/**
* DishMapper
* DishMapper
*/
@Autowired
private DishMapper dishMapper;
/**
* SetmealServicelistSetmealid
* SetmealMapperlistSetmealList<Setmeal>
* 便使
*
* @param setmeal id便
* @return List<Setmeal>Setmeal
*/
public List<Setmeal> list(Setmeal setmeal) {
List<Setmeal> list = setmealMapper.list(setmeal);
return list;
}
/**
* idSetmealServicegetDishItemByIdid
* SetmealMappergetDishItemBySetmealIdidList<DishItemVO>DishItemVO
* 便使
*
* @param id id
* @return List<DishItemVO>DishItemVO
*/
public List<DishItemVO> getDishItemById(Long id) {
return setmealMapper.getDishItemBySetmealId(id);
}
/**
* SetmealPageQueryDTO
* PageHelperMyBatis便PageHelper.startPageSetmealPageQueryDTOpagepageSize
* SetmealMapperpageQueryPage<Setmeal>
* PageResultPage<Setmeal>getTotalgetResultPageResultPageResult
* 便
*
* @param setmealPageQueryDTO
* @return PageResulttotalrecords便
*/
public PageResult pageQuery(SetmealPageQueryDTO setmealPageQueryDTO) {
// 开始分页查询通过PageHelper设置当前页码和每页显示数量后续执行的数据库查询会自动按照此分页设置进行操作
PageHelper.startPage(setmealPageQueryDTO.getPage(), setmealPageQueryDTO.getPageSize());
Page<Setmeal> list = setmealMapper.pageQuery(setmealPageQueryDTO);
// 处理查询结果构建PageResult对象来封装分页相关数据以便统一返回给上层调用者
PageResult pageResult = new PageResult();
pageResult.setTotal(list.getTotal());
pageResult.setRecords(list.getResult());
return pageResult;
}
/**
* Setmealididstatus
* SetmealMapperupdateSetmealidSetmeal
* 便
*
* @param status 10
* @param id id
*/
public void startOrStop(Integer status, Long id) {
Setmeal setmeal = new Setmeal();
setmeal.setStatus(status);
setmeal.setId(id);
// 更改套餐的起售或停售状态,调用数据访问层方法更新套餐在数据库中的状态记录
setmealMapper.updateSetmeal(setmeal);
}
/**
* 使@Transactional
*
* SetmealDTOSetmealBeanUtils.copyPropertiesSetmealMapperupdateSetmeal
* SetmealMapperdeleteSetmealDishidSetmealDTO
* SetmealDTOSetmealDishidSetmealMapperinsertBatchSetmealDish
*
*
* @param setmealDTO
*/
@Transactional
public void updateSetmeal(SetmealDTO setmealDTO) {
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO, setmeal);
// 修改套餐信息,调用数据访问层方法更新套餐基本信息
setmealMapper.updateSetmeal(setmeal);
// 修改套餐的菜品信息,先删除原有的套餐菜品关联记录
// 通过套餐id删除绑定在套餐上的菜品
setmealMapper.deleteSetmealDish(setmealDTO.getId());
// 批量插入套餐绑定的菜品获取修改后的套餐菜品关联信息列表设置套餐id后插入到关联表中
List<SetmealDish> dishes = setmealDTO.getSetmealDishes();
dishes.forEach(setmealDish -> setmealDish.setSetmealId(setmealDTO.getId()));
setmealMapper.insertBatchSetmealDish(dishes);
}
/**
* idid
* SetmealMappergetBySetmealIdidSetmealMappergetSetmealDishByIdidList<SetmealDish>SetmealDishid
* SetmealVOBeanUtils.copyPropertiesSetmealVOSetmealVO
* SetmealVO便
*
* @param id id
* @return SetmealVOid便
*/
public SetmealVO getDishById(Long id) {
// 获取套餐信息,调用数据访问层方法获取对应套餐对象
Setmeal setmeal = setmealMapper.getBySetmealId(id);
// 获取套餐绑定的菜品,调用数据访问层方法获取套餐对应的菜品关联列表
List<SetmealDish> setmealDishes = setmealMapper.getSetmealDishById(id);
// 构建返回对象创建SetmealVO对象并将套餐及菜品关联信息复制和设置进去
SetmealVO setmealVO = new SetmealVO();
BeanUtils.copyProperties(setmeal, setmealVO);
setmealVO.setSetmealDishes(setmealDishes);
return setmealVO;
}
/**
* idid
* ididsidSetmealMappergetBySetmealId
* StatusConstant.ENABLEDeletionNotAllowedExceptionMessageConstant.SETMEAL_ON_SALE
* idididArrayList<Long>便SetmealMapperbatchDeleteSetmealSetmealMapperdeleteSetmealDish
*
*
* @param ids id
*/
public void batchDeleteById(ArrayList<Long> ids) {
ids.forEach(id -> {
Setmeal setmeal = setmealMapper.getBySetmealId(id);
if (StatusConstant.ENABLE == setmeal.getStatus()) {
// 起售中的套餐不能删除,若处于起售状态则抛出异常提示
throw new DeletionNotAllowedException(MessageConstant.SETMEAL_ON_SALE);
}
});
ids.forEach(setmealId -> {
// 删除套餐表中的数据先构建包含套餐id的集合再调用对应的删除方法
ArrayList<Long> setmealIds = new ArrayList<>();
setmealIds.add(setmealId);
setmealMapper.batchDeleteSetmeal(setmealIds);
// 删除套餐菜品关系表中的数据,直接调用对应的删除方法
setmealMapper.deleteSetmealDish(setmealId);
});
}
/**
*
* SetmealDTOSetmealBeanUtils.copyPropertiesSetmealMapperinsertBatchSetmealDishSetmealDTOList<SetmealDish>
* SetmealMapperinsertSetmeal
*
* @param setmealDTO
*/
public void insert(SetmealDTO setmealDTO) {
Setmeal setmeal = new Setmeal();
BeanUtils.copyProperties(setmealDTO, setmeal);
// 新增套餐绑定的菜品,调用数据访问层方法批量插入套餐

@ -0,0 +1,93 @@
package com.sky.webSocket;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import javax.websocket.OnClose;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import javax.websocket.server.PathParam;
import javax.websocket.server.ServerEndpoint;
import java.io.IOException;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
/**
* WebSocketServerJava WebSocketWebSocketWebSocket
* 使WebSocket@ServerEndpoint@OnOpen@OnMessage@OnCloseWebSocket
* 线
*/
@Component
@ServerEndpoint("/ws/{sid}")
@Slf4j
public class WebSocketServer {
/**
* 使MapWebSocket{sid}ididWebSocketSession
* Map便便
*/
private static Map<String, Session> sessionMap = new HashMap<>();
/**
* 使@OnOpenWebSocket
* @PathParam("sid")sidWebSocketSession
* sid便sidSessionsessionMap便
*
* @param sid
* @param session WebSocket
*/
@OnOpen
public void open(@PathParam("sid") String sid, Session session) {
log.info("建立连接:{}", sid);
sessionMap.put(sid, session);
}
/**
* 使@OnMessageWebSocket
* message@PathParam("sid")sid
* sid便
*
* @param message WebSocket
* @param sid 便
*/
@OnMessage
public void onMessage(String message, @PathParam("sid") String sid) {
log.info("收到客户端:{}的信息:{}", sid, message);
}
/**
* 使@OnCloseWebSocket
* @PathParam("sid")sid
* sid便sessionMapsessionMap
*
* @param sid 便Map
*/
@OnClose
public void close(@PathParam("sid") String sid) {
log.info("断开连接:{}", sid);
sessionMap.remove(sid);
}
/**
* WebSocket
* sessionMapsessionMap.values()getBasicRemote().sendText(message)message
* IOExceptionRuntimeException
* 广线
*
* @param message
*/
public void sendToAllClient(String message) {
Collection<Session> sessionCollection = sessionMap.values();
for (Session session : sessionCollection) {
try {
session.getBasicRemote().sendText(message);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
}
Loading…
Cancel
Save