Compare commits
40 Commits
mini-1.0.4
...
production
Author | SHA1 | Date | |
---|---|---|---|
9e0663bbc0 | |||
0e9115bb06 | |||
bc66e20b07 | |||
f4e833b8db | |||
be6919124d | |||
a94f36f9d3 | |||
2d145793b4 | |||
d96fd3d536 | |||
5727e2e325 | |||
0dc02ae454 | |||
83047d7877 | |||
d52c22ff35 | |||
8ed15d290a | |||
85472f43e8 | |||
8ff95cdc07 | |||
c2a914d7f9 | |||
2038d76b1e | |||
0bcef8d497 | |||
9a0fe1715e | |||
bc5de2f4d6 | |||
2887104bb3 | |||
482d91eba3 | |||
08584c8042 | |||
eae5ac5310 | |||
95a485cfc4 | |||
64b4fe31a3 | |||
65563f5b75 | |||
b68fde365f | |||
d3fb7827f1 | |||
9a8f3d050c | |||
2d82571303 | |||
2f469aec14 | |||
83f424b80f | |||
152ff7d8e5 | |||
f5bc5b9eef | |||
f09dd671a3 | |||
d4edba9212 | |||
fc18ea402b | |||
35fdba483b | |||
68217b81dc |
60
20230425-epp.md
Normal file
@@ -0,0 +1,60 @@
|
||||
# 基于微服务的社区疫情防控系统
|
||||
|
||||
Epidemic prevention platform
|
||||
|
||||
> 项目首页:
|
||||
>
|
||||
> https://epp.only4.work/
|
||||
>
|
||||
> 代码仓库地址:
|
||||
>
|
||||
> https://git.only4.work/coder-xiaomo/epp
|
||||
|
||||
本项目采用 monorepo 单仓库模式进行维护,项目完整代码均在此仓库中。
|
||||
|
||||
|
||||
|
||||
## 管理员后台
|
||||
|
||||
> 管理员后台地址:
|
||||
>
|
||||
> https://epp.only4.work/manage/index.html
|
||||
|
||||
社区管理员 测试账号:admin<span style="user-select: none;"> </span>admin
|
||||
|
||||
系统管理员 测试账号:root<span style="user-select: none;"> </span>root
|
||||
|
||||
|
||||
|
||||
## 门禁端
|
||||
|
||||
>网页版地址:
|
||||
>
|
||||
>https://epp.only4.work/guard/index.html
|
||||
|
||||
可以直接用 **微信扫一扫功能** 或 **小程序端“扫门禁码”功能** 扫描门禁码,**扫描**及**确认进门**操作门禁端会弹出成功提示
|
||||
|
||||
\* 跨端桌面应用界面和功能均与网页版一致
|
||||
|
||||
|
||||
|
||||
## 小程序
|
||||
|
||||
> 小程序已审核上线,可以搜索 **devprogram** 或者扫描下方小程序码
|
||||
|
||||
\* 由于生活物资、进出码无法审核通过,所以**提审时隐藏了部分功能入口**。
|
||||
|
||||
如果登录之后**下方只有体温上报功能**,可以**点击右上角三个点→重新进入小程序**即可展示全部功能。
|
||||
|
||||

|
||||
|
||||
|
||||
|
||||
<br>
|
||||
|
||||
|
||||
-----
|
||||
|
||||
<div style="text-align: center;">
|
||||
张博凯
|
||||
</div>
|
252
JMeter测试-HTTP请求.jmx
Normal file
@@ -0,0 +1,252 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<jmeterTestPlan version="1.2" properties="5.0" jmeter="5.4.3">
|
||||
<hashTree>
|
||||
<TestPlan guiclass="TestPlanGui" testclass="TestPlan" testname="测试计划" enabled="true">
|
||||
<stringProp name="TestPlan.comments"></stringProp>
|
||||
<boolProp name="TestPlan.functional_mode">false</boolProp>
|
||||
<boolProp name="TestPlan.tearDown_on_shutdown">true</boolProp>
|
||||
<boolProp name="TestPlan.serialize_threadgroups">false</boolProp>
|
||||
<elementProp name="TestPlan.user_defined_variables" elementType="Arguments" guiclass="ArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
|
||||
<collectionProp name="Arguments.arguments"/>
|
||||
</elementProp>
|
||||
<stringProp name="TestPlan.user_define_classpath"></stringProp>
|
||||
</TestPlan>
|
||||
<hashTree>
|
||||
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组" enabled="true">
|
||||
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
||||
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
|
||||
<boolProp name="LoopController.continue_forever">false</boolProp>
|
||||
<intProp name="LoopController.loops">-1</intProp>
|
||||
</elementProp>
|
||||
<stringProp name="ThreadGroup.num_threads">10</stringProp>
|
||||
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
|
||||
<boolProp name="ThreadGroup.scheduler">false</boolProp>
|
||||
<stringProp name="ThreadGroup.duration"></stringProp>
|
||||
<stringProp name="ThreadGroup.delay"></stringProp>
|
||||
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
|
||||
</ThreadGroup>
|
||||
<hashTree>
|
||||
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true">
|
||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
|
||||
<collectionProp name="Arguments.arguments"/>
|
||||
</elementProp>
|
||||
<stringProp name="HTTPSampler.domain">epp.only4.work</stringProp>
|
||||
<stringProp name="HTTPSampler.port">80</stringProp>
|
||||
<stringProp name="HTTPSampler.protocol">https</stringProp>
|
||||
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
||||
<stringProp name="HTTPSampler.path">/user/manage/getUserList</stringProp>
|
||||
<stringProp name="HTTPSampler.method">GET</stringProp>
|
||||
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
||||
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||
<boolProp name="HTTPSampler.DO_MULTIPART_POST">false</boolProp>
|
||||
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
||||
<stringProp name="HTTPSampler.connect_timeout"></stringProp>
|
||||
<stringProp name="HTTPSampler.response_timeout"></stringProp>
|
||||
</HTTPSamplerProxy>
|
||||
<hashTree>
|
||||
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="响应断言" enabled="true">
|
||||
<collectionProp name="Asserion.test_strings"/>
|
||||
<stringProp name="Assertion.custom_message"></stringProp>
|
||||
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
||||
<boolProp name="Assertion.assume_success">false</boolProp>
|
||||
<intProp name="Assertion.test_type">16</intProp>
|
||||
</ResponseAssertion>
|
||||
<hashTree/>
|
||||
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true">
|
||||
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
||||
<objProp>
|
||||
<name>saveConfig</name>
|
||||
<value class="SampleSaveConfiguration">
|
||||
<time>true</time>
|
||||
<latency>true</latency>
|
||||
<timestamp>true</timestamp>
|
||||
<success>true</success>
|
||||
<label>true</label>
|
||||
<code>true</code>
|
||||
<message>true</message>
|
||||
<threadName>true</threadName>
|
||||
<dataType>true</dataType>
|
||||
<encoding>false</encoding>
|
||||
<assertions>true</assertions>
|
||||
<subresults>true</subresults>
|
||||
<responseData>false</responseData>
|
||||
<samplerData>false</samplerData>
|
||||
<xml>false</xml>
|
||||
<fieldNames>true</fieldNames>
|
||||
<responseHeaders>false</responseHeaders>
|
||||
<requestHeaders>false</requestHeaders>
|
||||
<responseDataOnError>false</responseDataOnError>
|
||||
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
|
||||
<assertionsResultsToSave>0</assertionsResultsToSave>
|
||||
<bytes>true</bytes>
|
||||
<sentBytes>true</sentBytes>
|
||||
<url>true</url>
|
||||
<threadCounts>true</threadCounts>
|
||||
<idleTime>true</idleTime>
|
||||
<connectTime>true</connectTime>
|
||||
</value>
|
||||
</objProp>
|
||||
<stringProp name="filename"></stringProp>
|
||||
</ResultCollector>
|
||||
<hashTree/>
|
||||
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
|
||||
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
||||
<objProp>
|
||||
<name>saveConfig</name>
|
||||
<value class="SampleSaveConfiguration">
|
||||
<time>true</time>
|
||||
<latency>true</latency>
|
||||
<timestamp>true</timestamp>
|
||||
<success>true</success>
|
||||
<label>true</label>
|
||||
<code>true</code>
|
||||
<message>true</message>
|
||||
<threadName>true</threadName>
|
||||
<dataType>true</dataType>
|
||||
<encoding>false</encoding>
|
||||
<assertions>true</assertions>
|
||||
<subresults>true</subresults>
|
||||
<responseData>false</responseData>
|
||||
<samplerData>false</samplerData>
|
||||
<xml>false</xml>
|
||||
<fieldNames>true</fieldNames>
|
||||
<responseHeaders>false</responseHeaders>
|
||||
<requestHeaders>false</requestHeaders>
|
||||
<responseDataOnError>false</responseDataOnError>
|
||||
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
|
||||
<assertionsResultsToSave>0</assertionsResultsToSave>
|
||||
<bytes>true</bytes>
|
||||
<sentBytes>true</sentBytes>
|
||||
<url>true</url>
|
||||
<threadCounts>true</threadCounts>
|
||||
<idleTime>true</idleTime>
|
||||
<connectTime>true</connectTime>
|
||||
</value>
|
||||
</objProp>
|
||||
<stringProp name="filename"></stringProp>
|
||||
</ResultCollector>
|
||||
<hashTree/>
|
||||
</hashTree>
|
||||
</hashTree>
|
||||
<ThreadGroup guiclass="ThreadGroupGui" testclass="ThreadGroup" testname="线程组" enabled="true">
|
||||
<stringProp name="ThreadGroup.on_sample_error">continue</stringProp>
|
||||
<elementProp name="ThreadGroup.main_controller" elementType="LoopController" guiclass="LoopControlPanel" testclass="LoopController" testname="循环控制器" enabled="true">
|
||||
<boolProp name="LoopController.continue_forever">false</boolProp>
|
||||
<intProp name="LoopController.loops">-1</intProp>
|
||||
</elementProp>
|
||||
<stringProp name="ThreadGroup.num_threads">800</stringProp>
|
||||
<stringProp name="ThreadGroup.ramp_time">1</stringProp>
|
||||
<boolProp name="ThreadGroup.scheduler">false</boolProp>
|
||||
<stringProp name="ThreadGroup.duration"></stringProp>
|
||||
<stringProp name="ThreadGroup.delay"></stringProp>
|
||||
<boolProp name="ThreadGroup.same_user_on_next_iteration">true</boolProp>
|
||||
</ThreadGroup>
|
||||
<hashTree>
|
||||
<HTTPSamplerProxy guiclass="HttpTestSampleGui" testclass="HTTPSamplerProxy" testname="HTTP请求" enabled="true">
|
||||
<elementProp name="HTTPsampler.Arguments" elementType="Arguments" guiclass="HTTPArgumentsPanel" testclass="Arguments" testname="用户定义的变量" enabled="true">
|
||||
<collectionProp name="Arguments.arguments"/>
|
||||
</elementProp>
|
||||
<stringProp name="HTTPSampler.domain">localhost</stringProp>
|
||||
<stringProp name="HTTPSampler.port">80</stringProp>
|
||||
<stringProp name="HTTPSampler.protocol">http</stringProp>
|
||||
<stringProp name="HTTPSampler.contentEncoding"></stringProp>
|
||||
<stringProp name="HTTPSampler.path">/access/code/getCodeInfo?id=1</stringProp>
|
||||
<stringProp name="HTTPSampler.method">POST</stringProp>
|
||||
<boolProp name="HTTPSampler.follow_redirects">true</boolProp>
|
||||
<boolProp name="HTTPSampler.auto_redirects">false</boolProp>
|
||||
<boolProp name="HTTPSampler.use_keepalive">true</boolProp>
|
||||
<boolProp name="HTTPSampler.DO_MULTIPART_POST">true</boolProp>
|
||||
<stringProp name="HTTPSampler.embedded_url_re"></stringProp>
|
||||
<stringProp name="HTTPSampler.implementation">HttpClient4</stringProp>
|
||||
<stringProp name="HTTPSampler.connect_timeout">300000</stringProp>
|
||||
<stringProp name="HTTPSampler.response_timeout"></stringProp>
|
||||
</HTTPSamplerProxy>
|
||||
<hashTree>
|
||||
<ResponseAssertion guiclass="AssertionGui" testclass="ResponseAssertion" testname="响应断言" enabled="true">
|
||||
<collectionProp name="Asserion.test_strings"/>
|
||||
<stringProp name="Assertion.custom_message"></stringProp>
|
||||
<stringProp name="Assertion.test_field">Assertion.response_data</stringProp>
|
||||
<boolProp name="Assertion.assume_success">false</boolProp>
|
||||
<intProp name="Assertion.test_type">16</intProp>
|
||||
</ResponseAssertion>
|
||||
<hashTree/>
|
||||
<ResultCollector guiclass="ViewResultsFullVisualizer" testclass="ResultCollector" testname="察看结果树" enabled="true">
|
||||
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
||||
<objProp>
|
||||
<name>saveConfig</name>
|
||||
<value class="SampleSaveConfiguration">
|
||||
<time>true</time>
|
||||
<latency>true</latency>
|
||||
<timestamp>true</timestamp>
|
||||
<success>true</success>
|
||||
<label>true</label>
|
||||
<code>true</code>
|
||||
<message>true</message>
|
||||
<threadName>true</threadName>
|
||||
<dataType>true</dataType>
|
||||
<encoding>false</encoding>
|
||||
<assertions>true</assertions>
|
||||
<subresults>true</subresults>
|
||||
<responseData>false</responseData>
|
||||
<samplerData>false</samplerData>
|
||||
<xml>false</xml>
|
||||
<fieldNames>true</fieldNames>
|
||||
<responseHeaders>false</responseHeaders>
|
||||
<requestHeaders>false</requestHeaders>
|
||||
<responseDataOnError>false</responseDataOnError>
|
||||
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
|
||||
<assertionsResultsToSave>0</assertionsResultsToSave>
|
||||
<bytes>true</bytes>
|
||||
<sentBytes>true</sentBytes>
|
||||
<url>true</url>
|
||||
<threadCounts>true</threadCounts>
|
||||
<idleTime>true</idleTime>
|
||||
<connectTime>true</connectTime>
|
||||
</value>
|
||||
</objProp>
|
||||
<stringProp name="filename"></stringProp>
|
||||
</ResultCollector>
|
||||
<hashTree/>
|
||||
<ResultCollector guiclass="StatVisualizer" testclass="ResultCollector" testname="聚合报告" enabled="true">
|
||||
<boolProp name="ResultCollector.error_logging">false</boolProp>
|
||||
<objProp>
|
||||
<name>saveConfig</name>
|
||||
<value class="SampleSaveConfiguration">
|
||||
<time>true</time>
|
||||
<latency>true</latency>
|
||||
<timestamp>true</timestamp>
|
||||
<success>true</success>
|
||||
<label>true</label>
|
||||
<code>true</code>
|
||||
<message>true</message>
|
||||
<threadName>true</threadName>
|
||||
<dataType>true</dataType>
|
||||
<encoding>false</encoding>
|
||||
<assertions>true</assertions>
|
||||
<subresults>true</subresults>
|
||||
<responseData>false</responseData>
|
||||
<samplerData>false</samplerData>
|
||||
<xml>false</xml>
|
||||
<fieldNames>true</fieldNames>
|
||||
<responseHeaders>false</responseHeaders>
|
||||
<requestHeaders>false</requestHeaders>
|
||||
<responseDataOnError>false</responseDataOnError>
|
||||
<saveAssertionResultsFailureMessage>true</saveAssertionResultsFailureMessage>
|
||||
<assertionsResultsToSave>0</assertionsResultsToSave>
|
||||
<bytes>true</bytes>
|
||||
<sentBytes>true</sentBytes>
|
||||
<url>true</url>
|
||||
<threadCounts>true</threadCounts>
|
||||
<idleTime>true</idleTime>
|
||||
<connectTime>true</connectTime>
|
||||
</value>
|
||||
</objProp>
|
||||
<stringProp name="filename"></stringProp>
|
||||
</ResultCollector>
|
||||
<hashTree/>
|
||||
</hashTree>
|
||||
</hashTree>
|
||||
</hashTree>
|
||||
</hashTree>
|
||||
</jmeterTestPlan>
|
5
MoveBackendJar.bat
Normal file
@@ -0,0 +1,5 @@
|
||||
move .\backend\microservice-gateway\target\microservice-gateway-0.0.1-SNAPSHOT.jar .\ignore
|
||||
move .\backend\microservice-provider-user-8001\target\microservice-provider-user-8001-0.0.1-SNAPSHOT.jar .\ignore
|
||||
move .\backend\microservice-provider-access-8002\target\microservice-provider-access-8002-0.0.1-SNAPSHOT.jar .\ignore
|
||||
move .\backend\microservice-provider-shop-8003\target\microservice-provider-shop-8003-0.0.1-SNAPSHOT.jar .\ignore
|
||||
pause
|
190
README.md
@@ -4,6 +4,8 @@
|
||||
|
||||
代码仓库:[GitHub](https://github.com/coder-xiaomo/epp) [Gitee](https://gitee.com/coder-xiaomo/epp) [自建](https://git.only4.work/coder-xiaomo/epp)
|
||||
|
||||
本项目采用 monorepo 单仓库模式进行维护,项目完整代码均在此仓库中。
|
||||
|
||||
|
||||
|
||||
## 简介
|
||||
@@ -122,6 +124,9 @@ git clone https://github.com/coder-xiaomo/epp
|
||||
# git clone https://git.only4.work/coder-xiaomo/epp
|
||||
# 进入项目根目录
|
||||
cd epp
|
||||
|
||||
# 切换到 production 分支
|
||||
git checkout production
|
||||
```
|
||||
|
||||
|
||||
@@ -212,9 +217,7 @@ cd ../
|
||||
# ############
|
||||
# 进入 frontend 目录
|
||||
cd frontend
|
||||
# 建议使用 cnpm 安装依赖,如果没有安装 cnpm,可以通过 npm i cnpm 进行安装
|
||||
cnpm install
|
||||
# npm install --legacy-peer-deps
|
||||
npm install
|
||||
# 回到项目根目录下
|
||||
cd ../
|
||||
```
|
||||
@@ -304,20 +307,42 @@ npm run package
|
||||
|
||||
|
||||
|
||||
#### 管理员前端项目打包并嵌入后端
|
||||
|
||||
```
|
||||
cd frontend
|
||||
npm run build
|
||||
```
|
||||
|
||||
然后将 `frontend/dist` 文件夹移动到 `backend/microservice-gateway/src/main/resources/static` 文件夹下,并修改文件夹名称 `dist` 为 `manage`
|
||||
|
||||
|
||||
|
||||
#### 后端配置
|
||||
|
||||
##### 配置业务域名
|
||||
|
||||
TODO
|
||||
|
||||
修改 `backend\microservice-provider-access-8002\src\main\resources\static\access\assets\js\websocket.js` 文件
|
||||
修改 `backend/microservice-provider-access-8002/src/main/resources/static/access/renderer.js` 文件
|
||||
|
||||
```
|
||||
window.wsUrl = 'ws://127.0.0.1:80/access/websocket/1';
|
||||
const baseUrl = "https://【⚠此处修改为你的业务域名】/" // 以 / 结尾,例如:https://epp.only4.work/
|
||||
|
||||
// 或者也可使用相对路径,例如:
|
||||
const baseUrl = "/"
|
||||
```
|
||||
|
||||
|
||||
|
||||
修改 `backend/microservice-provider-access-8002/src/main/resources/static/access/assets/js/websocket.js` 文件
|
||||
|
||||
```
|
||||
window.wsUrl = 'ws://【⚠此处修改为你的业务域名】/access/websocket/';
|
||||
```
|
||||
|
||||
> 注意,如果使用了 SSL 证书,那么 ws:// 要换成 wss://
|
||||
|
||||
|
||||
|
||||
##### 配置小程序 APPID 与 APPSECRET
|
||||
|
||||
修改 `backend/microservice-provider-access-8002/src/main/java/com/cxyxiaomo/epp/access/service/WeChatTokenServiceImpl.java` 文件
|
||||
@@ -330,9 +355,38 @@ window.wsUrl = 'ws://127.0.0.1:80/access/websocket/1';
|
||||
|
||||
|
||||
|
||||
##### 配置门禁端生成的小程序码环境
|
||||
|
||||
修改 `backend/microservice-provider-access-8002/src/main/resources/static/access/renderer.js` 文件
|
||||
|
||||
```
|
||||
const envVersion = "【⚠此处修改为当前小程序环境】" // 正式版为 "release",体验版为 "trial",开发版为 "develop"
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### 配置 Gateway 限流策略(可选)
|
||||
|
||||
> 如果你不懂这是在做什么,请直接跳过这一步
|
||||
|
||||
修改 `backend/microservice-gateway/src/main/resources/application.yml` 文件中 `routes` 中各个微服务的 `filters` 例如:
|
||||
|
||||
```yml
|
||||
filters: # 路由过滤器,使用自定义的限流过滤器工厂
|
||||
- name: RateLimitByIp # 设置每秒允许5个请求,每次请求需要1个令牌
|
||||
args:
|
||||
rate: 5.0
|
||||
permits: 1
|
||||
```
|
||||
|
||||
|
||||
|
||||
##### 打 jar 包
|
||||
|
||||
IDEA 中右侧 Maven 双击 Lifestyle 的 package,打包完成后的 jar 包可在以下位置找到
|
||||
> 打包需要一起打包,每个项目单独打包可能会提示找不到 microservice-common 相关依赖
|
||||
|
||||
IDEA 中右侧 Maven 双击 Lifestyle 的 package(建议先 clean 一下,并点击选中 Maven 的跳过测试,再进行 package),打包完成后的 jar 包可在以下位置找到
|
||||
|
||||
- backend/microservice-gateway/target/microservice-gateway-0.0.1-SNAPSHOT.jar
|
||||
- backend/microservice-provider-user-8001/target/microservice-provider-user-8001-0.0.1-SNAPSHOT.jar
|
||||
- backend/microservice-provider-access-8002/target/microservice-provider-access-8002-0.0.1-SNAPSHOT.jar
|
||||
@@ -340,10 +394,51 @@ IDEA 中右侧 Maven 双击 Lifestyle 的 package,打包完成后的 jar 包
|
||||
|
||||
|
||||
|
||||
#### nginx 代理配置(可选)
|
||||
#### Nacos 配置
|
||||
|
||||
> nacos 后台地址:http://127.0.0.1:8488/nacos/index.html
|
||||
|
||||
1. 进入 ,修改 nacos 登录密码(可选)
|
||||
|
||||
> 左侧 **权限控制** → **用户列表** → **修改**
|
||||
|
||||
2. 修改 nacos 端口为 8488(与后端项目配置文件中保持一致)
|
||||
|
||||
> nacos/conf/application.properties 中的端口号 port 改为 8488
|
||||
|
||||
3. 创建两个命名空间(命名空间ID分别为 `develop` 和 `production`)
|
||||
|
||||
> 左侧 **命名空间** → **新建命名空间**
|
||||
|
||||
| 命名空间名称 | 命名空间ID | 描述 | 配置数 | 操作 |
|
||||
| :--------------- | :--------- | :--------- | :----- | :----------- |
|
||||
| public(保留空间) | | | 0 | 详情删除编辑 |
|
||||
| develop | develop | develop | 0 | 详情删除编辑 |
|
||||
| production | production | production | 0 | 详情删除编辑 |
|
||||
|
||||
##### 新版 Nacos 需要配置密钥
|
||||
|
||||
**若使用的 Nacos 版本小于或等于 Nacos 2.2.0,不需要进行如下配置。**
|
||||
|
||||
🌟若使用的 Nacos 版本大于或等于 Nacos 2.2.0.1,则需要配置自定义密钥:
|
||||
|
||||
```properties
|
||||
# 密钥值可以自己指定,此处的自定义密钥来自 nacos 官网
|
||||
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
|
||||
```
|
||||
|
||||
参考:https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
|
||||
|
||||
|
||||
|
||||
#### nginx 代理配置
|
||||
|
||||
##### 反向代理(可选)
|
||||
|
||||
配置文件在 `nginx-conf` 目录下(不能直接拿来用,需要根据自己的实际情况来改)
|
||||
|
||||
> 以下配置仅供参考
|
||||
|
||||
```conf
|
||||
server
|
||||
{
|
||||
@@ -351,11 +446,18 @@ server
|
||||
listen 80;
|
||||
listen 443 ssl http2;
|
||||
|
||||
# 并发限制 限制当前站点最大并发数
|
||||
limit_conn perserver 50;
|
||||
# 单IP限制 限制单个IP访问最大并发数
|
||||
limit_conn perip 10;
|
||||
# 流量限制 限制每个请求的流量上限(单位:KB)
|
||||
limit_rate 8192k;
|
||||
|
||||
# 核心配置
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:5203; # ⚠ Gateway 微服务项目本地运行的端口
|
||||
|
||||
# websocket
|
||||
# websocket # ⚠ 门禁端用户扫码后通过 websocket 推送到门禁端完成开门
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
@@ -367,7 +469,9 @@ server
|
||||
}
|
||||
```
|
||||
|
||||
##### SSL证书配置(可选)
|
||||
|
||||
如果域名配置为 https:// 则需要配置 SSL 证书。SSL证书可在 nginx 中进行配置,具体配置方法此处省略。
|
||||
|
||||
|
||||
|
||||
@@ -421,23 +525,64 @@ Nacos 后台地址为:http://localhost:8848/nacos/index.html,默认用户名
|
||||
|
||||
#### [部署&开发] 启动 MySQL
|
||||
|
||||
略
|
||||
```
|
||||
# Ubuntu 下
|
||||
sudo systemctl start mysql
|
||||
```
|
||||
|
||||
#### [部署&开发] 启动各个微服务
|
||||
|
||||
开发:直接在 IDEA 中启动即可
|
||||
开发环境:Windows下
|
||||
|
||||
部署:
|
||||
> 直接在 IDEA 中启动即可
|
||||
>
|
||||
> 若系统内存够用,可以适当调大内存参数,如:-Xmx1024M -Xms256M
|
||||
|
||||
```
|
||||
# 启动 UserProvider
|
||||
```bash
|
||||
# 启动 Gateway
|
||||
# ......
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-gateway-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 启动 UserProvider
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-provider-user-8001-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 启动 AccessProvider
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-provider-access-8002-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 启动 ShopProvider
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-provider-shop-8003-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
|
||||
|
||||
生产环境:Ubuntu下
|
||||
|
||||
> 假设生产环境已有如下配置:
|
||||
>
|
||||
> - JDK 中 java 可执行文件所在路径为:/www/wwwroot/env/jdk-11/bin/java
|
||||
> - jar 包所在路径为:/www/wwwroot/workspace/
|
||||
>
|
||||
> 若系统内存够用,可以适当调大内存参数,如:-Xmx1024M -Xms256M
|
||||
|
||||
```bash
|
||||
# 启动 Gateway
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production -Dserver.port=8000 /www/wwwroot/workspace/microservice-gateway-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 启动 UserProvider
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production /www/wwwroot/workspace/microservice-provider-user-8001-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 启动 AccessProvider
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production /www/wwwroot/workspace/microservice-provider-access-8002-0.0.1-SNAPSHOT.jar
|
||||
|
||||
# 启动 ShopProvider
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production /www/wwwroot/workspace/microservice-provider-shop-8003-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
#### [可选] 启动 nginx
|
||||
|
||||
略
|
||||
```bash
|
||||
# Ubuntu 下
|
||||
sudo systemctl start nginx
|
||||
```
|
||||
|
||||
|
||||
|
||||
@@ -461,6 +606,17 @@ npm run serve
|
||||
|
||||
|
||||
|
||||
## 项目相关地址
|
||||
|
||||
### 门禁端网页
|
||||
|
||||
https://epp.only4.work/access/index.html
|
||||
|
||||
Nacos 注册中心
|
||||
|
||||
http://106.75.217.14:8488/nacos/index.html
|
||||
|
||||
|
||||
## 停止项目
|
||||
|
||||
这个应该不用多说吧
|
||||
|
164
TODOs.md
@@ -1,77 +1,139 @@
|
||||
还要做的部分
|
||||
|
||||
小程序提审要做的:
|
||||
|
||||
小程序扫门禁码之后门禁开门(扫码 websocket 推到门禁端),小程序端显示开门成功
|
||||
|
||||
项目部署到服务器
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
小程序端用户头像
|
||||
|
||||
大门 人员进出 后台管理(进出日志)
|
||||
|
||||
后台订单管理页
|
||||
|
||||
每个人创建账号的时候填充一些测试数据进去
|
||||
|
||||
门禁端左侧提示文字修改
|
||||
### 还要做的部分
|
||||
|
||||
后台管理两个端分开
|
||||
用户管理 社区管理员不能修改管理员账号
|
||||
后台管理分两个管理员身份
|
||||
- 不可以删除用户,只允许禁用用户
|
||||
|
||||
后台管理 按照id进行筛选
|
||||
社区管理员管理人员进出权限
|
||||
|
||||
& 演示时快速创建账号
|
||||
& 小程序提审(提审时隐藏小商店 调试按钮、上帝按钮)
|
||||
& 发给老班看一看
|
||||
发给老班看一看
|
||||
|
||||
数据库填充测试数据(以及创建一些测试账号)并备份,线上演示数据修改删除避免真删
|
||||
|
||||
项目中的TODO
|
||||
|
||||
|
||||
### 可能会被问到的问题
|
||||
|
||||
商品库存问题
|
||||
|
||||
|
||||
### 其他
|
||||
|
||||
小程序端用户头像
|
||||
|
||||
大门 人员进出 后台管理(进出日志)
|
||||
|
||||
每个人创建账号的时候填充一些测试数据进去
|
||||
|
||||
后台管理 按照id进行筛选
|
||||
|
||||
|
||||
|
||||
更多:
|
||||
|
||||
完成项目代码中的 TODO 部分
|
||||
|
||||
Java代码中小程序AppID、密钥处理,小程序代码中小程序AppID处理
|
||||
|
||||
|
||||
# VSCode 全局搜索排除
|
||||
|
||||
node_modules,.git,.idea,target,out,./postman-collection,@deprecated
|
||||
|
||||
|
||||
|
||||
# host 文件地址
|
||||
|
||||
C:\Windows\System32\drivers\etc
|
||||
|
||||
配置项
|
||||
|
||||
127.0.0.1 epp.only4.work
|
||||
|
||||
查看配置
|
||||
|
||||
ping epp.only4.work
|
||||
|
||||
|
||||
|
||||
# 后端项目启动命令
|
||||
|
||||
```bash
|
||||
; /www/wwwroot/env/jdk-11/bin/java -jar -Xmx1024M -Xms256M /www/wwwroot/workspace/microservice-gateway-0.0.1-SNAPSHOT.jar --server.port=7087
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production -Dserver.port=8000 /www/wwwroot/workspace/microservice-gateway-0.0.1-SNAPSHOT.jar
|
||||
# 小程序提审期间
|
||||
# /www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production -Dserver.port=8000 -Depp.miniprogram.config=hide /www/wwwroot/workspace/microservice-gateway-0.0.1-SNAPSHOT.jar
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production /www/wwwroot/workspace/microservice-provider-user-8001-0.0.1-SNAPSHOT.jar
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production /www/wwwroot/workspace/microservice-provider-access-8002-0.0.1-SNAPSHOT.jar
|
||||
/www/wwwroot/env/jdk-11/bin/java -jar -Xmx512M -Xms128M -Dspring.profiles.active=production /www/wwwroot/workspace/microservice-provider-shop-8003-0.0.1-SNAPSHOT.jar
|
||||
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-gateway-0.0.1-SNAPSHOT.jar
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-provider-user-8001-0.0.1-SNAPSHOT.jar
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-provider-access-8002-0.0.1-SNAPSHOT.jar
|
||||
java -jar -Xmx512M -Xms128M -Dspring.profiles.active=develop ./microservice-provider-shop-8003-0.0.1-SNAPSHOT.jar
|
||||
```
|
||||
|
||||
|
||||
# BT宝塔登录密钥
|
||||
|
||||
==================================================================
|
||||
外网面板地址: http://106.75.217.14:18734/107bb99c
|
||||
内网面板地址: http://10.23.189.141:18734/107bb99c
|
||||
username: qmud57rc
|
||||
password: 80347b8d
|
||||
If you cannot access the panel,
|
||||
release the following panel port [18734] in the security group
|
||||
若无法访问面板,请检查防火墙/安全组是否有放行面板[18734]端口
|
||||
==================================================================
|
||||
|
||||
|
||||
项目开发中遇到的问题
|
||||
小程序双端不一致的问题,参数转义,页面CSS样式是不完全一样的。
|
||||
|
||||
# IP 配置
|
||||
|
||||
develop
|
||||
|
||||
内网穿透:106.75.217.14
|
||||
|
||||
nacos:http://106.75.217.14:8488/nacos/index.html
|
||||
|
||||
数据库:本地
|
||||
|
||||
|
||||
|
||||
production
|
||||
|
||||
nacos:http://106.75.217.14:8488/nacos/index.html
|
||||
|
||||
数据库:服务器上
|
||||
|
||||
|
||||
|
||||
|
||||
# QCloud
|
||||
|
||||
主账号ID 100014397291
|
||||
|
||||
用户名 epp
|
||||
|
||||
登录密码 -
|
||||
|
||||
SecretId AKIDSkmeXTHsTqzwe8ZDiGcomW4OYXcZIerp
|
||||
|
||||
SecretKey 22sVt494mGZeV7sQkqwxnNjneHesqXxA
|
||||
|
||||
# 门禁端网页
|
||||
|
||||
https://epp.only4.work/access/index.html
|
||||
https://epp-prod.only4.work/access/index.html
|
||||
|
||||
|
||||
|
||||
# 启动远程 Nacos
|
||||
|
||||
> /www/wwwserv/epp/nacos/conf/application.properties port 改为 8488
|
||||
|
||||
```
|
||||
cd /www/wwwserv/epp/nacos/bin
|
||||
bash startup.sh -m standalone
|
||||
bash shutdown.sh
|
||||
```
|
||||
|
||||
http://106.75.217.14:8488/nacos/index.html
|
||||
nacos
|
||||
@@ -81,51 +143,41 @@ socan
|
||||
|
||||
# 启动本地 Nacos
|
||||
|
||||
```bash
|
||||
E:
|
||||
cd E:\nacos\bin
|
||||
startup.cmd -m standalone
|
||||
```
|
||||
|
||||
|
||||
|
||||
# 内网穿透
|
||||
|
||||
```bash
|
||||
cd E:\Project\毕业设计\epp\intranet-penetration\bin
|
||||
rathole.exe ../conf/client.toml
|
||||
```
|
||||
|
||||
|
||||
|
||||
# 微信小程序后台设置 小程序最低基础库 2.21.3
|
||||
|
||||
https://developers.weixin.qq.com/miniprogram/dev/framework/open-ability/userProfile.html
|
||||
|
||||
|
||||
**项目亮点**:
|
||||
|
||||
优点:
|
||||
订单id使用 雪花id(可以分布式部署)
|
||||
|
||||
遇到的问题:
|
||||
|
||||
|
||||
**项目开发中遇到的问题**:
|
||||
|
||||
nacos CPU占满问题,解决方案:提issue,多次测试,找到问题(HTTPDebug),问题解决
|
||||
|
||||
iPhone部分版本不支持webp格式图片
|
||||
|
||||
小程序双端不一致的问题,参数转义,页面CSS样式是不完全一样的。
|
||||
|
||||
-----
|
||||
|
||||
Nacos CPU 跑满问题 我提的 GitHub issue
|
||||
|
||||
https://github.com/alibaba/nacos/issues/10080
|
||||
|
||||
-----
|
||||
|
||||
Nacos 2.2.0.1 需要配置
|
||||
nacos.core.auth.plugin.nacos.token.secret.key=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
|
||||
参考:
|
||||
https://nacos.io/zh-cn/docs/v2/guide/user/auth.html
|
||||
|
||||
-----
|
||||
|
||||
体温填报接口:
|
||||
今日是否填报过,上报体温,上报的体温的历史记录
|
||||
|
||||
更多:
|
||||
完成项目代码中的 TODO 部分
|
||||
身份码后端接口考虑与其他系统的集成逻辑
|
||||
|
||||
Java代码中小程序AppID、密钥处理,小程序代码中小程序AppID处理
|
19
backend/.idea/runConfigurations/Dev_Gateway__epp_miniprogram_config_hide_.xml
generated
Normal file
@@ -0,0 +1,19 @@
|
||||
<component name="ProjectRunConfigurationManager">
|
||||
<configuration default="false" name="Dev-Gateway (epp.miniprogram.config=hide)" type="SpringBootApplicationConfigurationType" factoryName="Spring Boot">
|
||||
<envs>
|
||||
<env name="--spring.profiles.active" value="develop" />
|
||||
</envs>
|
||||
<module name="microservice-gateway" />
|
||||
<option name="SPRING_BOOT_MAIN_CLASS" value="com.cxyxiaomo.epp.gateway.Gateway" />
|
||||
<option name="VM_PARAMETERS" value="-Xms64m -Xmx256m -Depp.miniprogram.config=hide" />
|
||||
<extension name="coverage">
|
||||
<pattern>
|
||||
<option name="PATTERN" value="com.cxyxiaomo.epp.*" />
|
||||
<option name="ENABLED" value="true" />
|
||||
</pattern>
|
||||
</extension>
|
||||
<method v="2">
|
||||
<option name="Make" enabled="true" />
|
||||
</method>
|
||||
</configuration>
|
||||
</component>
|
@@ -3,6 +3,7 @@ package com.cxyxiaomo.epp.PageTable.enums;
|
||||
public enum AddType {
|
||||
CAN_NOT_ADD("plainText"),
|
||||
INPUT("input"),
|
||||
INPUT_NUMBER("input-number"),
|
||||
TEXTAREA("textarea"),
|
||||
SELECT("select"),
|
||||
IMAGE("image");
|
||||
|
@@ -3,6 +3,7 @@ package com.cxyxiaomo.epp.PageTable.enums;
|
||||
public enum EditType {
|
||||
CAN_NOT_EDIT("plainText"),
|
||||
INPUT("input"),
|
||||
INPUT_NUMBER("input-number"),
|
||||
TEXTAREA("textarea"),
|
||||
SELECT("select"),
|
||||
IMAGE("image");
|
||||
|
@@ -43,11 +43,12 @@ public class FieldRuleBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
public FieldRuleBuilder number() {
|
||||
rules.put("type", "number");
|
||||
rules.put("message", fieldDisplayName + "必须为数字");
|
||||
return this;
|
||||
}
|
||||
// public FieldRuleBuilder number() {
|
||||
// // rules.put("type", "number"); // 字符串类型的数字匹配不上
|
||||
// rules.put("regexp", "^\\d+?$");
|
||||
// rules.put("message", fieldDisplayName + "必须为数字");
|
||||
// return this;
|
||||
// }
|
||||
|
||||
public FieldRuleBuilder min(Integer min) {
|
||||
rules.put("min", min);
|
||||
@@ -61,6 +62,7 @@ public class FieldRuleBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
// 字符串类型长度范围
|
||||
public FieldRuleBuilder minMax(Integer min, Integer max) {
|
||||
rules.put("min", min);
|
||||
rules.put("max", max);
|
||||
@@ -68,6 +70,28 @@ public class FieldRuleBuilder {
|
||||
return this;
|
||||
}
|
||||
|
||||
// 数字类型数值范围
|
||||
// public FieldRuleBuilder range(Integer min, Integer max) {
|
||||
// // rules.put("min", min);
|
||||
// // rules.put("max", max);
|
||||
// rules.put("message", fieldDisplayName + "应大于 " + min + " 且小于 " + max);
|
||||
// return this;
|
||||
// }
|
||||
|
||||
// // 数字类型数字个数
|
||||
// public FieldRuleBuilder price(Integer minLen, Integer maxLen) {
|
||||
// rules.put("regexp", "^\\d{" + minLen + "," + maxLen + "}(\\.\\d{1,2})?$");
|
||||
// rules.put("message", fieldDisplayName + "应大于等于 " + Math.pow(10, minLen - 1) + " ,小于等于 " + (Math.pow(10, maxLen) - 1) + " 且小数位数不超过 2 位");
|
||||
// return this;
|
||||
// }
|
||||
|
||||
// public FieldRuleBuilder regexp(String regexp) {
|
||||
// // rules.put("type", "regexp");
|
||||
// rules.put("pattern", regexp);
|
||||
// rules.put("message", fieldDisplayName + "输入不符合要求,请检查");
|
||||
// return this;
|
||||
// }
|
||||
|
||||
public FieldRuleBuilder length(Integer len) {
|
||||
rules.put("min", len);
|
||||
rules.put("max", len);
|
||||
|
@@ -4,7 +4,7 @@ import java.util.Arrays;
|
||||
import java.util.Optional;
|
||||
|
||||
public enum OrderStatus {
|
||||
PENDING("Pending", "等待确认"),
|
||||
PENDING("Pending", "等待支付"),
|
||||
PROCESSING("Processing", "已支付,等待发货中"),
|
||||
SHIPPED("Shipped", "已发货,等待确认收货"),
|
||||
DELIVERED("Delivered", "已送达"),
|
||||
|
@@ -4,10 +4,12 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = true) // 链式写法
|
||||
public class Good {
|
||||
public class Good implements Serializable {
|
||||
Long id;
|
||||
String goodsName;
|
||||
Integer categoryId;
|
||||
|
@@ -4,10 +4,12 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = true) // 链式写法
|
||||
public class GoodCategory {
|
||||
public class GoodCategory implements Serializable {
|
||||
Long id;
|
||||
String categoryName;
|
||||
Integer order;
|
||||
|
@@ -4,13 +4,14 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.BigDecimal;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = true) // 链式写法
|
||||
public class Order {
|
||||
public class Order implements Serializable {
|
||||
private Long id;
|
||||
private Integer userId;
|
||||
private LocalDateTime orderDate;
|
||||
|
@@ -4,10 +4,12 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = true) // 链式写法
|
||||
public class OrderDetail {
|
||||
public class OrderDetail implements Serializable {
|
||||
private Long id;
|
||||
private Long orderId;
|
||||
private Long goodId;
|
||||
|
@@ -0,0 +1,18 @@
|
||||
package com.cxyxiaomo.epp.common.query;
|
||||
|
||||
import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.experimental.Accessors;
|
||||
|
||||
import java.io.Serializable;
|
||||
|
||||
@Data
|
||||
@NoArgsConstructor
|
||||
@Accessors(chain = true) // 链式写法
|
||||
// 微服务必须要实现Serializable
|
||||
public class OrderQuery implements Serializable {
|
||||
private Long id;
|
||||
private Integer userId;
|
||||
private String orderStatusCode;
|
||||
private String expressId;
|
||||
}
|
@@ -9,7 +9,6 @@ import org.springframework.beans.BeanUtils;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.math.RoundingMode;
|
||||
import java.time.LocalDateTime;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -22,10 +21,10 @@ import java.util.stream.Collectors;
|
||||
public class OrderVO implements Serializable {
|
||||
private String id;
|
||||
private Integer userId;
|
||||
private LocalDateTime orderDate;
|
||||
private String orderStatus;
|
||||
private String orderStatusCode;
|
||||
private String orderPrice;
|
||||
private String orderDate;
|
||||
private String payDate;
|
||||
private String cancelDate;
|
||||
private String shipDate;
|
||||
@@ -47,6 +46,9 @@ public class OrderVO implements Serializable {
|
||||
String price = order.getOrderPrice().setScale(2, RoundingMode.FLOOR).toPlainString();
|
||||
orderVO.setOrderPrice(price);
|
||||
|
||||
if (order.getOrderDate() != null) {
|
||||
orderVO.setOrderDate(order.getOrderDate().toString().replace("T", " "));
|
||||
}
|
||||
if (order.getPayDate() != null) {
|
||||
orderVO.setPayDate(order.getPayDate().toString().replace("T", " "));
|
||||
}
|
||||
|
@@ -0,0 +1,79 @@
|
||||
package com.cxyxiaomo.epp.gateway.Factory;
|
||||
|
||||
import com.google.common.util.concurrent.RateLimiter;
|
||||
import org.springframework.cloud.gateway.filter.GatewayFilter;
|
||||
import org.springframework.cloud.gateway.filter.factory.AbstractGatewayFilterFactory;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.server.reactive.ServerHttpRequest;
|
||||
import org.springframework.http.server.reactive.ServerHttpResponse;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Component
|
||||
// 一个自定义的限流过滤器工厂
|
||||
public class RateLimitByIpGatewayFilterFactory extends AbstractGatewayFilterFactory<RateLimitByIpGatewayFilterFactory.Config> {
|
||||
|
||||
// 用于存储IP地址和对应的计数器
|
||||
private static final Map<String, RateLimiter> RATE_LIMITER_CACHE = new ConcurrentHashMap<>();
|
||||
|
||||
public RateLimitByIpGatewayFilterFactory() {
|
||||
super(Config.class);
|
||||
}
|
||||
|
||||
@Override
|
||||
public GatewayFilter apply(Config config) {
|
||||
return (exchange, chain) -> {
|
||||
// 获取请求的IP地址
|
||||
ServerHttpRequest request = exchange.getRequest();
|
||||
String ip = request.getRemoteAddress().getAddress().getHostAddress();
|
||||
|
||||
// 根据IP地址获取对应的限流器
|
||||
RateLimiter rateLimiter = RATE_LIMITER_CACHE.get(ip);
|
||||
if (rateLimiter == null) {
|
||||
// 如果不存在,则创建一个新的限流器,并放入缓存中
|
||||
rateLimiter = RateLimiter.create(config.getRate());
|
||||
RATE_LIMITER_CACHE.put(ip, rateLimiter);
|
||||
}
|
||||
|
||||
// 判断请求是否被限流
|
||||
if (rateLimiter.tryAcquire(config.getPermits())) {
|
||||
// 如果没有被限流,则放行
|
||||
return chain.filter(exchange);
|
||||
} else {
|
||||
System.out.println("限流!ip: " + ip);
|
||||
// 如果被限流,则返回429状态码(Too Many Requests)
|
||||
ServerHttpResponse response = exchange.getResponse();
|
||||
response.setStatusCode(HttpStatus.TOO_MANY_REQUESTS);
|
||||
return response.setComplete();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
// 配置类,用于接收配置参数
|
||||
public static class Config {
|
||||
|
||||
// 每秒允许的请求数
|
||||
private double rate;
|
||||
|
||||
// 每次请求需要的令牌数
|
||||
private int permits;
|
||||
|
||||
public double getRate() {
|
||||
return rate;
|
||||
}
|
||||
|
||||
public void setRate(double rate) {
|
||||
this.rate = rate;
|
||||
}
|
||||
|
||||
public int getPermits() {
|
||||
return permits;
|
||||
}
|
||||
|
||||
public void setPermits(int permits) {
|
||||
this.permits = permits;
|
||||
}
|
||||
}
|
||||
}
|
@@ -1,10 +1,13 @@
|
||||
package com.cxyxiaomo.epp.gateway.controller;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.web.bind.annotation.RequestMapping;
|
||||
import org.springframework.web.bind.annotation.RequestParam;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.LinkedList;
|
||||
import java.util.Objects;
|
||||
|
||||
@RestController
|
||||
public class Controller {
|
||||
@@ -14,17 +17,29 @@ public class Controller {
|
||||
return "[ERROR] 500 Internal Server Error";
|
||||
}
|
||||
|
||||
@Value("${epp.miniprogram.config}")
|
||||
private String miniprogramConfig;
|
||||
|
||||
/**
|
||||
* 为了通过微信的小程序审核所特别处理的
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@RequestMapping("/getConfig")
|
||||
public HashMap<String, Object> WxMiniProgramAuditSpecialHandle() {
|
||||
boolean showCode = false;
|
||||
boolean showShop = false;
|
||||
public HashMap<String, Object> WxMiniProgramAuditSpecialHandle(@RequestParam(value = "v", required = false) String version) {
|
||||
boolean showCode = true;
|
||||
boolean showShop = true;
|
||||
boolean showReport = true;
|
||||
|
||||
// 第一版提审,已通过,在线上 version == null
|
||||
if (Objects.equals(version, "2")) {
|
||||
// 第一版提审,按照配置文件中的配置来
|
||||
if (Objects.equals(miniprogramConfig, "hide")) {
|
||||
showCode = false;
|
||||
showShop = false;
|
||||
}
|
||||
}
|
||||
|
||||
// 底部 tabbar
|
||||
LinkedList<String> tabbarItem = new LinkedList<>();
|
||||
tabbarItem.push("pages/index/index");
|
||||
|
@@ -40,20 +40,38 @@ spring:
|
||||
predicates:
|
||||
- Path=/user/**
|
||||
- Method=GET,POST
|
||||
filters: # 路由过滤器,使用自定义的限流过滤器工厂
|
||||
- name: RateLimitByIp # 设置每秒允许5个请求,每次请求需要1个令牌
|
||||
args:
|
||||
rate: 10.0
|
||||
permits: 1
|
||||
|
||||
- id: access
|
||||
uri: lb://microservice-provider-access
|
||||
predicates:
|
||||
- Path=/access/**
|
||||
- Method=GET,POST
|
||||
filters: # 路由过滤器,使用自定义的限流过滤器工厂
|
||||
- name: RateLimitByIp # 设置每秒允许5个请求,每次请求需要1个令牌
|
||||
args:
|
||||
rate: 10.0
|
||||
permits: 1
|
||||
|
||||
- id: access-websocket
|
||||
uri: lb:ws://microservice-provider-access
|
||||
predicates:
|
||||
- Path=/access/websocket/**
|
||||
|
||||
- id: shop
|
||||
uri: lb://microservice-provider-shop
|
||||
predicates:
|
||||
- Path=/shop/**
|
||||
- Method=GET,POST
|
||||
filters: # 路由过滤器,使用自定义的限流过滤器工厂
|
||||
- name: RateLimitByIp # 设置每秒允许5个请求,每次请求需要1个令牌
|
||||
args:
|
||||
rate: 10.0
|
||||
permits: 1
|
||||
|
||||
- id: test1
|
||||
uri: lb://microservice-provider-test
|
||||
@@ -79,3 +97,9 @@ spring:
|
||||
args:
|
||||
status: 302
|
||||
url: https://www.baidu.com/?wd=
|
||||
|
||||
epp:
|
||||
miniprogram:
|
||||
# 为了通过微信的小程序审核所特别处理的
|
||||
# show / hide
|
||||
config: show
|
||||
|
@@ -1 +1,3 @@
|
||||
编辑后右键 Compile And Reload File 修改即可生效,不用频繁重启项目
|
||||
|
||||
manage 文件夹下为 frontend 项目打包产物
|
After Width: | Height: | Size: 86 KiB |
@@ -1,6 +1,7 @@
|
||||
* {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
html,
|
@@ -0,0 +1,20 @@
|
||||
.scan-result-container {
|
||||
position: fixed;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 20;
|
||||
display: grid;
|
||||
place-items: center;
|
||||
}
|
||||
|
||||
.scan-result-image {
|
||||
width: min(55vw, 55vh);
|
||||
transition: 0.3s;
|
||||
transform: scale(0.001);
|
||||
}
|
||||
|
||||
.scan-result-image-show {
|
||||
transform: scale(1);
|
||||
}
|
@@ -62,7 +62,7 @@
|
||||
}
|
||||
|
||||
.hidden {
|
||||
display: none;
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* 弹窗列表样式 */
|
||||
@@ -82,6 +82,7 @@
|
||||
box-sizing: border-box;
|
||||
place-items: center;
|
||||
background-color: #f6f6f6;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.gate-list-item > p {
|
@@ -0,0 +1,39 @@
|
||||
const URLScanSuccessImage = "./assets/svg/scan-success.svg"
|
||||
const URLEnterGateImage = "./assets/svg/enter-gate.svg"
|
||||
const DOMFullScreenMask = document.getElementById("full-screen-mask")
|
||||
const DOMScanResultContainer = document.getElementById("scan-result-container")
|
||||
const DOMQRCodeScanSuccessImage = document.getElementById("qrcode-scan-success")
|
||||
|
||||
var isShowing = false
|
||||
|
||||
function showResult(imageType) {
|
||||
console.log("showResult")
|
||||
if (isShowing) {
|
||||
// console.log("showResult() skipped coz showing.")
|
||||
// 等待 0.1s 重试
|
||||
setTimeout(() => showResult(imageType), 100)
|
||||
return
|
||||
}
|
||||
isShowing = true
|
||||
DOMQRCodeScanSuccessImage.src = imageType === "onscan" ? URLScanSuccessImage : URLEnterGateImage
|
||||
DOMFullScreenMask.classList.remove("hidden")
|
||||
DOMScanResultContainer.classList.remove("hidden")
|
||||
//
|
||||
setTimeout(() => {
|
||||
DOMQRCodeScanSuccessImage.classList.add("scan-result-image-show")
|
||||
}, 100)
|
||||
|
||||
setTimeout(function hideResult() {
|
||||
console.log("hideResult")
|
||||
DOMQRCodeScanSuccessImage.classList.remove("scan-result-image-show")
|
||||
setTimeout(() => {
|
||||
DOMQRCodeScanSuccessImage.src = ""
|
||||
DOMFullScreenMask.classList.add("hidden")
|
||||
DOMScanResultContainer.classList.add("hidden")
|
||||
isShowing = false
|
||||
}, 300)
|
||||
}, 3000)
|
||||
}
|
||||
|
||||
// setTimeout(showResult, 100)
|
||||
window.showResult = showResult
|
@@ -1,6 +1,12 @@
|
||||
window.wsUrl = 'wss://epp-prod.only4.work/access/websocket/1';
|
||||
// window.wsUrl = 'ws://127.0.0.1:80/access/websocket/1';
|
||||
// window.wsUrl = 'ws://127.0.0.1:8002/access/websocket/1';
|
||||
/**
|
||||
* FIXME 环境配置
|
||||
*
|
||||
* window.wsUrl
|
||||
* - 线上环境:'wss://epp.only4.work/access/websocket/'
|
||||
* - 开发环境:'ws://127.0.0.1:80/access/websocket/'
|
||||
* 'ws://127.0.0.1:8002/access/websocket/'
|
||||
*/
|
||||
window.wsUrl = 'wss://epp.only4.work/access/websocket/';
|
||||
|
||||
window.ws = null; // WebSocket 实例对象
|
||||
|
||||
@@ -10,9 +16,20 @@ window.ws = null; // WebSocket 实例对象
|
||||
return
|
||||
}
|
||||
|
||||
function getWsUrl() {
|
||||
function getUUID() {
|
||||
return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function (c) {
|
||||
var r = Math.random() * 16 | 0, v = c == 'x' ? r : (r & 0x3 | 0x8);
|
||||
return v.toString(16);
|
||||
});
|
||||
}
|
||||
|
||||
return `${window.wsUrl}${getUUID()}`
|
||||
}
|
||||
|
||||
function createConn() {
|
||||
// 创建webscoket 对象
|
||||
const ws = new WebSocket(window.wsUrl)
|
||||
const ws = new WebSocket(getWsUrl() /* window.wsUrl */)
|
||||
// 执行上面的语句之后,客户端就会与服务器进行连接
|
||||
|
||||
// readyState返回当前实例对象的当前状态
|
||||
@@ -34,9 +51,23 @@ window.ws = null; // WebSocket 实例对象
|
||||
ws.onmessage = ({data}) => {
|
||||
console.log('onmessage readyState', ws.readyState)
|
||||
// 注意此时的data是json格式的 需要转化下
|
||||
console.log('onmessage 有新消息啦=======>', JSON.parse(data))
|
||||
let result = JSON.parse(data)
|
||||
console.log('onmessage 有新消息啦=======>', result)
|
||||
// 实例对象的send方法给服务器发送消息
|
||||
ws.send('客户端发送的消息')
|
||||
|
||||
switch (result.action) {
|
||||
case 'onscan':
|
||||
case 'onopen':
|
||||
if (window.currentGate && result.gateId === window.currentGate.id) {
|
||||
console.log(result.action)
|
||||
window.showResult(result.action)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
console.log("switch=>default", result.action)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 实例对象的onclose属性,用于连接关闭后的回调 函数
|
||||
@@ -58,5 +89,6 @@ window.ws = null; // WebSocket 实例对象
|
||||
}
|
||||
return ws
|
||||
}
|
||||
|
||||
window.ws = createConn()
|
||||
})()
|
Before Width: | Height: | Size: 886 B After Width: | Height: | Size: 886 B |
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100" height="100" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
|
||||
<circle cx="50" cy="50" r="45" stroke="white" stroke-width="7" fill="white"/>
|
||||
|
||||
<!-- 外围圆圈 -->
|
||||
<circle cx="50" cy="50" r="45" stroke="#006600" stroke-width="8" fill="none">
|
||||
<animate id="circle" attributeName="stroke-dasharray" from="0,282.743" to="282.743,0" dur="1s" begin="0s" fill="freeze"/>
|
||||
<animateTransform attributeName="transform" type="rotate" from="-90 50 50" to="270 50 50" dur="1s" begin="0s" fill="freeze"/>
|
||||
</circle>
|
||||
|
||||
<!-- 对勾动画 -->
|
||||
<path d="M20 50 L40 70 L80 30" stroke="#006600" stroke-width="8" fill="none" visibility="hidden">
|
||||
<set attributeName="visibility" from="hidden" to="visible" begin="circle.end+0.1s"/>
|
||||
<!-- 对勾开始动画 -->
|
||||
<!-- <animate attributeName="stroke-dasharray" from="0,120" to="120,0" dur="1s" begin="circle.end+0.1s" repeatCount="indefinite"/> -->
|
||||
<animate id="check" attributeName="stroke-dasharray" from="0,120" to="120,0" dur="1s" begin="circle.end+0.1s" repeatCount="1"/>
|
||||
<!-- 对勾隐藏动画 -->
|
||||
<set attributeName="visibility" from="visible" to="hidden" begin="check.end+0.1s"/>
|
||||
</path>
|
||||
|
||||
<!-- 扫码成功 -->
|
||||
<!-- <text x="50" y="55" font-size="20" text-anchor="middle" fill="#006600" visibility="hidden">
|
||||
扫码成功
|
||||
<set attributeName="visibility" from="hidden" to="visible" begin="check.end+0.1s"/>
|
||||
</text> -->
|
||||
<text x="50" y="50" font-weight="bold" text-anchor="middle" fill="#006600" visibility="hidden">
|
||||
<tspan x="50" dx="3" dy="-3" font-size="26">大门</tspan>
|
||||
<tspan x="50" dy="23" font-size="20">已开启</tspan>
|
||||
<set attributeName="visibility" from="hidden" to="visible" begin="check.end+0.1s"/>
|
||||
</text>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1,33 @@
|
||||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
|
||||
<svg width="100" height="100" viewBox="0 0 100 100" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
|
||||
<circle cx="50" cy="50" r="45" stroke="white" stroke-width="7" fill="white"/>
|
||||
|
||||
<!-- 外围圆圈 -->
|
||||
<circle cx="50" cy="50" r="45" stroke="#006600" stroke-width="8" fill="none">
|
||||
<animate id="circle" attributeName="stroke-dasharray" from="0,282.743" to="282.743,0" dur="1s" begin="0s" fill="freeze"/>
|
||||
<animateTransform attributeName="transform" type="rotate" from="-90 50 50" to="270 50 50" dur="1s" begin="0s" fill="freeze"/>
|
||||
</circle>
|
||||
|
||||
<!-- 对勾动画 -->
|
||||
<path d="M20 50 L40 70 L80 30" stroke="#006600" stroke-width="8" fill="none" visibility="hidden">
|
||||
<set attributeName="visibility" from="hidden" to="visible" begin="circle.end+0.1s"/>
|
||||
<!-- 对勾开始动画 -->
|
||||
<!-- <animate attributeName="stroke-dasharray" from="0,120" to="120,0" dur="1s" begin="circle.end+0.1s" repeatCount="indefinite"/> -->
|
||||
<animate id="check" attributeName="stroke-dasharray" from="0,120" to="120,0" dur="1s" begin="circle.end+0.1s" repeatCount="1"/>
|
||||
<!-- 对勾隐藏动画 -->
|
||||
<set attributeName="visibility" from="visible" to="hidden" begin="check.end+0.1s"/>
|
||||
</path>
|
||||
|
||||
<!-- 扫码成功 -->
|
||||
<!-- <text x="50" y="55" font-size="20" text-anchor="middle" fill="#006600" visibility="hidden">
|
||||
扫码成功
|
||||
<set attributeName="visibility" from="hidden" to="visible" begin="check.end+0.1s"/>
|
||||
</text> -->
|
||||
<text x="50" y="50" font-size="27" font-weight="bold" text-anchor="middle" fill="#006600" visibility="hidden">
|
||||
<tspan x="50" dx="4" dy="-5">扫码</tspan>
|
||||
<tspan x="50" dy="28">成功</tspan>
|
||||
<set attributeName="visibility" from="hidden" to="visible" begin="check.end+0.1s"/>
|
||||
</text>
|
||||
</svg>
|
After Width: | Height: | Size: 1.9 KiB |
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
@@ -10,6 +10,7 @@
|
||||
<title>社区疫情防控系统 - 门禁端</title>
|
||||
<link rel="stylesheet" href="./assets/css/index.css"/>
|
||||
<link rel="stylesheet" href="./assets/css/setting-panel.css"/>
|
||||
<link rel="stylesheet" href="./assets/css/scan-result.css"/>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
@@ -23,6 +24,9 @@
|
||||
</div>
|
||||
<div class="left-container">
|
||||
<h1>进出社区请扫码</h1>
|
||||
<p>1. 打开 微信 > 扫一扫,扫描右侧小程序码</p>
|
||||
<p>2. 点击确认进入,门即开启</p>
|
||||
<!--<h1>进出社区请扫码</h1>
|
||||
<h3>社区居民</h3>
|
||||
<p>1. 打开 微信 > 扫一扫,扫描右侧小程序码</p>
|
||||
<p>2. 点击确认进入,门即开启</p>
|
||||
@@ -32,15 +36,16 @@
|
||||
<p>2. 填写进入申请表</p>
|
||||
|
||||
<h3>长期租客</h3>
|
||||
<p>1. 请联系管理员为你添加进出权限</p>
|
||||
<p>1. 请联系管理员为你添加进出权限</p>-->
|
||||
</div>
|
||||
<div class="right-container">
|
||||
<h1 id="no-qrcode">请选择大门</h1>
|
||||
<img id="qrcode" src="" style="display: none">
|
||||
<img id="qrcode" src="" style="display: none;"><br>
|
||||
<p id="refreshTimeCountDown"></p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 设置页面 -->
|
||||
<div id="full-screen-mask" class="full-screen-mask hidden"></div>
|
||||
<div id="setting-container" class="setting-container hidden">
|
||||
<div class="setting-panel">
|
||||
@@ -63,8 +68,15 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 扫码成功 -->
|
||||
<div id="scan-result-container" class="scan-result-container hidden">
|
||||
<img id="qrcode-scan-success" class="scan-result-image" src="./assets/svg/scan-success.svg">
|
||||
</div>
|
||||
|
||||
<script src="./assets/js/setting-panel.js" type="module"></script>
|
||||
<script src="./renderer.js" type="module"></script>
|
||||
<script src="assets/js/websocket-message-panel.js"></script>
|
||||
<script src="./assets/js/websocket.js"></script>
|
||||
</body>
|
||||
|
@@ -1,7 +1,18 @@
|
||||
/**
|
||||
* FIXME 环境配置
|
||||
*
|
||||
* baseUrl
|
||||
* - 线上环境:"https://epp.only4.work/"
|
||||
* - 开发环境:"/"
|
||||
* envVersion
|
||||
* - 线上环境:"release"
|
||||
* - 开发环境:"develop"
|
||||
*/
|
||||
// 定义常量
|
||||
const url = "https://epp-prod.only4.work/access/wechat/getUnlimitedQRCode"
|
||||
const baseUrl = "https://epp.only4.work/"
|
||||
const url = baseUrl + "access/wechat/getUnlimitedQRCode"
|
||||
const page = "pages/index/index" // "pages/scan/entrance"
|
||||
const envVersion = "develop" // 正式版为 "release",体验版为 "trial",开发版为 "develop"
|
||||
const envVersion = "release" // 正式版为 "release",体验版为 "trial",开发版为 "develop"
|
||||
const autoColor = true
|
||||
const isHyaline = false
|
||||
const width = 500
|
||||
@@ -102,7 +113,7 @@ window.changePanelSelectGate = changePanelSelectGate
|
||||
|
||||
// 发送请求,获取大门列表
|
||||
async function getGateList() {
|
||||
const response = await fetch('https://epp-prod.only4.work/access/gate/guard-client/getGateList');
|
||||
const response = await fetch(baseUrl + 'access/gate/guard-client/getGateList');
|
||||
const data = await response.json();
|
||||
return data.data;
|
||||
}
|
@@ -0,0 +1,92 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>基于微服务的社区疫情防控系统</title>
|
||||
<style>
|
||||
body {
|
||||
font-size: 1.2em;
|
||||
}
|
||||
|
||||
.grid-item {
|
||||
border: 1px solid black;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.grid-item ul {
|
||||
text-align: left;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
|
||||
<div>
|
||||
<h1 style="text-align: center;">基于微服务的社区疫情防控系统</h1>
|
||||
<p style="text-align: center;">epp.only4.work</p>
|
||||
|
||||
<div style="display: grid; grid-template-columns: repeat(2, 1fr);">
|
||||
<div class="grid-item">
|
||||
<h3>
|
||||
门禁端 跨端桌面应用
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
方式1:访问
|
||||
<a target="_blank" href="./guard/index.html">https://epp.only4.work/guard/index.html</a>
|
||||
</li>
|
||||
<li>
|
||||
方式2:运行跨端桌面应用
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="grid-item">
|
||||
<h3>
|
||||
居民端 小程序
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
方式1:扫描下方小程序码
|
||||
<p style="text-align: center">
|
||||
<img src="./assets/image/miniprogram.jpg" style="width: 180px;">
|
||||
</p>
|
||||
</li>
|
||||
<li>
|
||||
方式2:微信搜索小程序 <b>devprogram</b>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="grid-item">
|
||||
<h3>
|
||||
社区管理员端 管理后台
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
访问
|
||||
<a target="_blank" href="./manage/index.html">https://epp.only4.work/manage/index.html</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="grid-item">
|
||||
<h3>
|
||||
系统管理员端 管理后台
|
||||
</h3>
|
||||
<ul>
|
||||
<li>
|
||||
访问
|
||||
<a target="_blank" href="./manage/index.html">https://epp.only4.work/manage/index.html</a>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<h2>开发</h2>
|
||||
<p>小程序后台:<a target="_blank">https://mp.weixin.qq.com/</a></p>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
2
backend/microservice-gateway/src/main/resources/static/manage/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
||||
*
|
||||
!.gitignore
|
@@ -0,0 +1 @@
|
||||
.error-page[data-v-d4771405]{display:flex;justify-content:center;align-items:center;flex-direction:column;width:100%;height:100%;background:#f3f3f3;box-sizing:border-box}.error-code[data-v-d4771405]{line-height:1;font-size:250px;font-weight:bolder;color:#f02d2d}.error-code span[data-v-d4771405]{color:#00a854}.error-desc[data-v-d4771405]{font-size:30px;color:#777}.error-handle[data-v-d4771405]{margin-top:30px;padding-bottom:200px}.error-btn[data-v-d4771405]{margin-left:100px}
|
@@ -0,0 +1 @@
|
||||
.el-card{--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:4px;--el-card-padding:20px;--el-card-bg-color:var(--el-fill-color-blank)}.el-card{border-radius:var(--el-card-border-radius);border:1px solid var(--el-card-border-color);background-color:var(--el-card-bg-color);overflow:hidden;color:var(--el-text-color-primary);transition:var(--el-transition-duration)}.el-card.is-always-shadow{box-shadow:var(--el-box-shadow-light)}.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:var(--el-box-shadow-light)}.el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color);box-sizing:border-box}.el-card__body{padding:var(--el-card-padding)}
|
@@ -0,0 +1 @@
|
||||
:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{-webkit-animation:v-modal-in var(--el-transition-duration-fast) ease;animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{-webkit-animation:v-modal-out var(--el-transition-duration-fast) ease forwards;animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:var(--el-popup-modal-opacity);background:var(--el-popup-modal-bg-color)}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:20px;--el-dialog-border-radius:var(--el-border-radius-small);position:relative;margin:var(--el-dialog-margin-top,15vh) auto 50px;background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:0!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto;margin:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-dialog__header{padding:var(--el-dialog-padding-primary);padding-bottom:10px;margin-right:16px}.el-dialog__headerbtn{position:absolute;top:6px;right:0;padding:0;width:54px;height:54px;background:0 0;border:none;outline:0;cursor:pointer;font-size:var(--el-message-close-size,16px)}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{line-height:var(--el-dialog-font-line-height);font-size:var(--el-dialog-title-font-size);color:var(--el-text-color-primary)}.el-dialog__body{padding:calc(var(--el-dialog-padding-primary) + 10px) var(--el-dialog-padding-primary);color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size)}.el-dialog__footer{padding:var(--el-dialog-padding-primary);padding-top:10px;text-align:right;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px calc(var(--el-dialog-padding-primary) + 5px) 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-overlay-dialog{position:fixed;top:0;right:0;bottom:0;left:0;overflow:auto}.dialog-fade-enter-active{-webkit-animation:modal-fade-in var(--el-transition-duration);animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{-webkit-animation:dialog-fade-in var(--el-transition-duration);animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{-webkit-animation:modal-fade-out var(--el-transition-duration);animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{-webkit-animation:dialog-fade-out var(--el-transition-duration);animation:dialog-fade-out var(--el-transition-duration)}@-webkit-keyframes dialog-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes dialog-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@-webkit-keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-overlay{position:fixed;top:0;right:0;bottom:0;left:0;z-index:2000;height:100%;background-color:var(--el-overlay-color-lighter);overflow:auto}.el-overlay .el-overlay-root{height:0}
|
After Width: | Height: | Size: 6.0 KiB |
@@ -0,0 +1 @@
|
||||
.login-wrap[data-v-ae431c4c]{width:100%;height:100%}.login-container[data-v-ae431c4c]{width:100%;height:100%;display:grid;place-items:center}.ms-title[data-v-ae431c4c]{width:100%;padding:18px 24px;box-sizing:border-box;text-align:center;font-size:20px;color:#fff;border-bottom:1px solid #ddd}.ms-login[data-v-ae431c4c]{width:min(380px,95vw);padding:5px 10px;border-radius:5px;background:rgba(255,255,255,.3);overflow:hidden}.ms-content[data-v-ae431c4c]{padding:30px}.login-btn[data-v-ae431c4c]{text-align:center}.login-btn button[data-v-ae431c4c]{width:100%;height:36px;margin-bottom:10px}.company-info[data-v-ae431c4c]{color:#7589b6;text-align:center;position:absolute;left:0;right:0;bottom:10px;font-size:13px;letter-spacing:1px}
|
@@ -0,0 +1 @@
|
||||
.line-height{line-height:2.7em}.row-index{width:110px;display:inline-block}
|
@@ -0,0 +1,9 @@
|
||||
/*!
|
||||
* Cropper.js v1.5.13
|
||||
* https://fengyuanchen.github.io/cropperjs
|
||||
*
|
||||
* Copyright 2015-present Chen Fengyuan
|
||||
* Released under the MIT license
|
||||
*
|
||||
* Date: 2022-11-20T05:30:43.444Z
|
||||
*/.cropper-container{direction:ltr;font-size:0;line-height:0;position:relative;-ms-touch-action:none;touch-action:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.cropper-container img{-webkit-backface-visibility:hidden;backface-visibility:hidden;display:block;height:100%;image-orientation:0deg;max-height:none!important;max-width:none!important;min-height:0!important;min-width:0!important;width:100%}.cropper-wrap-box,.cropper-canvas,.cropper-drag-box,.cropper-crop-box,.cropper-modal{bottom:0;left:0;position:absolute;right:0;top:0}.cropper-wrap-box,.cropper-canvas{overflow:hidden}.cropper-drag-box{background-color:#fff;opacity:0}.cropper-modal{background-color:#000;opacity:.5}.cropper-view-box{display:block;height:100%;outline:1px solid #39f;outline-color:#3399ffbf;overflow:hidden;width:100%}.cropper-dashed{border:0 dashed #eee;display:block;opacity:.5;position:absolute}.cropper-dashed.dashed-h{border-bottom-width:1px;border-top-width:1px;height:calc(100% / 3);left:0;top:calc(100% / 3);width:100%}.cropper-dashed.dashed-v{border-left-width:1px;border-right-width:1px;height:100%;left:calc(100% / 3);top:0;width:calc(100% / 3)}.cropper-center{display:block;height:0;left:50%;opacity:.75;position:absolute;top:50%;width:0}.cropper-center:before,.cropper-center:after{background-color:#eee;content:" ";display:block;position:absolute}.cropper-center:before{height:1px;left:-3px;top:0;width:7px}.cropper-center:after{height:7px;left:0;top:-3px;width:1px}.cropper-face,.cropper-line,.cropper-point{display:block;height:100%;opacity:.1;position:absolute;width:100%}.cropper-face{background-color:#fff;left:0;top:0}.cropper-line{background-color:#39f}.cropper-line.line-e{cursor:ew-resize;right:-3px;top:0;width:5px}.cropper-line.line-n{cursor:ns-resize;height:5px;left:0;top:-3px}.cropper-line.line-w{cursor:ew-resize;left:-3px;top:0;width:5px}.cropper-line.line-s{bottom:-3px;cursor:ns-resize;height:5px;left:0}.cropper-point{background-color:#39f;height:5px;opacity:.75;width:5px}.cropper-point.point-e{cursor:ew-resize;margin-top:-3px;right:-3px;top:50%}.cropper-point.point-n{cursor:ns-resize;left:50%;margin-left:-3px;top:-3px}.cropper-point.point-w{cursor:ew-resize;left:-3px;margin-top:-3px;top:50%}.cropper-point.point-s{bottom:-3px;cursor:s-resize;left:50%;margin-left:-3px}.cropper-point.point-ne{cursor:nesw-resize;right:-3px;top:-3px}.cropper-point.point-nw{cursor:nwse-resize;left:-3px;top:-3px}.cropper-point.point-sw{bottom:-3px;cursor:nesw-resize;left:-3px}.cropper-point.point-se{bottom:-3px;cursor:nwse-resize;height:20px;opacity:1;right:-3px;width:20px}@media (min-width: 768px){.cropper-point.point-se{height:15px;width:15px}}@media (min-width: 992px){.cropper-point.point-se{height:10px;width:10px}}@media (min-width: 1200px){.cropper-point.point-se{height:5px;opacity:.75;width:5px}}.cropper-point.point-se:before{background-color:#39f;bottom:-50%;content:" ";display:block;height:200%;opacity:0;position:absolute;right:-50%;width:200%}.cropper-invisible{opacity:0}.cropper-bg{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAAA3NCSVQICAjb4U/gAAAABlBMVEXMzMz////TjRV2AAAACXBIWXMAAArrAAAK6wGCiw1aAAAAHHRFWHRTb2Z0d2FyZQBBZG9iZSBGaXJld29ya3MgQ1M26LyyjAAAABFJREFUCJlj+M/AgBVhF/0PAH6/D/HkDxOGAAAAAElFTkSuQmCC)}.cropper-hide{display:block;height:0;position:absolute;width:0}.cropper-hidden{display:none!important}.cropper-move{cursor:move}.cropper-crop{cursor:crosshair}.cropper-disabled .cropper-drag-box,.cropper-disabled .cropper-face,.cropper-disabled .cropper-line,.cropper-disabled .cropper-point{cursor:not-allowed}.info[data-v-e7288b09]{text-align:center;padding:35px 0}.info-image[data-v-e7288b09]{position:relative;margin:auto;width:100px;height:100px;background:#f8f8f8;border:1px solid #eee;border-radius:50px;overflow:hidden}.info-edit[data-v-e7288b09]{display:flex;justify-content:center;align-items:center;position:absolute;left:0;top:0;width:100%;height:100%;background:rgba(0,0,0,.5);opacity:0;transition:opacity .3s ease}.info-edit i[data-v-e7288b09]{color:#eee;font-size:25px}.info-image:hover .info-edit[data-v-e7288b09]{opacity:1}.info-name[data-v-e7288b09]{margin:15px 0 10px;font-size:24px;font-weight:500;color:#262626}.crop-demo-btn[data-v-e7288b09]{position:relative}.crop-input[data-v-e7288b09]{position:absolute;width:100px;height:40px;left:0;top:0;opacity:0;cursor:pointer}
|
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||
<meta name="viewport" content="width=device-width,initial-scale=1.0">
|
||||
<title></title>
|
||||
<link rel="stylesheet" href="https://at.alicdn.com/t/font_830376_qzecyukz0s.css">
|
||||
<script type="module" crossorigin src="./assets/index.f92c5f31.js"></script>
|
||||
<link rel="stylesheet" href="./assets/index.ca6f3a66.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<noscript>
|
||||
<strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled.
|
||||
Please enable it to continue.</strong>
|
||||
</noscript>
|
||||
<div id="app"></div>
|
||||
|
||||
<!-- built files will be auto injected -->
|
||||
</body>
|
||||
|
||||
</html>
|
@@ -61,6 +61,13 @@ public class AccessLogController {
|
||||
return Res.error("参数错误");
|
||||
}
|
||||
|
||||
// 推送到门禁端
|
||||
JSONObject websocketData = new JSONObject();
|
||||
websocketData.put("gateId", gateId);
|
||||
websocketData.put("action", "onopen");
|
||||
String websocketJSON = websocketData.toString();
|
||||
WebSocketServer.sendAllMessage(websocketJSON);
|
||||
|
||||
AccessLog accessLog = new AccessLog();
|
||||
accessLog.setId(null);
|
||||
accessLog.setType(type);
|
||||
|
@@ -58,6 +58,14 @@ public class GateController {
|
||||
Long gateId = Long.valueOf(id);
|
||||
Gate gate = gateService.getGateById(gateId);
|
||||
GateVO gateVO = GateVO.convertFrom(gate);
|
||||
|
||||
// 推送到门禁端
|
||||
JSONObject websocketData = new JSONObject();
|
||||
websocketData.put("gateId", id);
|
||||
websocketData.put("action", "onscan");
|
||||
String websocketJSON = websocketData.toString();
|
||||
WebSocketServer.sendAllMessage(websocketJSON);
|
||||
|
||||
return Res.success(gateVO);
|
||||
}
|
||||
|
||||
|
@@ -1,5 +1,6 @@
|
||||
package com.cxyxiaomo.epp.access.controller;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.cxyxiaomo.epp.access.pojo.UnlimitedQRCodeParam;
|
||||
import com.cxyxiaomo.epp.access.service.WeChatTokenServiceImpl;
|
||||
import com.cxyxiaomo.epp.common.response.Res;
|
||||
@@ -47,7 +48,28 @@ public class WeChatTokenController {
|
||||
unlimitedQRCodeParam.setIsHyaline(isHyaline);
|
||||
okhttp3.ResponseBody responseBody = weChatTokenService.getUnlimitedQRCodeFromApi(accessToken, unlimitedQRCodeParam);
|
||||
|
||||
try {
|
||||
// {"errcode":40001,"errmsg":"invalid credential, access_token is invalid or not latest, could get access_token by getStableAccessToken, more details at https://mmbizurl.cn/s/JtxxFh33r rid: 6446bac4-4a6b0410-118a16e7"}
|
||||
if (Objects.requireNonNull(responseBody.contentType()).subtype().equals("json")) {
|
||||
// 返回了 JSON 说明失败了
|
||||
String jsonString = responseBody.string();
|
||||
JSONObject jsonObject = JSONObject.parseObject(jsonString);
|
||||
String errcode = jsonObject.getString("errcode");
|
||||
if (errcode.equals("40001")) {
|
||||
// 重新获取 Access Token
|
||||
accessToken = weChatTokenService.getAccessToken(true);
|
||||
responseBody = weChatTokenService.getUnlimitedQRCodeFromApi(accessToken, unlimitedQRCodeParam);
|
||||
} else if (errcode.equals("40013")) {
|
||||
System.out.println("40013 invalid appid 不合法的 AppID ,请开发者检查 AppID 的正确性,避免异常字符,注意大小写\n" +
|
||||
"docs: https://developers.weixin.qq.com/miniprogram/dev/OpenApiDoc/mp-access-token/getAccessToken.html");
|
||||
return null;
|
||||
}
|
||||
}
|
||||
// 返回了图片,直接返回
|
||||
return responseBody.bytes();
|
||||
} catch (NullPointerException ignored) {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
@GetMapping(value = "/rpc/getOpenIdFromApi")
|
||||
|
@@ -18,7 +18,7 @@ public class WebSocketServer {
|
||||
private Session session;
|
||||
|
||||
// session集合,存放对应的session
|
||||
private static ConcurrentHashMap<Integer, Session> sessionPool = new ConcurrentHashMap<>();
|
||||
private static ConcurrentHashMap<String, Session> sessionPool = new ConcurrentHashMap<>();
|
||||
|
||||
// concurrent包的线程安全Set,用来存放每个客户端对应的WebSocket对象。
|
||||
private static CopyOnWriteArraySet<WebSocketServer> webSocketSet = new CopyOnWriteArraySet<>();
|
||||
@@ -30,7 +30,7 @@ public class WebSocketServer {
|
||||
* @param userId 用户ID
|
||||
*/
|
||||
@OnOpen
|
||||
public void onOpen(Session session, @PathParam(value = "userId") Integer userId) {
|
||||
public void onOpen(Session session, @PathParam(value = "userId") String userId) {
|
||||
log.info("WebSocket建立连接中,连接用户ID:{}", userId);
|
||||
try {
|
||||
Session historySession = sessionPool.get(userId);
|
||||
@@ -84,7 +84,7 @@ public class WebSocketServer {
|
||||
* @param userId 用户ID
|
||||
* @param message 发送的消息
|
||||
*/
|
||||
public static void sendMessageByUser(Integer userId, String message) {
|
||||
public static void sendMessageByUser(String userId, String message) {
|
||||
log.info("用户ID:" + userId + ",推送内容:" + message);
|
||||
Session session = sessionPool.get(userId);
|
||||
try {
|
||||
|
@@ -35,12 +35,18 @@ public class WeChatTokenServiceImpl implements WeChatTokenService {
|
||||
|
||||
@Override
|
||||
public String getAccessToken() {
|
||||
return getAccessToken(false);
|
||||
}
|
||||
|
||||
public String getAccessToken(Boolean forceUpdate) {
|
||||
if (!forceUpdate) {
|
||||
// 首先从数据库中查询是否存在 access_token
|
||||
// 如果存在且没有过期,那么就直接返回(距离失效时间小于 3 分钟就当作过期)
|
||||
Setting atSetting = accessDao.getValueByKey(SETTING_KEY);
|
||||
if (atSetting != null && LocalDateTime.now().plusMinutes(3L).compareTo(atSetting.getTime()) < 0) {
|
||||
return atSetting.getValue();
|
||||
}
|
||||
}
|
||||
|
||||
// 否则则去请求一个新的 access_token
|
||||
JSONObject jsonObject = getAccessTokenFromApi();
|
||||
|
@@ -56,8 +56,15 @@ public class GoodController {
|
||||
searchText = null;
|
||||
}
|
||||
}
|
||||
List<GoodVO> list = goodService.list(cateId, searchText);
|
||||
return Res.success(list);
|
||||
List<GoodVO> list = goodService.listOnSale(cateId, searchText);
|
||||
// return Res.success(list);
|
||||
|
||||
// 小程序商品列表页 划线价格 和 未划线价格 写反了,所以接口这里也反过来写
|
||||
return Res.success(list.stream().peek(i -> {
|
||||
Double retailPrice = i.getRetailPrice();
|
||||
i.setRetailPrice(i.getCounterPrice());
|
||||
i.setCounterPrice(retailPrice);
|
||||
}).collect(Collectors.toList()));
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -100,7 +107,8 @@ public class GoodController {
|
||||
|
||||
// 分类列表
|
||||
List<GoodCategory> cateList = goodService.getCateList();
|
||||
String cateListForMock = JSONArray.from(cateList.stream().map(i -> i.getId()).collect(Collectors.toList())).toString();
|
||||
String cateListForMock = JSONArray.from(cateList.stream()
|
||||
.map(i -> i.getId().toString()).collect(Collectors.toList())).toString();
|
||||
|
||||
// id列 字段名(区分大小写;以VO中的变量名为准)
|
||||
// 新增、修改弹窗时,使用该列作为主键列进行操作
|
||||
@@ -119,21 +127,30 @@ public class GoodController {
|
||||
null // "IMG 120x120,随机图片"
|
||||
)
|
||||
.add("goodsName", "goodsName", "商品名称", "",
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.INPUT, EditType.CAN_NOT_EDIT,
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
"商品名称", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("商品名称").required())
|
||||
.add(FieldRuleBuilder.create("商品名称").minMax(6, 20)),
|
||||
.add(FieldRuleBuilder.create("商品名称").minMax(2, 20)),
|
||||
"DPD @cword(6, 20)"
|
||||
)
|
||||
.add("brief", "brief", "商品简介", "暂无简介",
|
||||
FieldType.LONG_TEXT, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
"商品简介", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("商品简介").required())
|
||||
.add(FieldRuleBuilder.create("商品简介").minMax(2, 30)),
|
||||
"DPD @cword(15, 30)"
|
||||
)
|
||||
.add("categoryId", "categoryName", "所属分类", "",
|
||||
FieldType.TEXT, SearchType.SELECT, AddType.SELECT, EditType.SELECT,
|
||||
"商品分类",
|
||||
"商品分类", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("商品分类").required()),
|
||||
"DPD @pick(" + cateListForMock + "])"
|
||||
"DPD @pick(" + cateListForMock + ")"
|
||||
)
|
||||
.add("brand", "brand", "商品品牌", "",
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||
@@ -141,19 +158,10 @@ public class GoodController {
|
||||
"商品品牌", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("商品品牌").required())
|
||||
.add(FieldRuleBuilder.create("商品品牌").minMax(6, 20)),
|
||||
.add(FieldRuleBuilder.create("商品品牌").minMax(2, 20)),
|
||||
"DPD @cword(6, 15)"
|
||||
)
|
||||
.add("brief", "brief", "商品简介", "暂无简介",
|
||||
FieldType.HIDDEN, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
"商品简介", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("商品简介").required())
|
||||
.add(FieldRuleBuilder.create("商品简介").minMax(6, 30)),
|
||||
"DPD @cword(15, 30)"
|
||||
)
|
||||
.add("isOnSale", "isOnSale", "状态", true,
|
||||
.add("isOnSale", "isOnSaleDisplay", "状态", true,
|
||||
FieldType.TEXT, SearchType.SELECT, AddType.SELECT, EditType.SELECT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
"状态", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
@@ -177,20 +185,24 @@ public class GoodController {
|
||||
"DPD @cword(1, 2)"
|
||||
)
|
||||
.add("counterPrice", "counterPrice", "专柜价格", "",
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.INPUT_NUMBER, EditType.INPUT_NUMBER,
|
||||
"专柜价/原价/划线价",
|
||||
"专柜价格 / 原价 / 划线价", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("专柜价格").required()),
|
||||
"DTD /^\\d+?(\\.?\\d+?)?$/"
|
||||
.add(FieldRuleBuilder.create("专柜价格").required())
|
||||
// .add(FieldRuleBuilder.create("专柜价格").regexp("^(\\d+(\\.\\d{1,2})?)$"))
|
||||
,
|
||||
"DTD /^[1-9]\\d{0,4}(\\.?\\d{1,2})?$/"
|
||||
)
|
||||
.add("retailPrice", "retailPrice", "零售价格", "",
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.INPUT, EditType.INPUT,
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.INPUT_NUMBER, EditType.INPUT_NUMBER,
|
||||
"零售价/售价/未划线价",
|
||||
"零售价 / 售价 / 未划线价", FieldBuilder.EDIT_PLACEHOLDER_SAME_AS_ADD_PLACEHOLDER,
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("零售价格").required()),
|
||||
"DTD /^\\d+?(\\.?\\d+?)?$/"
|
||||
.add(FieldRuleBuilder.create("零售价格").required())
|
||||
// .add(FieldRuleBuilder.create("零售价格").regexp("^(\\d+(\\.\\d{1,2})?)$"))
|
||||
,
|
||||
"DTD /^[1-9]\\d{0,2}(\\.?\\d{1,2})?$/"
|
||||
)
|
||||
.add("detail", "detail", "商品详细介绍", "暂无商品详细介绍",
|
||||
FieldType.LONG_TEXT, SearchType.INPUT, AddType.TEXTAREA, EditType.TEXTAREA,
|
||||
@@ -212,7 +224,7 @@ public class GoodController {
|
||||
// build
|
||||
JSONArray fieldMapper = FieldMapperBuilder.create()
|
||||
.add("categoryId", "categoryName", cateMap)
|
||||
.add("isOnSale", "isOnSale", stateMap)
|
||||
.add("isOnSale", "isOnSaleDisplay", stateMap)
|
||||
.build();
|
||||
|
||||
// 拼装返回结果
|
||||
@@ -237,6 +249,18 @@ public class GoodController {
|
||||
@ResponseBody
|
||||
public Res editGood(@ModelAttribute GoodVO goodVO) {
|
||||
Good good = GoodVO.convertTo(goodVO);
|
||||
Double retailPrice = good.getRetailPrice();
|
||||
if (Objects.nonNull(retailPrice)) {
|
||||
if (retailPrice < 0 || retailPrice > 99999999.99) {
|
||||
return Res.error("零售价格输入不符,须在 0 - 99999999.99 之间");
|
||||
}
|
||||
}
|
||||
Double counterPrice = good.getCounterPrice();
|
||||
if (Objects.nonNull(counterPrice)) {
|
||||
if (counterPrice < 0 || counterPrice > 99999999.99) {
|
||||
return Res.error("专柜价格输入不符,须在 0 - 99999999.99 之间");
|
||||
}
|
||||
}
|
||||
|
||||
// 先查询商品是否存在
|
||||
Good existGood = goodService.getGoodById(good.getId());
|
||||
|
@@ -2,18 +2,31 @@ package com.cxyxiaomo.epp.shop.controller;
|
||||
|
||||
import com.alibaba.fastjson2.JSONArray;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import com.cxyxiaomo.epp.PageTable.enums.AddType;
|
||||
import com.cxyxiaomo.epp.PageTable.enums.EditType;
|
||||
import com.cxyxiaomo.epp.PageTable.enums.FieldType;
|
||||
import com.cxyxiaomo.epp.PageTable.enums.SearchType;
|
||||
import com.cxyxiaomo.epp.PageTable.query.PageQuery;
|
||||
import com.cxyxiaomo.epp.PageTable.utils.FieldBuilder;
|
||||
import com.cxyxiaomo.epp.PageTable.utils.FieldMapperBuilder;
|
||||
import com.cxyxiaomo.epp.PageTable.utils.FieldRuleBuilder;
|
||||
import com.cxyxiaomo.epp.PageTable.utils.FieldRuleListBuilder;
|
||||
import com.cxyxiaomo.epp.common.enums.OrderStatus;
|
||||
import com.cxyxiaomo.epp.common.pojo.Order;
|
||||
import com.cxyxiaomo.epp.common.pojo.OrderDetail;
|
||||
import com.cxyxiaomo.epp.common.query.OrderQuery;
|
||||
import com.cxyxiaomo.epp.common.response.Res;
|
||||
import com.cxyxiaomo.epp.common.vo.GoodVO;
|
||||
import com.cxyxiaomo.epp.common.vo.OrderDetailVO;
|
||||
import com.cxyxiaomo.epp.common.vo.OrderVO;
|
||||
import com.cxyxiaomo.epp.shop.service.GoodService;
|
||||
import com.cxyxiaomo.epp.shop.service.OrderService;
|
||||
import com.github.pagehelper.PageHelper;
|
||||
import com.github.pagehelper.PageInfo;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import java.text.SimpleDateFormat;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
@@ -30,8 +43,8 @@ public class OrderController {
|
||||
/**
|
||||
* 小程序端创建订单
|
||||
*
|
||||
* @param userId 下单用户
|
||||
* @param orderList 下单商品 [ { goodId, count }, ... ]
|
||||
* @param params userId 下单用户
|
||||
* @param params orderList 下单商品 [ { goodId, count }, ... ]
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/miniprogram/createOrder")
|
||||
@@ -184,6 +197,12 @@ public class OrderController {
|
||||
return Res.success(success ? "支付成功" : "支付失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 用户取消订单
|
||||
*
|
||||
* @param params
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/miniprogram/cancelOrder")
|
||||
@ResponseBody
|
||||
public Res cancelOrder(@RequestBody JSONObject params) {
|
||||
@@ -224,6 +243,106 @@ public class OrderController {
|
||||
return Res.success(success ? "取消成功" : "取消失败");
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单发货
|
||||
*
|
||||
* @param orderId
|
||||
* @param expressId
|
||||
* @param comment
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/manage/deliverOrder")
|
||||
@ResponseBody
|
||||
public Res deliverOrder(Long orderId, String expressId, String comment) {
|
||||
if (orderId == null || expressId == null || comment == null) {
|
||||
return Res.error("参数错误");
|
||||
}
|
||||
|
||||
if (expressId.equals("") && comment.equals("")) {
|
||||
return Res.error("运单号 和 发货备注 不可同时为空");
|
||||
}
|
||||
|
||||
// 查询订单详情
|
||||
Order order = orderService.getOrderById(orderId);
|
||||
if (order == null) {
|
||||
return Res.error("订单不存在");
|
||||
}
|
||||
|
||||
//判断是否可以发货
|
||||
OrderStatus orderStatus = OrderStatus.get(order.getOrderStatus());
|
||||
switch (orderStatus) {
|
||||
case PENDING:
|
||||
return Res.error("订单尚未支付,不可发货");
|
||||
case PROCESSING: // 订单未发货
|
||||
// 更新订单发货信息
|
||||
orderService.updateOrderShipInfo(orderId, expressId, comment);
|
||||
// 更新支付信息
|
||||
orderService.updateOrderStatus(orderId, OrderStatus.SHIPPED);
|
||||
return Res.success("发货成功");
|
||||
case SHIPPED: // 订单已发货,修改发货信息
|
||||
// 更新订单发货信息
|
||||
orderService.updateOrderShipInfo(orderId, expressId, comment);
|
||||
return Res.success("发货信息修改成功");
|
||||
case DELIVERED:
|
||||
return Res.error("订单已完成,无法再次发货");
|
||||
case CANCELLED:
|
||||
return Res.error("订单已取消,不可发货");
|
||||
default:
|
||||
return Res.error("当前订单状态不可发货");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 管理员取消订单
|
||||
*
|
||||
* @param orderId
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/manage/cancelOrder")
|
||||
@ResponseBody
|
||||
public Res cancelOrderByManager(Long orderId) {
|
||||
if (orderId == null) {
|
||||
return Res.error("参数错误");
|
||||
}
|
||||
|
||||
// 查询订单详情
|
||||
Order order = orderService.getOrderById(orderId);
|
||||
if (order == null) {
|
||||
return Res.error("订单不存在");
|
||||
}
|
||||
|
||||
//判断是否可以取消
|
||||
OrderStatus orderStatus = OrderStatus.get(order.getOrderStatus());
|
||||
switch (orderStatus) {
|
||||
case PENDING:
|
||||
// 更新订单发货信息
|
||||
orderService.updateOrderShipInfo(orderId, "", "管理员取消了您的订单,如有疑问请联系管理员");
|
||||
// 更新支付信息
|
||||
orderService.updateOrderStatus(orderId, OrderStatus.CANCELLED);
|
||||
return Res.success("操作成功");
|
||||
case PROCESSING:
|
||||
// 更新订单发货信息
|
||||
orderService.updateOrderShipInfo(orderId, "", "管理员取消了您的订单,费用已退回至您的帐户,如有疑问请联系管理员");
|
||||
// 更新支付信息
|
||||
orderService.updateOrderStatus(orderId, OrderStatus.CANCELLED);
|
||||
return Res.success("操作成功");
|
||||
case SHIPPED:
|
||||
return Res.error("订单已发货,不可取消");
|
||||
case DELIVERED:
|
||||
return Res.error("订单已送达,不可取消");
|
||||
case CANCELLED:
|
||||
return Res.error("订单已取消");
|
||||
default:
|
||||
return Res.error("当前订单状态无法取消");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 订单确认收货
|
||||
*
|
||||
* @param params
|
||||
* @return
|
||||
*/
|
||||
@PostMapping("/miniprogram/confirmOrder")
|
||||
@ResponseBody
|
||||
public Res confirmOrder(@RequestBody JSONObject params) {
|
||||
@@ -261,4 +380,189 @@ public class OrderController {
|
||||
|
||||
return Res.success(success ? "确认收货成功" : "确认收货失败");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 获取订单列表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/manage/getOrderList")
|
||||
@ResponseBody
|
||||
public Res getOrderList(PageQuery pageQuery, OrderQuery orderQuery) {
|
||||
// 查询分页数据
|
||||
PageHelper.startPage(pageQuery.getPageIndex(), pageQuery.getPageSize());
|
||||
List<Order> orderList = orderService.getOrderList(orderQuery);
|
||||
PageInfo<Order> orderPageInfo = new PageInfo<>(orderList);
|
||||
List<Order> list = orderPageInfo.getList();
|
||||
List<OrderVO> voList = OrderVO.convertFrom(list);
|
||||
|
||||
// id列 字段名(区分大小写;以VO中的变量名为准)
|
||||
// 新增、修改弹窗时,使用该列作为主键列进行操作
|
||||
String idFieldName = "id";
|
||||
|
||||
// 当前管理页面
|
||||
String pageName = "订单管理";
|
||||
|
||||
// 指定前端表格显示列
|
||||
JSONArray columns = FieldBuilder.create()
|
||||
.add("userId", "userId", "用户ID", "",
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("orderStatusCode", "orderStatusName", "订单状态", true,
|
||||
FieldType.TEXT, SearchType.SELECT, AddType.CAN_NOT_ADD, EditType.SELECT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, "订单状态",
|
||||
FieldRuleListBuilder.create()
|
||||
.add(FieldRuleBuilder.create("订单状态").required()),
|
||||
null
|
||||
)
|
||||
.add("orderPrice", "orderPrice", "订单价格", "",
|
||||
FieldType.TEXT, SearchType.CAN_NOT_SEARCH, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("orderDate", "orderDate", "下单时间", "",
|
||||
FieldType.TEXT, SearchType.CAN_NOT_SEARCH, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("payDate", "payDate", "支付时间", "",
|
||||
FieldType.TEXT, SearchType.CAN_NOT_SEARCH, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("cancelDate", "cancelDate", "取消时间", "",
|
||||
FieldType.TEXT, SearchType.CAN_NOT_SEARCH, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("shipDate", "shipDate", "发货时间", "",
|
||||
FieldType.TEXT, SearchType.CAN_NOT_SEARCH, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("deliverDate", "deliverDate", "送达时间", "",
|
||||
FieldType.TEXT, SearchType.CAN_NOT_SEARCH, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("expressId", "expressId", "运单号", "",
|
||||
FieldType.TEXT, SearchType.INPUT, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.add("comment", "comment", "发货备注", "",
|
||||
FieldType.LONG_TEXT, SearchType.CAN_NOT_SEARCH, AddType.CAN_NOT_ADD, EditType.CAN_NOT_EDIT,
|
||||
FieldBuilder.SEARCH_PLACEHOLDER_SAME_AS_FIELDNAME,
|
||||
null, null, null, null
|
||||
)
|
||||
.build();
|
||||
|
||||
// 指定需要翻译的字段
|
||||
OrderStatus[] orderStatusList = OrderStatus.values();
|
||||
HashMap<String, String> orderStatusMap = new HashMap<>(orderStatusList.length);
|
||||
for (OrderStatus orderStatus : orderStatusList) {
|
||||
orderStatusMap.put(orderStatus.getValue(), orderStatus.toString());
|
||||
}
|
||||
// build
|
||||
JSONArray fieldMapper = FieldMapperBuilder.create()
|
||||
.add("orderStatusCode", "orderStatusName", orderStatusMap)
|
||||
.build();
|
||||
|
||||
// 拼装返回结果
|
||||
JSONObject map = new JSONObject(6);
|
||||
map.put("total", orderPageInfo.getTotal());
|
||||
map.put("list", voList);
|
||||
map.put("columns", columns);
|
||||
map.put("fieldMapper", fieldMapper);
|
||||
map.put("idFieldName", idFieldName);
|
||||
map.put("pageName", pageName);
|
||||
|
||||
// 返回结果
|
||||
return Res.success(map);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * 编辑订单
|
||||
// *
|
||||
// * @return
|
||||
// */
|
||||
// @PostMapping("/manage/editOrder")
|
||||
// @ResponseBody
|
||||
// public Res editOrder(@ModelAttribute OrderVO OrderVO) {
|
||||
// Order Order = OrderVO.convertTo(OrderVO);
|
||||
//
|
||||
// // 先查询订单是否存在
|
||||
// Order existOrder = orderService.getOrderById(Order.getId());
|
||||
//
|
||||
// if (Order.getId() == null || Order.getId() < 1) {
|
||||
// // 新增订单
|
||||
// if (existOrder != null) {
|
||||
// return Res.error("订单已存在,操作失败");
|
||||
// }
|
||||
//
|
||||
// if (Order.getOrdersName() == null || "".equals(Order.getOrdersName())) {
|
||||
// return Res.error("订单名称不能为空");
|
||||
// }
|
||||
// Order.setId(null);
|
||||
// orderService.addOrder(Order);
|
||||
// } else {
|
||||
// // 修改订单
|
||||
// if (existOrder == null) {
|
||||
// return Res.error("订单不存在,操作失败");
|
||||
// }
|
||||
//
|
||||
// orderService.updateOrder(Order);
|
||||
// }
|
||||
// return Res.success(true);
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * 关闭订单
|
||||
// *
|
||||
// * @param id
|
||||
// * @return
|
||||
// */
|
||||
// @PostMapping("/manage/deleteOrder")
|
||||
// @ResponseBody
|
||||
// public Res deleteOrder(Long id) {
|
||||
// if (id == null || id <= 0) {
|
||||
// return Res.error("订单不存在,删除失败");
|
||||
// }
|
||||
// // 先查询订单是否存在
|
||||
// Order existOrder = orderService.getOrderById(id);
|
||||
// if (existOrder == null) {
|
||||
// return Res.error("订单不存在,删除失败");
|
||||
// }
|
||||
// boolean b = orderService.deleteOrder(existOrder.getId());
|
||||
// return Res.success(b);
|
||||
// }
|
||||
|
||||
/**
|
||||
* 导出订单列表
|
||||
*
|
||||
* @return
|
||||
*/
|
||||
@GetMapping("/manage/exportOrderList")
|
||||
@ResponseBody
|
||||
public Res exportOrderList(OrderQuery orderQuery) {
|
||||
List<Order> orderList = orderService.getOrderList(orderQuery);
|
||||
List<OrderVO> orderVOList = OrderVO.convertFrom(orderList);
|
||||
|
||||
// 当前时间
|
||||
Date now = Calendar.getInstance().getTime();
|
||||
SimpleDateFormat format = new SimpleDateFormat("yyyyMMdd_HHmmss");
|
||||
String dateTime = format.format(now);
|
||||
|
||||
HashMap<String, Object> map = new HashMap<>();
|
||||
map.put("list", orderVOList);
|
||||
map.put("sheetName", "订单表-" + System.currentTimeMillis());
|
||||
map.put("fileName", "订单表_导出时间_" + dateTime);
|
||||
|
||||
return Res.success(map);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -14,6 +14,8 @@ public interface GoodDao {
|
||||
|
||||
List<Good> list(@Param("cateId") Integer cateId, @Param("searchText") String searchText);
|
||||
|
||||
List<Good> listOnSale(@Param("cateId") Integer cateId, @Param("searchText") String searchText);
|
||||
|
||||
Good getById(Long id);
|
||||
|
||||
Good selectById(Long id);
|
||||
@@ -27,13 +29,7 @@ public interface GoodDao {
|
||||
Integer deleteById(Integer id);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
// Manage
|
||||
public boolean addGood(Good good);
|
||||
|
||||
public boolean updateGood(Good good);
|
||||
|
@@ -2,6 +2,7 @@ package com.cxyxiaomo.epp.shop.dao;
|
||||
|
||||
import com.cxyxiaomo.epp.common.pojo.Order;
|
||||
import com.cxyxiaomo.epp.common.pojo.OrderDetail;
|
||||
import com.cxyxiaomo.epp.common.query.OrderQuery;
|
||||
import org.apache.ibatis.annotations.Mapper;
|
||||
import org.apache.ibatis.annotations.Param;
|
||||
import org.springframework.stereotype.Repository;
|
||||
@@ -62,6 +63,19 @@ public interface OrderDao {
|
||||
*/
|
||||
int updateOrderStatus(@Param("orderId") Long orderId, @Param("orderStatus") String orderStatus);
|
||||
|
||||
/**
|
||||
* 更新订单发货信息
|
||||
*
|
||||
* @param orderId
|
||||
* @param expressId
|
||||
* @param comment
|
||||
* @return
|
||||
*/
|
||||
int updateOrderShipInfo(@Param("orderId") Long orderId, @Param("expressId") String expressId, @Param("comment") String comment);
|
||||
|
||||
// 根据订单 ID 删除订单信息及订单详情信息
|
||||
int deleteOrderById(Long orderId);
|
||||
boolean deleteOrderById(Long orderId);
|
||||
|
||||
|
||||
public List<Order> getOrderList(OrderQuery orderQuery);
|
||||
}
|
||||
|
@@ -27,6 +27,13 @@ public class GoodService {
|
||||
return goodVOS;
|
||||
}
|
||||
|
||||
// 只列出上架状态的商品
|
||||
public List<GoodVO> listOnSale(Integer cateId, String searchText) {
|
||||
List<Good> list = goodDao.listOnSale(cateId, searchText);
|
||||
List<GoodVO> goodVOS = GoodVO.convertFrom(list);
|
||||
return goodVOS;
|
||||
}
|
||||
|
||||
public GoodVO getById(Long id) {
|
||||
Good good = goodDao.getById(id);
|
||||
GoodVO goodVO = GoodVO.convertFrom(good);
|
||||
|
@@ -4,6 +4,7 @@ import com.cxyxiaomo.epp.common.enums.OrderStatus;
|
||||
import com.cxyxiaomo.epp.common.pojo.Good;
|
||||
import com.cxyxiaomo.epp.common.pojo.Order;
|
||||
import com.cxyxiaomo.epp.common.pojo.OrderDetail;
|
||||
import com.cxyxiaomo.epp.common.query.OrderQuery;
|
||||
import com.cxyxiaomo.epp.common.utils.SnowflakeManager;
|
||||
import com.cxyxiaomo.epp.common.vo.OrderDetailVO;
|
||||
import com.cxyxiaomo.epp.shop.dao.GoodDao;
|
||||
@@ -132,4 +133,15 @@ public class OrderService {
|
||||
int affectRows = orderDao.updateOrderStatus(orderId, orderStatus.getValue());
|
||||
return affectRows > 0;
|
||||
}
|
||||
|
||||
public Boolean updateOrderShipInfo(Long orderId, String expressId, String comment) {
|
||||
int affectRows = orderDao.updateOrderShipInfo(orderId, expressId, comment);
|
||||
return affectRows > 0;
|
||||
}
|
||||
|
||||
|
||||
public List<Order> getOrderList(OrderQuery orderQuery) {
|
||||
return orderDao.getOrderList(orderQuery);
|
||||
}
|
||||
|
||||
}
|
||||
|
@@ -37,6 +37,20 @@
|
||||
</if>
|
||||
order by `sort_order` asc
|
||||
</select>
|
||||
<select id="listOnSale" resultType="com.cxyxiaomo.epp.common.pojo.Good">
|
||||
SELECT *
|
||||
FROM goods
|
||||
WHERE is_on_sale = 1
|
||||
<if test="cateId != null">
|
||||
AND category_id = #{cateId}
|
||||
</if>
|
||||
<if test="searchText != null">
|
||||
AND
|
||||
( goods_name LIKE concat('%',#{searchText,jdbcType=VARCHAR},'%')
|
||||
OR brief LIKE concat('%',#{searchText,jdbcType=VARCHAR},'%'))
|
||||
</if>
|
||||
order by `sort_order` asc
|
||||
</select>
|
||||
<select id="getById" parameterType="java.lang.Long" resultType="com.cxyxiaomo.epp.common.pojo.Good">
|
||||
SELECT *
|
||||
FROM goods
|
||||
|
@@ -95,7 +95,7 @@
|
||||
</update>
|
||||
|
||||
<!-- 根据订单 ID 删除订单信息及订单详情信息 -->
|
||||
<delete id="deleteOrderById" parameterType="java.lang.Integer">
|
||||
<delete id="deleteOrderById" parameterType="java.lang.Long">
|
||||
DELETE
|
||||
FROM `order`
|
||||
WHERE id = #{orderId};
|
||||
@@ -104,4 +104,39 @@
|
||||
-- FROM goods_order_details
|
||||
-- WHERE order_id = #{orderId};
|
||||
</delete>
|
||||
|
||||
|
||||
<!-- manage 相关的 SQL -->
|
||||
<select id="getOrderList" resultType="com.cxyxiaomo.epp.common.pojo.Order"
|
||||
parameterType="com.cxyxiaomo.epp.common.query.OrderQuery">
|
||||
SELECT * FROM `order`
|
||||
<where>
|
||||
<if test="id != null">
|
||||
AND id = #{id}
|
||||
</if>
|
||||
<if test="userId != null">
|
||||
AND user_id = #{userId}
|
||||
</if>
|
||||
<if test="orderStatusCode != null and orderStatusCode != ''">
|
||||
AND order_status = #{orderStatusCode}
|
||||
</if>
|
||||
<if test="expressId != null and expressId != ''">
|
||||
AND express_id = #{expressId}
|
||||
</if>
|
||||
</where>
|
||||
</select>
|
||||
|
||||
<!-- 更新发货信息 -->
|
||||
<update id="updateOrderShipInfo" parameterType="com.cxyxiaomo.epp.common.pojo.Order">
|
||||
UPDATE `order`
|
||||
<set>
|
||||
<if test="expressId != null">
|
||||
express_id = #{expressId},
|
||||
</if>
|
||||
<if test="comment != null">
|
||||
`comment` = #{comment},
|
||||
</if>
|
||||
</set>
|
||||
WHERE id = #{orderId}
|
||||
</update>
|
||||
</mapper>
|
||||
|
@@ -11,7 +11,14 @@
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<iframe src="https://epp-prod.only4.work/access/index.html?inElectron=true" frameborder="0"></iframe>
|
||||
<!--
|
||||
FIXME 环境配置
|
||||
|
||||
src
|
||||
- 线上环境:"https://epp.only4.work/guard/index.html?inElectron=true"
|
||||
- 开发环境:"http://localhost/guard/index.html?inElectron=true"
|
||||
-->
|
||||
<iframe src="https://epp.only4.work/guard/index.html?inElectron=true" frameborder="0"></iframe>
|
||||
<script src="./renderer.js" type="module"></script>
|
||||
</body>
|
||||
|
||||
|
302
database/epp.sql
@@ -11,7 +11,7 @@
|
||||
Target Server Version : 80012
|
||||
File Encoding : 65001
|
||||
|
||||
Date: 17/04/2023 22:15:30
|
||||
Date: 25/04/2023 02:57:07
|
||||
*/
|
||||
|
||||
SET NAMES utf8mb4;
|
||||
@@ -28,15 +28,28 @@ CREATE TABLE `access_log` (
|
||||
`user_real_name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '用户真实姓名',
|
||||
`gate_id` bigint(20) NOT NULL COMMENT '大门id',
|
||||
`type` enum('IN','OUT') CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '类型(进门 OR 出门)'
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '人员进出记录表' ROW_FORMAT = Dynamic;
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '人员进出记录表' ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of access_log
|
||||
-- ----------------------------
|
||||
INSERT INTO `access_log` VALUES (1758893687032647686, '2023-04-16 14:55:34', 3, '用户 密码user', 1758638368624873480, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1758919878770823177, '2023-04-16 16:39:38', 3, '用户 密码user', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1758919904809062403, '2023-04-16 16:39:44', 3, '用户 密码user', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1758920178021830662, '2023-04-16 16:40:50', 3, '用户 密码user', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759407313074130949, '2023-04-18 00:56:32', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759408311121350660, '2023-04-18 01:00:30', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759408461545869315, '2023-04-18 01:01:05', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759409402835767298, '2023-04-18 01:04:50', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759410073555308546, '2023-04-18 01:07:30', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759411594028257285, '2023-04-18 01:13:32', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759412052071419911, '2023-04-18 01:15:22', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1759412344213082116, '2023-04-18 01:16:31', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761945003858464777, '2023-04-25 01:00:24', 3, '普通用户acsu1', 1758638368624873480, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761946898962452483, '2023-04-25 01:07:56', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761946945452118019, '2023-04-25 01:08:07', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761946984043909124, '2023-04-25 01:08:16', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761947169356648453, '2023-04-25 01:09:01', 3, '普通用户acsu1', 1758638368624873480, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761947208124600320, '2023-04-25 01:09:10', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761955409775693833, '2023-04-25 01:41:45', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761958712752345097, '2023-04-25 01:54:53', 3, '普通用户acsu1', 1758617522619420679, 'IN');
|
||||
INSERT INTO `access_log` VALUES (1761960057291018242, '2023-04-25 02:00:13', 3, '普通用户acsu1', 1758638368624873480, 'IN');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for apply1
|
||||
@@ -69,22 +82,6 @@ INSERT INTO `apply1` VALUES (10, 12, '1', '飞机', '1', '2022-06-15 10:53:00',
|
||||
INSERT INTO `apply1` VALUES (11, 2, '1', '飞机', '1', '2022-10-23 16:17:00', '2022-10-23 18:17:00', 1, '');
|
||||
INSERT INTO `apply1` VALUES (12, 13, '1', '飞机', '1', '2022-10-26 19:25:00', '2022-10-26 21:25:00', 1, '');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for count1
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `count1`;
|
||||
CREATE TABLE `count1` (
|
||||
`date` date NOT NULL COMMENT '日期',
|
||||
`time` datetime NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '时间',
|
||||
`in_num` int(11) NULL DEFAULT NULL COMMENT '入校人数',
|
||||
`out_num` int(11) NULL DEFAULT NULL COMMENT '出校人数',
|
||||
PRIMARY KEY (`date`) USING BTREE
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of count1
|
||||
-- ----------------------------
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for feedback1
|
||||
-- ----------------------------
|
||||
@@ -113,11 +110,11 @@ INSERT INTO `feedback1` VALUES (5, '123', '123456', '2022-03-28 19:34:04', 2, NU
|
||||
-- ----------------------------
|
||||
DROP TABLE IF EXISTS `gate`;
|
||||
CREATE TABLE `gate` (
|
||||
`id` bigint(11) NOT NULL AUTO_INCREMENT COMMENT '雪花id',
|
||||
`id` bigint(11) NOT NULL COMMENT '雪花id',
|
||||
`name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '大门显示名称',
|
||||
`open` tinyint(1) NOT NULL DEFAULT 1 COMMENT '大门是否开放 1为开放 2为关闭',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 1758638368624873481 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社区大门' ROW_FORMAT = DYNAMIC;
|
||||
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci COMMENT = '社区大门' ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of gate
|
||||
@@ -140,7 +137,7 @@ CREATE TABLE `goods` (
|
||||
`gallery` varchar(1023) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '[]' COMMENT '商品宣传图片列表,采用JSON数组格式',
|
||||
`brief` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品简介',
|
||||
`is_on_sale` tinyint(1) NULL DEFAULT 1 COMMENT '是否上架 0为下架 1为上架',
|
||||
`sort_order` smallint(4) NULL DEFAULT 100 COMMENT '排序',
|
||||
`sort_order` int(11) NULL DEFAULT 100 COMMENT '排序',
|
||||
`pic_url` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '商品页面商品图片',
|
||||
`type` tinyint(1) NULL DEFAULT 0 COMMENT '商品类型',
|
||||
`unit` varchar(31) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT '件' COMMENT '商品单位,例如件、盒',
|
||||
@@ -157,95 +154,94 @@ CREATE TABLE `goods` (
|
||||
-- ----------------------------
|
||||
-- Records of goods
|
||||
-- ----------------------------
|
||||
INSERT INTO `goods` VALUES (1, '口罩', 4, '千驰医疗器械', '[]', '一次性口罩', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 0.99, 1.99, '这是一次性口罩,采用优质无纺布材料制作,轻薄透气,防护效果好。', 0);
|
||||
INSERT INTO `goods` VALUES (2, '水银温度计', 4, '千驰医疗器械', '[]', '医用玻璃水银体温计腋下温度计家用成人儿童婴儿口腔发烧探热针', 1, 200, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 59.90, 66.90, '产品名称:\r\n玻璃体温计\r\n\r\n产品型号:\r\n三角型棒式(口腔)、内标式(腋下)\r\n\r\n使用期限:\r\n2年\r\n\r\n适用范围:\r\n供测量人体体温用\r\n\r\n产品构成:\r\n本产品由贡(水银)、感温泡和玻璃管组成。其中贡要符合一号贡的要求\r\n\r\n注意事项:\r\n测温前避免剧烈运动,饮热饮、冷饮和饮酒等影响实际体温的因素', 0);
|
||||
INSERT INTO `goods` VALUES (3, '酒精', 4, '海氏海诺', '[]', '海氏海诺 75%酒精消毒液大桶2L乙醇伤口皮肤消毒家用清洁防疫酒精', 1, 300, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 10.00, 18.80, '海氏海诺 75%酒精消毒液大桶2L乙醇伤口皮肤消毒家用清洁防疫酒精', 0);
|
||||
INSERT INTO `goods` VALUES (4, '红富士苹果', 1, '佳农', '[\"https://cdn.example.com/goods/apple.jpg\"]', '新鲜红富士苹果', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 5.99, 8.99, '新鲜红富士苹果,口感甜脆,营养丰富。适合作为水果零食或食用。', 0);
|
||||
INSERT INTO `goods` VALUES (5, '牛奶', 7, '蒙牛', '[\"https://cdn.example.com/goods/milk.jpg\"]', '蒙牛纯牛奶', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 10.99, 12.99, '蒙牛纯牛奶,原味鲜香,营养均衡。适合早餐或饮用。', 0);
|
||||
INSERT INTO `goods` VALUES (6, '口罩', 4, '0', '[\"https://cdn.example.com/goods/mask.jpg\"]', '医用口罩', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 0.99, 1.99, '医用口罩,防护效果好,适合日常出行或在公共场合佩戴。', 0);
|
||||
INSERT INTO `goods` VALUES (7, '洗发水', 2, '清扬男士', '[\"https://cdn.example.com/goods/shampoo.jpg\"]', '清扬男士去屑洗发露', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 16.99, 19.99, '清扬男士去屑洗发露,深层清洁头皮,去除头屑。适合男性使用。', 0);
|
||||
INSERT INTO `goods` VALUES (8, '泡腾片', 3, '德国DAS', '[\"https://cdn.example.com/goods/vitaminc.jpg\"]', '维生素C泡腾片', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 29.99, 39.99, '矫正维生素C泡腾片,补充维生素C,提高免疫力。适合日常补充。', 0);
|
||||
INSERT INTO `goods` VALUES (9, '青菜', 1, '京鲜生', '[]', '新鲜有机蔬菜', 1, 200, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 3.50, 4.50, '青菜是一种十分常见的蔬菜,有很高的营养价值。它含有丰富的维生素、矿物质和膳食纤维等营养成分,对人体有很多好处。青菜不仅可以做菜吃,还可以榨汁喝,是一种很好的保健食品。', 0);
|
||||
INSERT INTO `goods` VALUES (10, '橙子', 1, '京鲜生', '[]', '新鲜橙子,现摘现发', 1, 300, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 6.50, 8.50, '橙子是一种很常见的水果,味道酸甜可口,有很多好处。它含有丰富的维生素C和抗氧化物质,能够增强免疫力、促进消化和排毒,预防感冒和癌症等疾病。橙子可以直接食用或者榨汁喝,也可以用来做饮料、糕点等食品。', 0);
|
||||
INSERT INTO `goods` VALUES (11, '花牛苹果', 1, '佳农', '[]', '新鲜花牛苹果', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 3.50, 4.50, '这是一篮新鲜的花牛苹果,口感酸甜可口,非常适合作为水果零食食用。', 0);
|
||||
INSERT INTO `goods` VALUES (12, '牛奶', 7, '伊利', '[]', '伊利纯牛奶', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 5.99, 7.99, '这是一盒纯牛奶,来源于天然放牧的奶牛,口感醇厚,营养丰富。', 0);
|
||||
INSERT INTO `goods` VALUES (13, '酒精', 0, '利尔康', '[]', '30瓶装!利尔康75%酒精消毒液大桶杀菌清洁500ml75度乙醇医疗伤口', 1, 300, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 10.00, 16.00, '医用口罩,防护效果好,适合日常出行或在公共场合佩戴。', 0);
|
||||
INSERT INTO `goods` VALUES (14, '方便面', 5, '0', '[]', '康师傅牛肉面', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 2.50, 3.50, '这是一袋康师傅牛肉面,方便快捷,味道鲜美,非常适合作为零食食用。', 0);
|
||||
INSERT INTO `goods` VALUES (15, '维生素C片', 3, 'ORIHIRO', '[]', 'VC维生素片', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 8.99, 10.99, '这是一瓶VC维生素片,含有丰富的维生素C和其他营养成分,能够增强免疫力,改善皮肤质量。', 0);
|
||||
INSERT INTO `goods` VALUES (16, '矿泉水', 7, '怡宝', '[]', '怡宝矿泉水', 1, 40, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.99, 5.99, '怡宝矿泉水', 0);
|
||||
INSERT INTO `goods` VALUES (17, '牙刷', 2, '黑人', '[]', '舒适柔软的牙刷', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 8.99, 10.99, '这是一把舒适柔软的牙刷,能够很好地清洁牙齿,让口腔更健康。', 0);
|
||||
INSERT INTO `goods` VALUES (18, '饼干', 5, '0', '[]', '酥脆的饼干', 1, 50, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 12.99, 15.99, '这是一盒酥脆的饼干,口感香脆,非常适合当零食食用。', 0);
|
||||
INSERT INTO `goods` VALUES (19, '手洗液', 2, '舒肤佳', '[]', '抑菌洗手液', 1, 65, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 18.99, 21.99, '这是一瓶抑菌洗手液,能够有效地杀灭手部细菌,保持双手清洁卫生。', 0);
|
||||
INSERT INTO `goods` VALUES (20, '口香糖', 5, '0', '[]', '清新口气口香糖', 1, 45, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 9.99, 12.99, '这是一盒清新口气口香糖,口感浓郁,能够有效地清除口腔异味。', 0);
|
||||
INSERT INTO `goods` VALUES (21, '面膜', 2, '0', '[]', '补水保湿面膜', 1, 55, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '片', 29.99, 35.99, '补水保湿面膜', 0);
|
||||
INSERT INTO `goods` VALUES (22, '一次性医用口罩', 4, '医用口罩', '[]', '一次性医用口罩', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 5.99, 8.99, '一次性医用口罩,具有防护作用。适合在公共场所佩戴,能有效减少病毒传播。', 0);
|
||||
INSERT INTO `goods` VALUES (23, '一次性手套', 4, '医用手套', '[]', '一次性医用手套', 1, 101, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '双', 1.99, 3.99, '一次性医用手套,具有防护作用。适合在公共场所佩戴,能有效减少病毒传播。', 0);
|
||||
INSERT INTO `goods` VALUES (24, '消毒液', 4, '莫雷夫', '[]', '消毒液', 1, 102, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 15.99, 18.99, '消毒液,能杀死细菌和病毒,具有杀菌消毒作用。适合在公共场所或家庭使用。', 0);
|
||||
INSERT INTO `goods` VALUES (25, '体温计', 4, '博朗', '[]', '电子体温', 1, 103, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 35.99, 39.99, '电子体温计,能够准确测量体温。适合在家庭或医疗机构使用。', 0);
|
||||
INSERT INTO `goods` VALUES (26, '消毒湿巾', 4, '医用湿巾', '[]', '消毒湿巾', 1, 104, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '包', 6.99, 8.99, '消毒湿巾,能杀死细菌和病毒,具有杀菌消毒作用。适合在公共场所或家庭使用。', 0);
|
||||
INSERT INTO `goods` VALUES (27, '医用隔离衣', 4, '医用', '[]', '医用隔离衣', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 149.99, 199.99, '医用隔离衣,用于医护人员在处理病人时的个人防护。可以有效隔离病原体和防止血液、液体的渗透,透气性好,舒适耐穿。', 0);
|
||||
INSERT INTO `goods` VALUES (28, '紫外线消毒灯', 4, '普利司通', '[]', '紫外线消毒灯', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 249.99, 299.99, '紫外线消毒灯,可以杀死空气、表面、物品等处的细菌、病毒等微生物,达到消毒杀菌的效果。可以广泛应用于家庭、医院、学校、工厂等场所。', 0);
|
||||
INSERT INTO `goods` VALUES (29, '防护面罩', 4, '防护', '[]', '防护面罩', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 39.99, 49.99, '防护面罩,用于工业生产中的防护、医疗卫生、防疫防护等场合。可以有效防护口鼻呼吸道受到外来飞沫、粉尘、液体等物品的侵袭,防止病毒等微生物的感染。', 0);
|
||||
INSERT INTO `goods` VALUES (30, '橡胶手套', 4, '安全手套', '[]', '橡胶手套', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '双', 12.99, 14.99, '橡胶手套,用于实验室、医院、化工、食品加工等场所。', 0);
|
||||
INSERT INTO `goods` VALUES (31, '板蓝根颗粒', 3, '同仁堂', '[]', '板蓝根颗粒', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 15.99, 18.99, '板蓝根颗粒,清热解毒,适用于感冒发热等症状。每日三次,一次一袋,开水冲服。', 0);
|
||||
INSERT INTO `goods` VALUES (32, '感冒灵颗粒', 3, '999', '[]', '感冒灵颗粒', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 25.99, 28.99, '感冒灵颗粒,缓解感冒症状,适用于感冒、咳嗽等症状。每日三次,一次一袋,开水冲服。', 0);
|
||||
INSERT INTO `goods` VALUES (33, '蒲地蓝消炎片', 3, '同仁堂', '[]', '蒲地蓝消炎片', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 28.99, 33.99, '蒲地蓝消炎片,清热解毒,适用于上呼吸道感染等症状。每次两片,每日三次,饭前半小时服用。', 0);
|
||||
INSERT INTO `goods` VALUES (34, '氯霉素眼药水', 3, '卫康', '[]', '氯霉素眼药水', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 19.99, 22.99, '氯霉素眼药水,治疗眼部感染等症状。每日三次,每次滴入一到两滴。', 0);
|
||||
INSERT INTO `goods` VALUES (35, '感冒止咳糖浆', 3, '舒适达', '[]', '感冒止咳糖浆', 1, 110, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 29.99, 33.99, '感冒止咳糖浆,缓解咳嗽症状,适用于感冒、咳嗽等症状。', 0);
|
||||
INSERT INTO `goods` VALUES (36, '牛排', 6, 'A牌', '[]', '精选优质牛肉', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 128.00, 98.00, '这是一道经典的西餐菜品,适合搭配蔬菜沙拉或烤蔬菜一起食用。精选优质牛肉,切成均匀的厚片,肉质鲜嫩多汁,口感十分美味。', 0);
|
||||
INSERT INTO `goods` VALUES (37, '羊肉串', 6, 'B牌', '[]', '新鲜羊肉', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '串', 25.00, 18.80, '这是一种很受欢迎的中式小吃,适合作为下酒菜或夜宵食用。新鲜羊肉切成均匀大小的块状,串在竹签上,经过炭火烤制,香味四溢,口感香嫩。', 0);
|
||||
INSERT INTO `goods` VALUES (38, '烤鸭', 6, 'C牌', '[]', '北京烤鸭', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '只', 188.00, 138.00, '这是一道北京传统名菜,是中国餐饮文化的重要组成部分之一。选用饲养周期在60天以上的肥美鸭子,采用传统技艺腌制,经过炭火烤制,外皮金黄酥脆,肉质鲜嫩,口感丰富。', 0);
|
||||
INSERT INTO `goods` VALUES (39, '牛腩煲', 6, 'D牌', '[]', '牛肉小炒肉', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 58.00, 42.80, '这是一道香港地道的特色菜,非常适合在冬天享用。精选上等牛肉,切成小块,搭配多种香料和蔬菜,慢火炖制数小时,汤汁鲜美浓郁,肉质软烂易嚼。', 0);
|
||||
INSERT INTO `goods` VALUES (40, '鸡肉卷', 6, 'E牌', '[]', '鸡胸肉盖饭', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '卷', 28.00, 19.90, '这是一道适合当做早餐或午餐的美食。选用鸡胸肉,切成薄片,搭配火腿、鲜菇、洋葱等多种食材,卷起来后煎烤,口感香嫩可口。', 0);
|
||||
INSERT INTO `goods` VALUES (41, '黑椒牛柳', 6, '国贸牛肉', '[]', '国贸牛肉', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 138.00, 118.00, '这是一款以黑椒作为调味料的烤牛肉,口感香辣,肉质鲜嫩。适合烤肉或者烤箱烤制。', 0);
|
||||
INSERT INTO `goods` VALUES (42, '红烧肉', 6, '泰山食品', '[]', '红烧肉', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盘', 68.00, 58.00, '红烧肉是一道传统的中国菜品,选用优质的五花肉,慢火慢炖,酱汁入味,外焦里嫩,色香味俱佳。适合与米饭一起食用。', 0);
|
||||
INSERT INTO `goods` VALUES (43, '蜜汁叉烧', 6, '三只松鼠', '[]', '蜜汁叉烧', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 38.00, 28.00, '蜜汁叉烧是一种广东传统的烤肉食品,精选猪肉,经过特殊的腌制和烤制工艺,表面呈现出一层诱人的红色。入口即化,外酥里嫩,咸香适口。适合作为下酒菜或者加入面条、炒饭等中餐中。', 0);
|
||||
INSERT INTO `goods` VALUES (44, '香辣鸡翅', 6, '波司登鸡肉', '[]', '波司登鸡肉', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 25.00, 18.00, '选用肉质鲜嫩的鸡翅中段,搭配特制的香辣调料,烤制出来的鸡翅鲜香辣口,肉质紧实,外皮酥脆。', 0);
|
||||
INSERT INTO `goods` VALUES (45, '嫩牛肉片', 6, '三元牛肉', '[]', '嫩牛肉片,口感鲜嫩,富含蛋白质', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 68.00, 59.00, '这是一款优质嫩牛肉片,富含优质蛋白质,口感极佳,适合煲汤、炒菜、火锅等多种烹饪方式', 0);
|
||||
INSERT INTO `goods` VALUES (46, '鲜猪肉片', 6, '三元猪肉', '[]', '鲜猪肉片,鲜香味美,肉质细嫩', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 32.80, 29.90, '这是一款优质鲜猪肉片,经过严格挑选,新鲜出品,鲜香味美,肉质细嫩,是您炒菜、煲汤、烧烤的绝佳选择', 0);
|
||||
INSERT INTO `goods` VALUES (47, '蒜泥白肉', 6, '三元猪肉', '[]', '鲜嫩白肉,配上酱料和蒜泥,口感鲜香', 1, 98, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 39.80, 34.90, '这是一款经典美食蒜泥白肉,选用新鲜优质猪肉,搭配上鲜美蒜泥和特制酱料,口感鲜香可口,回味无穷', 0);
|
||||
INSERT INTO `goods` VALUES (48, '鸡腿肉', 6, '三元鸡肉', '[]', '鲜嫩多汁,肉质细嫩', 1, 97, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 16.80, 13.90, '这是一款新鲜的鸡腿肉,富含蛋白质,肉质细嫩,口感鲜美,适合烤着吃、烧着吃、炖着吃等多种烹饪方式', 0);
|
||||
INSERT INTO `goods` VALUES (49, '碳酸饮料', 7, '可口可乐公司', '[]', '可口可乐', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.00, 2.50, '可口可乐是世界知名的碳酸饮料品牌,有着浓郁的可乐味,口感清爽,是人们喜欢的饮品之一。', 0);
|
||||
INSERT INTO `goods` VALUES (50, '碳酸饮料', 7, '百事公司', '[]', '百事可乐', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.00, 2.50, '百事可乐是世界知名的碳酸饮料品牌,与可口可乐齐名,有着浓郁的可乐味,口感清爽,是人们喜欢的饮品之一。', 0);
|
||||
INSERT INTO `goods` VALUES (51, '无糖碳酸饮料', 7, '可口可乐公司', '[]', '雪碧', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.50, 3.00, '雪碧是一种无糖碳酸饮料,口感清新,有着独特的柠檬味,深受人们的喜爱。', 0);
|
||||
INSERT INTO `goods` VALUES (52, '功能性饮料', 7, '红牛公司', '[]', '红牛', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '罐', 5.00, 4.50, '红牛是一种功能性饮料,能够提供短期的能量补给,帮助人们在工作和学习中保持专注。', 0);
|
||||
INSERT INTO `goods` VALUES (53, '咖啡饮品', 7, '星巴克公司', '[]', '咖啡', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '杯', 25.00, 20.00, '咖啡是一种饮用热饮,由磨碎的咖啡豆冲泡而成,具有提神醒脑、去除疲劳的作用,是人们在生活和工作中常饮用的饮品之一。', 0);
|
||||
INSERT INTO `goods` VALUES (54, '可口可乐', 7, '可口可乐公司', '[]', '可口可乐(Coca-Cola)', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 5.00, 3.50, '可口可乐(Coca-Cola),是美国可口可乐公司生产的一种碳酸软饮料,源自1886年由美国药剂师John Stith Pemberton发明的法国可卡因酒,后于1888年更名为可口可乐。可口可乐是全球最具价值的品牌之一,也是全球最畅销的碳酸软饮料之一。', 0);
|
||||
INSERT INTO `goods` VALUES (55, '百事可乐', 7, '百事公司', '[]', '百事可乐(Pepsi-Cola)', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 5.00, 3.50, '百事可乐(Pepsi-Cola)是由美国百事公司生产的一种碳酸软饮料。百事可乐的味道类似于可口可乐,但口感略微不同,因此两种饮料在市场上形成了一种明显的竞争关系。', 0);
|
||||
INSERT INTO `goods` VALUES (56, '康师傅冰红茶', 7, '康师傅集团', '[]', '康师傅冰红茶', 1, 98, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 4.00, 2.50, '康师傅冰红茶是一种深受广大消费者喜爱的茶饮料,口感香甜,清新解渴。康师傅是中国著名的食品生产企业,其产品包括方便面、速冻食品、饮料等。', 0);
|
||||
INSERT INTO `goods` VALUES (57, '怡宝矿泉水', 7, '怡宝集团', '[]', '怡宝矿泉水', 1, 97, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.00, 2.00, '怡宝矿泉水是一种天然的矿泉水,口感清新,无任何添加剂,非常适合日常饮用。怡宝集团是中国知名的饮料生产企业,其产品包括矿泉水、纯净水、茶饮料等。', 0);
|
||||
INSERT INTO `goods` VALUES (58, '沐浴露', 2, '施巴', '[]', '施巴舒缓滋润沐浴露', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 49.90, 39.90, '施巴舒缓滋润沐浴露,富含甘油和天然植物精华,能够滋润肌肤', 0);
|
||||
INSERT INTO `goods` VALUES (59, '洗衣液', 2, '威露士', '[]', '威露士洗衣液', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 25.00, 29.90, '威露士洗衣液,洁净彻底,去除顽渍,衣物柔软舒适。适用于各种布料。', 0);
|
||||
INSERT INTO `goods` VALUES (60, '洗碗布', 2, '无品牌', '[]', '柔软吸水,耐用不掉毛', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 3.00, 5.00, '适用于洗涤餐具、清洁厨房等', 0);
|
||||
INSERT INTO `goods` VALUES (61, '一次性餐具套装', 2, '无品牌', '[]', '一次性餐具套装,方便卫生', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '套', 8.00, 12.00, '包含一次性碗、盘、刀、叉、勺等,使用后方便清理,卫生方便', 0);
|
||||
INSERT INTO `goods` VALUES (62, '剃须刀', 2, '飞利浦', '[]', '飞利浦电动剃须刀,充电式', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 199.00, 299.00, '适用于男性剃须,充电式方便携带,刀片锋利,剃须干净', 0);
|
||||
INSERT INTO `goods` VALUES (63, '马桶刷', 2, '无品牌', '[]', '马桶清洁必备,柄部防滑设计', 1, 150, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 5.00, 9.90, '适用于马桶清洁,柄部采用防滑设计,方便操作', 0);
|
||||
INSERT INTO `goods` VALUES (64, '抽纸', 2, '维达', '[]', '维达软抽3层130抽面纸', 1, 50, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '包', 14.50, 18.00, '适用于日常生活,柔软舒适,吸水性好,可重复使用', 0);
|
||||
INSERT INTO `goods` VALUES (65, '剪刀', 2, '晨光', '[]', '晨光不锈钢剪刀', 1, 120, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '把', 9.90, 12.00, '适用于日常生活、办公等,剪刀锋利,手感舒适', 0);
|
||||
INSERT INTO `goods` VALUES (66, '防晒霜', 2, '兰蔻', '[]', '兰蔻防晒霜SPF50+', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 299.00, 399.00, '适用于户外活动、日常生活等,有效防止紫外线伤害,清爽不油腻,易于吸收', 0);
|
||||
INSERT INTO `goods` VALUES (67, '纸巾盒', 2, '普乐士', '[]', '普乐士魔法盒抽纸盒', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 12.50, 15.00, '', 0);
|
||||
INSERT INTO `goods` VALUES (68, '洗洁精', 2, '威露士', '[]', '威露士洗洁精', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 9.99, 12.99, '威露士洗洁精,有效去除油渍和污垢,轻松清洁厨房餐具。', 0);
|
||||
INSERT INTO `goods` VALUES (69, '洗手液', 2, '蜜芽', '[]', '蜜芽儿童无刺激洗手液', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 19.99, 22.99, '蜜芽儿童无刺激洗手液,温和配方,不刺激肌肤,适合儿童使用。', 0);
|
||||
INSERT INTO `goods` VALUES (70, '电动牙刷', 2, '飞利浦', '[]', '飞利浦声波震动电动牙刷', 1, 98, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '支', 299.00, 399.00, '飞利浦声波震动电动牙刷,高效清洁牙齿,深入去除牙渍,呵护牙齿健康。', 0);
|
||||
INSERT INTO `goods` VALUES (71, '梳子', 2, '宝洁', '[]', '宝洁双面按摩梳', 1, 97, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '把', 12.99, 15.99, '宝洁双面按摩梳,双面设计,可以按摩头皮,缓解疲劳,也可以梳理发丝,让发型更加完美。', 0);
|
||||
INSERT INTO `goods` VALUES (72, '洗衣液', 2, '妙洁', '[]', '妙洁深层洁净洗衣液', 1, 96, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 29.99, 39.99, '妙洁深层洁净洗衣液,有效去除衣物污渍,保护衣物纤维,让衣服更柔软。', 0);
|
||||
INSERT INTO `goods` VALUES (73, '纸巾', 2, '维达', '[]', '维达抽纸', 1, 95, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 19.99, 22.99, '维达抽纸,柔软舒适,吸水性好,不易破碎。', 0);
|
||||
INSERT INTO `goods` VALUES (74, '剪刀', 2, '福尺', '[]', '福尺多功能剪刀', 1, 94, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '把', 9.99, 12.99, '福尺多功能剪刀', 0);
|
||||
INSERT INTO `goods` VALUES (75, '薯片', 5, '乐事', '[]', '薯片', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 8.00, 10.00, '美味薯片,酥脆可口,适合下午茶。', 0);
|
||||
INSERT INTO `goods` VALUES (76, '巧克力', 5, '德芙', '[]', '德芙巧克力', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 20.00, 25.00, '德芙巧克力,甜美可口,适合送礼。', 0);
|
||||
INSERT INTO `goods` VALUES (77, '蜜饯', 5, '三只松鼠', '[]', '三只松鼠夏威夷果', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 18.00, 20.00, '三只松鼠夏威夷果,口感香甜,健康零食。', 0);
|
||||
INSERT INTO `goods` VALUES (78, '牛肉干', 5, '卫龙', '[]', '麻辣牛肉干', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 15.00, 20.00, '卫龙麻辣牛肉干,辣味十足,爽口不腻。', 0);
|
||||
INSERT INTO `goods` VALUES (79, '薄荷糖', 5, '金丝猴', '[]', '金丝猴薄荷糖', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 10.00, 12.00, '金丝猴薄荷糖,口感清新,适合口气不佳的人。', 0);
|
||||
INSERT INTO `goods` VALUES (80, '奥利奥饼干', 5, 'Oreo', '[]', '经典口味奥利奥饼干', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 18.00, 16.99, '经典口味奥利奥饼干,酥脆可口,一口一个,让你停不下来。', 0);
|
||||
INSERT INTO `goods` VALUES (81, '可口可乐', 7, 'Coca-Cola', '[]', '经典可口可乐', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.00, 2.50, '可口可乐,清爽解渴,适合任何场合。', 0);
|
||||
INSERT INTO `goods` VALUES (82, '大白兔奶糖', 5, '大白兔', '[]', '经典奶香味道', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 5.00, 4.50, '大白兔奶糖,经典奶香味道,口感绵软。', 0);
|
||||
INSERT INTO `goods` VALUES (83, '卫龙辣条', 5, '卫龙', '[]', '经典辣味', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 6.00, 5.50, '卫龙辣条,经典辣味,辣爽可口,不同于其他辣条。', 0);
|
||||
INSERT INTO `goods` VALUES (84, '雀巢咖啡', 5, 'Nestle', '[]', '拿铁口味', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 20.00, 18.99, '雀巢咖啡,拿铁口味,浓郁香醇,唤醒你的味蕾。', 0);
|
||||
INSERT INTO `goods` VALUES (85, '伊利纯牛奶', 7, '伊利', '[]', '高端纯牛奶', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 5.00, 4.80, '伊利纯牛奶,高端纯牛奶,口感绵密,适合慢慢品尝。', 0);
|
||||
INSERT INTO `goods` VALUES (86, '太平梳打饼干', 5, '太平', '[]', '酥脆可口', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 10.00, 8.50, '太平梳打饼干,酥脆可口,咬一口,满口的香脆声。', 0);
|
||||
INSERT INTO `goods` VALUES (87, '德芙巧克力', 5, 'Dove', '[]', '丝滑绵密', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 30.00, 28.50, '德芙巧克力,丝滑绵密,一口一个,舌尖上的享受。', 0);
|
||||
INSERT INTO `goods` VALUES (88, '常产过片根直式党子', 6, '运量此受资市标接', NULL, '度党约进手即温任团据解知易主流见养步料题进拉且生般政学全', 0, 27885, '//epp-1302260381.cos.ap-shanghai.myqcloud.com/good/d6641529-e32b-46d9-b883-ec6585848fc9.jpg', NULL, '状气', 48841.00, 6.33, '反则向候间清且工至关八活里证商新作往感件区感其交七在且七成精说分率见领主元开论山适革严素就眼和毛便来热指持调证光同又院群置经论过天位无类给海便标从。', 0);
|
||||
INSERT INTO `goods` VALUES (89, '3213123', 3, '用众价热员济种这万人', NULL, '带位究在着几起儿头里除团确还支了张千说', 1, 776, '//epp-1302260381.cos.ap-shanghai.myqcloud.com/good/d8af3d35-f9b7-431d-a431-fea79aec3004.jpg', NULL, '或道', 26.00, 37932.00, '做标火消行斯感没情政马青圆战空义每马南见对写时你行常年然而见身上高布动系海此低装往华员强每华风部问系阶都但总广型何议消是导造许要领百无单步格况候离拉历则通又线片角九么出书要经包过儿式细半色设新法天下现至数导社过须布再至走素增备关角社派色。', 0);
|
||||
INSERT INTO `goods` VALUES (1, '口罩', 4, '千驰医疗器械', '[]', '一次性口罩', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 1.99, 0.99, '这是一次性口罩,采用优质无纺布材料制作,轻薄透气,防护效果好。', 0);
|
||||
INSERT INTO `goods` VALUES (2, '水银温度计', 4, '千驰医疗器械', '[]', '医用玻璃水银体温计腋下温度计家用成人儿童婴儿口腔发烧探热针', 1, 200, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 66.90, 59.90, '产品名称:\r\n玻璃体温计\r\n\r\n产品型号:\r\n三角型棒式(口腔)、内标式(腋下)\r\n\r\n使用期限:\r\n2年\r\n\r\n适用范围:\r\n供测量人体体温用\r\n\r\n产品构成:\r\n本产品由贡(水银)、感温泡和玻璃管组成。其中贡要符合一号贡的要求\r\n\r\n注意事项:\r\n测温前避免剧烈运动,饮热饮、冷饮和饮酒等影响实际体温的因素', 0);
|
||||
INSERT INTO `goods` VALUES (3, '酒精', 4, '海氏海诺', '[]', '海氏海诺 75%酒精消毒液大桶2L乙醇伤口皮肤消毒家用清洁防疫酒精', 1, 300, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 18.80, 10.00, '海氏海诺 75%酒精消毒液大桶2L乙醇伤口皮肤消毒家用清洁防疫酒精', 0);
|
||||
INSERT INTO `goods` VALUES (4, '红富士苹果', 1, '佳农', '[\"https://cdn.example.com/goods/apple.jpg\"]', '新鲜红富士苹果', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 8.99, 5.99, '新鲜红富士苹果,口感甜脆,营养丰富。适合作为水果零食或食用。', 0);
|
||||
INSERT INTO `goods` VALUES (5, '牛奶', 7, '蒙牛', '[\"https://cdn.example.com/goods/milk.jpg\"]', '蒙牛纯牛奶', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 12.99, 10.99, '蒙牛纯牛奶,原味鲜香,营养均衡。适合早餐或饮用。', 0);
|
||||
INSERT INTO `goods` VALUES (6, '口罩', 4, '0', '[\"https://cdn.example.com/goods/mask.jpg\"]', '医用口罩', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 1.99, 0.99, '医用口罩,防护效果好,适合日常出行或在公共场合佩戴。', 0);
|
||||
INSERT INTO `goods` VALUES (7, '洗发水', 2, '清扬男士', '[\"https://cdn.example.com/goods/shampoo.jpg\"]', '清扬男士去屑洗发露', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 19.99, 16.99, '清扬男士去屑洗发露,深层清洁头皮,去除头屑。适合男性使用。', 0);
|
||||
INSERT INTO `goods` VALUES (8, '泡腾片', 3, '德国DAS', '[\"https://cdn.example.com/goods/vitaminc.jpg\"]', '维生素C泡腾片', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 39.99, 29.99, '矫正维生素C泡腾片,补充维生素C,提高免疫力。适合日常补充。', 0);
|
||||
INSERT INTO `goods` VALUES (9, '青菜', 1, '京鲜生', '[]', '新鲜有机蔬菜', 1, 200, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 4.50, 3.50, '青菜是一种十分常见的蔬菜,有很高的营养价值。它含有丰富的维生素、矿物质和膳食纤维等营养成分,对人体有很多好处。青菜不仅可以做菜吃,还可以榨汁喝,是一种很好的保健食品。', 0);
|
||||
INSERT INTO `goods` VALUES (10, '橙子', 1, '京鲜生', '[]', '新鲜橙子,现摘现发', 1, 300, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 8.50, 6.50, '橙子是一种很常见的水果,味道酸甜可口,有很多好处。它含有丰富的维生素C和抗氧化物质,能够增强免疫力、促进消化和排毒,预防感冒和癌症等疾病。橙子可以直接食用或者榨汁喝,也可以用来做饮料、糕点等食品。', 0);
|
||||
INSERT INTO `goods` VALUES (11, '花牛苹果', 1, '佳农', '[]', '新鲜花牛苹果', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 4.50, 3.50, '这是一篮新鲜的花牛苹果,口感酸甜可口,非常适合作为水果零食食用。', 0);
|
||||
INSERT INTO `goods` VALUES (12, '牛奶', 7, '伊利', '[]', '伊利纯牛奶', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 7.99, 5.99, '这是一盒纯牛奶,来源于天然放牧的奶牛,口感醇厚,营养丰富。', 0);
|
||||
INSERT INTO `goods` VALUES (13, '酒精', 0, '利尔康', '[]', '30瓶装!利尔康75%酒精消毒液大桶杀菌清洁500ml75度乙醇医疗伤口', 1, 300, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 16.00, 10.00, '医用口罩,防护效果好,适合日常出行或在公共场合佩戴。', 0);
|
||||
INSERT INTO `goods` VALUES (14, '方便面', 5, '0', '[]', '康师傅牛肉面', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 3.50, 2.50, '这是一袋康师傅牛肉面,方便快捷,味道鲜美,非常适合作为零食食用。', 0);
|
||||
INSERT INTO `goods` VALUES (15, '维生素C片', 3, 'ORIHIRO', '[]', 'VC维生素片', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 10.99, 8.99, '这是一瓶VC维生素片,含有丰富的维生素C和其他营养成分,能够增强免疫力,改善皮肤质量。', 0);
|
||||
INSERT INTO `goods` VALUES (17, '牙刷', 2, '黑人', '[]', '舒适柔软的牙刷', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 10.99, 8.99, '这是一把舒适柔软的牙刷,能够很好地清洁牙齿,让口腔更健康。', 0);
|
||||
INSERT INTO `goods` VALUES (18, '饼干', 5, '0', '[]', '酥脆的饼干', 1, 50, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 15.99, 12.99, '这是一盒酥脆的饼干,口感香脆,非常适合当零食食用。', 0);
|
||||
INSERT INTO `goods` VALUES (19, '手洗液', 2, '舒肤佳', '[]', '抑菌洗手液', 1, 65, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 21.99, 18.99, '这是一瓶抑菌洗手液,能够有效地杀灭手部细菌,保持双手清洁卫生。', 0);
|
||||
INSERT INTO `goods` VALUES (20, '口香糖', 5, '绿箭', '[]', '清新口气口香糖', 1, 45, '//epp-1302260381.cos.ap-shanghai.myqcloud.com/good/4eb6f363-314d-4c37-a640-1832de4ffb2b.jpg', 0, '盒', 12.99, 9.99, '这是一盒清新口气口香糖,口感浓郁,能够有效地清除口腔异味。', 0);
|
||||
INSERT INTO `goods` VALUES (21, '面膜', 2, '0', '[]', '补水保湿面膜', 1, 55, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '片', 35.99, 29.99, '补水保湿面膜', 0);
|
||||
INSERT INTO `goods` VALUES (22, '一次性医用口罩', 4, '医用口罩', '[]', '一次性医用口罩', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 8.99, 5.99, '一次性医用口罩,具有防护作用。适合在公共场所佩戴,能有效减少病毒传播。', 0);
|
||||
INSERT INTO `goods` VALUES (23, '一次性手套', 4, '医用手套', '[]', '一次性医用手套', 1, 101, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '双', 3.99, 1.99, '一次性医用手套,具有防护作用。适合在公共场所佩戴,能有效减少病毒传播。', 0);
|
||||
INSERT INTO `goods` VALUES (24, '消毒液', 4, '莫雷夫', '[]', '消毒液', 1, 102, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 18.99, 15.99, '消毒液,能杀死细菌和病毒,具有杀菌消毒作用。适合在公共场所或家庭使用。', 0);
|
||||
INSERT INTO `goods` VALUES (25, '体温计', 4, '博朗', '[]', '电子体温', 1, 103, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 39.99, 35.99, '电子体温计,能够准确测量体温。适合在家庭或医疗机构使用。', 0);
|
||||
INSERT INTO `goods` VALUES (26, '消毒湿巾', 4, '医用湿巾', '[]', '消毒湿巾', 1, 104, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '包', 8.99, 6.99, '消毒湿巾,能杀死细菌和病毒,具有杀菌消毒作用。适合在公共场所或家庭使用。', 0);
|
||||
INSERT INTO `goods` VALUES (27, '医用隔离衣', 4, '医用', '[]', '医用隔离衣', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '件', 199.99, 149.99, '医用隔离衣,用于医护人员在处理病人时的个人防护。可以有效隔离病原体和防止血液、液体的渗透,透气性好,舒适耐穿。', 0);
|
||||
INSERT INTO `goods` VALUES (28, '紫外线消毒灯', 4, '普利司通', '[]', '紫外线消毒灯', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 299.99, 249.99, '紫外线消毒灯,可以杀死空气、表面、物品等处的细菌、病毒等微生物,达到消毒杀菌的效果。可以广泛应用于家庭、医院、学校、工厂等场所。', 0);
|
||||
INSERT INTO `goods` VALUES (29, '防护面罩', 4, '防护', '[]', '防护面罩', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 49.99, 39.99, '防护面罩,用于工业生产中的防护、医疗卫生、防疫防护等场合。可以有效防护口鼻呼吸道受到外来飞沫、粉尘、液体等物品的侵袭,防止病毒等微生物的感染。', 0);
|
||||
INSERT INTO `goods` VALUES (30, '橡胶手套', 4, '安全手套', '[]', '橡胶手套', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '双', 14.99, 12.99, '橡胶手套,用于实验室、医院、化工、食品加工等场所。', 0);
|
||||
INSERT INTO `goods` VALUES (31, '板蓝根颗粒', 3, '同仁堂', '[]', '板蓝根颗粒', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 18.99, 15.99, '板蓝根颗粒,清热解毒,适用于感冒发热等症状。每日三次,一次一袋,开水冲服。', 0);
|
||||
INSERT INTO `goods` VALUES (32, '感冒灵颗粒', 3, '999', '[]', '感冒灵颗粒', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 28.99, 25.99, '感冒灵颗粒,缓解感冒症状,适用于感冒、咳嗽等症状。每日三次,一次一袋,开水冲服。', 0);
|
||||
INSERT INTO `goods` VALUES (33, '蒲地蓝消炎片', 3, '同仁堂', '[]', '蒲地蓝消炎片', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 33.99, 28.99, '蒲地蓝消炎片,清热解毒,适用于上呼吸道感染等症状。每次两片,每日三次,饭前半小时服用。', 0);
|
||||
INSERT INTO `goods` VALUES (34, '氯霉素眼药水', 3, '卫康', '[]', '氯霉素眼药水', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 22.99, 19.99, '氯霉素眼药水,治疗眼部感染等症状。每日三次,每次滴入一到两滴。', 0);
|
||||
INSERT INTO `goods` VALUES (35, '感冒止咳糖浆', 3, '舒适达', '[]', '感冒止咳糖浆', 1, 110, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 33.99, 29.99, '感冒止咳糖浆,缓解咳嗽症状,适用于感冒、咳嗽等症状。', 0);
|
||||
INSERT INTO `goods` VALUES (36, '牛排', 6, 'A牌', '[]', '精选优质牛肉', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 98.00, 128.00, '这是一道经典的西餐菜品,适合搭配蔬菜沙拉或烤蔬菜一起食用。精选优质牛肉,切成均匀的厚片,肉质鲜嫩多汁,口感十分美味。', 0);
|
||||
INSERT INTO `goods` VALUES (37, '羊肉串', 6, 'B牌', '[]', '新鲜羊肉', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '串', 18.80, 25.00, '这是一种很受欢迎的中式小吃,适合作为下酒菜或夜宵食用。新鲜羊肉切成均匀大小的块状,串在竹签上,经过炭火烤制,香味四溢,口感香嫩。', 0);
|
||||
INSERT INTO `goods` VALUES (38, '烤鸭', 6, 'C牌', '[]', '北京烤鸭', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '只', 138.00, 188.00, '这是一道北京传统名菜,是中国餐饮文化的重要组成部分之一。选用饲养周期在60天以上的肥美鸭子,采用传统技艺腌制,经过炭火烤制,外皮金黄酥脆,肉质鲜嫩,口感丰富。', 0);
|
||||
INSERT INTO `goods` VALUES (39, '牛腩煲', 6, 'D牌', '[]', '牛肉小炒肉', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 42.80, 58.00, '这是一道香港地道的特色菜,非常适合在冬天享用。精选上等牛肉,切成小块,搭配多种香料和蔬菜,慢火炖制数小时,汤汁鲜美浓郁,肉质软烂易嚼。', 0);
|
||||
INSERT INTO `goods` VALUES (40, '鸡肉卷', 6, 'E牌', '[]', '鸡胸肉盖饭', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '卷', 19.90, 28.00, '这是一道适合当做早餐或午餐的美食。选用鸡胸肉,切成薄片,搭配火腿、鲜菇、洋葱等多种食材,卷起来后煎烤,口感香嫩可口。', 0);
|
||||
INSERT INTO `goods` VALUES (41, '黑椒牛柳', 6, '国贸牛肉', '[]', '国贸牛肉', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 118.00, 138.00, '这是一款以黑椒作为调味料的烤牛肉,口感香辣,肉质鲜嫩。适合烤肉或者烤箱烤制。', 0);
|
||||
INSERT INTO `goods` VALUES (42, '红烧肉', 6, '泰山食品', '[]', '红烧肉', 1, 90, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盘', 58.00, 68.00, '红烧肉是一道传统的中国菜品,选用优质的五花肉,慢火慢炖,酱汁入味,外焦里嫩,色香味俱佳。适合与米饭一起食用。', 0);
|
||||
INSERT INTO `goods` VALUES (43, '蜜汁叉烧', 6, '三只松鼠', '[]', '蜜汁叉烧', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 28.00, 38.00, '蜜汁叉烧是一种广东传统的烤肉食品,精选猪肉,经过特殊的腌制和烤制工艺,表面呈现出一层诱人的红色。入口即化,外酥里嫩,咸香适口。适合作为下酒菜或者加入面条、炒饭等中餐中。', 0);
|
||||
INSERT INTO `goods` VALUES (44, '香辣鸡翅', 6, '波司登鸡肉', '[]', '波司登鸡肉', 1, 70, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 18.00, 25.00, '选用肉质鲜嫩的鸡翅中段,搭配特制的香辣调料,烤制出来的鸡翅鲜香辣口,肉质紧实,外皮酥脆。', 0);
|
||||
INSERT INTO `goods` VALUES (45, '嫩牛肉片', 6, '三元牛肉', '[]', '嫩牛肉片,口感鲜嫩,富含蛋白质', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 59.00, 68.00, '这是一款优质嫩牛肉片,富含优质蛋白质,口感极佳,适合煲汤、炒菜、火锅等多种烹饪方式', 0);
|
||||
INSERT INTO `goods` VALUES (46, '鲜猪肉片', 6, '三元猪肉', '[]', '鲜猪肉片,鲜香味美,肉质细嫩', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 29.90, 32.80, '这是一款优质鲜猪肉片,经过严格挑选,新鲜出品,鲜香味美,肉质细嫩,是您炒菜、煲汤、烧烤的绝佳选择', 0);
|
||||
INSERT INTO `goods` VALUES (47, '蒜泥白肉', 6, '三元猪肉', '[]', '鲜嫩白肉,配上酱料和蒜泥,口感鲜香', 1, 98, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '份', 34.90, 39.80, '这是一款经典美食蒜泥白肉,选用新鲜优质猪肉,搭配上鲜美蒜泥和特制酱料,口感鲜香可口,回味无穷', 0);
|
||||
INSERT INTO `goods` VALUES (48, '鸡腿肉', 6, '三元鸡肉', '[]', '鲜嫩多汁,肉质细嫩', 1, 97, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '斤', 13.90, 16.80, '这是一款新鲜的鸡腿肉,富含蛋白质,肉质细嫩,口感鲜美,适合烤着吃、烧着吃、炖着吃等多种烹饪方式', 0);
|
||||
INSERT INTO `goods` VALUES (49, '碳酸饮料', 7, '可口可乐公司', '[]', '可口可乐', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 2.50, 3.00, '可口可乐是世界知名的碳酸饮料品牌,有着浓郁的可乐味,口感清爽,是人们喜欢的饮品之一。', 0);
|
||||
INSERT INTO `goods` VALUES (50, '碳酸饮料', 7, '百事公司', '[]', '百事可乐', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 2.50, 3.00, '百事可乐是世界知名的碳酸饮料品牌,与可口可乐齐名,有着浓郁的可乐味,口感清爽,是人们喜欢的饮品之一。', 0);
|
||||
INSERT INTO `goods` VALUES (51, '无糖碳酸饮料', 7, '可口可乐公司', '[]', '雪碧', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.00, 3.50, '雪碧是一种无糖碳酸饮料,口感清新,有着独特的柠檬味,深受人们的喜爱。', 0);
|
||||
INSERT INTO `goods` VALUES (52, '功能性饮料', 7, '红牛公司', '[]', '红牛', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '罐', 4.50, 5.00, '红牛是一种功能性饮料,能够提供短期的能量补给,帮助人们在工作和学习中保持专注。', 0);
|
||||
INSERT INTO `goods` VALUES (53, '咖啡饮品', 7, '星巴克公司', '[]', '咖啡', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '杯', 20.00, 25.00, '咖啡是一种饮用热饮,由磨碎的咖啡豆冲泡而成,具有提神醒脑、去除疲劳的作用,是人们在生活和工作中常饮用的饮品之一。', 0);
|
||||
INSERT INTO `goods` VALUES (54, '可口可乐', 7, '可口可乐公司', '[]', '可口可乐(Coca-Cola)', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.50, 5.00, '可口可乐(Coca-Cola),是美国可口可乐公司生产的一种碳酸软饮料,源自1886年由美国药剂师John Stith Pemberton发明的法国可卡因酒,后于1888年更名为可口可乐。可口可乐是全球最具价值的品牌之一,也是全球最畅销的碳酸软饮料之一。', 0);
|
||||
INSERT INTO `goods` VALUES (55, '百事可乐', 7, '百事公司', '[]', '百事可乐(Pepsi-Cola)', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 3.50, 5.00, '百事可乐(Pepsi-Cola)是由美国百事公司生产的一种碳酸软饮料。百事可乐的味道类似于可口可乐,但口感略微不同,因此两种饮料在市场上形成了一种明显的竞争关系。', 0);
|
||||
INSERT INTO `goods` VALUES (56, '康师傅冰红茶', 7, '康师傅集团', '[]', '康师傅冰红茶', 1, 98, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 2.50, 4.00, '康师傅冰红茶是一种深受广大消费者喜爱的茶饮料,口感香甜,清新解渴。康师傅是中国著名的食品生产企业,其产品包括方便面、速冻食品、饮料等。', 0);
|
||||
INSERT INTO `goods` VALUES (57, '怡宝矿泉水', 7, '怡宝集团', '[]', '怡宝矿泉水', 1, 97, '//epp-1302260381.cos.ap-shanghai.myqcloud.com/good/c40ce089-9655-4957-8db8-00b85749af5f.jpg', 0, '瓶', 2.00, 3.00, '怡宝矿泉水是一种天然的矿泉水,口感清新,无任何添加剂,非常适合日常饮用。怡宝集团是中国知名的饮料生产企业,其产品包括矿泉水、纯净水、茶饮料等。', 0);
|
||||
INSERT INTO `goods` VALUES (58, '沐浴露', 2, '施巴', '[]', '施巴舒缓滋润沐浴露', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 39.90, 49.90, '施巴舒缓滋润沐浴露,富含甘油和天然植物精华,能够滋润肌肤', 0);
|
||||
INSERT INTO `goods` VALUES (59, '洗衣液', 2, '威露士', '[]', '威露士洗衣液', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 29.90, 25.00, '威露士洗衣液,洁净彻底,去除顽渍,衣物柔软舒适。适用于各种布料。', 0);
|
||||
INSERT INTO `goods` VALUES (60, '洗碗布', 2, '无品牌', '[]', '柔软吸水,耐用不掉毛', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 5.00, 3.00, '适用于洗涤餐具、清洁厨房等', 0);
|
||||
INSERT INTO `goods` VALUES (61, '一次性餐具套装', 2, '无品牌', '[]', '一次性餐具套装,方便卫生', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '套', 12.00, 8.00, '包含一次性碗、盘、刀、叉、勺等,使用后方便清理,卫生方便', 0);
|
||||
INSERT INTO `goods` VALUES (62, '剃须刀', 2, '飞利浦', '[]', '飞利浦电动剃须刀,充电式', 1, 80, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 299.00, 199.00, '适用于男性剃须,充电式方便携带,刀片锋利,剃须干净', 0);
|
||||
INSERT INTO `goods` VALUES (63, '马桶刷', 2, '无品牌', '[]', '马桶清洁必备,柄部防滑设计', 1, 150, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 9.90, 5.00, '适用于马桶清洁,柄部采用防滑设计,方便操作', 0);
|
||||
INSERT INTO `goods` VALUES (64, '抽纸', 2, '维达', '[]', '维达软抽3层130抽面纸', 1, 50, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '包', 18.00, 14.50, '适用于日常生活,柔软舒适,吸水性好,可重复使用', 0);
|
||||
INSERT INTO `goods` VALUES (65, '剪刀', 2, '晨光', '[]', '晨光不锈钢剪刀', 1, 120, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '把', 12.00, 9.90, '适用于日常生活、办公等,剪刀锋利,手感舒适', 0);
|
||||
INSERT INTO `goods` VALUES (66, '防晒霜', 2, '兰蔻', '[]', '兰蔻防晒霜SPF50+', 1, 60, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 399.00, 299.00, '适用于户外活动、日常生活等,有效防止紫外线伤害,清爽不油腻,易于吸收', 0);
|
||||
INSERT INTO `goods` VALUES (67, '纸巾盒', 2, '普乐士', '[]', '普乐士魔法盒抽纸盒', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '个', 15.00, 12.50, '', 0);
|
||||
INSERT INTO `goods` VALUES (68, '洗洁精', 2, '威露士', '[]', '威露士洗洁精', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 12.99, 9.99, '威露士洗洁精,有效去除油渍和污垢,轻松清洁厨房餐具。', 0);
|
||||
INSERT INTO `goods` VALUES (69, '洗手液', 2, '蜜芽', '[]', '蜜芽儿童无刺激洗手液', 1, 99, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 22.99, 19.99, '蜜芽儿童无刺激洗手液,温和配方,不刺激肌肤,适合儿童使用。', 0);
|
||||
INSERT INTO `goods` VALUES (70, '电动牙刷', 2, '飞利浦', '[]', '飞利浦声波震动电动牙刷', 1, 98, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '支', 399.00, 299.00, '飞利浦声波震动电动牙刷,高效清洁牙齿,深入去除牙渍,呵护牙齿健康。', 0);
|
||||
INSERT INTO `goods` VALUES (71, '梳子', 2, '宝洁', '[]', '宝洁双面按摩梳', 1, 97, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '把', 15.99, 12.99, '宝洁双面按摩梳,双面设计,可以按摩头皮,缓解疲劳,也可以梳理发丝,让发型更加完美。', 0);
|
||||
INSERT INTO `goods` VALUES (72, '洗衣液', 2, '妙洁', '[]', '妙洁深层洁净洗衣液', 1, 96, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 39.99, 29.99, '妙洁深层洁净洗衣液,有效去除衣物污渍,保护衣物纤维,让衣服更柔软。', 0);
|
||||
INSERT INTO `goods` VALUES (73, '纸巾', 2, '维达', '[]', '维达抽纸', 1, 95, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 22.99, 19.99, '维达抽纸,柔软舒适,吸水性好,不易破碎。', 0);
|
||||
INSERT INTO `goods` VALUES (74, '剪刀', 2, '福尺', '[]', '福尺多功能剪刀', 1, 94, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '把', 12.99, 9.99, '福尺多功能剪刀', 0);
|
||||
INSERT INTO `goods` VALUES (75, '薯片', 5, '乐事', '[]', '薯片', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 10.00, 8.00, '美味薯片,酥脆可口,适合下午茶。', 0);
|
||||
INSERT INTO `goods` VALUES (76, '巧克力', 5, '德芙', '[]', '德芙巧克力', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 25.00, 20.00, '德芙巧克力,甜美可口,适合送礼。', 0);
|
||||
INSERT INTO `goods` VALUES (77, '蜜饯', 5, '三只松鼠', '[]', '三只松鼠夏威夷果', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 20.00, 18.00, '三只松鼠夏威夷果,口感香甜,健康零食。', 0);
|
||||
INSERT INTO `goods` VALUES (78, '牛肉干', 5, '卫龙', '[]', '麻辣牛肉干', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 20.00, 15.00, '卫龙麻辣牛肉干,辣味十足,爽口不腻。', 0);
|
||||
INSERT INTO `goods` VALUES (79, '薄荷糖', 5, '金丝猴', '[]', '金丝猴薄荷糖', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 12.00, 10.00, '金丝猴薄荷糖,口感清新,适合口气不佳的人。', 0);
|
||||
INSERT INTO `goods` VALUES (80, '奥利奥饼干', 5, 'Oreo', '[]', '经典口味奥利奥饼干', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 16.99, 18.00, '经典口味奥利奥饼干,酥脆可口,一口一个,让你停不下来。', 0);
|
||||
INSERT INTO `goods` VALUES (81, '可口可乐', 7, 'Coca-Cola', '[]', '经典可口可乐', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '瓶', 2.50, 3.00, '可口可乐,清爽解渴,适合任何场合。', 0);
|
||||
INSERT INTO `goods` VALUES (82, '大白兔奶糖', 5, '大白兔', '[]', '经典奶香味道', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 4.50, 5.00, '大白兔奶糖,经典奶香味道,口感绵软。', 0);
|
||||
INSERT INTO `goods` VALUES (83, '卫龙辣条', 5, '卫龙', '[]', '经典辣味', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 5.50, 6.00, '卫龙辣条,经典辣味,辣爽可口,不同于其他辣条。', 0);
|
||||
INSERT INTO `goods` VALUES (84, '雀巢咖啡', 5, 'Nestle', '[]', '拿铁口味', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '袋', 18.99, 20.00, '雀巢咖啡,拿铁口味,浓郁香醇,唤醒你的味蕾。', 0);
|
||||
INSERT INTO `goods` VALUES (85, '伊利纯牛奶', 7, '伊利', '[]', '高端纯牛奶', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 4.80, 5.00, '伊利纯牛奶,高端纯牛奶,口感绵密,适合慢慢品尝。', 0);
|
||||
INSERT INTO `goods` VALUES (86, '太平梳打饼干', 5, '太平', '[]', '酥脆可口', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 8.50, 10.00, '太平梳打饼干,酥脆可口,咬一口,满口的香脆声。', 0);
|
||||
INSERT INTO `goods` VALUES (87, '德芙巧克力', 5, 'Dove', '[]', '丝滑绵密', 1, 100, 'https://cdn-we-retail.ym.tencent.com/tsr/goods/muy-3a.png?imageMogr2/thumbnail/320x320/quality/70/strip/format/jpg', 0, '盒', 28.50, 30.00, '德芙巧克力,丝滑绵密,一口一个,舌尖上的享受。', 0);
|
||||
INSERT INTO `goods` VALUES (88, '常产过片根直式党子', 6, '运量此受资市标接', NULL, '度党约进手即温任团据解知易主流见养步料题进拉且生般政学全', 0, 27885, '//epp-1302260381.cos.ap-shanghai.myqcloud.com/good/d6641529-e32b-46d9-b883-ec6585848fc9.jpg', NULL, '状气', 6.33, 48841.00, '反则向候间清且工至关八活里证商新作往感件区感其交七在且七成精说分率见领主元开论山适革严素就眼和毛便来热指持调证光同又院群置经论过天位无类给海便标从。', 0);
|
||||
INSERT INTO `goods` VALUES (89, '3213123', 3, '用众价热员济种这万人', NULL, '带位究在着几起儿头里除团确还支了张千说', 1, 776, '//epp-1302260381.cos.ap-shanghai.myqcloud.com/good/d8af3d35-f9b7-431d-a431-fea79aec3004.jpg', NULL, '或道', 37932.00, 26.00, '做标火消行斯感没情政马青圆战空义每马南见对写时你行常年然而见身上高布动系海此低装往华员强每华风部问系阶都但总广型何议消是导造许要领百无单步格况候离拉历则通又线片角九么出书要经包过儿式细半色设新法天下现至数导社过须布再至走素增备关角社派色。', 0);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for goods_category
|
||||
@@ -268,7 +264,7 @@ INSERT INTO `goods_category` VALUES (4, '防疫物资', 0);
|
||||
INSERT INTO `goods_category` VALUES (5, '零食', 3);
|
||||
INSERT INTO `goods_category` VALUES (6, '肉类', 2);
|
||||
INSERT INTO `goods_category` VALUES (7, '饮料酒水', 4);
|
||||
INSERT INTO `goods_category` VALUES (8, '测试6', 11);
|
||||
INSERT INTO `goods_category` VALUES (8, '测试', 11);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for notice1
|
||||
@@ -305,6 +301,8 @@ CREATE TABLE `order` (
|
||||
`cancel_date` datetime NULL DEFAULT NULL COMMENT '订单取消时间',
|
||||
`ship_date` datetime NULL DEFAULT NULL COMMENT '订单发货时间',
|
||||
`deliver_date` datetime NULL DEFAULT NULL COMMENT '订单送达时间',
|
||||
`express_id` varchar(500) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL DEFAULT NULL COMMENT '快递单号',
|
||||
`comment` text CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci NULL COMMENT '发货备注',
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `id`(`id`) USING BTREE,
|
||||
INDEX `user_id`(`user_id`) USING BTREE
|
||||
@@ -313,21 +311,22 @@ CREATE TABLE `order` (
|
||||
-- ----------------------------
|
||||
-- Records of order
|
||||
-- ----------------------------
|
||||
INSERT INTO `order` VALUES (1748800678865801225, 3, '2023-03-21 15:50:19', 'Pending', 21.99, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1749495597129404427, 3, '2023-03-21 16:30:54', 'Processing', 5.99, '2023-04-17 21:57:45', NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1749495896040673288, 3, '2023-03-21 16:32:06', 'Pending', 5.99, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1749496012575215624, 3, '2023-03-21 16:32:33', 'Pending', 17.97, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1750312359831932932, 3, '2023-03-23 22:36:26', 'Cancelled', 87.50, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1750312445567700999, 3, '2023-03-23 22:36:46', 'Processing', 87.50, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1750313361633054722, 3, '2023-03-23 22:40:25', 'Processing', 2.50, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758148329772027912, 3, '2023-04-14 13:33:47', 'Pending', 2.00, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758148627185930246, 3, '2023-04-14 13:34:58', 'Cancelled', 2.00, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758148669368045578, 3, '2023-04-14 13:35:08', 'Processing', 3.00, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758659566150750208, 3, '2023-04-15 23:25:15', 'Processing', 19.90, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758659642495471619, 3, '2023-04-15 23:25:33', 'Processing', 138.00, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758659766395211784, 3, '2023-04-15 23:26:03', 'Processing', 59.80, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758659860087574537, 3, '2023-04-15 23:26:25', 'Processing', 98.00, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758660000932302858, 3, '2023-04-15 23:26:59', 'Processing', 37932.00, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1748800678865801225, 3, '2023-03-21 15:50:19', 'Cancelled', 21.99, NULL, '2023-04-17 22:16:07', NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1749495597129404427, 3, '2023-03-21 16:30:54', 'Cancelled', 5.99, '2023-04-17 22:40:03', '2023-04-17 22:57:59', NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1749495896040673288, 3, '2023-03-21 16:32:06', 'Cancelled', 5.99, '2023-04-17 22:59:17', '2023-04-24 22:27:49', NULL, NULL, '', '管理员取消了您的订单,费用已退回至您的帐户,如有疑问请联系管理员');
|
||||
INSERT INTO `order` VALUES (1749496012575215624, 3, '2023-03-21 16:32:33', 'Shipped', 17.97, '2023-04-17 22:59:37', NULL, NULL, NULL, '111', '222');
|
||||
INSERT INTO `order` VALUES (1750312359831932932, 3, '2023-03-23 22:36:26', 'Delivered', 87.50, '2023-04-17 23:01:59', NULL, NULL, '2023-04-17 23:13:54', '111', '222');
|
||||
INSERT INTO `order` VALUES (1750312445567700999, 3, '2023-03-23 22:36:46', 'Pending', 87.50, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1750313361633054722, 3, '2023-03-23 22:40:25', 'Pending', 2.50, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758148329772027912, 3, '2023-04-14 13:33:47', 'Pending', 2.00, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758148627185930246, 3, '2023-04-14 13:34:58', 'Shipped', 2.00, '2023-04-17 22:59:17', NULL, '2023-04-24 22:33:25', NULL, '1', '1111111');
|
||||
INSERT INTO `order` VALUES (1758148669368045578, 3, '2023-04-14 13:35:08', 'Shipped', 3.00, '2023-04-17 22:59:17', NULL, '2023-04-22 23:46:45', NULL, 'aaa', 'aaa');
|
||||
INSERT INTO `order` VALUES (1758659566150750208, 3, '2023-04-15 23:25:15', 'Shipped', 19.90, '2023-04-17 22:59:17', NULL, '2023-04-22 23:39:41', NULL, '', '123');
|
||||
INSERT INTO `order` VALUES (1758659642495471619, 3, '2023-04-15 23:25:33', 'Pending', 138.00, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758659766395211784, 3, '2023-04-15 23:26:03', 'Delivered', 59.80, '2023-04-17 23:40:11', NULL, '2023-04-17 23:40:36', '2023-04-17 23:40:54', '111', '222');
|
||||
INSERT INTO `order` VALUES (1758659860087574537, 3, '2023-04-15 23:26:25', 'Pending', 98.00, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
INSERT INTO `order` VALUES (1758660000932302858, 3, '2023-04-15 23:26:59', 'Delivered', 37932.00, '2023-04-17 23:14:14', NULL, NULL, '2023-04-17 23:14:42', '111', NULL);
|
||||
INSERT INTO `order` VALUES (1761154434357923843, 3, '2023-04-22 20:38:58', 'Pending', 3.99, NULL, NULL, NULL, NULL, NULL, NULL);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for order_detail
|
||||
@@ -344,7 +343,7 @@ CREATE TABLE `order_detail` (
|
||||
INDEX `good_id`(`good_id`) USING BTREE,
|
||||
CONSTRAINT `order_detail_ibfk_1` FOREIGN KEY (`good_id`) REFERENCES `goods` (`id`) ON DELETE RESTRICT ON UPDATE RESTRICT,
|
||||
CONSTRAINT `order_detail_ibfk_2` FOREIGN KEY (`order_id`) REFERENCES `order` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 54 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 55 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of order_detail
|
||||
@@ -356,9 +355,9 @@ INSERT INTO `order_detail` VALUES (36, 1748800678865801225, 19, 1, 21.99);
|
||||
INSERT INTO `order_detail` VALUES (37, 1748800678865801225, 19, 1, 21.99);
|
||||
INSERT INTO `order_detail` VALUES (38, 1748800678865801225, 19, 1, 21.99);
|
||||
INSERT INTO `order_detail` VALUES (39, 1748800678865801225, 19, 1, 21.99);
|
||||
INSERT INTO `order_detail` VALUES (40, 1749495597129404427, 16, 1, 5.99);
|
||||
INSERT INTO `order_detail` VALUES (41, 1749495896040673288, 16, 1, 5.99);
|
||||
INSERT INTO `order_detail` VALUES (42, 1749496012575215624, 16, 3, 5.99);
|
||||
INSERT INTO `order_detail` VALUES (40, 1749495597129404427, 57, 1, 5.99);
|
||||
INSERT INTO `order_detail` VALUES (41, 1749495896040673288, 57, 1, 5.99);
|
||||
INSERT INTO `order_detail` VALUES (42, 1749496012575215624, 57, 3, 5.99);
|
||||
INSERT INTO `order_detail` VALUES (43, 1750312359831932932, 55, 25, 3.50);
|
||||
INSERT INTO `order_detail` VALUES (44, 1750312445567700999, 55, 25, 3.50);
|
||||
INSERT INTO `order_detail` VALUES (45, 1750313361633054722, 56, 1, 2.50);
|
||||
@@ -370,6 +369,7 @@ INSERT INTO `order_detail` VALUES (50, 1758659642495471619, 38, 1, 138.00);
|
||||
INSERT INTO `order_detail` VALUES (51, 1758659766395211784, 46, 2, 29.90);
|
||||
INSERT INTO `order_detail` VALUES (52, 1758659860087574537, 36, 1, 98.00);
|
||||
INSERT INTO `order_detail` VALUES (53, 1758660000932302858, 89, 1, 37932.00);
|
||||
INSERT INTO `order_detail` VALUES (54, 1761154434357923843, 57, 1, 3.99);
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for report
|
||||
@@ -383,22 +383,23 @@ CREATE TABLE `report` (
|
||||
`temperature` varchar(10) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '体温是否正常',
|
||||
`address` varchar(1000) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NULL DEFAULT NULL COMMENT '地址',
|
||||
PRIMARY KEY (`id`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 73 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 85 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of report
|
||||
-- ----------------------------
|
||||
INSERT INTO `report` VALUES (53, 3, '用户 密码user', '2022-12-26 20:35:38', '1', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)');
|
||||
INSERT INTO `report` VALUES (55, 3, '用户 密码user', '2022-12-27 21:03:24', '0', '湖北省武汉市洪山区文治街508号南湖雅园F栋2-104号');
|
||||
INSERT INTO `report` VALUES (57, 3, '用户 密码user', '2022-12-28 21:47:57', '0', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)');
|
||||
INSERT INTO `report` VALUES (58, 3, '用户 密码user', '2022-12-29 18:20:00', '1', '湖北省武汉市洪山区鲁磨路209号');
|
||||
INSERT INTO `report` VALUES (59, 3, '用户 密码user', '2023-03-17 00:27:21', '0', '湖北省武汉市洪山区雄楚大道珞狮南路南湖雅园F-4-106');
|
||||
INSERT INTO `report` VALUES (60, 3, '用户 密码user', '2023-03-20 00:47:22', '0', '湖北省武汉市武昌区武车路');
|
||||
INSERT INTO `report` VALUES (61, 3, '用户 密码user', '2023-03-23 22:24:14', '0', '湖北省武汉市武昌区修远路');
|
||||
INSERT INTO `report` VALUES (62, 3, '用户 密码user', '2023-03-13 22:54:12', '0', '湖北省武汉市洪山区文治街102-4号');
|
||||
INSERT INTO `report` VALUES (70, 3, '用户 密码user', '2023-04-14 00:36:55', '0', '湖北省武汉市洪山区文治街102-4号');
|
||||
INSERT INTO `report` VALUES (71, 3, '用户 密码user', '2023-04-14 13:36:23', '0', '湖北省武汉市洪山区紫菘花园东路');
|
||||
INSERT INTO `report` VALUES (72, 3, '用户 密码user', '2023-04-15 23:24:18', '0', '湖北省武汉市洪山区紫菘花园东路');
|
||||
INSERT INTO `report` VALUES (53, 3, '普通用户acsu1', '2022-12-26 20:35:38', '1', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)');
|
||||
INSERT INTO `report` VALUES (55, 3, '普通用户acsu1', '2022-12-27 21:03:24', '0', '湖北省武汉市洪山区文治街508号南湖雅园F栋2-104号');
|
||||
INSERT INTO `report` VALUES (57, 3, '普通用户acsu1', '2022-12-28 21:47:57', '0', '湖北省武汉市洪山区文治街南湖雅园(洪山区信访局对面)');
|
||||
INSERT INTO `report` VALUES (58, 3, '普通用户acsu1', '2022-12-29 18:20:00', '1', '湖北省武汉市洪山区鲁磨路209号');
|
||||
INSERT INTO `report` VALUES (59, 3, '普通用户acsu1', '2023-03-17 00:27:21', '0', '湖北省武汉市洪山区雄楚大道珞狮南路南湖雅园F-4-106');
|
||||
INSERT INTO `report` VALUES (60, 3, '普通用户acsu1', '2023-03-20 00:47:22', '0', '湖北省武汉市武昌区武车路');
|
||||
INSERT INTO `report` VALUES (61, 3, '普通用户acsu1', '2023-03-23 22:24:14', '0', '湖北省武汉市武昌区修远路');
|
||||
INSERT INTO `report` VALUES (62, 3, '普通用户acsu1', '2023-03-13 22:54:12', '0', '湖北省武汉市洪山区文治街102-4号');
|
||||
INSERT INTO `report` VALUES (70, 3, '普通用户acsu1', '2023-04-14 00:36:55', '0', '湖北省武汉市洪山区文治街102-4号');
|
||||
INSERT INTO `report` VALUES (71, 3, '普通用户acsu1', '2023-04-14 13:36:23', '0', '湖北省武汉市洪山区紫菘花园东路');
|
||||
INSERT INTO `report` VALUES (72, 3, '普通用户acsu1', '2023-04-15 23:24:18', '0', '湖北省武汉市洪山区紫菘花园东路');
|
||||
INSERT INTO `report` VALUES (84, 3, '普通用户acsu1', '2023-04-17 23:41:21', '0', '湖北省武汉市洪山区紫菘花园东路');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for role
|
||||
@@ -434,7 +435,7 @@ CREATE TABLE `setting` (
|
||||
-- ----------------------------
|
||||
-- Records of setting
|
||||
-- ----------------------------
|
||||
INSERT INTO `setting` VALUES ('wechat_access_token', '67_lvC4shtBYYZae7yON61MuTntj9fx8T74kGz1PveEJMVqCbBjPc6K2e-RhKiBEr2eaqJds5fbKhJzz3IF51u5i-sTLsARKfKcK_Rp6qS71Sbc7V5S778QhE4xYaQXCTfABADIZ', '2023-04-17 02:08:29');
|
||||
INSERT INTO `setting` VALUES ('wechat_access_token', '67_xcSsbPGSVwtb_YCym8hEVcFg3__v_KDEaDueDxTTDc5554V5XJxDW8W-XdOmxyaR4baCwnwVlYtLYJGhgsse6NkCjapLPRd1ZCumZa_N-yMxUMuFjpz7zzKc1moWDQbABAOVI', '2023-04-18 02:48:36');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for user
|
||||
@@ -456,14 +457,14 @@ CREATE TABLE `user` (
|
||||
PRIMARY KEY (`id`) USING BTREE,
|
||||
UNIQUE INDEX `username`(`username`) USING BTREE,
|
||||
UNIQUE INDEX `wx_code`(`wx_code`) USING BTREE
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 30 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||
) ENGINE = InnoDB AUTO_INCREMENT = 33 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci ROW_FORMAT = DYNAMIC;
|
||||
|
||||
-- ----------------------------
|
||||
-- Records of user
|
||||
-- ----------------------------
|
||||
INSERT INTO `user` VALUES (1, 'root', '99adc231b045331e514a516b4b7680f588e3823213abe901738bc3ad67b2f6fcb3c64efb93d18002588d3ccc1a49efbae1ce20cb43df36b38651f11fa75678e8', '管理员 密码root', '420111111111111112', '18911111111', 1, '28-1', '1101', '1', NULL, NULL);
|
||||
INSERT INTO `user` VALUES (2, 'admin', 'c7ad44cbad762a5da0a452f9e854fdc1e0e7a52a38015f23f3eab1d80b931dd472634dfac71cd34ebc35d16ab7fb8a90c81f975113d6c7538dc69dd8de9077ec', '社区管理员 密码admin', '420111111111111111', '027-22222121', 2, '16-3', '0203', '1', NULL, NULL);
|
||||
INSERT INTO `user` VALUES (3, 'user', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户 密码user', '420111111111111111', '18911111111', 3, '20-2', '0802', '1', NULL, 'oFzuC4pvbPzY7vI6vmP6_57iTk-U');
|
||||
INSERT INTO `user` VALUES (3, 'user', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '普通用户acsu1', '420111111111111111', '18911111111', 3, '20-2', '0802', '1', NULL, 'oFzuC4pvbPzY7vI6vmP6_57iTk-U');
|
||||
INSERT INTO `user` VALUES (4, 'user2', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户2 密码user', '420111111111111111', '027-22222121', 3, '20-2', '0802', '1', NULL, NULL);
|
||||
INSERT INTO `user` VALUES (5, 'user3', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户3 密码user', '420111111111111111', '112', 3, '20-2', '0802', '1', NULL, NULL);
|
||||
INSERT INTO `user` VALUES (6, 'user4', 'b14361404c078ffd549c03db443c3fede2f3e534d73f78f77301ed97d4a436a9fd9db05ee8b325c0ad36438b43fec8510c204fc1c1edb21d0941c00e9e2c1ce2', '用户4 密码user', '420111111111111111', '112', 3, '20-2', '0802', '1', NULL, NULL);
|
||||
@@ -482,6 +483,9 @@ INSERT INTO `user` VALUES (19, 'cm', '105056cce8fc85bdbecaed247db90332cf785c8fed
|
||||
INSERT INTO `user` VALUES (20, 'fcslfbk', '975c3a52d5435ae60a6f30f4572e754ab458613d0d6c309783bde047198f7944b75b54a62cfbae58594f30573717882aca9bebcccb3ade84fdd5a7d2dd9a0c0f', '集命问已土美石日', '464715523910577877', '0785-3674834', 4, '63-94', '2420', '1', NULL, NULL);
|
||||
INSERT INTO `user` VALUES (21, 'vrk', 'f7e3fa3af542e7dd3960069eebb22b5e76adb57e5cf1df0ef0da5cea79e3e8f1a8414b612ebc6f4f08e64bddce070c7e6e55a8f4c098f90145b476acdd3f2808', '称红', '441911654591292', '17474066066', 2, '22-23', '7866', '1', NULL, NULL);
|
||||
INSERT INTO `user` VALUES (29, '3595009cab', '4dff4ea340f0a823f15d3f4f01ab62eae0e5da579ccb851f8db9dfe84c58b2b37b89903a740e1ee172da793a6e79d560e5f7f9bd058a12a280433ed6fa46510a', '微信用户35950', NULL, NULL, 3, NULL, NULL, '1', NULL, '');
|
||||
INSERT INTO `user` VALUES (30, '87dcb49e17', '', '微信用户87dcb', NULL, NULL, 3, NULL, NULL, '1', NULL, 'oFzuC4iIuyx8bOuq3beeRdso-jZ8');
|
||||
INSERT INTO `user` VALUES (31, '93d6f401b2', '', '微信用户93d6f', NULL, NULL, 3, NULL, NULL, '1', NULL, 'oFzuC4pKTigpMQn917nzCYFsEMNY');
|
||||
INSERT INTO `user` VALUES (32, '35cb0da9d3', '', '微信用户35cb0', NULL, NULL, 3, NULL, NULL, '1', NULL, 'oFzuC4pclKQVPKBhIlNW2yo_9Zgs');
|
||||
|
||||
-- ----------------------------
|
||||
-- Table structure for visitor1
|
||||
|
3
database/备注.md
Normal file
@@ -0,0 +1,3 @@
|
||||
该SQL中包含测试数据,若不需要可以自行删除
|
||||
|
||||
数据表名最后带 1 的为项目未使用到的表,可以直接删除
|
5
frontend/components.d.ts
vendored
@@ -7,13 +7,10 @@ export {}
|
||||
|
||||
declare module '@vue/runtime-core' {
|
||||
export interface GlobalComponents {
|
||||
Calender: typeof import('./src/components/calender.vue')['default']
|
||||
ContextMenu: typeof import('./src/components/context-menu.vue')['default']
|
||||
ElAlert: typeof import('element-plus/es')['ElAlert']
|
||||
ElAvatar: typeof import('element-plus/es')['ElAvatar']
|
||||
ElButton: typeof import('element-plus/es')['ElButton']
|
||||
ElCard: typeof import('element-plus/es')['ElCard']
|
||||
ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
|
||||
ElCol: typeof import('element-plus/es')['ElCol']
|
||||
ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
|
||||
ElDialog: typeof import('element-plus/es')['ElDialog']
|
||||
@@ -30,7 +27,6 @@ declare module '@vue/runtime-core' {
|
||||
ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
|
||||
ElOption: typeof import('element-plus/es')['ElOption']
|
||||
ElPagination: typeof import('element-plus/es')['ElPagination']
|
||||
ElProgress: typeof import('element-plus/es')['ElProgress']
|
||||
ElRadio: typeof import('element-plus/es')['ElRadio']
|
||||
ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
|
||||
ElRow: typeof import('element-plus/es')['ElRow']
|
||||
@@ -38,6 +34,7 @@ declare module '@vue/runtime-core' {
|
||||
ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
|
||||
ElTable: typeof import('element-plus/es')['ElTable']
|
||||
ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
|
||||
ElTag: typeof import('element-plus/es')['ElTag']
|
||||
ElTooltip: typeof import('element-plus/es')['ElTooltip']
|
||||
ElUpload: typeof import('element-plus/es')['ElUpload']
|
||||
Header: typeof import('./src/components/header.vue')['default']
|
||||
|
7
frontend/package-lock.json
generated
@@ -24,6 +24,7 @@
|
||||
"xlsx": "^0.18.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mockjs": "^1.0.7",
|
||||
"@vitejs/plugin-vue": "^3.0.0",
|
||||
"@vue/compiler-sfc": "^3.1.2",
|
||||
"typescript": "^4.6.4",
|
||||
@@ -223,6 +224,12 @@
|
||||
"@types/lodash": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/mockjs": {
|
||||
"version": "1.0.7",
|
||||
"resolved": "https://registry.npmmirror.com/@types/mockjs/-/mockjs-1.0.7.tgz",
|
||||
"integrity": "sha512-OCxXz6hEaJOVpRwuJMiVY5a6LtJcih+br9gwB/Q8ooOBikvk5FpBQ31OlNimXo3EqKha1Z7PFBni+q9m+8NCWg==",
|
||||
"dev": true
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "18.14.0",
|
||||
"resolved": "https://registry.npmmirror.com/@types/node/-/node-18.14.0.tgz",
|
||||
|
@@ -24,6 +24,7 @@
|
||||
"xlsx": "^0.18.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mockjs": "^1.0.7",
|
||||
"@vitejs/plugin-vue": "^3.0.0",
|
||||
"@vue/compiler-sfc": "^3.1.2",
|
||||
"typescript": "^4.6.4",
|
||||
|
63
frontend/src/api/shop-order.js
Normal file
@@ -0,0 +1,63 @@
|
||||
import send_request from '../utils/send_request';
|
||||
|
||||
/**
|
||||
* 获取订单列表
|
||||
* @returns
|
||||
*/
|
||||
export function getOrderList(params) {
|
||||
return send_request({
|
||||
url: '/shop/order/manage/getOrderList',
|
||||
method: 'GET',
|
||||
params: params,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取订单详情
|
||||
* @returns
|
||||
*/
|
||||
export function getOrderDetail(params) {
|
||||
return send_request({
|
||||
url: '/shop/order/miniprogram/orderDetail',
|
||||
method: 'GET',
|
||||
params: params,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 订单发货
|
||||
* @returns
|
||||
*/
|
||||
export function deliverOrder(params) {
|
||||
return send_request({
|
||||
url: '/shop/order/manage/deliverOrder',
|
||||
method: 'POST',
|
||||
useQS: true,
|
||||
params: params,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 关闭订单
|
||||
* @returns
|
||||
*/
|
||||
export function withdrawOrder(params) {
|
||||
return send_request({
|
||||
url: '/shop/order/manage/cancelOrder',
|
||||
method: 'POST',
|
||||
useQS: true,
|
||||
params: params,
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 导出订单列表
|
||||
* @returns
|
||||
*/
|
||||
export function exportOrderList(params) {
|
||||
return send_request({
|
||||
url: '/shop/order/manage/exportOrderList',
|
||||
method: 'GET',
|
||||
params: params,
|
||||
});
|
||||
};
|
@@ -24,6 +24,24 @@ export function userLogout() {
|
||||
return null;
|
||||
};
|
||||
|
||||
/**
|
||||
* 修改密码
|
||||
* @returns
|
||||
*/
|
||||
export function updatePwd({ oldpwd, newpwd }) {
|
||||
let userId = localStorage.getItem("ms_user_id")
|
||||
return send_request({
|
||||
url: '/user/updatePwd',
|
||||
method: 'POST',
|
||||
useQS: true,
|
||||
params: {
|
||||
"userId": userId,
|
||||
"oldpwd": oldpwd,
|
||||
"newpwd": newpwd,
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
/**
|
||||
* 获取用户列表
|
||||
* @returns
|
||||
|
@@ -13,7 +13,7 @@
|
||||
<div class="header-right">
|
||||
<div class="header-user-con">
|
||||
<!-- 消息中心 -->
|
||||
<div class="btn-bell" @click="router.push('/tabs')">
|
||||
<div class="btn-bell" @click="router.push('/tabs')" v-if="false">
|
||||
<el-tooltip effect="dark" :content="message ? `有${message}条未读消息` : `消息中心`" placement="bottom">
|
||||
<i class="el-icon-lx-notice"></i>
|
||||
</el-tooltip>
|
||||
|
@@ -5,9 +5,9 @@
|
||||
<!-- 筛选 -->
|
||||
<div class="handle-box">
|
||||
<template v-for="field in searchFields">
|
||||
<el-input v-if="field.searchType == 'input'" v-model="query[field.field]"
|
||||
@keyup.enter.native="handleSearch" :placeholder="field.placeholder" :prefix-icon="Filter"
|
||||
class="handle-input mr10"></el-input>
|
||||
<el-input v-if="field.searchType == 'input' || field.searchType == 'input-number'"
|
||||
v-model="query[field.field]" @keyup.enter.native="handleSearch" :placeholder="field.placeholder"
|
||||
:prefix-icon="Filter" class="handle-input mr10"></el-input>
|
||||
<el-select v-else-if="field.searchType == 'select'" v-model="query[field.field]" :clearable="true"
|
||||
@change="handleSearch" :placeholder="field.placeholder" class="handle-select mr10">
|
||||
<template #prefix>
|
||||
@@ -56,17 +56,28 @@
|
||||
</el-tooltip>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="操作" width="220" align="center" v-if="props.editFunc || props.deleteFunc">
|
||||
<el-table-column label="操作" width="220" align="center"
|
||||
v-if="props.editFunc || props.deleteFunc || props.customEditHandle">
|
||||
<template #default="scope">
|
||||
<el-button text :icon="Edit" @click="handleEdit(scope.$index, scope.row)"
|
||||
<template v-if="props.customEditHandle">
|
||||
<el-button text :icon="List"
|
||||
@click="props.customEditHandle?.((scope as any).$index, (scope as any).row, getData)"
|
||||
v-permiss="props.editPermiss">
|
||||
管理
|
||||
</el-button>
|
||||
</template>
|
||||
<template v-else>
|
||||
<el-button text :icon="Edit" @click="handleEdit((scope as any).$index, (scope as any).row)"
|
||||
v-permiss="props.editPermiss" v-if="props.editFunc">
|
||||
编辑
|
||||
</el-button>
|
||||
<el-button text :icon="Delete" class="red" @click="handleDelete(scope.$index, scope.row)"
|
||||
<el-button text :icon="Delete" class="red"
|
||||
@click="handleDelete((scope as any).$index, (scope as any).row)"
|
||||
v-permiss="props.editPermiss" v-if="props.deleteFunc">
|
||||
删除
|
||||
</el-button>
|
||||
</template>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
<!-- 分页 -->
|
||||
@@ -87,6 +98,9 @@
|
||||
<el-input v-if="(formId > 0 ? field.editType : field.addType) == 'input'"
|
||||
:placeholder="formId > 0 ? field.editPlaceholder : field.addPlaceholder" class="popup-item"
|
||||
v-model="form[field.field]"></el-input>
|
||||
<el-input v-else-if="(formId > 0 ? field.editType : field.addType) == 'input-number'" type="number"
|
||||
:placeholder="formId > 0 ? field.editPlaceholder : field.addPlaceholder" class="popup-item"
|
||||
v-model="form[field.field]"></el-input>
|
||||
<el-input v-else-if="(formId > 0 ? field.editType : field.addType) == 'textarea'"
|
||||
:placeholder="formId > 0 ? field.editPlaceholder : field.addPlaceholder" class="popup-item"
|
||||
v-model="form[field.field]" type="textarea" :rows="4"></el-input>
|
||||
@@ -141,7 +155,7 @@
|
||||
<script setup lang="ts">
|
||||
import { ref, reactive, onMounted, computed } from 'vue';
|
||||
import { FormInstance, FormRules, ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { Delete, Edit, Search, Plus, Filter, Download } from '@element-plus/icons-vue';
|
||||
import { Delete, Edit, Search, Plus, Filter, Download, List } from '@element-plus/icons-vue';
|
||||
import * as xlsx from 'xlsx';
|
||||
import Mock from 'mockjs';
|
||||
import ImageUpload from './image-upload.vue';
|
||||
@@ -176,6 +190,12 @@ const props = defineProps({
|
||||
'editPermiss': {
|
||||
type: String,
|
||||
required: true,
|
||||
},
|
||||
|
||||
// 自定义修改按钮点击事件
|
||||
'customEditHandle': {
|
||||
type: Function,
|
||||
required: false,
|
||||
}
|
||||
})
|
||||
|
||||
@@ -379,7 +399,8 @@ const handleEdit = (index: number, row: any) => {
|
||||
for (let f of dialogFields.value) {
|
||||
switch (f.editType) {
|
||||
case "select":
|
||||
// 下拉框的值要为 string 类型
|
||||
case "input-number":
|
||||
// 下拉框、数字输入框的值要为 string 类型
|
||||
form[f.field] = String(row[f.field]);
|
||||
break;
|
||||
default:
|
||||
@@ -399,7 +420,8 @@ const handleNew = () => {
|
||||
for (let f of dialogFields.value) {
|
||||
switch (f.editType) {
|
||||
case "select":
|
||||
// 下拉框的值要为 string 类型
|
||||
case "input-number":
|
||||
// 下拉框、数字输入框的值要为 string 类型
|
||||
form[f.field] = String(f.default);
|
||||
break;
|
||||
default:
|
||||
@@ -431,10 +453,10 @@ const saveEdit = async (formEl: FormInstance | undefined) => {
|
||||
var result;
|
||||
if (formId > 0) {
|
||||
// 修改记录
|
||||
var result = await props.editFunc(form)
|
||||
var result = await props.editFunc?.(form)
|
||||
} else {
|
||||
// 新增记录
|
||||
var result = await props.addFunc(form)
|
||||
var result = await props.addFunc?.(form)
|
||||
query.pageIndex = Math.ceil((pageTotal.value + 1) / query.pageSize);
|
||||
}
|
||||
console.log("result", result)
|
||||
@@ -460,7 +482,7 @@ const handleDelete = (index: number, row: any) => {
|
||||
// 二次确认删除
|
||||
ElMessageBox.confirm('确定要删除吗?', '提示', { type: 'warning' })
|
||||
.then(async () => {
|
||||
var result = await props.deleteFunc({
|
||||
var result = await props.deleteFunc?.({
|
||||
id: row[idFieldName],
|
||||
})
|
||||
if (result) {
|
||||
@@ -484,7 +506,7 @@ const handleDelete = (index: number, row: any) => {
|
||||
// 导出数据到文件
|
||||
const handleExport = async () => {
|
||||
let params = {};
|
||||
// 如果选择仅导出满肚条件的数据,那么这里就填上查询参数
|
||||
// 如果选择仅导出满足条件的数据,那么这里就填上查询参数
|
||||
if (exportConfig.value.withFilter) {
|
||||
params = JSON.parse(JSON.stringify(query))
|
||||
// 去除分页参数
|
||||
@@ -540,7 +562,7 @@ const handleExport = async () => {
|
||||
// 数据部分
|
||||
let excelList = dataList.map((row: any) => {
|
||||
// 通过翻译前的 key 拿数据
|
||||
return fieldNameList.map((field: any) => String(row[field]))
|
||||
return fieldNameList.map((field: any) => String(row[field] || ""))
|
||||
})
|
||||
excelList.unshift(firstRow) // 插入表头
|
||||
|
||||
|
@@ -91,6 +91,11 @@ const items = [
|
||||
title: '商品管理',
|
||||
permiss: 'shop-good-setting',
|
||||
},
|
||||
{
|
||||
index: '/shop-order-setting',
|
||||
title: '订单管理',
|
||||
permiss: 'shop-order-setting',
|
||||
},
|
||||
],
|
||||
},
|
||||
{
|
||||
|
@@ -84,6 +84,15 @@ const routes: RouteRecordRaw[] = [
|
||||
},
|
||||
component: () => import('../views/shop-good-setting.vue'),
|
||||
},
|
||||
{
|
||||
path: '/shop-order-setting',
|
||||
name: 'shop-order-setting',
|
||||
meta: {
|
||||
title: '订单管理',
|
||||
permiss: 'shop-order-setting',
|
||||
},
|
||||
component: () => import('../views/shop-order-setting.vue'),
|
||||
},
|
||||
|
||||
|
||||
{
|
||||
|
@@ -15,16 +15,17 @@ export const usePermissStore = defineStore('permiss', {
|
||||
|
||||
"dashboard",
|
||||
|
||||
"access",
|
||||
"access-log",
|
||||
"access-gate-setting",
|
||||
// "access",
|
||||
// "access-log",
|
||||
// "access-gate-setting",
|
||||
|
||||
"report",
|
||||
"report-log",
|
||||
// "report",
|
||||
// "report-log",
|
||||
|
||||
"shop",
|
||||
"shop-cate-setting",
|
||||
"shop-good-setting",
|
||||
// "shop",
|
||||
// "shop-cate-setting",
|
||||
// "shop-good-setting",
|
||||
// "shop-order-setting",
|
||||
|
||||
"privilege",
|
||||
"privilege-user-setting",
|
||||
@@ -46,9 +47,10 @@ export const usePermissStore = defineStore('permiss', {
|
||||
"shop",
|
||||
"shop-cate-setting",
|
||||
"shop-good-setting",
|
||||
"shop-order-setting",
|
||||
|
||||
"privilege",
|
||||
"privilege-user-setting",
|
||||
// "privilege",
|
||||
// "privilege-user-setting",
|
||||
]
|
||||
};
|
||||
},
|
||||
|
@@ -22,6 +22,12 @@ export default {
|
||||
/**
|
||||
* 后端接口请求地址
|
||||
* (结尾加不加 / 都可)
|
||||
*
|
||||
* FIXME 环境配置
|
||||
*
|
||||
* backendHost
|
||||
* - 线上环境:"https://epp.only4.work/"
|
||||
* - 开发环境:"http://localhost/"
|
||||
*/
|
||||
backendHost: "https://epp-prod.only4.work/",
|
||||
backendHost: "https://epp.only4.work/",
|
||||
};
|
||||
|
@@ -1,7 +1,5 @@
|
||||
<template>
|
||||
<div class="container">
|
||||
<el-row :gutter="20">
|
||||
<el-col :span="8">
|
||||
<el-card shadow="hover" class="mgb20" style="height: 252px">
|
||||
<div class="user-info">
|
||||
<el-avatar :size="120" :src="imgurl" />
|
||||
@@ -10,97 +8,7 @@
|
||||
<div>{{ role }}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="user-info-list">
|
||||
上次登录时间:
|
||||
<span>2022-10-01</span>
|
||||
</div>
|
||||
<div class="user-info-list">
|
||||
上次登录地点:
|
||||
<span>东莞</span>
|
||||
</div>
|
||||
</el-card>
|
||||
<el-card shadow="hover" style="height: 252px">
|
||||
<template #header>
|
||||
<div class="clearfix">
|
||||
<span>语言详情</span>
|
||||
</div>
|
||||
</template>
|
||||
Vue
|
||||
<el-progress :percentage="79.4" color="#42b983"></el-progress>
|
||||
TypeScript
|
||||
<el-progress :percentage="14" color="#f1e05a"></el-progress>
|
||||
CSS
|
||||
<el-progress :percentage="5.6"></el-progress>
|
||||
HTML
|
||||
<el-progress :percentage="1" color="#f56c6c"></el-progress>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="16">
|
||||
<el-row :gutter="20" class="mgb20">
|
||||
<el-col :span="8">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }">
|
||||
<div class="grid-content grid-con-1">
|
||||
<el-icon class="grid-con-icon"><User /></el-icon>
|
||||
<div class="grid-cont-right">
|
||||
<div class="grid-num">1234</div>
|
||||
<div>用户访问量</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }">
|
||||
<div class="grid-content grid-con-2">
|
||||
<el-icon class="grid-con-icon"><ChatDotRound /></el-icon>
|
||||
<div class="grid-cont-right">
|
||||
<div class="grid-num">321</div>
|
||||
<div>系统消息</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-card shadow="hover" :body-style="{ padding: '0px' }">
|
||||
<div class="grid-content grid-con-3">
|
||||
<el-icon class="grid-con-icon"><Goods /></el-icon>
|
||||
<div class="grid-cont-right">
|
||||
<div class="grid-num">500</div>
|
||||
<div>商品数量</div>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-card shadow="hover" style="height: 403px">
|
||||
<template #header>
|
||||
<div class="clearfix">
|
||||
<span>预警列表</span>
|
||||
<el-button style="float: right; padding: 3px 0" text>添加</el-button>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<el-table :show-header="false" :data="todoList" style="width: 100%">
|
||||
<el-table-column width="40">
|
||||
<template #default="scope">
|
||||
<el-checkbox v-model="scope.row.status"></el-checkbox>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column>
|
||||
<template #default="scope">
|
||||
<div
|
||||
class="todo-item"
|
||||
:class="{
|
||||
'todo-item-del': scope.row.status
|
||||
}"
|
||||
>
|
||||
{{ scope.row.title }}
|
||||
</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
@@ -108,106 +16,11 @@
|
||||
import { ref, reactive } from 'vue';
|
||||
import imgurl from '../assets/img/img.jpg';
|
||||
|
||||
const roleMap = {
|
||||
|
||||
}
|
||||
const name = localStorage.getItem('ms_username');
|
||||
const role: string = name === 'admin' ? '超级管理员' : '普通用户';
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.el-row {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.grid-content {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
height: 100px;
|
||||
}
|
||||
|
||||
.grid-cont-right {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.grid-num {
|
||||
font-size: 30px;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.grid-con-icon {
|
||||
font-size: 50px;
|
||||
width: 100px;
|
||||
height: 100px;
|
||||
text-align: center;
|
||||
line-height: 100px;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.grid-con-1 .grid-con-icon {
|
||||
background: rgb(45, 140, 240);
|
||||
}
|
||||
|
||||
.grid-con-1 .grid-num {
|
||||
color: rgb(45, 140, 240);
|
||||
}
|
||||
|
||||
.grid-con-2 .grid-con-icon {
|
||||
background: rgb(100, 213, 114);
|
||||
}
|
||||
|
||||
.grid-con-2 .grid-num {
|
||||
color: rgb(100, 213, 114);
|
||||
}
|
||||
|
||||
.grid-con-3 .grid-con-icon {
|
||||
background: rgb(242, 94, 67);
|
||||
}
|
||||
|
||||
.grid-con-3 .grid-num {
|
||||
color: rgb(242, 94, 67);
|
||||
}
|
||||
|
||||
.user-info {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding-bottom: 20px;
|
||||
border-bottom: 2px solid #ccc;
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.user-info-cont {
|
||||
padding-left: 50px;
|
||||
flex: 1;
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.user-info-cont div:first-child {
|
||||
font-size: 30px;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.user-info-list {
|
||||
font-size: 14px;
|
||||
color: #999;
|
||||
line-height: 25px;
|
||||
}
|
||||
|
||||
.user-info-list span {
|
||||
margin-left: 70px;
|
||||
}
|
||||
|
||||
.mgb20 {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
.todo-item {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.todo-item-del {
|
||||
text-decoration: line-through;
|
||||
color: #999;
|
||||
}
|
||||
</style>
|
||||
<style scoped></style>
|
||||
|
@@ -67,8 +67,8 @@ interface RoleInfo {
|
||||
|
||||
const router = useRouter();
|
||||
const param = reactive<LoginInfo>({
|
||||
username: 'root',
|
||||
password: 'root'
|
||||
username: 'admin',
|
||||
password: 'admin'
|
||||
});
|
||||
|
||||
const rules: FormRules = {
|
||||
@@ -116,7 +116,10 @@ const submitForm = (formEl: FormInstance | undefined) => {
|
||||
if (!data) return;
|
||||
|
||||
console.log("login data", data, data.userInfo);
|
||||
|
||||
if (![1, 2].includes(data.userInfo?.roleId)) {
|
||||
ElMessage.error('您所在用户组无权登录当前系统');
|
||||
return;
|
||||
}
|
||||
ElMessage.success('登录成功');
|
||||
localStorage.setItem('ms_username', data.userInfo?.username);
|
||||
localStorage.setItem('ms_realname', data.userInfo?.realname);
|
||||
|
191
frontend/src/views/shop-order-setting.vue
Normal file
@@ -0,0 +1,191 @@
|
||||
<template>
|
||||
<div class="container">
|
||||
<manageList :list-func="shopOrderApi.getOrderList" :custom-edit-handle="editHandle"
|
||||
:export-func="shopOrderApi.exportOrderList" edit-permiss="shop-order-setting" />
|
||||
|
||||
<!-- 新增 / 编辑弹出框 -->
|
||||
<el-dialog title="管理订单" v-model="visible" style="width: 60%; min-width: 280px;">
|
||||
<el-row>
|
||||
<el-col :span="12">
|
||||
<p class="line-height">
|
||||
<span class="row-index">订单ID</span>
|
||||
{{ orderDetail.id || "" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">订单状态</span>
|
||||
<el-tag effect="plain" round>{{ orderDetail.orderStatus || "" }}</el-tag>
|
||||
{{ orderDetail.orderStatusCode || "" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">下单用户ID</span>
|
||||
{{ orderDetail.userId || "" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">订单价格</span>
|
||||
{{ orderDetail.orderPrice ? ('¥' + orderDetail.orderPrice) : "-" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">下单时间</span>
|
||||
{{ orderDetail.orderDate || "-" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">订单取消时间</span>
|
||||
{{ orderDetail.cancelDate || "-" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">订单支付时间</span>
|
||||
{{ orderDetail.payDate || "-" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">订单发货时间</span>
|
||||
{{ orderDetail.shipDate || "-" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">订单送达时间</span>
|
||||
{{ orderDetail.deliverDate || "-" }}
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">运单号</span>
|
||||
<template
|
||||
v-if="orderDetail.orderStatusCode != 'Processing' && orderDetail.orderStatusCode != 'Shipped'">
|
||||
{{ orderDetail.expressId || "-" }}
|
||||
</template>
|
||||
<el-input v-else v-model="shippingInfo.expressId" placeholder="Please input" />
|
||||
</p>
|
||||
<p class="line-height">
|
||||
<span class="row-index">发货备注</span>
|
||||
<template
|
||||
v-if="orderDetail.orderStatusCode != 'Processing' && orderDetail.orderStatusCode != 'Shipped'">
|
||||
{{ orderDetail.comment || "-" }}
|
||||
</template>
|
||||
<el-input v-else v-model="shippingInfo.comment" placeholder="Please input" />
|
||||
</p>
|
||||
</el-col>
|
||||
<el-col :span="12">
|
||||
<p style="margin-bottom: 20px;">该订单中包含如下商品</p>
|
||||
<div style="max-height:50vh; overflow-y: scroll;">
|
||||
<el-card class="box-card" v-for="i in orderItem" :key="i.goodId"
|
||||
style="--el-card-padding: 10px; margin-bottom: 8px;">
|
||||
<div style="display: grid; grid-template-columns: 50px 1fr 60px; gap: 15px;">
|
||||
<img :src="i.good.picUrl" style="width: 60px; height: 60px;" />
|
||||
<div style="place-self: center left;">
|
||||
<p>{{ i.good.goodsName }}</p>
|
||||
<p style="color: grey; font-size: 12px;">商品ID: {{ i.goodId }}</p>
|
||||
</div>
|
||||
<div style="place-self: center; font-size: 16px;">{{ i.goodCount }} {{ i.good.unit }}</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<!-- 订单状态:PENDING("Pending", "等待确认"), -->
|
||||
<!-- 订单状态:PROCESSING("Processing", "已支付,等待发货中"), -->
|
||||
<!-- 订单状态:SHIPPED("Shipped", "已发货,等待确认收货"), -->
|
||||
<!-- 订单状态:DELIVERED("Delivered", "已送达"), -->
|
||||
<!-- 订单状态:CANCELLED("Cancelled", "已取消"); -->
|
||||
<!-- 该订单已被取消 -->
|
||||
<template #footer>
|
||||
<span class="dialog-footer">
|
||||
<el-button v-if="orderDetail.orderStatusCode == 'Processing'" type="danger"
|
||||
@click="withdrawOrder">取消发货并退款</el-button>
|
||||
<el-button
|
||||
v-if="orderDetail.orderStatusCode == 'Processing' || orderDetail.orderStatusCode == 'Shipped'"
|
||||
type="primary" @click="saveEdit">保存发货信息</el-button>
|
||||
<el-button @click="visible = false">关 闭</el-button>
|
||||
</span>
|
||||
</template>
|
||||
</el-dialog>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import manageList from '../components/manage-list.vue';
|
||||
import * as shopOrderApi from '../api/shop-order';
|
||||
import { ref, reactive, onMounted, computed } from 'vue';
|
||||
import { FormInstance, FormRules, ElMessage, ElMessageBox } from 'element-plus';
|
||||
import { Delete, Edit, Search, Plus, Filter, Download } from '@element-plus/icons-vue';
|
||||
|
||||
const visible: any = ref(false);
|
||||
|
||||
const orderDetail = ref({} as any);
|
||||
const orderItem = ref([] as any);
|
||||
|
||||
const shippingInfo = ref({} as any); // 发货信息
|
||||
|
||||
let completeCallback: Function = () => { };
|
||||
|
||||
const editHandle = async function (tabIndex: number, row: any, refreshFunc: Function) {
|
||||
console.log("tabIndex", tabIndex)
|
||||
console.log("orderDetail", row)
|
||||
orderDetail.value = row // 订单详情
|
||||
|
||||
shippingInfo.value.expressId = row.expressId
|
||||
shippingInfo.value.comment = row.comment
|
||||
|
||||
completeCallback = refreshFunc
|
||||
visible.value = true
|
||||
|
||||
shopOrderApi.getOrderDetail({
|
||||
orderId: row.id
|
||||
}).then(function (data) {
|
||||
let orderGoods = {}
|
||||
data.goods.forEach((good: any) => {
|
||||
orderGoods[good.id] = good
|
||||
});
|
||||
|
||||
orderItem.value = data.orderItem.map((item: any) => {
|
||||
item.good = orderGoods[item.goodId]
|
||||
return item
|
||||
})
|
||||
|
||||
console.log("orderItem", orderItem.value)
|
||||
})
|
||||
}
|
||||
|
||||
const saveEdit = function () {
|
||||
// 保存发货信息
|
||||
ElMessageBox.confirm('确定要进行发货操作吗?发货后订单将不可撤销。(用户点击收货前仍可以修改发货信息)', '提示', { type: 'warning' })
|
||||
.then(async () => {
|
||||
shopOrderApi.deliverOrder({
|
||||
orderId: orderDetail.value.id,
|
||||
...shippingInfo.value
|
||||
}).then(function (data) {
|
||||
if (data) { // 如果出错则已经出提示了
|
||||
ElMessage.success({ message: data })
|
||||
visible.value = false
|
||||
completeCallback()
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => { });
|
||||
}
|
||||
|
||||
const withdrawOrder = function () {
|
||||
// 取消订单
|
||||
ElMessageBox.confirm('确定要取消此订单吗?该操作不可撤销。', '提示', { type: 'warning' })
|
||||
.then(async () => {
|
||||
shopOrderApi.withdrawOrder({
|
||||
orderId: orderDetail.value.id,
|
||||
...shippingInfo.value
|
||||
}).then(function (data) {
|
||||
if (data) { // 如果出错则已经出提示了
|
||||
ElMessage.success({ message: data })
|
||||
visible.value = false
|
||||
completeCallback()
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => { });
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.line-height {
|
||||
line-height: 2.7em;
|
||||
}
|
||||
|
||||
.row-index {
|
||||
width: 110px;
|
||||
display: inline-block;
|
||||
}
|
||||
</style>
|
@@ -16,7 +16,6 @@
|
||||
</span>
|
||||
</div>
|
||||
<div class="info-name">{{ name }}</div>
|
||||
<!-- <div class="info-desc">不可能!我的代码怎么可能会有bug!</div> -->
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
@@ -38,9 +37,6 @@
|
||||
<el-form-item label="确认密码:">
|
||||
<el-input type="password" v-model="form.new1"></el-input>
|
||||
</el-form-item>
|
||||
<!-- <el-form-item label="个人简介:">
|
||||
<el-input v-model="form.desc"></el-input>
|
||||
</el-form-item> -->
|
||||
<el-form-item>
|
||||
<el-button type="primary" @click="onSubmit">保存</el-button>
|
||||
</el-form-item>
|
||||
@@ -70,7 +66,7 @@ import VueCropper from 'vue-cropperjs';
|
||||
import 'cropperjs/dist/cropper.css';
|
||||
import avatar from '../assets/img/img.jpg';
|
||||
import { ElMessage, ElMessageBox, ElLoading } from 'element-plus';
|
||||
import send_request from '../utils/send_request';
|
||||
import * as userApi from '../api/user';
|
||||
|
||||
const name = localStorage.getItem('ms_username');
|
||||
const user_id = localStorage.getItem('ms_user_id');
|
||||
@@ -104,29 +100,16 @@ const onSubmit = async () => {
|
||||
|
||||
ElMessageBox.confirm('确认要修改密码吗?', '提示', {
|
||||
type: 'warning'
|
||||
}).then(async () => {
|
||||
userApi.updatePwd({
|
||||
oldpwd: form.old,
|
||||
newpwd: form.new,
|
||||
}).then((data) => {
|
||||
data && ElMessage.success(data);
|
||||
})
|
||||
.then(async () => {
|
||||
console.log("send_request v1/user/alterPSW")
|
||||
|
||||
const loading = ElLoading.service({
|
||||
lock: true,
|
||||
text: '请稍候',
|
||||
background: 'rgba(0, 0, 0, 0.7)',
|
||||
});
|
||||
await send_request('v1/user/alterPSW', "POST", {
|
||||
"userId": form.user_id,
|
||||
"oldPSW": form.old,
|
||||
"newPSW": form.new
|
||||
}, (data: any) => {
|
||||
console.log(data);
|
||||
ElMessage.success('删除成功');
|
||||
// tableData.value.splice(index, 1);
|
||||
})
|
||||
loading.close();
|
||||
|
||||
})
|
||||
.catch(() => {
|
||||
}).catch((err) => {
|
||||
ElMessage.success('删除失败');
|
||||
console.log("err", err)
|
||||
});
|
||||
return;
|
||||
|
||||
|
@@ -1,20 +0,0 @@
|
||||
import { createApp } from 'vue'
|
||||
import { setGlobalDataPlugin } from '@tarojs/taro'
|
||||
import './app.css'
|
||||
|
||||
const App = createApp({
|
||||
onShow(options) { },
|
||||
// 入口组件不需要实现 render 方法,即使实现了也会被 taro 所覆盖
|
||||
})
|
||||
|
||||
// 全局变量 refer: https://docs.taro.zone/docs/come-from-miniapp#%E5%85%A8%E5%B1%80%E5%8F%98%E9%87%8F
|
||||
App.use(setGlobalDataPlugin, {
|
||||
globalData: {
|
||||
debugMode: true, // 是否展示调试内容
|
||||
baseUrl: true
|
||||
? "https://epp-prod.only4.work"
|
||||
: "http://localhost", // 不带最后的 /
|
||||
}
|
||||
})
|
||||
|
||||
export default App
|
@@ -1,9 +1,16 @@
|
||||
server
|
||||
{
|
||||
server_name epp-prod.only4.work;
|
||||
server_name epp.only4.work;
|
||||
listen 80;
|
||||
listen 443 ssl http2;
|
||||
|
||||
# 并发限制 限制当前站点最大并发数
|
||||
limit_conn perserver 50;
|
||||
# 单IP限制 限制单个IP访问最大并发数
|
||||
limit_conn perip 10;
|
||||
# 流量限制 限制每个请求的流量上限(单位:KB)
|
||||
limit_rate 8192k;
|
||||
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:5203;
|
||||
|
||||
|
@@ -22,9 +22,14 @@ App({
|
||||
},
|
||||
globalData: {
|
||||
// debugMode: true, // 是否展示调试内容
|
||||
baseUrl: true ? // Api 请求域名 不带最后的 /
|
||||
"https://epp-prod.only4.work" :
|
||||
"http://localhost",
|
||||
/**
|
||||
* FIXME 环境配置
|
||||
*
|
||||
* baseUrl
|
||||
* - 线上环境:'https://epp.only4.work'
|
||||
* - 开发环境:'http://localhost'
|
||||
*/
|
||||
baseUrl: "https://epp.only4.work", // Api 请求域名 不带最后的 /
|
||||
userInfo: null
|
||||
}
|
||||
})
|
||||
|
@@ -49,7 +49,7 @@ export function toggle(that) {
|
||||
export function updateConfig(baseUrl) {
|
||||
// 请求配置文件(用于审核时隐藏部分功能)
|
||||
wx.request({
|
||||
url: baseUrl + '/getConfig',
|
||||
url: baseUrl + '/getConfig?v=2',
|
||||
success(result) {
|
||||
let data = result.data
|
||||
if (data.tabbarItem) {
|
||||
|
@@ -7,16 +7,16 @@
|
||||
<view class="good-card-info">
|
||||
<!-- <text class="good-title line-wrap">{{ goodinfo.goodsName }}</text> -->
|
||||
<text class="good-title line-wrap">{{ goodinfo.brief }}</text>
|
||||
<view class="good-price good-price-counter">
|
||||
<!-- 原价 -->
|
||||
<view class="good-price-symbol">¥</view>
|
||||
<view class="good-price-number">{{ goodinfo.counterPrice }}</view>
|
||||
</view>
|
||||
<view class="good-price good-price-retail">
|
||||
<!-- 售价 -->
|
||||
<view style="height:0.12em;" class="good-price-line"></view>
|
||||
<view class="good-price-symbol">¥</view>
|
||||
<view class="good-price-number">{{ goodinfo.retailPrice }}</view>
|
||||
</view>
|
||||
<view class="good-price good-price-counter">
|
||||
<!-- 原价 -->
|
||||
<view style="height:0.12em;" class="good-price-line"></view>
|
||||
<view class="good-price-symbol">¥</view>
|
||||
<view class="good-price-number">{{ goodinfo.counterPrice }}</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
@@ -52,12 +52,12 @@
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.good-price-counter {
|
||||
.good-price-retail {
|
||||
color: #fa4126;
|
||||
font-size: 36rpx;
|
||||
}
|
||||
|
||||
.good-price-retail {
|
||||
.good-price-counter {
|
||||
color: #bbbbbb;
|
||||
font-size: 24rpx;
|
||||
margin: 0 0 0 8rpx;
|
||||
|
@@ -137,7 +137,7 @@ Page({
|
||||
filterList: filterList,
|
||||
filterActiveName: "全部",
|
||||
orderList: userOrder.orders.map(order => {
|
||||
order.displayDate = order.orderDate.replace("T", " ")
|
||||
order.displayDate = order.orderDate
|
||||
return order
|
||||
})
|
||||
})
|
||||
@@ -153,7 +153,7 @@ Page({
|
||||
console.log("userOrder", userOrder)
|
||||
this.setData({
|
||||
orderList: userOrder.orders.map(order => {
|
||||
order.displayDate = order.orderDate.replace("T", " ")
|
||||
order.displayDate = order.orderDate
|
||||
return order
|
||||
})
|
||||
})
|
||||
|
@@ -259,7 +259,7 @@ Page({
|
||||
this.setData({
|
||||
order: orderDetail.order,
|
||||
orderGoodList: orderGoodList,
|
||||
orderTime: orderDetail.order.orderDate.replace("T", " "),
|
||||
orderTime: orderDetail.order.orderDate,
|
||||
orderStatusCode: orderStatusCode,
|
||||
orderPrice: orderPrice,
|
||||
})
|
||||
|
16
z 论文TODO.txt
@@ -7,20 +7,4 @@ TODO
|
||||
文档中的TODO处理
|
||||
|
||||
|
||||
|
||||
论文可以参考一下:https://blog.csdn.net/WeiXin_DZbishe/article/details/127091024
|
||||
|
||||
|
||||
【中英论文下载】
|
||||
强烈推荐使用谷歌浏览器
|
||||
卡号:356983353,密码:270045
|
||||
打开链接
|
||||
www.mv616.xyz,点击页面顶端【会员登录】
|
||||
输入发给你的卡号卡密,点击【资源列表】然后点击【中文/英文数据库】
|
||||
_________________________________________________________________
|
||||
|
||||
1,每个数据库里面很多入口,选择一个点击进去,搜不到或者不能下载的,换其他入口使用即可!
|
||||
2,三小时内5星带10字以上好评告知客服,免费送第三方查重工具哦!
|
||||
|
||||
|
||||
*不限制下载数量,遇到使用问题请咨询客服或者留言,不满意支持退款的哦!
|
||||
|
3
分支说明.md
Normal file
@@ -0,0 +1,3 @@
|
||||
main: 开发分支 (域名为localhost; 门禁端小程序环境为develop)
|
||||
production: 生产分支 (基于开发分支,域名改为epp.only4.work; 门禁端小程序环境改为release)
|
||||
miniprogramAudit: 小程序提审分支 (基于生产分支,从后端动态隐藏小程序端社区码&小商店功能)
|
145
论文中数据字典.md
@@ -1,26 +1,21 @@
|
||||
> 使用 phpMyAdmin 导出,如果有修改,可以同步修改到论文正文
|
||||
|
||||
## apply1
|
||||
## access_log
|
||||
|
||||
表注释: *人员进出记录表*
|
||||
|
||||
| 字段 | 类型 | 空 | 默认 | 注释 |
|
||||
| :---------- | :---------- | :--- | :----- | :--------------------------- |
|
||||
| id *(主键)* | int | 否 | | |
|
||||
| stu_id | int | 是 | *NULL* | 用户id |
|
||||
| issue | varchar(50) | 是 | *NULL* | 申请事由 |
|
||||
| transport | varchar(20) | 是 | *NULL* | 出行方式 |
|
||||
| place | varchar(50) | 是 | *NULL* | 目的地 |
|
||||
| start_time | datetime | 是 | *NULL* | 开始时间 |
|
||||
| end_time | datetime | 是 | *NULL* | 结束时间 |
|
||||
| state | int | 是 | 0 | 状态(0:审批中,1:通过,2:驳回) |
|
||||
| reason | varchar(20) | 是 | *NULL* | 驳回原因 |
|
||||
| :------------- | :---------------- | :--- | :---------------- | :------------------- |
|
||||
| id | bigint | 否 | | 雪花id |
|
||||
| time | datetime | 否 | CURRENT_TIMESTAMP | 进出时间 |
|
||||
| user_id | int | 否 | | 用户id |
|
||||
| user_real_name | varchar(255) | 是 | *NULL* | 用户真实姓名 |
|
||||
| gate_id | bigint | 否 | | 大门id |
|
||||
| type | enum('IN', 'OUT') | 是 | *NULL* | 类型(进门 OR 出门) |
|
||||
|
||||
### 索引
|
||||
没有已定义的索引!
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 10 | A | 否 | |
|
||||
|
||||
## community_gate
|
||||
## gate
|
||||
|
||||
表注释: *社区大门*
|
||||
|
||||
@@ -32,38 +27,6 @@
|
||||
|
||||
### 索引
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 0 | A | 否 | |
|
||||
|
||||
## count1
|
||||
|
||||
| 字段 | 类型 | 空 | 默认 | 注释 |
|
||||
| :------------ | :------- | :--- | :----- | :------- |
|
||||
| date *(主键)* | date | 否 | | 日期 |
|
||||
| time | datetime | 是 | *NULL* | 时间 |
|
||||
| in_num | int | 是 | *NULL* | 入校人数 |
|
||||
| out_num | int | 是 | *NULL* | 出校人数 |
|
||||
|
||||
### 索引
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | date | 0 | A | 否 | |
|
||||
|
||||
## feedback1
|
||||
|
||||
| 字段 | 类型 | 空 | 默认 | 注释 |
|
||||
| :---------- | :----------- | :--- | :----- | :--------- |
|
||||
| id *(主键)* | int | 否 | | |
|
||||
| title | varchar(255) | 是 | *NULL* | 反馈标题 |
|
||||
| content | longtext | 是 | *NULL* | 反馈内容 |
|
||||
| time | datetime | 是 | *NULL* | 反馈时间 |
|
||||
| user_id | int | 是 | *NULL* | 反馈用户id |
|
||||
| reply | varchar(255) | 是 | *NULL* | 回复 |
|
||||
|
||||
### 索引
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 5 | A | 否 | |
|
||||
@@ -94,10 +57,10 @@
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :---------- | :---- | :--- | :--- | :---------- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 87 | A | 否 | |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 89 | A | 否 | |
|
||||
| category_id | BTREE | 否 | 否 | category_id | 8 | A | 是 | |
|
||||
| brand_id | BTREE | 否 | 否 | brand | 67 | A | 是 | |
|
||||
| sort_order | BTREE | 否 | 否 | sort_order | 25 | A | 是 | |
|
||||
| brand_id | BTREE | 否 | 否 | brand | 69 | A | 是 | |
|
||||
| sort_order | BTREE | 否 | 否 | sort_order | 27 | A | 是 | |
|
||||
|
||||
## goods_category
|
||||
|
||||
@@ -111,22 +74,7 @@
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 7 | A | 否 | |
|
||||
|
||||
## notice1
|
||||
|
||||
| 字段 | 类型 | 空 | 默认 | 注释 |
|
||||
| :---------- | :----------- | :--- | :----- | :--- |
|
||||
| id *(主键)* | int | 否 | | |
|
||||
| title | varchar(255) | 是 | *NULL* | 标题 |
|
||||
| content | longtext | 是 | *NULL* | 内容 |
|
||||
| time | date | 是 | *NULL* | 时间 |
|
||||
|
||||
### 索引
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 5 | A | 否 | |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 8 | A | 否 | |
|
||||
|
||||
## order
|
||||
|
||||
@@ -138,13 +86,18 @@
|
||||
| order_status | enum('Pending', 'Processing', 'Shipped', 'Delivered', 'Cancelled') | 否 | | 订单状态 |
|
||||
| order_price | decimal(10,2) | 否 | | 订单总金额 |
|
||||
| pay_date | datetime | 是 | *NULL* | 订单支付时间 |
|
||||
| cancel_date | datetime | 是 | *NULL* | 订单取消时间 |
|
||||
| ship_date | datetime | 是 | *NULL* | 订单发货时间 |
|
||||
| deliver_date | datetime | 是 | *NULL* | 订单送达时间 |
|
||||
| express_id | varchar(500) | 是 | *NULL* | 快递单号 |
|
||||
| comment | text | 是 | *NULL* | 发货备注 |
|
||||
|
||||
### 索引
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :------ | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 4 | A | 否 | |
|
||||
| id | BTREE | 是 | 否 | id | 4 | A | 否 | |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 15 | A | 否 | |
|
||||
| id | BTREE | 是 | 否 | id | 15 | A | 否 | |
|
||||
| user_id | BTREE | 否 | 否 | user_id | 1 | A | 否 | |
|
||||
|
||||
## order_detail
|
||||
@@ -161,9 +114,9 @@
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------- | :---- | :--- | :--- | :------- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 10 | A | 否 | |
|
||||
| order_id | BTREE | 否 | 否 | order_id | 4 | A | 否 | |
|
||||
| good_id | BTREE | 否 | 否 | good_id | 2 | A | 否 | |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 21 | A | 否 | |
|
||||
| order_id | BTREE | 否 | 否 | order_id | 15 | A | 否 | |
|
||||
| good_id | BTREE | 否 | 否 | good_id | 9 | A | 否 | |
|
||||
|
||||
## report
|
||||
|
||||
@@ -180,7 +133,20 @@
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 1 | A | 否 | |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 12 | A | 否 | |
|
||||
|
||||
## role
|
||||
|
||||
| 字段 | 类型 | 空 | 默认 | 注释 |
|
||||
| :---------- | :----------- | :--- | :--- | :------- |
|
||||
| id *(主键)* | int | 否 | | role_id |
|
||||
| role_name | varchar(255) | 否 | | roleName |
|
||||
|
||||
### 索引
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 6 | A | 否 | |
|
||||
|
||||
## setting
|
||||
|
||||
@@ -199,41 +165,26 @@
|
||||
## user
|
||||
|
||||
| 字段 | 类型 | 空 | 默认 | 注释 |
|
||||
| :-------------- | :----------- | :--- | :----- | :----------------------------------------------------------- |
|
||||
| :-------------- | :----------- | :--- | :----- | :--------------------------------------------- |
|
||||
| id *(主键)* | int | 否 | | |
|
||||
| username | varchar(20) | 否 | | 用户名 |
|
||||
| password | varchar(255) | 否 | | 密码 |
|
||||
| realname | varchar(20) | 是 | *NULL* | 真实姓名 |
|
||||
| id_number | varchar(18) | 是 | *NULL* | 身份证号 |
|
||||
| phone_number | varchar(11) | 是 | *NULL* | 手机号 |
|
||||
| role | int | 否 | | 角色 (0-超级管理员 1-工作人员 2-社区居民_房主 3-社区居民_家庭成员 4-社区居民_租客 5-访客) |
|
||||
| phone_number | varchar(20) | 是 | *NULL* | 手机号 |
|
||||
| role_id | int | 否 | | 角色id |
|
||||
| building_id | varchar(255) | 是 | *NULL* | 门栋号+单元号 |
|
||||
| doorplate | varchar(255) | 是 | *NULL* | 门牌号 |
|
||||
| permission | int | 否 | 0 | 进出权限 (0-无 1-继承(普通居民) 2-永久 3-限时) |
|
||||
| permission | varchar(20) | 否 | 0 | 进出权限 (0-无 1-继承(普通居民) 2-永久 3-限时) |
|
||||
| permission_time | datetime | 是 | *NULL* | 进出权限失效时间 |
|
||||
|
||||
### 索引
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 1 | A | 否 | |
|
||||
|
||||
## visitor1
|
||||
|
||||
| 字段 | 类型 | 空 | 默认 | 注释 |
|
||||
| :---------- | :----------- | :--- | :----- | :---------------------------------- |
|
||||
| id *(主键)* | int | 否 | | |
|
||||
| time | datetime | 是 | *NULL* | 预约时间 |
|
||||
| phone | varchar(20) | 是 | *NULL* | 预约用户id |
|
||||
| issue | varchar(255) | 是 | *NULL* | 预约事由 |
|
||||
| meet_name | varchar(20) | 是 | *NULL* | 会见人姓名 |
|
||||
| create_time | datetime | 是 | *NULL* | 创建时间 |
|
||||
| state | int | 是 | 0 | 状态(0:审批中,1:成功,2:驳回) |
|
||||
| wx_code | varchar(255) | 是 | *NULL* | 微信登录授权码 |
|
||||
|
||||
### 索引
|
||||
|
||||
|
||||
|
||||
| 键名 | 类型 | 唯一 | 紧凑 | 字段 | 基数 | 排序规则 | 空 | 注释 |
|
||||
| :------ | :---- | :--- | :--- | :--- | :--- | :------- | :--- | :--- |
|
||||
| :------- | :---- | :--- | :--- | :------- | :--- | :------- | :--- | :--- |
|
||||
| PRIMARY | BTREE | 是 | 否 | id | 1 | A | 否 | |
|
||||
| username | BTREE | 是 | 否 | username | 1 | A | 否 | |
|
||||
| wx_code | BTREE | 是 | 否 | wx_code | 1 | A | 是 | |
|