Browse Source

统一首次加载和下拉刷新的数据获取逻辑

Xfy
徐飞洋 4 weeks ago
parent
commit
905aa337f4
  1. 23
      Dockerfile
  2. 28
      docker-compose.yml
  3. 2
      pages/index/index.js
  4. 104
      server-example/.env配置说明.md
  5. 94
      server-example/DOCKER_DEPLOYMENT.md
  6. 23
      server-example/Dockerfile
  7. 33
      server-example/docker-compose.yml
  8. 154
      server-example/fix_settlement_fields.sql
  9. 8
      server-example/server-mysql.js
  10. 47
      server-example/test-post-api.js

23
Dockerfile

@ -1,23 +0,0 @@
# 使用官方的Node.js 18镜像作为基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json到工作目录
COPY server-example/package*.json ./
# 安装依赖
RUN npm install --production
# 复制整个项目到工作目录
COPY . .
# 设置环境变量
ENV NODE_ENV=production
# 暴露应用端口
EXPOSE 3000
# 运行应用
CMD ["npm", "start"]

28
docker-compose.yml

@ -1,28 +0,0 @@
services:
app:
build: .
container_name: mini-program-server
restart: always
ports:
- "3000:3000"
volumes:
- /opt/project_app/logs:/app/server-example/logs
- /opt/project_app/uploads:/app/server-example/uploads
environment:
- NODE_ENV=production
depends_on:
- mysql
mysql:
image: mysql:8.0
container_name: mini-program-mysql
restart: always
ports:
- "3306:3306"
volumes:
- /opt/project_app/mysql-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=your_root_password
- MYSQL_DATABASE=mini_program
- MYSQL_USER=mini_program_user
- MYSQL_PASSWORD=your_user_password

2
pages/index/index.js

@ -600,7 +600,7 @@ Page({
this.checkAndRestoreLoginStatus()
this.loadCategories()
this.loadGoods()
this.onRefresh()
this.checkPhoneInPersonnel()
this.loadAdCarouselList()

104
server-example/.env配置说明.md

@ -1,104 +0,0 @@
# .env文件配置说明
## 1. 微信小程序配置
### WECHAT_APPID
- **含义**:微信小程序的唯一标识
- **获取方式**:登录微信公众平台 -> 开发管理 -> 开发设置 -> 开发者ID(AppID)
- **当前值**:`wx3da6ea0adf91cf0d`(已配置,无需修改)
### WECHAT_APPSECRET
- **含义**:微信小程序的应用密钥,用于接口调用
- **获取方式**:登录微信公众平台 -> 开发管理 -> 开发设置 -> 开发者密码(AppSecret)(需要管理员扫码获取)
- **当前值**:`78fd81bce5a2968a8e7c607ae68c4c0b`(已配置,无需修改)
### WECHAT_TOKEN
- **含义**:用于微信服务器验证的随机字符串,确保安全性
- **设置方式**:可以自定义一个复杂的随机字符串(建议包含大小写字母、数字和特殊字符)
- **示例**:`abcdefghijklmnopqrstuvwxyz1234567890!@#$%^&*`
- **当前值**:`your-random-token`(需要修改)
## 2. MySQL数据库配置
### DB_HOST
- **含义**:MySQL数据库服务器的IP地址或域名
- **设置方式**
- 如果数据库和应用部署在同一台服务器,使用`localhost`或`127.0.0.1`
- 如果使用Docker Compose部署,使用服务名称(如`mysql`)
- 如果是远程数据库,使用数据库服务器的IP地址
- **当前值**:`1.95.162.61`(已配置,无需修改)
### DB_PORT
- **含义**:MySQL数据库服务的端口号
- **默认值**:MySQL默认端口为`3306`
- **当前值**:`3306`(已配置,无需修改)
### DB_DATABASE
- **含义**:要使用的数据库名称
- **设置方式**:确保该数据库已在MySQL中创建
- **当前值**:`wechat_app`(已配置,无需修改)
### DB_USER
- **含义**:MySQL数据库的用户名
- **设置方式**:使用具有该数据库访问权限的用户名
- **当前值**:`root`(已配置,无需修改)
### DB_PASSWORD
- **含义**:MySQL数据库用户的密码
- **设置方式**
- 如果用户有密码,填写实际密码
- 如果没有密码,保留为空字符串(`DB_PASSWORD=""`)
- **当前值**:`schl@2025`(已配置,无需修改)
## 3. 服务器配置
### PORT
- **含义**:Node.js服务器监听的端口号
- **设置方式**:选择一个未被占用的端口(建议使用1024以上的端口)
- **当前值**:`3003`(已配置,无需修改)
### LOG_LEVEL
- **含义**:日志记录的级别
- **可选值**:`debug`, `info`, `warn`, `error`
- **建议**:开发环境使用`debug`,生产环境使用`info`或`warn`
- **当前值**:`debug`(已配置,建议生产环境修改为`info`)
### NODE_ENV
- **含义**:Node.js运行环境
- **可选值**:`development`(开发环境), `production`(生产环境)
- **当前值**:`production`(已配置,无需修改)
### ENABLE_DETAILED_LOGGING
- **含义**:是否启用详细日志记录(用于问题排查)
- **可选值**:`true`, `false`
- **建议**:开发环境使用`true`,生产环境使用`false`以提高性能
- **当前值**:`true`(已配置,建议生产环境修改为`false`)
## 配置注意事项
1. **不要泄露敏感信息**:.env文件包含AppSecret、数据库密码等敏感信息,不要将其提交到代码仓库
2. **备份配置**:定期备份配置文件,以防丢失
3. **Docker部署时的特殊配置**
- 如果使用Docker Compose部署,将`DB_HOST`改为`mysql`(与docker-compose.yml中的服务名称一致)
- 确保数据库端口在Docker Compose中正确映射
4. **环境一致性**:确保开发环境和生产环境的配置保持一致(除了敏感信息和环境特定配置)
5. **配置验证**:配置完成后,启动服务前可以先测试数据库连接是否正常
## 修改示例
如果要修改配置,直接编辑.env文件即可:
```bash
# 修改微信token
WECHAT_TOKEN=my-new-secure-token-2025
# 修改日志级别为info
LOG_LEVEL=info
# 关闭详细日志
ENABLE_DETAILED_LOGGING=false
```

94
server-example/DOCKER_DEPLOYMENT.md

@ -1,94 +0,0 @@
# 微信小程序后端服务Docker部署指南
## 环境准备
- 安装Docker和Docker Compose
- 确保云服务器端口3000和3306对外开放
## 部署步骤
### 1. 克隆仓库
```bash
git clone http://8.137.125.67:4000/Swt29/Project_app.git
cd Project_app/server-example
```
### 2. 配置环境变量
复制并编辑.env文件:
```bash
cp .env.example.mysql .env
# 编辑.env文件,配置数据库连接等信息
```
### 3. 构建和启动容器
```bash
docker-compose up -d
```
### 4. 查看容器状态
```bash
docker-compose ps
```
### 5. 查看日志
```bash
docker-compose logs -f
```
## 代码更新和部署
### 1. 拉取最新代码
```bash
git pull origin BOSS
```
### 2. 重新构建和启动容器
```bash
docker-compose down
docker-compose up -d --build
```
## 数据库管理
### 进入数据库容器
```bash
docker exec -it wechat-miniprogram-db mysql -u wechat_user -p
```
### 备份数据库
```bash
docker exec -t wechat-miniprogram-db mysqldump -u wechat_user -p wechat_miniprogram > backup.sql
```
## 常见问题
### 端口冲突
如果端口3000或3306已被占用,可以修改docker-compose.yml文件中的端口映射:
```yaml
ports:
- "8080:3000" # 将宿主机8080端口映射到容器3000端口
```
### 数据库连接失败
检查.env文件中的数据库配置是否与docker-compose.yml中的配置一致。
### 容器启动失败
查看日志以获取详细错误信息:
```bash
docker-compose logs -f app
```

23
server-example/Dockerfile

@ -1,23 +0,0 @@
# 使用Node.js官方镜像作为基础镜像
FROM node:18-alpine
# 设置工作目录
WORKDIR /app
# 复制package.json和package-lock.json
COPY package*.json ./
# 安装依赖
RUN npm install --production
# 复制应用代码
COPY . .
# 设置环境变量
ENV NODE_ENV=production
# 暴露端口
EXPOSE 3000
# 启动命令
CMD ["npm", "start"]

33
server-example/docker-compose.yml

@ -1,33 +0,0 @@
version: '3.8'
services:
app:
build: .
container_name: wechat-miniprogram-server
restart: always
ports:
- "3000:3000"
environment:
- NODE_ENV=production
volumes:
- ./logs:/app/logs
- ./uploads:/app/uploads
depends_on:
- db
db:
image: mysql:8.0
container_name: wechat-miniprogram-db
restart: always
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=wechat_miniprogram
- MYSQL_USER=wechat_user
- MYSQL_PASSWORD=wechat_password
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:

154
server-example/fix_settlement_fields.sql

@ -1,154 +0,0 @@
-- 确保 users 表包含立即入驻功能所需的所有字段
-- 此脚本用于修复或添加入驻流程可能需要的数据库字段
USE wechat_app;
-- 检查并添加缺失的字段(如果不存在)
-- 1. 入驻相关字段
-- 检查 collaborationid 字段(合作商身份)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'collaborationid'
) THEN
ALTER TABLE users ADD COLUMN collaborationid TEXT COMMENT '合作商身份' AFTER demand;
END IF;
-- 检查 cooperation 字段(合作模式)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'cooperation'
) THEN
ALTER TABLE users ADD COLUMN cooperation VARCHAR(255) COMMENT '合作模式' AFTER collaborationid;
END IF;
-- 检查 businesslicenseurl 字段(营业执照)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'businesslicenseurl'
) THEN
ALTER TABLE users ADD COLUMN businesslicenseurl TEXT COMMENT '营业执照URL' AFTER cooperation;
END IF;
-- 检查 proofurl 字段(证明材料)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'proofurl'
) THEN
ALTER TABLE users ADD COLUMN proofurl TEXT COMMENT '证明材料URL' AFTER businesslicenseurl;
END IF;
-- 检查 brandurl 字段(品牌授权链)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'brandurl'
) THEN
ALTER TABLE users ADD COLUMN brandurl TEXT COMMENT '品牌授权链文件URL' AFTER proofurl;
END IF;
-- 检查 partnerstatus 字段(合作商状态)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'partnerstatus'
) THEN
ALTER TABLE users ADD COLUMN partnerstatus VARCHAR(255) COMMENT '合作商状态' AFTER brandurl;
END IF;
-- 2. 详细地址相关字段
-- 检查 detailedaddress 字段
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'detailedaddress'
) THEN
ALTER TABLE users ADD COLUMN detailedaddress VARCHAR(255) COMMENT '详细地址' AFTER district;
END IF;
-- 3. 其他可能需要的字段
-- 检查 reasonforfailure 字段(审核失败原因)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'reasonforfailure'
) THEN
ALTER TABLE users ADD COLUMN reasonforfailure TEXT COMMENT '审核失败原因' AFTER partnerstatus;
END IF;
-- 检查 idcardstatus 字段(身份证认证状态)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'idcardstatus'
) THEN
ALTER TABLE users ADD COLUMN idcardstatus INT NULL COMMENT '身份证认证状态(0:待审核,1:审核通过,2:审核失败)' AFTER reasonforfailure;
END IF;
-- 检查 audit_time 字段(审核时间)
IF NOT EXISTS (
SELECT * FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND COLUMN_NAME = 'audit_time'
) THEN
ALTER TABLE users ADD COLUMN audit_time DATETIME COMMENT '审核时间' AFTER reasonforfailure;
END IF;
-- 4. 修改字段属性以允许空值(如果需要)
-- 修改 collaborationid 允许为空(入驻流程中可能未选择)
ALTER TABLE users MODIFY COLUMN collaborationid TEXT NULL COMMENT '合作商身份';
-- 修改 cooperation 允许为空
ALTER TABLE users MODIFY COLUMN cooperation VARCHAR(255) NULL COMMENT '合作模式';
-- 修改 province/city/district 允许为空(地址选择可能不完整)
ALTER TABLE users MODIFY COLUMN province VARCHAR(50) NULL COMMENT '省份';
ALTER TABLE users MODIFY COLUMN city VARCHAR(50) NULL COMMENT '城市';
ALTER TABLE users MODIFY COLUMN district VARCHAR(255) NULL COMMENT '区域';
-- 5. 添加索引以提高查询性能
-- 为 openid 添加唯一索引(如果尚未存在)
IF NOT EXISTS (
SELECT * FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND INDEX_NAME = 'idx_openid'
) THEN
CREATE INDEX idx_openid ON users(openid);
END IF;
-- 为 partnerstatus 添加索引(用于查询审核状态)
IF NOT EXISTS (
SELECT * FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND INDEX_NAME = 'idx_partnerstatus'
) THEN
CREATE INDEX idx_partnerstatus ON users(partnerstatus);
END IF;
-- 为 userId 添加索引(如果尚未存在唯一索引)
IF NOT EXISTS (
SELECT * FROM information_schema.STATISTICS
WHERE TABLE_SCHEMA = 'wechat_app'
AND TABLE_NAME = 'users'
AND INDEX_NAME = 'idx_userId'
) THEN
CREATE INDEX idx_userId ON users(userId);
END IF;
SELECT '数据库表结构修复完成!' AS status;

8
server-example/server-mysql.js

@ -1606,6 +1606,11 @@ User.init({
defaultValue: Sequelize.NOW,
onUpdate: Sequelize.NOW
},
// 新增字段:提交时间
newtime: {
type: DataTypes.DATE,
defaultValue: Sequelize.NOW
},
}, {
sequelize,
@ -8265,7 +8270,8 @@ app.post('/api/settlement/submit', async (req, res) => {
proofurl: String(!proofurl || proofurl.trim() === '' ? '未上传' : proofurl), // 数据库NOT NULL: 证明材料
brandurl: String(!brandurl || brandurl.trim() === '' ? '' : brandurl), // 品牌授权链文件(可为空)
partnerstatus: 'underreview', // 合作商状态明确设置为审核中
updated_at: getBeijingTime()
updated_at: getBeijingTime(),
newtime: getBeijingTime() // 新增字段:提交时间
};
console.log('11. 构建的updateData对象:', JSON.stringify(updateData, null, 2));

47
server-example/test-post-api.js

@ -1,47 +0,0 @@
// 测试创建动态API
const http = require('http');
// 测试数据
const testData = {
content: '测试发布帖子',
images: ['https://example.com/image1.jpg', 'https://example.com/image2.jpg'],
topic: '今天你吃蛋了么?'
};
// 发送POST请求到主服务器
const options = {
hostname: 'localhost',
port: 3003,
path: '/api/eggbar/posts',
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Content-Length': Buffer.byteLength(JSON.stringify(testData))
}
};
const req = http.request(options, (res) => {
console.log(`状态码: ${res.statusCode}`);
console.log(`响应头: ${JSON.stringify(res.headers)}`);
let data = '';
res.on('data', (chunk) => {
data += chunk;
});
res.on('end', () => {
console.log('响应体:', data);
console.log('测试完成');
});
});
req.on('error', (e) => {
console.error(`请求错误: ${e.message}`);
});
// 发送请求体
req.write(JSON.stringify(testData));
req.end();
console.log('正在发送测试请求到 http://localhost:3003/api/eggbar/posts...');
console.log('测试数据:', testData);
Loading…
Cancel
Save