docs(migration): 添加清渊传奇PHP到Vue+Node.js移植计划文档
- 新增 MIGRATION.md 详细记录PHP到Node.js架构迁移方案 - 包含项目背景、现有资产盘点、架构设计、任务清单等完整规划 - 记录后端补全、前端补全、PHP停用、部署运维四个阶段实施计划 - 提供技术决策、数据库说明、进度总览等关键信息 - 更新 .gitignore 添加 *_out.txt build_output.txt 构建输出文件过滤 - 修复 utils.js 路径引用问题确保代码正常运行
This commit is contained in:
4
.gitignore
vendored
4
.gitignore
vendored
@@ -6,6 +6,8 @@ yarn-debug.log*
|
|||||||
yarn-error.log*
|
yarn-error.log*
|
||||||
pnpm-debug.log*
|
pnpm-debug.log*
|
||||||
lerna-debug.log*
|
lerna-debug.log*
|
||||||
|
*_out.txt
|
||||||
|
build_output.txt
|
||||||
|
|
||||||
node_modules
|
node_modules
|
||||||
dist
|
dist
|
||||||
@@ -22,3 +24,5 @@ dist-ssr
|
|||||||
*.njsproj
|
*.njsproj
|
||||||
*.sln
|
*.sln
|
||||||
*.sw?
|
*.sw?
|
||||||
|
|
||||||
|
.lingma
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ import Router from 'koa-router'
|
|||||||
import mysql from '../mysql/index.js'
|
import mysql from '../mysql/index.js'
|
||||||
import * as log4js from '../log4js.js'
|
import * as log4js from '../log4js.js'
|
||||||
import config from '../config/index.js'
|
import config from '../config/index.js'
|
||||||
import { encryptPassword } from '../utils.js'
|
import { encryptPassword } from '../utils/utils.js'
|
||||||
|
|
||||||
const router = new Router()
|
const router = new Router()
|
||||||
|
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import mysql from '../mysql/index.js'
|
|||||||
import jwt from 'jsonwebtoken'
|
import jwt from 'jsonwebtoken'
|
||||||
import * as log4js from '../log4js.js'
|
import * as log4js from '../log4js.js'
|
||||||
import config from '../config/index.js'
|
import config from '../config/index.js'
|
||||||
import { time, unixTime, encryptPassword, generateCode, getClientIp, isValidAccount, isValidEmail, getDeviceInfo } from '../utils.js'
|
import { time, unixTime, encryptPassword, generateCode, getClientIp, isValidAccount, isValidEmail, getDeviceInfo } from '../utils/utils.js'
|
||||||
import { sendCodeMail } from '../mail.js'
|
import { sendCodeMail } from '../mail.js'
|
||||||
|
|
||||||
const router = new Router()
|
const router = new Router()
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import config from '../../config/index.js'
|
import config from '../../config/index.js'
|
||||||
import { getClientIp } from '../../utils.js'
|
import { getClientIp } from '../../utils/utils.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* IP 黑名单过滤中间件
|
* IP 黑名单过滤中间件
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
import * as log4js from '../../log4js.js'
|
import * as log4js from '../../log4js.js'
|
||||||
import { getClientIp } from '../../utils.js'
|
import { getClientIp } from '../../utils/utils.js'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 简单内存限流中间件(基于滑动窗口计数)
|
* 简单内存限流中间件(基于滑动窗口计数)
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import mysql from '../mysql/index.js'
|
|||||||
import getGameDB from '../mysql/gameDB.js'
|
import getGameDB from '../mysql/gameDB.js'
|
||||||
import * as log4js from '../log4js.js'
|
import * as log4js from '../log4js.js'
|
||||||
import config from '../config/index.js'
|
import config from '../config/index.js'
|
||||||
import { time, unixTime, getClientIp } from '../utils.js'
|
import { time, unixTime, getClientIp } from '../utils/utils.js'
|
||||||
import { readFileSync, existsSync } from 'fs'
|
import { readFileSync, existsSync } from 'fs'
|
||||||
import { fileURLToPath } from 'url'
|
import { fileURLToPath } from 'url'
|
||||||
import { dirname, join } from 'path'
|
import { dirname, join } from 'path'
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
[32m[19:26:51] [INFO] [koa][39m 🚀 Koa server running on port 3001
|
|
||||||
[33m[19:28:04] [WARN] [koa][39m 登录失败 testuser ::1
|
|
||||||
[32m[20:13:27] [INFO] [koa][39m 用户登录成功 aceykubbo ::1
|
|
||||||
@@ -1 +0,0 @@
|
|||||||
[32m[11:46:24] [INFO] [koa][39m 🚀 Koa server running on port 3001
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
npm warn Unknown user config "home". This will stop working in the next major version of npm.
|
|
||||||
[36mvite v7.3.1 [32mbuilding client environment for production...[36m[39m
|
|
||||||
<script src="/static/js/md5.js"> in "/index.html" can't be bundled without type="module" attribute
|
|
||||||
<script src="/static/js/common.js?v=1"> in "/index.html" can't be bundled without type="module" attribute
|
|
||||||
transforming...
|
|
||||||
[32m✓[39m 1670 modules transformed.
|
|
||||||
rendering chunks...
|
|
||||||
computing gzip size...
|
|
||||||
[2mdist/[22m[32mindex.html [39m[1m[2m 1.05 kB[22m[1m[22m[2m │ gzip: 0.49 kB[22m
|
|
||||||
[2mdist/[22m[35massets/agree-BLQpfDVx.css [39m[1m[2m 1.37 kB[22m[1m[22m[2m │ gzip: 0.46 kB[22m
|
|
||||||
[2mdist/[22m[35massets/linuxdo-bind-DPWWajSf.css [39m[1m[2m 1.77 kB[22m[1m[22m[2m │ gzip: 0.53 kB[22m
|
|
||||||
[2mdist/[22m[35massets/withdraw-DqWlBzRo.css [39m[1m[2m 3.60 kB[22m[1m[22m[2m │ gzip: 0.81 kB[22m
|
|
||||||
[2mdist/[22m[35massets/login-BlSp8Yei.css [39m[1m[2m 4.29 kB[22m[1m[22m[2m │ gzip: 1.16 kB[22m
|
|
||||||
[2mdist/[22m[35massets/index-KHprj2W-.css [39m[1m[2m378.12 kB[22m[1m[22m[2m │ gzip: 53.06 kB[22m
|
|
||||||
[2mdist/[22m[36massets/agree-C-28jhbg.js [39m[1m[2m 0.92 kB[22m[1m[22m[2m │ gzip: 0.63 kB[22m
|
|
||||||
[2mdist/[22m[36massets/linuxdo-bind-CFqSeBhv.js [39m[1m[2m 2.55 kB[22m[1m[22m[2m │ gzip: 1.25 kB[22m
|
|
||||||
[2mdist/[22m[36massets/index-7GZNUh9s.js [39m[1m[2m 3.66 kB[22m[1m[22m[2m │ gzip: 1.94 kB[22m
|
|
||||||
[2mdist/[22m[36massets/withdraw-09hftHnJ.js [39m[1m[2m 4.85 kB[22m[1m[22m[2m │ gzip: 2.24 kB[22m
|
|
||||||
[2mdist/[22m[36massets/login-kOeQ-hLG.js [39m[1m[2m 6.67 kB[22m[1m[22m[2m │ gzip: 2.60 kB[22m
|
|
||||||
[2mdist/[22m[36massets/request-CitDfMDA.js [39m[1m[2m 37.58 kB[22m[1m[22m[2m │ gzip: 15.14 kB[22m
|
|
||||||
[2mdist/[22m[36massets/index-DjlCHBNb.js [39m[1m[33m988.31 kB[39m[22m[2m │ gzip: 326.73 kB[22m
|
|
||||||
[33m
|
|
||||||
(!) Some chunks are larger than 500 kB after minification. Consider:
|
|
||||||
- Using dynamic import() to code-split the application
|
|
||||||
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
|
|
||||||
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.[39m
|
|
||||||
[32m✓ built in 11.94s[39m
|
|
||||||
@@ -1,25 +0,0 @@
|
|||||||
npm warn Unknown user config "home". This will stop working in the next major version of npm.
|
|
||||||
[36mvite v7.3.1 [32mbuilding client environment for production...[36m[39m
|
|
||||||
<script src="/static/js/md5.js"> in "/index.html" can't be bundled without type="module" attribute
|
|
||||||
<script src="/static/js/common.js?v=1"> in "/index.html" can't be bundled without type="module" attribute
|
|
||||||
transforming...
|
|
||||||
[32m✓[39m 1670 modules transformed.
|
|
||||||
rendering chunks...
|
|
||||||
computing gzip size...
|
|
||||||
[2mdist/[22m[32mindex.html [39m[1m[2m 1.21 kB[22m[1m[22m[2m │ gzip: 0.54 kB[22m
|
|
||||||
[2mdist/[22m[35massets/agree-BLQpfDVx.css [39m[1m[2m 1.37 kB[22m[1m[22m[2m │ gzip: 0.46 kB[22m
|
|
||||||
[2mdist/[22m[35massets/linuxdo-bind-DPWWajSf.css [39m[1m[2m 1.77 kB[22m[1m[22m[2m │ gzip: 0.53 kB[22m
|
|
||||||
[2mdist/[22m[35massets/withdraw-DqWlBzRo.css [39m[1m[2m 3.60 kB[22m[1m[22m[2m │ gzip: 0.81 kB[22m
|
|
||||||
[2mdist/[22m[35massets/login-Dg3cbkYJ.css [39m[1m[2m 4.27 kB[22m[1m[22m[2m │ gzip: 1.16 kB[22m
|
|
||||||
[2mdist/[22m[35massets/index-KHprj2W-.css [39m[1m[2m378.12 kB[22m[1m[22m[2m │ gzip: 53.06 kB[22m
|
|
||||||
[2mdist/[22m[36massets/request-Cp8a3QvY.js [39m[1m[2m 0.56 kB[22m[1m[22m[2m │ gzip: 0.42 kB[22m
|
|
||||||
[2mdist/[22m[36massets/agree-BcUYvO61.js [39m[1m[2m 1.00 kB[22m[1m[22m[2m │ gzip: 0.67 kB[22m
|
|
||||||
[2mdist/[22m[36massets/linuxdo-bind-Dwzc1_1I.js [39m[1m[2m 2.67 kB[22m[1m[22m[2m │ gzip: 1.31 kB[22m
|
|
||||||
[2mdist/[22m[36massets/index-DuMdIoFP.js [39m[1m[2m 3.74 kB[22m[1m[22m[2m │ gzip: 1.98 kB[22m
|
|
||||||
[2mdist/[22m[36massets/index-C39LcZDB.js [39m[1m[2m 4.34 kB[22m[1m[22m[2m │ gzip: 2.08 kB[22m
|
|
||||||
[2mdist/[22m[36massets/withdraw-BUvhXBBH.js [39m[1m[2m 4.97 kB[22m[1m[22m[2m │ gzip: 2.30 kB[22m
|
|
||||||
[2mdist/[22m[36massets/login-kvI3nDLX.js [39m[1m[2m 6.79 kB[22m[1m[22m[2m │ gzip: 2.67 kB[22m
|
|
||||||
[2mdist/[22m[36massets/vendor-axios-42ANG6Sg.js [39m[1m[2m 37.09 kB[22m[1m[22m[2m │ gzip: 14.85 kB[22m
|
|
||||||
[2mdist/[22m[36massets/vendor-vue-CrCesgj8.js [39m[1m[2m105.59 kB[22m[1m[22m[2m │ gzip: 40.98 kB[22m
|
|
||||||
[2mdist/[22m[36massets/vendor-element-DlG_uBZr.js [39m[1m[2m878.48 kB[22m[1m[22m[2m │ gzip: 284.60 kB[22m
|
|
||||||
[32m✓ built in 11.71s[39m
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
npm warn Unknown user config "home". This will stop working in the next major version of npm.
|
|
||||||
[36mvite v7.3.1 [32mbuilding client environment for production...[36m[39m
|
|
||||||
<script src="/static/js/md5.js"> in "/index.html" can't be bundled without type="module" attribute
|
|
||||||
<script src="/static/js/common.js?v=1"> in "/index.html" can't be bundled without type="module" attribute
|
|
||||||
transforming...
|
|
||||||
[32m✓[39m 1670 modules transformed.
|
|
||||||
rendering chunks...
|
|
||||||
computing gzip size...
|
|
||||||
[2mdist/[22m[32mindex.html [39m[1m[2m 1.05 kB[22m[1m[22m[2m │ gzip: 0.49 kB[22m
|
|
||||||
[2mdist/[22m[35massets/agree-BLQpfDVx.css [39m[1m[2m 1.37 kB[22m[1m[22m[2m │ gzip: 0.46 kB[22m
|
|
||||||
[2mdist/[22m[35massets/linuxdo-bind-DPWWajSf.css [39m[1m[2m 1.77 kB[22m[1m[22m[2m │ gzip: 0.53 kB[22m
|
|
||||||
[2mdist/[22m[35massets/withdraw-DqWlBzRo.css [39m[1m[2m 3.60 kB[22m[1m[22m[2m │ gzip: 0.81 kB[22m
|
|
||||||
[2mdist/[22m[35massets/login-BlSp8Yei.css [39m[1m[2m 4.29 kB[22m[1m[22m[2m │ gzip: 1.16 kB[22m
|
|
||||||
[2mdist/[22m[35massets/index-KHprj2W-.css [39m[1m[2m378.12 kB[22m[1m[22m[2m │ gzip: 53.06 kB[22m
|
|
||||||
[2mdist/[22m[36massets/agree-C-28jhbg.js [39m[1m[2m 0.92 kB[22m[1m[22m[2m │ gzip: 0.63 kB[22m
|
|
||||||
[2mdist/[22m[36massets/linuxdo-bind-CFqSeBhv.js [39m[1m[2m 2.55 kB[22m[1m[22m[2m │ gzip: 1.25 kB[22m
|
|
||||||
[2mdist/[22m[36massets/index-7GZNUh9s.js [39m[1m[2m 3.66 kB[22m[1m[22m[2m │ gzip: 1.94 kB[22m
|
|
||||||
[2mdist/[22m[36massets/withdraw-09hftHnJ.js [39m[1m[2m 4.85 kB[22m[1m[22m[2m │ gzip: 2.24 kB[22m
|
|
||||||
[2mdist/[22m[36massets/login-kOeQ-hLG.js [39m[1m[2m 6.67 kB[22m[1m[22m[2m │ gzip: 2.60 kB[22m
|
|
||||||
[2mdist/[22m[36massets/request-CitDfMDA.js [39m[1m[2m 37.58 kB[22m[1m[22m[2m │ gzip: 15.14 kB[22m
|
|
||||||
[2mdist/[22m[36massets/index-DjlCHBNb.js [39m[1m[33m988.31 kB[39m[22m[2m │ gzip: 326.73 kB[22m
|
|
||||||
[33m
|
|
||||||
(!) Some chunks are larger than 500 kB after minification. Consider:
|
|
||||||
- Using dynamic import() to code-split the application
|
|
||||||
- Use build.rollupOptions.output.manualChunks to improve chunking: https://rollupjs.org/configuration-options/#output-manualchunks
|
|
||||||
- Adjust chunk size limit for this warning via build.chunkSizeWarningLimit.[39m
|
|
||||||
[32m✓ built in 17.40s[39m
|
|
||||||
@@ -5,7 +5,6 @@ const loadBar2MaxWidth = 200;
|
|||||||
let loadError = false;
|
let loadError = false;
|
||||||
onMounted(()=>{
|
onMounted(()=>{
|
||||||
const loadBox = document.getElementById('loadBox'),
|
const loadBox = document.getElementById('loadBox'),
|
||||||
logoImg = document.getElementById('logoImg'),
|
|
||||||
loadBar1 = document.getElementById('loadBar1'),
|
loadBar1 = document.getElementById('loadBar1'),
|
||||||
loadBar2 = document.getElementById('loadBar2');
|
loadBar2 = document.getElementById('loadBar2');
|
||||||
|
|
||||||
@@ -18,7 +17,6 @@ onMounted(()=>{
|
|||||||
smallScreen = screenWidth <= 0,
|
smallScreen = screenWidth <= 0,
|
||||||
isHorizontal = isMobile() && screenHeight <= 590;
|
isHorizontal = isMobile() && screenHeight <= 590;
|
||||||
if (loadBox) loadBox.style.paddingTop = (!isHorizontal ? (screenHeight / 4) : 50) + 'px';
|
if (loadBox) loadBox.style.paddingTop = (!isHorizontal ? (screenHeight / 4) : 50) + 'px';
|
||||||
if (logoImg) logoImg.width = isHorizontal || smallScreen ? 300 : 500;
|
|
||||||
if (loadBar1) {
|
if (loadBar1) {
|
||||||
loadBar1Width += 20;
|
loadBar1Width += 20;
|
||||||
if (loadBar1Width > 100) loadBar1Width = 0;
|
if (loadBar1Width > 100) loadBar1Width = 0;
|
||||||
@@ -73,7 +71,6 @@ onMounted(()=>{
|
|||||||
<template>
|
<template>
|
||||||
<div id="logDiv" style="position:absolute; top: 31%; left: 50%;transform: translate(-50%,-50%)">
|
<div id="logDiv" style="position:absolute; top: 31%; left: 50%;transform: translate(-50%,-50%)">
|
||||||
<div style="display: flex;flex-direction: column; align-items: center;gap: 4px;justify-content: center">
|
<div style="display: flex;flex-direction: column; align-items: center;gap: 4px;justify-content: center">
|
||||||
<img id="logoImg" align="center" width="380" src="/login/logo.png" class="mb-20"/>
|
|
||||||
<div id="label" style="color: #b4792e; font-size: 20px;">
|
<div id="label" style="color: #b4792e; font-size: 20px;">
|
||||||
首次加载时间较长……请耐心等待,如长时间无响应 <span class="font_small">
|
首次加载时间较长……请耐心等待,如长时间无响应 <span class="font_small">
|
||||||
<a onClick="window.location.reload()" class="link_color">请点此刷新</a> /
|
<a onClick="window.location.reload()" class="link_color">请点此刷新</a> /
|
||||||
|
|||||||
@@ -32,13 +32,14 @@ onMounted(async () => {
|
|||||||
// 解析 JWT 获取账号信息
|
// 解析 JWT 获取账号信息
|
||||||
const payload = parseJwt(token)
|
const payload = parseJwt(token)
|
||||||
if (!payload?.username) {
|
if (!payload?.username) {
|
||||||
|
error.value = '登录信息无效,请重新登录'
|
||||||
sessionStorage.removeItem('CQ-TOKEN')
|
sessionStorage.removeItem('CQ-TOKEN')
|
||||||
router.replace('/login')
|
setTimeout(() => router.replace('/login'), 2000)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
const account = payload.username
|
const account = payload.username
|
||||||
const password = payload.password // md5 密码哈希,用于游戏客户端鉴权
|
const password = payload.password || '' // md5 密码哈希,用于游戏客户端鉴权
|
||||||
const serverId = payload.server_id || 1
|
const serverId = payload.server_id || 1
|
||||||
|
|
||||||
// 调用 enter_game 接口,更新登录信息
|
// 调用 enter_game 接口,更新登录信息
|
||||||
|
|||||||
@@ -66,7 +66,16 @@ async function handleLogin() {
|
|||||||
if (res.code === 0) {
|
if (res.code === 0) {
|
||||||
sessionStorage.setItem('CQ-TOKEN', res.token)
|
sessionStorage.setItem('CQ-TOKEN', res.token)
|
||||||
ElMessage.success(res.message || '登录成功')
|
ElMessage.success(res.message || '登录成功')
|
||||||
setTimeout(() => router.push('/index'), 1500)
|
// 确保token被正确存储后再跳转
|
||||||
|
setTimeout(() => {
|
||||||
|
// 验证token是否已正确存储
|
||||||
|
const storedToken = sessionStorage.getItem('CQ-TOKEN')
|
||||||
|
if (storedToken) {
|
||||||
|
router.push('/index')
|
||||||
|
} else {
|
||||||
|
ElMessage.error('登录状态保存失败,请重试')
|
||||||
|
}
|
||||||
|
}, 1500)
|
||||||
} else {
|
} else {
|
||||||
ElMessage.error(res.message || '登录失败')
|
ElMessage.error(res.message || '登录失败')
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,7 @@ export default defineConfig({
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
server: {
|
server: {
|
||||||
|
port: 3176,
|
||||||
proxy: {
|
proxy: {
|
||||||
'/api': {
|
'/api': {
|
||||||
target: 'http://localhost:3001',
|
target: 'http://localhost:3001',
|
||||||
|
|||||||
@@ -1,11 +0,0 @@
|
|||||||
npm warn Unknown user config "home". This will stop working in the next major version of npm.
|
|
||||||
[2m20:23:55[22m [36m[1m[vite][22m[39m [90m[2m(client)[22m[39m Re-optimizing dependencies because vite config has changed
|
|
||||||
|
|
||||||
[32m[1mVITE[22m v7.3.1[39m [2mready in [0m[1m970[22m[2m[0m ms[22m
|
|
||||||
|
|
||||||
[32m➜[39m [1mLocal[22m: [36mhttp://localhost:[1m5173[22m/[39m
|
|
||||||
[2m [32m➜[39m [1mNetwork[22m[2m: use [22m[1m--host[22m[2m to expose[22m
|
|
||||||
[1m[33m[@vue/compiler-sfc][0m[33m `defineOptions` is a compiler macro and no longer needs to be imported.[0m
|
|
||||||
|
|
||||||
|
|
||||||
d:\code\chuanqi-qycq-web\module\web>
|
|
||||||
Reference in New Issue
Block a user