更新后端API端口和认证系统,优化数据库配置和环境变量管理
This commit is contained in:
@@ -1,11 +1,11 @@
|
||||
// 数据库配置
|
||||
const dbConfig = {
|
||||
development: {
|
||||
username: 'root',
|
||||
password: 'password',
|
||||
database: 'niumall_dev',
|
||||
host: '127.0.0.1',
|
||||
port: 3306,
|
||||
username: process.env.DB_USERNAME || 'root',
|
||||
password: process.env.DB_PASSWORD || 'password',
|
||||
database: process.env.DB_NAME || 'niumall_dev',
|
||||
host: process.env.DB_HOST || '127.0.0.1',
|
||||
port: process.env.DB_PORT || 3306,
|
||||
dialect: 'mysql'
|
||||
},
|
||||
production: {
|
||||
|
||||
@@ -3,7 +3,98 @@ const bcrypt = require('bcryptjs');
|
||||
const { v4: uuidv4 } = require('uuid');
|
||||
const { successResponse, errorResponse } = require('../utils/response');
|
||||
const { jwtConfig } = require('../config/config');
|
||||
const User = require('../models/User');
|
||||
const { ApiUser } = require('../../models');
|
||||
const jsonwebtoken = require('jsonwebtoken');
|
||||
const { Op } = require('sequelize');
|
||||
|
||||
// 传统用户登录 - 管理系统使用
|
||||
const login = async (req, res) => {
|
||||
try {
|
||||
const { username, password } = req.body;
|
||||
|
||||
// 验证参数
|
||||
if (!username || !password) {
|
||||
return res.status(400).json(errorResponse('用户名和密码不能为空', 400));
|
||||
}
|
||||
|
||||
// 查找用户 - 支持通过用户名或邮箱登录
|
||||
let user = await ApiUser.findOne({
|
||||
where: {
|
||||
[Op.or]: [
|
||||
{ username },
|
||||
{ email: username }
|
||||
]
|
||||
}
|
||||
});
|
||||
|
||||
// 检查用户是否存在
|
||||
if (!user) {
|
||||
return res.status(401).json(errorResponse('用户名或密码错误', 401));
|
||||
}
|
||||
|
||||
// 验证密码
|
||||
const isPasswordValid = await bcrypt.compare(password, user.password_hash);
|
||||
if (!isPasswordValid) {
|
||||
return res.status(401).json(errorResponse('用户名或密码错误', 401));
|
||||
}
|
||||
|
||||
// 检查用户状态
|
||||
if (user.status !== 'active') {
|
||||
return res.status(401).json(errorResponse('用户账号已被禁用', 401));
|
||||
}
|
||||
|
||||
// 生成JWT token
|
||||
const token = jsonwebtoken.sign(
|
||||
{
|
||||
id: user.id,
|
||||
uuid: user.uuid,
|
||||
username: user.username,
|
||||
userType: user.user_type,
|
||||
email: user.email
|
||||
},
|
||||
jwtConfig.secret,
|
||||
{ expiresIn: jwtConfig.expiresIn }
|
||||
);
|
||||
|
||||
// 准备返回的用户信息
|
||||
const userInfo = {
|
||||
id: user.id,
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
user_type: user.user_type,
|
||||
status: user.status,
|
||||
phone: user.phone
|
||||
};
|
||||
|
||||
// 返回响应 - 包含data字段以匹配前端期望的格式
|
||||
res.json({
|
||||
success: true,
|
||||
message: '登录成功',
|
||||
data: {
|
||||
access_token: token,
|
||||
token_type: 'Bearer',
|
||||
expires_in: parseInt(jwtConfig.expiresIn) * 60, // 转换为秒
|
||||
user: {
|
||||
id: user.id,
|
||||
username: user.username,
|
||||
email: user.email,
|
||||
phone: user.phone,
|
||||
avatar: user.avatar,
|
||||
role: user.user_type,
|
||||
status: user.status,
|
||||
createdAt: user.created_at,
|
||||
updatedAt: user.updated_at
|
||||
}
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('用户登录失败:', error);
|
||||
res.status(500).json({
|
||||
success: false,
|
||||
message: '登录失败,请稍后再试'
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
// 小程序用户登录
|
||||
const miniProgramLogin = async (req, res) => {
|
||||
@@ -30,7 +121,7 @@ const miniProgramLogin = async (req, res) => {
|
||||
}
|
||||
|
||||
// 生成JWT token
|
||||
const token = jwt.sign(
|
||||
const token = jsonwebtoken.sign(
|
||||
{
|
||||
id: user.id,
|
||||
uuid: user.uuid,
|
||||
@@ -62,7 +153,7 @@ const miniProgramLogin = async (req, res) => {
|
||||
// 获取当前用户信息
|
||||
const getCurrentUser = async (req, res) => {
|
||||
try {
|
||||
const user = await User.findByPk(req.user.id);
|
||||
const user = await ApiUser.findByPk(req.user.id);
|
||||
|
||||
if (!user) {
|
||||
return res.status(404).json(errorResponse('用户不存在', 404));
|
||||
@@ -86,6 +177,7 @@ const getCurrentUser = async (req, res) => {
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
login,
|
||||
miniProgramLogin,
|
||||
getCurrentUser
|
||||
};
|
||||
@@ -1,3 +1,6 @@
|
||||
// 加载.env文件
|
||||
require('dotenv').config();
|
||||
|
||||
const express = require('express');
|
||||
const cors = require('cors');
|
||||
const helmet = require('helmet');
|
||||
@@ -5,6 +8,15 @@ const morgan = require('morgan');
|
||||
const swaggerUi = require('swagger-ui-express');
|
||||
const YAML = require('yamljs');
|
||||
|
||||
// 打印环境变量用于调试
|
||||
console.log('Environment variables:');
|
||||
console.log('DB_HOST:', process.env.DB_HOST);
|
||||
console.log('DB_PORT:', process.env.DB_PORT);
|
||||
console.log('DB_USERNAME:', process.env.DB_USERNAME);
|
||||
console.log('DB_NAME:', process.env.DB_NAME);
|
||||
console.log('NODE_ENV:', process.env.NODE_ENV);
|
||||
console.log('PORT:', process.env.PORT);
|
||||
|
||||
// 数据库连接
|
||||
const sequelize = require('./config/database');
|
||||
|
||||
@@ -57,10 +69,12 @@ app.use(errorHandler);
|
||||
// 同步数据库模型
|
||||
const syncDatabase = async () => {
|
||||
try {
|
||||
await sequelize.sync({ alter: true });
|
||||
// 不修改现有表结构,只创建不存在的表
|
||||
await sequelize.sync({ force: false });
|
||||
console.log('数据库模型同步成功');
|
||||
} catch (error) {
|
||||
console.error('数据库模型同步失败:', error);
|
||||
console.log('服务器仍然会继续运行,但某些功能可能受到影响');
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -3,6 +3,9 @@ const router = express.Router();
|
||||
const AuthController = require('../controllers/AuthController');
|
||||
const { authenticate } = require('../middleware/auth');
|
||||
|
||||
// 传统用户登录 - 管理系统使用
|
||||
router.post('/login', AuthController.login);
|
||||
|
||||
// 小程序用户登录
|
||||
router.post('/mini-program/login', AuthController.miniProgramLogin);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user