接入远端数据库

wlf
wang 2 months ago
parent 6d54ecbe66
commit 407564d490

@ -18,25 +18,34 @@ goldminer/
│ │ └── main.js # 入口文件
│ ├── package.json
│ └── vue.config.js
├── run.py # 启动脚本
└── run.bat # 一键启动批处理文件
└── start.bat # 一键启动批处理文件
```
## 系统架构
下图展示了黄金矿工游戏的系统架构:
![系统架构图](https://mermaid.ink/img/eyJjb2RlIjoiZ3JhcGggVEQ7XG4gICAgQVtcIueUqOaIt+a1j-imvuWZqFwiXSAtLT58orWpl3wgQltcIlZ1ZSDliY3nq69cIl1cbiAgICBCIC0tPnxBUEkg6K-35rGCfCBDW1wiRmxhc2sg5ZCO56uvXCJdXG4gICAgQyAtLT586ZSZ5bqmfCBCXG4gICAgXG4gICAgc3ViZ3JhcGggXCLliY3nq68gbG9jYWxob3N0OjgwODBcIlxuICAgIEIgLS0-fOa4suafk3wgRFtcIkFwcC52dWVcIl1cbiAgICBEIC0tPnzljIXlkKt8IEVbXCJHYW1lLnZ1ZVwiXVxuICAgIEUgLS0-fOa4uOaIj-mAu-i-kXwgRltcIua4uOaIj-W-queOr1wiXVxuICAgIEYgLS0-fOabtOaWsHwgR1tcIkNhbnZhcyDmuLLmn5NcIl1cbiAgICBlbmRcbiAgICBcbiAgICBzdWJncmFwaCBcIuWQjuerryBsb2NhbGhvc3Q6NTAwMFwiXG4gICAgQyAtLT585bGP5oCn5paH5Lu26LWE5rqQfCBIW1wiaW5kZXguaHRtbFwiXVxuICAgIEMgLS0-fEFQSXwgSVtcIi9hcGkvaGVhbHRoXCJdXG4gICAgZW5kIiwibWVybWFpZCI6e30sInVwZGF0ZUVkaXRvciI6ZmFsc2UsImF1dG9TeW5jIjp0cnVlLCJ1cGRhdGVEaWFncmFtIjpmYWxzZX0)
![系统架构图](https://mermaid.ink/img/eyJjb2RlIjoiZ3JhcGggVEQ7XG4gICAgQVtcIueUqOaIt+a1j-imvuWZqFwiXSAtLT58orWpl3wgQltcIlZ1ZSDliY3nq69cIl1cbiAgICBCIC0tPnxBUEkg6K-35rGCfCBDW1wiRmxhc2sg5ZCO56uvXCJdXG4gICAgQyAtLT586ZSZ5bqmfCBCXG4gICAgXG4gICAgc3ViZ3JhcGggXCLliY3nq68gbG9jYWxob3N0OjgwODBcIlxuICAgIEIgLS0-fOa4suafk3wgRFtcIkFwcC52dWVcIl1cbiAgICBEIC0tPnzljIXlkKt8IEVbXCJHYW1lLnZ1ZVwiXVxuICAgIEUgLS0-fOa4uOaIj-mAu-i-kXwgRltcIua4uOaIj-W-queOr1wiXVxuICAgIEYgLS0-fOabtOaWsHwgR1tcIkNhbnZhcyDmuLLmn5NcIl1cbiAgICBlbmRcbiAgICBcbiAgICBzdWJncmFwaCBcIuWQjuerryBsb2NhbGhvc3Q6NTAwMFwiXG4gICAgQyAtLT585bGP5oCn5paH5Lu26LWE5rqQfCBIW1wiaW5kZXguaHRtbFwiXVxuICAgIEMgLS0-fEFQSXwgSVtcIi9hcGkvaGVhbHRoXCJdXG4gICAgQyAtLT586ZO+5o6lIENsb3VkfCBKW1wiTXlTUUwg5LqR5pWw5o2u5bqTXCJdXG4gICAgZW5kIiwibWVybWFpZCI6e30sInVwZGF0ZUVkaXRvciI6ZmFsc2UsImF1dG9TeW5jIjp0cnVlLCJ1cGRhdGVEaWFncmFtIjpmYWxzZX0)
## 数据库配置
本项目使用云端MySQL数据库存储用户数据、游戏记录和聊天信息。
数据库配置信息:
- 数据库类型MySQL 8.4.3
- 服务提供商SQLPub.com
- 数据库名称goldminer
- 连接地址mysql2.sqlpub.com:3307
## 安装和运行
### 快速启动(推荐)
直接双击 `run.bat` 文件即可一键启动游戏。
直接双击 `start.bat` 文件即可一键启动游戏。
这个脚本会自动:
1. 检查并安装所需的后端依赖
2. 检查并创建必要的配置文件
2. 连接到云端数据库并创建必要的表(如果不存在)
3. 同时启动后端和前端服务器
4. 自动在浏览器中打开游戏
@ -70,21 +79,12 @@ python app.py
cd goldminer/frontend
```
2. 创建Babel配置文件如果不存在
```
echo module.exports = { > babel.config.js
echo presets: [ >> babel.config.js
echo '@vue/cli-plugin-babel/preset' >> babel.config.js
echo ] >> babel.config.js
echo } >> babel.config.js
```
3. 安装依赖
2. 安装依赖
```
npm install
```
4. 开发模式运行
3. 开发模式运行
```
npm run serve
```
@ -107,6 +107,7 @@ npm run serve
## 技术栈
- 后端Flask
- 后端Flask, SQLAlchemy, PyMySQL
- 前端Vue 3
- 通信Axios
- 数据库MySQL 8.4.3 (云端)
- 通信Axios, Socket.IO

@ -6,11 +6,28 @@ from flask_socketio import SocketIO, emit, join_room, leave_room
import os
import uuid
from datetime import datetime
from sqlalchemy.exc import OperationalError
import logging
logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)
app = Flask(__name__, static_folder='../frontend/dist')
app.config['SECRET_KEY'] = os.environ.get('SECRET_KEY', 'dev_key_for_goldminer')
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///goldminer.db'
# 云端MySQL数据库配置
DB_USER = os.environ.get('DB_USER', 'goldminer')
DB_PASSWORD = os.environ.get('DB_PASSWORD', 'nBAWq9DDwJ14Fugq')
DB_HOST = os.environ.get('DB_HOST', 'mysql2.sqlpub.com')
DB_PORT = os.environ.get('DB_PORT', '3307')
DB_NAME = os.environ.get('DB_NAME', 'goldminer')
# 构建MySQL连接字符串包含端口
app.config['SQLALCHEMY_DATABASE_URI'] = f'mysql+pymysql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:{DB_PORT}/{DB_NAME}'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config['SQLALCHEMY_ECHO'] = True # 开启SQL查询日志方便调试
logger.info(f"连接到云端数据库: {DB_HOST}:{DB_PORT}/{DB_NAME}")
CORS(app, supports_credentials=True, origins=['*']) # Enable CORS with credentials for all origins
db = SQLAlchemy(app)
@ -67,9 +84,24 @@ class ChatMessage(db.Model):
room = db.relationship('ChatRoom', backref=db.backref('messages', lazy=True))
user = db.relationship('User', backref=db.backref('messages', lazy=True))
# 创建数据库表
with app.app_context():
db.create_all()
# 检查数据库连接并创建表
def init_db():
with app.app_context():
try:
logger.info("正在连接到云端MySQL数据库...")
# 尝试创建表结构(如果不存在)
db.create_all()
logger.info("数据库连接成功,并且所有表都已创建(如果不存在)。")
except OperationalError as e:
logger.error("无法连接到云端MySQL数据库。请检查您的数据库配置和网络连接。")
logger.error(f"错误详情: {e}")
logger.error("请确保:")
logger.error(f"1. 能够访问数据库服务器 {DB_HOST}:{DB_PORT}")
logger.error(f"2. 数据库 '{DB_NAME}' 存在且用户 '{DB_USER}' 有权限访问。")
logger.error(f"3. 提供的密码是正确的。")
# 这里不会阻止应用启动,但会记录错误
except Exception as e:
logger.error(f"初始化数据库时发生未知错误: {e}")
# 注册API
@app.route('/api/register', methods=['POST'])
@ -449,4 +481,7 @@ def handle_send_message(data):
}, room=str(room_id))
if __name__ == '__main__':
socketio.run(app, debug=True, host='0.0.0.0')
# 在启动应用前初始化数据库
init_db()
# 使用 eventlet 或 gevent 来获得更好的性能
socketio.run(app, debug=True, host='0.0.0.0', port=5000)

Binary file not shown.

@ -1,6 +1,9 @@
from app import socketio, app
from app import socketio, app, init_db, DB_HOST, DB_PORT, DB_NAME
if __name__ == '__main__':
# 在启动应用前初始化云端数据库
print(f"连接到云端数据库: {DB_HOST}:{DB_PORT}/{DB_NAME}")
init_db()
print("启动后端服务器...")
print("监听所有网络接口 (0.0.0.0:5000)")
socketio.run(app, host='0.0.0.0', port=5000, debug=True)
socketio.run(app, debug=True, host='0.0.0.0', port=5000)

@ -0,0 +1 @@
{"ast":null,"code":"import { createApp } from 'vue';\nimport App from './App.vue';\nimport router from './router';\nimport axios from 'axios';\n\n// 配置axios默认URL使用当前主机名而不是硬编码的localhost\nconst currentHost = window.location.hostname;\naxios.defaults.baseURL = process.env.NODE_ENV === 'production' ? '' : `http://${currentHost}:5000`;\nconst app = createApp(App);\napp.use(router);\napp.mount('#app');","map":{"version":3,"names":["createApp","App","router","axios","currentHost","window","location","hostname","defaults","baseURL","process","env","NODE_ENV","app","use","mount"],"sources":["D:/学习/网络应用程序开发/pdf/goldminer/frontend/src/main.js"],"sourcesContent":["import { createApp } from 'vue'\r\nimport App from './App.vue'\r\nimport router from './router'\r\nimport axios from 'axios'\r\n\r\n// 配置axios默认URL使用当前主机名而不是硬编码的localhost\r\nconst currentHost = window.location.hostname\r\naxios.defaults.baseURL = process.env.NODE_ENV === 'production' \r\n ? '' \r\n : `http://${currentHost}:5000`\r\n\r\nconst app = createApp(App)\r\napp.use(router)\r\napp.mount('#app') "],"mappings":"AAAA,SAASA,SAAS,QAAQ,KAAK;AAC/B,OAAOC,GAAG,MAAM,WAAW;AAC3B,OAAOC,MAAM,MAAM,UAAU;AAC7B,OAAOC,KAAK,MAAM,OAAO;;AAEzB;AACA,MAAMC,WAAW,GAAGC,MAAM,CAACC,QAAQ,CAACC,QAAQ;AAC5CJ,KAAK,CAACK,QAAQ,CAACC,OAAO,GAAGC,OAAO,CAACC,GAAG,CAACC,QAAQ,KAAK,YAAY,GAC1D,EAAE,GACF,UAAUR,WAAW,OAAO;AAEhC,MAAMS,GAAG,GAAGb,SAAS,CAACC,GAAG,CAAC;AAC1BY,GAAG,CAACC,GAAG,CAACZ,MAAM,CAAC;AACfW,GAAG,CAACE,KAAK,CAAC,MAAM,CAAC","ignoreList":[]},"metadata":{},"sourceType":"module","externalDependencies":[]}

@ -1 +1 @@
[{"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\main.js":"1","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\App.vue":"2","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\router.js":"3","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Home.vue":"4","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Register.vue":"5","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Game.vue":"6","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Login.vue":"7","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\UserProfile.vue":"8","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\ChatRoom.vue":"9","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Leaderboard.vue":"10","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Header.vue":"11"},{"size":407,"mtime":1750159657634,"results":"12","hashOfConfig":"13"},{"size":1004,"mtime":1750128639386,"results":"14","hashOfConfig":"13"},{"size":1555,"mtime":1750147385472,"results":"15","hashOfConfig":"13"},{"size":5735,"mtime":1750130209089,"results":"16","hashOfConfig":"13"},{"size":4492,"mtime":1750147385471,"results":"17","hashOfConfig":"13"},{"size":26829,"mtime":1750130209088,"results":"18","hashOfConfig":"13"},{"size":3647,"mtime":1750147385470,"results":"19","hashOfConfig":"13"},{"size":11652,"mtime":1750130209090,"results":"20","hashOfConfig":"13"},{"size":16278,"mtime":1750130209087,"results":"21","hashOfConfig":"13"},{"size":13225,"mtime":1750128639387,"results":"22","hashOfConfig":"13"},{"size":4152,"mtime":1750147491182,"results":"23","hashOfConfig":"13"},{"filePath":"24","messages":"25","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"i331ru",{"filePath":"26","messages":"27","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28","messages":"29","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30","messages":"31","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32","messages":"33","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34","messages":"35","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36","messages":"37","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38","messages":"39","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40","messages":"41","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"42","messages":"43","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"44","messages":"45","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\main.js",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\App.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\router.js",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Home.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Register.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Game.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Login.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\UserProfile.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\ChatRoom.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Leaderboard.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Header.vue",[]]
[{"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\main.js":"1","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\App.vue":"2","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\router.js":"3","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Home.vue":"4","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Register.vue":"5","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Game.vue":"6","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Login.vue":"7","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\UserProfile.vue":"8","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\ChatRoom.vue":"9","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Leaderboard.vue":"10","D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Header.vue":"11"},{"size":420,"mtime":1750209720347,"results":"12","hashOfConfig":"13"},{"size":1004,"mtime":1750128639386,"results":"14","hashOfConfig":"13"},{"size":1555,"mtime":1750209720347,"results":"15","hashOfConfig":"13"},{"size":5735,"mtime":1750209720346,"results":"16","hashOfConfig":"13"},{"size":4492,"mtime":1750147385471,"results":"17","hashOfConfig":"13"},{"size":26829,"mtime":1750209720345,"results":"18","hashOfConfig":"13"},{"size":3647,"mtime":1750147385470,"results":"19","hashOfConfig":"13"},{"size":11652,"mtime":1750209720347,"results":"20","hashOfConfig":"13"},{"size":16278,"mtime":1750209720344,"results":"21","hashOfConfig":"13"},{"size":13225,"mtime":1750128639387,"results":"22","hashOfConfig":"13"},{"size":4152,"mtime":1750209720345,"results":"23","hashOfConfig":"13"},{"filePath":"24","messages":"25","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"i331ru",{"filePath":"26","messages":"27","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"28","messages":"29","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"30","messages":"31","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"32","messages":"33","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"34","messages":"35","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"36","messages":"37","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"38","messages":"39","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"40","messages":"41","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"42","messages":"43","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},{"filePath":"44","messages":"45","errorCount":0,"fatalErrorCount":0,"warningCount":0,"fixableErrorCount":0,"fixableWarningCount":0},"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\main.js",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\App.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\router.js",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Home.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Register.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Game.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Login.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\UserProfile.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\ChatRoom.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Leaderboard.vue",[],"D:\\学习\\网络应用程序开发\\pdf\\goldminer\\frontend\\src\\components\\Header.vue",[]]

@ -64,8 +64,9 @@ REM Run the backend server with host=0.0.0.0
echo ===================================
echo Starting Backend Server...
echo Backend will listen on all network interfaces (0.0.0.0:5000)
echo Connecting to cloud database: mysql2.sqlpub.com:3307
echo ===================================
python -c "from app import socketio, app; socketio.run(app, host='0.0.0.0', port=5000, debug=True)"
python app.py
pause
if "%1"=="" goto menu
exit /b

Loading…
Cancel
Save