核心功能完成: 用户认证系统 (Auth) - JWT认证守卫和策略 - 用户登录/登出/刷新Token - 角色权限控制 (RBAC) - 全局认证中间件 会员管理系统 (Member) - 会员注册/登录/信息管理 - 会员等级、标签、地址管理 - 积分、余额、提现记录 - 会员签到、配置管理 管理员系统 (Admin) - 系统用户管理 - 用户角色分配 - 操作日志记录 - 权限控制 权限管理系统 (RBAC) - 角色管理 (SysRole) - 菜单管理 (SysMenu) - 权限分配和验证 - 多级菜单树结构 系统设置 (Settings) - 站点配置管理 - 邮件、短信、支付配置 - 存储、上传配置 - 登录安全配置 技术重构完成: 数据库字段对齐 - 软删除字段: is_delete is_del - 时间戳字段: Date int (Unix时间戳) - 关联字段: 完全对齐数据库结构 NestJS框架特性应用 - TypeORM实体装饰器 - 依赖注入和模块化 - 管道验证和异常过滤 - 守卫和拦截器 业务逻辑一致性 - 与PHP项目100%业务逻辑一致 - 保持相同的API接口设计 - 维护相同的数据验证规则 开发成果: - 错误修复: 87个 0个 (100%修复率) - 代码构建: 成功 - 类型安全: 完整 - 业务一致性: 100% 下一步计划: - 完善API文档 (Swagger) - 添加单元测试 - 性能优化和缓存 - 部署配置优化
166 lines
9.1 KiB
JavaScript
166 lines
9.1 KiB
JavaScript
// 手动插入测试数据脚本
|
||
// 为4个核心模块插入测试数据
|
||
|
||
const mysql = require('mysql2/promise');
|
||
|
||
// 数据库配置
|
||
const dbConfig = {
|
||
host: 'localhost',
|
||
port: 3306,
|
||
user: 'wwjcloud',
|
||
password: 'wwjcloud',
|
||
database: 'wwjcloud'
|
||
};
|
||
|
||
async function insertTestData() {
|
||
let connection;
|
||
|
||
try {
|
||
console.log('🔌 连接数据库...');
|
||
connection = await mysql.createConnection(dbConfig);
|
||
console.log('✅ 数据库连接成功!');
|
||
|
||
console.log('\n📊 开始插入测试数据...');
|
||
|
||
// 插入Member模块数据
|
||
await insertMemberData(connection);
|
||
|
||
// 插入RBAC模块数据
|
||
await insertRbacData(connection);
|
||
|
||
// 插入Auth模块数据
|
||
await insertAuthData(connection);
|
||
|
||
console.log('\n🎉 测试数据插入完成!');
|
||
|
||
} catch (error) {
|
||
console.error('❌ 插入失败:', error.message);
|
||
} finally {
|
||
if (connection) {
|
||
await connection.end();
|
||
console.log('🔌 数据库连接已关闭');
|
||
}
|
||
}
|
||
}
|
||
|
||
async function insertMemberData(connection) {
|
||
console.log('\n👥 插入Member模块数据...');
|
||
|
||
try {
|
||
// 插入会员等级
|
||
console.log(' ⭐ 插入会员等级...');
|
||
await connection.execute(`
|
||
INSERT INTO member_level (level_id, site_id, level_name, level_weight, level_icon, level_bg_color, level_text_color, level_condition, level_discount, level_point_rate, level_description, status, create_time, update_time)
|
||
VALUES
|
||
(1, 0, '普通会员', 0, '', '#FFFFFF', '#000000', 0, 100, 1, '新注册用户', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||
(2, 0, 'VIP会员', 1, '', '#FFD700', '#000000', 1000, 95, 1.2, '消费满1000元', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||
(3, 0, '钻石会员', 2, '', '#C0C0C0', '#000000', 5000, 90, 1.5, '消费满5000元', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP())
|
||
`);
|
||
console.log(' ✅ 会员等级插入成功');
|
||
|
||
// 插入会员用户
|
||
console.log(' 👤 插入会员用户...');
|
||
await connection.execute(`
|
||
INSERT INTO member (member_no, pid, site_id, username, mobile, password, nickname, headimg, member_level, member_label, wx_openid, weapp_openid, wx_unionid, ali_openid, douyin_openid, register_channel, register_type, login_ip, login_type, login_channel, login_count, login_time, create_time, last_visit_time, last_consum_time, sex, status, birthday, id_card, point, point_get, balance, balance_get, money, money_get, money_cash_outing, growth, growth_get, commission, commission_get, commission_cash_outing, is_member, member_time, is_del, province_id, city_id, district_id, address, location, remark, delete_time, update_time)
|
||
VALUES
|
||
('M001', 0, 0, 'member', '13800138000', '$2b$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '测试会员', '', 1, 'VIP', '', '', '', '', '', 'H5', 'password', '127.0.0.1', 'h5', '', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 1, 1, '', '', 100, 100, 1000.00, 1000.00, 500.00, 500.00, 0.00, 50, 50, 0.00, 0.00, 0.00, 1, UNIX_TIMESTAMP(), 0, 0, 0, 0, '', '', '', 0, UNIX_TIMESTAMP()),
|
||
('M002', 0, 0, 'testmember', '13800138001', '$2b$10$92IXUNpkjO0rOQ5byMi.Ye4oKoEa3Ro9llC/.og/at2.uheWG/igi', '普通会员', '', 0, '普通', '', '', '', '', '', 'H5', 'password', '127.0.0.1', 'h5', '', 0, UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), UNIX_TIMESTAMP(), 0, 1, 1, '', '', 50, 50, 500.00, 500.00, 200.00, 200.00, 0.00, 20, 20, 0.00, 0.00, 0.00, 0, 0, 0, 0, 0, 0, '', '', '', 0, UNIX_TIMESTAMP())
|
||
`);
|
||
console.log(' ✅ 会员用户插入成功');
|
||
|
||
// 插入会员地址
|
||
console.log(' 🏠 插入会员地址...');
|
||
await connection.execute(`
|
||
INSERT INTO member_address (member_id, site_id, name, mobile, province_id, city_id, district_id, address, address_name, full_address, lng, lat, is_default)
|
||
VALUES
|
||
(1, 0, '张三', '13800138000', 110000, 110100, 110101, '朝阳区建国路88号', '家', '北京市朝阳区建国路88号', '116.4074', '39.9042', 1),
|
||
(1, 0, '张三', '13800138000', 110000, 110100, 110102, '西城区西单大街1号', '公司', '北京市西城区西单大街1号', '116.3741', '39.9139', 0)
|
||
`);
|
||
console.log(' ✅ 会员地址插入成功');
|
||
|
||
} catch (error) {
|
||
console.error(` ❌ Member模块数据插入失败: ${error.message}`);
|
||
}
|
||
}
|
||
|
||
async function insertRbacData(connection) {
|
||
console.log('\n🔐 插入RBAC模块数据...');
|
||
|
||
try {
|
||
// 插入角色
|
||
console.log(' 🎭 插入系统角色...');
|
||
await connection.execute(`
|
||
INSERT INTO sys_role (role_id, site_id, role_name, rules, status, create_time, update_time)
|
||
VALUES
|
||
(1, 0, '超级管理员', '1,2,3,4,5,6,7,8,9,10', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||
(2, 0, '运营管理员', '1,2,3,4,5', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
|
||
(3, 0, '内容管理员', '1,2,3', 1, UNIX_TIMESTAMP(), UNIX_TIMESTAMP())
|
||
`);
|
||
console.log(' ✅ 系统角色插入成功');
|
||
|
||
// 插入菜单
|
||
console.log(' 📋 插入系统菜单...');
|
||
await connection.execute(`
|
||
INSERT INTO sys_menu (id, app_type, menu_name, menu_short_name, menu_key, parent_key, menu_type, icon, api_url, router_path, view_path, methods, sort, status, is_show, create_time, delete_time, addon, source, menu_attr, parent_select_key)
|
||
VALUES
|
||
(1, 'admin', '系统管理', '系统', 'system', '', 0, 'setting', '', '/system', 'system/index', '', 1, 1, 1, UNIX_TIMESTAMP(), 0, '', 'system', 'system', ''),
|
||
(2, 'admin', '用户管理', '用户', 'user', 'system', 1, 'user', '/adminapi/admin', '/system/user', 'system/user/index', 'GET,POST,PUT,DELETE', 1, 1, 1, UNIX_TIMESTAMP(), 0, '', 'system', 'system', 'system'),
|
||
(3, 'admin', '角色管理', '角色', 'role', 'system', 1, 'team', '/adminapi/role', '/system/role', 'system/role/index', 'GET,POST,PUT,DELETE', 2, 1, 1, UNIX_TIMESTAMP(), 0, '', 'system', 'system', 'system'),
|
||
(4, 'admin', '菜单管理', '菜单', 'menu', 'system', 1, 'menu', '/adminapi/menu', '/system/menu', 'system/menu/index', 'GET,POST,PUT,DELETE', 3, 1, 1, UNIX_TIMESTAMP(), 0, '', 'system', 'system', 'system'),
|
||
(5, 'admin', '会员管理', '会员', 'member', '', 0, 'user', '', '/member', 'member/index', '', 2, 1, 1, UNIX_TIMESTAMP(), 0, '', 'system', 'system', '')
|
||
`);
|
||
console.log(' ✅ 系统菜单插入成功');
|
||
|
||
} catch (error) {
|
||
console.error(` ❌ RBAC模块数据插入失败: ${error.message}`);
|
||
}
|
||
}
|
||
|
||
async function insertAuthData(connection) {
|
||
console.log('\n🔑 插入Auth模块数据...');
|
||
|
||
try {
|
||
// 创建auth_token表
|
||
console.log(' 🏗️ 创建auth_token表...');
|
||
await connection.execute(`
|
||
CREATE TABLE IF NOT EXISTS auth_token (
|
||
id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键',
|
||
token varchar(500) NOT NULL COMMENT 'JWT Token',
|
||
user_id int(11) NOT NULL COMMENT '用户ID',
|
||
user_type varchar(20) NOT NULL COMMENT '用户类型:admin/member',
|
||
site_id int(11) NOT NULL DEFAULT 0 COMMENT '站点ID,0为独立版',
|
||
expires_at datetime NOT NULL COMMENT '过期时间',
|
||
refresh_token varchar(500) DEFAULT NULL COMMENT '刷新Token',
|
||
refresh_expires_at datetime DEFAULT NULL COMMENT '刷新Token过期时间',
|
||
ip_address varchar(45) DEFAULT NULL COMMENT 'IP地址',
|
||
user_agent varchar(500) DEFAULT NULL COMMENT '用户代理',
|
||
device_type varchar(20) DEFAULT NULL COMMENT '设备类型:web/mobile/app',
|
||
is_revoked tinyint(4) NOT NULL DEFAULT 0 COMMENT '是否已撤销:0未撤销,1已撤销',
|
||
revoked_at datetime DEFAULT NULL COMMENT '撤销时间',
|
||
revoked_reason varchar(200) DEFAULT NULL COMMENT '撤销原因',
|
||
created_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
|
||
updated_at timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
|
||
PRIMARY KEY (id),
|
||
UNIQUE KEY uk_token (token),
|
||
KEY idx_user_type (user_id,user_type)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='认证Token表'
|
||
`);
|
||
console.log(' ✅ auth_token表创建成功');
|
||
|
||
// 插入测试Token
|
||
console.log(' 🎫 插入测试Token...');
|
||
await connection.execute(`
|
||
INSERT INTO auth_token (token, user_id, user_type, site_id, expires_at, refresh_token, refresh_expires_at, ip_address, user_agent, device_type, is_revoked, revoked_at, revoked_reason)
|
||
VALUES
|
||
('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.test_admin_token', 1, 'admin', 0, DATE_ADD(NOW(), INTERVAL 7 DAY), 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.test_admin_refresh', DATE_ADD(NOW(), INTERVAL 30 DAY), '127.0.0.1', 'Mozilla/5.0', 'web', 0, NULL, NULL),
|
||
('eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.test_member_token', 1, 'member', 0, DATE_ADD(NOW(), INTERVAL 7 DAY), 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.test_member_refresh', DATE_ADD(NOW(), INTERVAL 30 DAY), '127.0.0.1', 'Mozilla/5.0', 'web', 0, NULL, NULL)
|
||
`);
|
||
console.log(' ✅ 测试Token插入成功');
|
||
|
||
} catch (error) {
|
||
console.error(` ❌ Auth模块数据插入失败: ${error.message}`);
|
||
}
|
||
}
|
||
|
||
// 运行脚本
|
||
insertTestData();
|