Complete setup guide for Box Management API monorepo from scratch
Before starting, ensure you have:
npm install -g pnpm)# Navigate to monorepo root
cd box-nestjs-monorepo
# Install all dependencies for monorepo
# This will install dependencies for:
# - Root workspace
# - apps/box-mgnt-api
# - libs/common
# - libs/core
# - libs/db
pnpm install
What this does:
package.json@box/common, @box/core, @box/db)node_modules/ and pnpm-lock.yamlExpected output:
Packages: +XXX
Progress: resolved XXX, reused XXX, downloaded 0, added XXX
Done in Xs
# Check if NestJS CLI is available
pnpm nest --version
# Verify workspace structure
pnpm list --depth=0
Create .env.mgnt.dev in the monorepo root:
# Copy from template (if exists) or create new
touch .env.mgnt.dev
Minimum required configuration:
# Application Environment
APP_ENV=development
# MySQL Database Connection
MYSQL_URL="mysql://root:your_password@localhost:3306/box_admin"
# Optional: For migrations in development
# MYSQL_SHADOW_URL="mysql://root:your_password@localhost:3306/box_admin_shadow"
# MongoDB Connection
MONGO_URL="mongodb://admin:your_password@localhost:27017/box_admin?authSource=admin"
# Application Server
APP_HOST=0.0.0.0
APP_PORT=3300
APP_CORS_ORIGIN=*
# JWT Configuration
JWT_SECRET=047df8aaa3d17dc1173c5a9a3052ba66c2b0bd96937147eb643319a0c90d132f
JWT_ACCESS_TOKEN_TTL=43200
# 2FA Encryption
TWOFA_ENC_KEY=2q89JPacSKDmuU3hJCfKQhDg3sq74QScy0ShYBoQPgM=
APP_ISSUER=BOX-MGNT
# External APIs (optional for initial setup)
MGNT_API_URL=http://47.76.151.238:83
MGNT_API_TOKEN=
IMCHAT_API_URL=http://47.76.151.238:88
IMCHAT_API_TOKEN=
GAME_SERVER_ADMIN_API_URL=http://119.28.182.132:83
GAME_SERVER_TOKEN=
# Partner Integration (optional)
B_BASE_URL=https://wwapi.hxc1t.com
B_SIGN_SECRET=Z3VhbmNpbmV3ZWl4aWFvMTIzNDU2
PARTNER_MD5_KEY=160360904be3dd23bf4f1278a74196efdbf3f9b834ce883ef6ae09eb05c5c652
PARTNER_ITEMS_LIMIT=100
B_BASE_ORDER_ADD=/open/open/order/add
B_BASE_ORDER_UPDATE_STATUS=/open/open/order/updateStatus
B_BASE_CHAT_ADD=/open/order/chat/send
Generate secure secrets:
# Generate JWT_SECRET
node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"
# Generate TWOFA_ENC_KEY
node -e "console.log(require('crypto').randomBytes(32).toString('base64'))"
MySQL:
# Connect to MySQL
mysql -u root -p
# Create database
CREATE DATABASE box_admin CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Optional: Create shadow database for migrations
CREATE DATABASE box_admin_shadow CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
# Verify
SHOW DATABASES LIKE 'box_%';
exit;
MongoDB:
# Connect to MongoDB
mongosh -u admin -p
# Switch to box_admin database (auto-created on first use)
use box_admin
# Verify connection
db.stats()
exit
# Generate both MySQL and MongoDB Prisma clients
pnpm prisma:generate
# Or generate separately:
pnpm prisma:generate:mysql
pnpm prisma:generate:mongo
What this does:
prisma/mysql/schema/*.prismaprisma/mongo/schema/*.prismanode_modules/@prisma/mysql/clientnode_modules/@prisma/mongo/clientExpected output:
✔ Generated Prisma Client (MySQL) to ./node_modules/@prisma/mysql/client
✔ Generated Prisma Client (MongoDB) to ./node_modules/@prisma/mongo/client
# Run all migrations and create database schema
pnpm prisma:migrate:dev:mysql
What this does:
prisma/mysql/schema/*.prismaprisma/mysql/migrations/20251121082348_init_db/_prisma_migrations tableTables created:
sys_user - User accountssys_role - User rolessys_menu - Menu/permission structuresys_api_permission - API endpoint permissionssys_user_role - User-role relationshipssys_role_menu - Role-menu relationshipssys_role_api_permission - Role-API permission relationshipssys_login_log - Login activity logssys_operation_log - Operation audit logssys_quota_log - User quota trackingVerify migration:
# Check tables were created
mysql -u root -p box_admin -e "SHOW TABLES;"
# Check migration history
mysql -u root -p box_admin -e "SELECT * FROM _prisma_migrations;"
MongoDB collections are created dynamically when first used. Schema is defined in:
prisma/mongo/schema/*.prismaCollections:
adsModule - Advertisement module typesads - Advertisement contentcategory - Content categorieschannel - Distribution channelshome - Homepage configurationssystemParam - System parameterstag - Content tagsvideoMedia - Video media metadata# Seed Mongo `box_admin` collections with admin data
pnpm prisma:seed:box-admin:admin
What this seeds:
Admin User (sys_user in Mongo)
admina123456 (hashed)admin@box.comRoles (sys_role)
Menus (sys_menu)
API Permissions (sys_api_permission)
Role Associations
Expected output:
🌱 Seeding database...
✓ Created 1 users
✓ Created 6 roles
✓ Created 120+ menus
✓ Created 250+ API permissions
✓ Created user-role associations
✓ Created role-menu associations
✓ Created role-API permission associations
✅ Database seeded successfully!
# Check user was created
mysql -u root -p box_admin -e "SELECT id, username, nickname, email FROM sys_user;"
# Check roles
mysql -u root -p box_admin -e "SELECT id, name, code FROM sys_role;"
# Check menus (top-level)
mysql -u root -p box_admin -e "SELECT id, title, name, path FROM sys_menu WHERE parent_id IS NULL;"
# Verify admin has roles
mysql -u root -p box_admin -e "
SELECT u.username, r.name
FROM sys_user u
JOIN sys_user_role ur ON u.id = ur.user_id
JOIN sys_role r ON ur.role_id = r.id
WHERE u.username = 'admin';
"
For MongoDB collections, refer to mongo-db-seeds.md for sample data:
# Connect to MongoDB
mongosh -u admin -p box_admin
# Example: Seed adsModule collection
db.adsModule.insertMany([
{ adsModule: "启动页(10:21)" },
{ adsModule: "轮播(2:1)" },
{ adsModule: "弹窗-图标(1:1)" },
{ adsModule: "弹窗-图片(2:3)" },
{ adsModule: "弹窗-官方(2:3)" },
{ adsModule: "瀑布流-图标(1:1)" },
{ adsModule: "瀑布流-文字" },
{ adsModule: "布流-视频(8:5)" },
{ adsModule: "悬浮-底部(1:1)" },
{ adsModule: "悬浮-边缘(1:1)" },
{ adsModule: "banner(4:1)" },
{ adsModule: "片头(8:5)" },
{ adsModule: "暂停(2:1)" }
])
# Verify
db.adsModule.find()
Note: Full MongoDB seeding scripts are in mongo-db-seeds.md. Implement as needed for your environment.
For convenience, run the MySQL migration plus the Mongo admin seed in one command:
pnpm prisma:migrate:dev:mysql && pnpm prisma:seed:box-admin:admin
# Start Box Management API in watch mode
pnpm dev:mgnt
Expected output:
[Nest] INFO [NestFactory] Starting Nest application...
[Nest] INFO [InstanceLoader] AppModule dependencies initialized
[Nest] INFO [RoutesResolver] AuthController {/mgnt/auth}
[Nest] INFO [RoutesResolver] UserController {/mgnt/user}
...
[Nest] INFO [NestApplication] Nest application successfully started
🚀 Server running on http://0.0.0.0:3300
📚 API Documentation: http://0.0.0.0:3300/api-docs
Health Check:
curl http://localhost:3300/health
Login with seeded admin:
curl -X POST http://localhost:3300/mgnt/auth/login \
-H "Content-Type: application/json" \
-d '{
"username": "admin",
"password": "a123456"
}'
Expected response:
{
"success": true,
"code": "OK",
"message": "success",
"data": {
"account": "admin",
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"avatar": null,
"nickname": "Administrator",
"email": "admin@box.com",
...
},
"timestamp": "2025-11-23T12:34:56.789Z"
}
Open browser: http://localhost:3300/api-docs
Edit files in prisma/mysql/schema/:
// Example: Add new field to user.prisma
model SysUser {
id Int @id @default(autoincrement())
username String @unique @db.VarChar(50)
// ... existing fields ...
// NEW: Add phone number field
phone String? @db.VarChar(20)
@@map("sys_user")
}
# Generate migration with descriptive name
pnpm prisma:migrate:dev:mysql
# When prompted, enter migration name: add_user_phone_field
What happens:
prisma/mysql/migrations/XXXXXXXXXXXXXX_add_user_phone_field/_prisma_migrations table# Check the generated SQL
cat prisma/mysql/migrations/XXXXXXXXXXXXXX_add_user_phone_field/migration.sql
Example output:
-- AlterTable
ALTER TABLE `sys_user` ADD COLUMN `phone` VARCHAR(20) NULL;
If your migration requires seed data updates:
// prisma/mysql/seed.ts
const adminUser = {
username: 'admin',
password: await bcrypt.hash('a123456', 10),
phone: '+1234567890', // Add new field
// ... other fields
};
# Check database schema
mysql -u root -p box_admin -e "DESCRIBE sys_user;"
# Check migration history
mysql -u root -p box_admin -e "
SELECT migration_name, finished_at, applied_steps_count
FROM _prisma_migrations
ORDER BY finished_at DESC
LIMIT 5;
"
✅ DO:
❌ DON'T:
# Create new migration without applying
pnpm exec dotenv -e .env.mgnt.dev -- prisma migrate dev --create-only --schema=prisma/mysql/schema
# Apply pending migrations
pnpm prisma:migrate:dev:mysql
# Reset database (⚠️ DESTRUCTIVE - deletes all data)
pnpm prisma:migrate:reset:mysql
# Check migration status
pnpm exec dotenv -e .env.mgnt.dev -- prisma migrate status --schema=prisma/mysql/schema
# Generate client only (after schema changes)
pnpm prisma:generate:mysql
If multiple developers create migrations:
# 1. Pull latest changes
git pull origin main
# 2. Check for migration conflicts
pnpm exec dotenv -e .env.mgnt.dev -- prisma migrate status --schema=prisma/mysql/schema
# 3. If conflicts exist, reset and re-migrate
pnpm prisma:migrate:reset:mysql
pnpm prisma:migrate:dev:mysql
# 1. Test migration in staging
pnpm exec dotenv -e .env.staging -- prisma migrate deploy --schema=prisma/mysql/schema
# 2. Backup production database
mysqldump -u root -p box_admin > backup_$(date +%Y%m%d_%H%M%S).sql
# 3. Apply to production
pnpm exec dotenv -e .env.production -- prisma migrate deploy --schema=prisma/mysql/schema
# 4. Verify
pnpm exec dotenv -e .env.production -- prisma migrate status --schema=prisma/mysql/schema
# Clear cache and retry
pnpm store prune
rm -rf node_modules pnpm-lock.yaml
pnpm install
# Regenerate clients
pnpm prisma:generate
# Check database connection
mysql -u root -p -e "SELECT 1"
# Reset and retry (development only)
pnpm prisma:migrate:reset:mysql
pnpm prisma:setup:mysql
# Change port in .env.mgnt.dev
APP_PORT=3301
# Or kill existing process
lsof -ti:3300 | xargs kill -9
# Check MongoDB is running
systemctl status mongod
# Test connection
mongosh -u admin -p --authenticationDatabase admin
ARCHITECTURE_FLOW.mdDEVELOPER_GUIDE.mdDEPLOYMENT_CHECKLIST.mdREFACTOR_SUMMARY.mdmongo-db-seeds.md| Task | Command |
|---|---|
| Install dependencies | pnpm install |
| Generate Prisma clients | pnpm prisma:generate |
| Run migrations | pnpm prisma:migrate:dev:mysql |
| Seed admin data | pnpm prisma:seed:box-admin:admin |
| Seed ad modules | pnpm prisma:seed:box-admin |
| Full setup | pnpm prisma:migrate:dev:mysql && pnpm prisma:seed:box-admin:admin |
| Start dev server | pnpm dev:mgnt |
| Build production | pnpm build:mgnt |
| Start production | pnpm start:mgnt |
| Type check | pnpm typecheck |
| Lint code | pnpm lint |
| Run all tests | pnpm test |
After seeding, login with:
admina123456admin@box.com⚠️ IMPORTANT: Change the default password in production!
Last Updated: November 23, 2025
Prisma Version: 5.15.0
NestJS Version: 10.3.8
Node Version: 20+