#!/usr/bin/env node /** * Uniapp Material Design项目开发服务器 - 包含项目API * 绑定到所有IP地址,支持公网访问 */ const express = require('express'); const cors = require('cors'); const path = require('path'); const fs = require('fs'); // 创建Express应用 const app = express(); const PORT = process.env.PORT || 8000; const HOST = '0.0.0.0'; // 绑定到所有IP // 启用CORS app.use(cors()); // 解析JSON请求体 app.use(express.json()); app.use(express.urlencoded({ extended: true })); // 静态文件服务 app.use(express.static(path.join(__dirname))); // 模拟Uniapp的页面路由 app.get('/pages/:page/:page', (req, res) => { const pagePath = path.join(__dirname, 'pages', req.params.page, `${req.params.page}.vue`); if (fs.existsSync(pagePath)) { // 如果是Vue文件,返回一个简单的HTML页面 res.send(` 玩Android - ${req.params.page}

玩Android Material Design

开发服务器预览

📱
${req.params.page}页面
这是Uniapp Material Design项目的${req.params.page}页面预览
服务器信息
页面路径: /pages/${req.params.page}/${req.params.page}.vue
服务器地址: ${req.protocol}://${req.get('host')}
公网IP: 129.211.173.87:${PORT}
访问时间: ${new Date().toLocaleString()}
返回首页
`); } else { res.status(404).send('页面不存在'); } }); // 首页路由 - 使用新的首页 app.get('/', (req, res) => { const indexPath = path.join(__dirname, 'index.html'); if (fs.existsSync(indexPath)) { res.sendFile(indexPath); } else { // 如果index.html不存在,返回默认首页 res.send(` 玩Android Material Design - 首页

玩Android Material Design

开发服务器预览

📱
玩Android Material Design
基于Uniapp框架开发的玩Android客户端,完全遵循Material Design 3设计规范
服务器信息
服务器地址: ${req.protocol}://${req.get('host')}
公网IP: 129.211.173.87:${PORT}
项目路径: /home/ubuntu/wanandroid/uniapp_android
启动时间: ${new Date().toLocaleString()}
Node版本: ${process.version}
查看正确首页 查看项目页面 Material预览
`); } }); // API模拟 - 玩Android API // Banner数据 app.get('/api/banner/json', (req, res) => { res.json({ data: [ { desc: "Material Design Banner 1", id: 1, imagePath: "https://via.placeholder.com/300x150/6200EE/ffffff?text=Banner1", isVisible: 1, order: 0, title: "玩Android Material Design", type: 0, url: "https://www.wanandroid.com" }, { desc: "Material Design Banner 2", id: 2, imagePath: "https://via.placeholder.com/300x150/03DAC6/ffffff?text=Banner2", isVisible: 1, order: 1, title: "Uniapp开发框架", type: 0, url: "https://uniapp.dcloud.io" }, { desc: "Material Design Banner 3", id: 3, imagePath: "https://via.placeholder.com/300x150/FF9800/ffffff?text=Banner3", isVisible: 1, order: 2, title: "Android应用开发", type: 0, url: "https://developer.android.com" } ], errorCode: 0, errorMsg: "" }); }); // 搜索热词 app.get('/api/hotkey/json', (req, res) => { res.json({ data: [ { id: 1, link: "", name: "Material Design", order: 1, visible: 1 }, { id: 2, link: "", name: "Uniapp", order: 2, visible: 1 }, { id: 3, link: "", name: "Android", order: 3, visible: 1 }, { id: 4, link: "", name: "Vue 3", order: 4, visible: 1 }, { id: 5, link: "", name: "玩Android", order: 5, visible: 1 }, { id: 6, link: "", name: "API开发", order: 6, visible: 1 } ], errorCode: 0, errorMsg: "" }); }); // 文章列表 - 根据页码返回不同内容 app.get('/api/article/list/:page/json', (req, res) => { const page = parseInt(req.params.page) || 0; // 基础文章(第0页显示) const baseArticles = [ { id: 1, title: "玩Android Material Design客户端发布", link: "https://www.wanandroid.com", author: "Material Design", shareUser: "", chapterName: "前端开发", superChapterName: "移动开发", niceDate: "刚刚", publishTime: Date.now(), collect: false, zan: 42, fresh: true, tags: [] }, { id: 2, title: "Uniapp框架Material Design实践指南", link: "https://uniapp.dcloud.io", author: "Uniapp团队", shareUser: "", chapterName: "Uniapp", superChapterName: "跨端开发", niceDate: "1小时前", publishTime: Date.now() - 3600000, collect: true, zan: 28, fresh: false, tags: [] }, { id: 3, title: "Android Material Design 3新特性详解", link: "https://developer.android.com", author: "Google", shareUser: "", chapterName: "Android", superChapterName: "移动开发", niceDate: "3小时前", publishTime: Date.now() - 10800000, collect: false, zan: 56, fresh: false, tags: [] }, { id: 4, title: "玩Android API接口完整文档", link: "https://www.wanandroid.com/blog/show/2", author: "玩Android", shareUser: "", chapterName: "API文档", superChapterName: "开发资源", niceDate: "1天前", publishTime: Date.now() - 86400000, collect: true, zan: 89, fresh: false, tags: [] } ]; // 根据页码生成动态文章 const categories = ["Kotlin", "Jetpack", "Compose", "架构", "性能", "安全", "测试", "工具", "Flutter", "ReactNative"]; const authors = ["Android团队", "Kotlin专家", "架构师", "开发者", "技术博主", "Google开发者", "开源社区", "高级工程师"]; const dynamicArticles = []; for (let i = 0; i < 5; i++) { const articleId = page * 10 + i + 100; const category = categories[(page + i) % categories.length]; const author = authors[(page + i) % authors.length]; dynamicArticles.push({ id: articleId, title: `${category}开发实战教程 - 第${page + 1}期-${i + 1}`, link: "https://www.wanandroid.com", author: author, shareUser: "", chapterName: category, superChapterName: "技术教程", niceDate: `${page + 1}天前`, publishTime: Date.now() - (page * 86400000 + i * 3600000), collect: (articleId % 2 === 0), zan: 20 + (articleId % 50), fresh: (page === 0 && i < 2), tags: [] }); } // 合并文章列表 let allArticles; if (page === 0) { allArticles = [...baseArticles, ...dynamicArticles]; } else { allArticles = dynamicArticles; } res.json({ data: { curPage: page, datas: allArticles, offset: page * 20, over: page >= 4, pageCount: 5, size: 20, total: 50 }, errorCode: 0, errorMsg: "" }); }); // 项目分类API - https://www.wanandroid.com/project/tree/json app.get('/api/project/tree/json', (req, res) => { res.json({ data: [ { children: [], courseId: 13, id: 294, name: "完整项目", order: 145000, parentChapterId: 293, visible: 1 }, { children: [], courseId: 13, id: 402, name: "跨平台应用", order: 144000, parentChapterId: 293, visible: 1 }, { children: [], courseId: 13, id: 367, name: "资源聚合类", order: 143000, parentChapterId: 293, visible: 1 }, { children: [], courseId: 13, id: 323, name: "动画", order: 142000, parentChapterId: 293, visible: 1 }, { children: [], courseId: 13, id: 314, name: "RV列表动效", order: 141000, parentChapterId: 293, visible: 1 }, { children: [], courseId: 13, id: 358, name: "项目基础功能", order: 140000, parentChapterId: 293, visible: 1 }, { children: [], courseId: 13, id: 296, name: "网络&文件下载", order: 139000, parentChapterId: 293, visible: 1 } ], errorCode: 0, errorMsg: "" }); }); // 体系分类API - https://www.wanandroid.com/tree/json app.get('/api/tree/json', (req, res) => { res.json({ data: [ { id: 1, name: "开发环境", order: 1000, children: [ { id: 11, name: "Android Studio相关", order: 1001 }, { id: 12, name: "gradle", order: 1002 }, { id: 13, name: "官方发布", order: 1003 }, { id: 14, name: "90-120hz", order: 1004 } ] }, { id: 2, name: "基础知识", order: 2000, children: [ { id: 21, name: "Activity", order: 2001 }, { id: 22, name: "Service", order: 2002 }, { id: 23, name: "BroadcastReceiver", order: 2003 }, { id: 24, name: "ContentProvider", order: 2004 } ] }, { id: 3, name: "四大组件", order: 3000, children: [ { id: 31, name: "Activity详解", order: 3001 }, { id: 32, name: "Service详解", order: 3002 }, { id: 33, name: "Broadcast详解", order: 3003 }, { id: 34, name: "ContentProvider详解", order: 3004 } ] }, { id: 4, name: "常用控件", order: 4000, children: [ { id: 41, name: "TextView", order: 4001 }, { id: 42, name: "Button", order: 4002 }, { id: 43, name: "ImageView", order: 4003 }, { id: 44, name: "RecyclerView", order: 4004 } ] }, { id: 5, name: "UI/UX设计", order: 5000, children: [ { id: 51, name: "Material Design", order: 5001 }, { id: 52, name: "动画效果", order: 5002 }, { id: 53, name: "响应式设计", order: 5003 }, { id: 54, name: "用户体验", order: 5004 } ] }, { id: 6, name: "网络编程", order: 6000, children: [ { id: 61, name: "HTTP/HTTPS", order: 6001 }, { id: 62, name: "Retrofit", order: 6002 }, { id: 63, name: "OkHttp", order: 6003 }, { id: 64, name: "WebSocket", order: 6004 } ] }, { id: 7, name: "数据存储", order: 7000, children: [ { id: 71, name: "SharedPreferences", order: 7001 }, { id: 72, name: "SQLite", order: 7002 }, { id: 73, name: "Room", order: 7003 }, { id: 74, name: "文件存储", order: 7004 } ] }, { id: 8, name: "性能优化", order: 8000, children: [ { id: 81, name: "内存优化", order: 8001 }, { id: 82, name: "启动优化", order: 8002 }, { id: 83, name: "布局优化", order: 8003 }, { id: 84, name: "网络优化", order: 8004 } ] }, { id: 9, name: "架构设计", order: 9000, children: [ { id: 91, name: "MVC/MVP/MVVM", order: 9001 }, { id: 92, name: "组件化", order: 9002 }, { id: 93, name: "模块化", order: 9003 }, { id: 94, name: "Clean Architecture", order: 9004 } ] }, { id: 10, name: "测试与调试", order: 10000, children: [ { id: 101, name: "单元测试", order: 10001 }, { id: 102, name: "UI测试", order: 10002 }, { id: 103, name: "性能测试", order: 10003 }, { id: 104, name: "调试技巧", order: 10004 } ] } ], errorCode: 0, errorMsg: "" }); }); // 项目列表API - https://www.wanandroid.com/project/list/1/json?cid=294 app.get('/api/project/list/:page/json', (req, res) => { const page = parseInt(req.params.page) || 0; const cid = parseInt(req.query.cid) || 294; // 根据分类ID返回不同的项目数据 let projects = []; if (cid === 294) { // 完整项目 projects = [ { id: 101, title: "玩Android Material Design客户端", desc: "基于Uniapp框架开发的玩Android客户端,完全遵循Material Design 3设计规范", author: "Material Design", publishTime: Date.now() - 86400000, zan: 42, collect: false, comments: 12, fresh: true, superChapterName: "完整项目" }, { id: 102, title: "跨平台电商应用", desc: "使用Uniapp开发的跨平台电商应用,支持iOS、Android、Web和小程序", author: "Uniapp团队", publishTime: Date.now() - 172800000, zan: 28, collect: true, comments: 8, fresh: false, superChapterName: "完整项目" } ]; } else if (cid === 402) { // 跨平台应用 projects = [ { id: 201, title: "智能家居控制中心", desc: "基于Android的智能家居控制中心应用,支持多种智能设备连接和控制", author: "IoT开发者", publishTime: Date.now() - 259200000, zan: 56, collect: false, comments: 24, fresh: false, superChapterName: "跨平台应用" }, { id: 202, title: "在线教育平台", desc: "完整的在线教育平台,包含课程管理、视频播放、在线测试、学习进度跟踪等功能", author: "教育科技", publishTime: Date.now() - 345600000, zan: 89, collect: true, comments: 36, fresh: false, superChapterName: "跨平台应用" } ]; } else if (cid === 367) { // 资源聚合类 projects = [ { id: 301, title: "技术文章聚合平台", desc: "聚合各大技术网站的文章,提供统一的阅读体验和个性化推荐", author: "技术聚合", publishTime: Date.now() - 432000000, zan: 34, collect: false, comments: 15, fresh: true, superChapterName: "资源聚合类" } ]; } else { // 默认项目数据 projects = [ { id: 401, title: "Material Design动画示例", desc: "展示Material Design的各种动画效果和过渡", author: "动画设计师", publishTime: Date.now() - 518400000, zan: 67, collect: false, comments: 28, fresh: false, superChapterName: "动画" } ]; } res.json({ data: { curPage: page, datas: projects, offset: page * 20, over: page >= 2, pageCount: 3, size: 20, total: projects.length }, errorCode: 0, errorMsg: "" }); }); // 用户信息API - https://www.wanandroid.com/user/lg/userinfo/json app.get('/api/user/info/json', (req, res) => { // 检查是否登录(通过请求头或cookie) const authHeader = req.headers.authorization; if (!authHeader) { // 未登录状态 res.json({ errorCode: -1001, errorMsg: "请先登录!", data: null }); return; } // 模拟已登录用户数据 res.json({ data: { coinCount: 128, collectIds: [1, 2, 3, 4, 5], email: "caishushu@example.com", icon: "", id: 12345, nickname: "蔡叔叔", publicName: "蔡叔叔", token: "", type: 0, username: "caishushu" }, errorCode: 0, errorMsg: "" }); }); // 用户积分API - https://www.wanandroid.com/lg/coin/userinfo/json app.get('/api/coin/userinfo/json', (req, res) => { // 检查是否登录 const authHeader = req.headers.authorization; if (!authHeader) { res.json({ errorCode: -1001, errorMsg: "请先登录!", data: null }); return; } // 模拟积分数据 res.json({ data: { coinCount: 128, level: 3, rank: 156, userId: 12345, username: "caishushu" }, errorCode: 0, errorMsg: "" }); }); // 收藏列表API - https://www.wanandroid.com/lg/collect/list/0/json app.get('/api/collect/list/json', (req, res) => { // 检查是否登录 const authHeader = req.headers.authorization; if (!authHeader) { res.json({ errorCode: -1001, errorMsg: "请先登录!", data: null }); return; } // 模拟收藏数据 res.json({ data: { curPage: 0, datas: [ { author: "Material Design", chapterId: 1, chapterName: "前端开发", collect: true, courseId: 13, desc: "", envelopePic: "", fresh: false, id: 1, link: "https://www.wanandroid.com", niceDate: "刚刚", origin: "", originId: -1, publishTime: Date.now(), title: "玩Android Material Design客户端发布", userId: 12345, visible: 1, zan: 42 }, { author: "Uniapp团队", chapterId: 2, chapterName: "Uniapp", collect: true, courseId: 13, desc: "", envelopePic: "", fresh: false, id: 2, link: "https://uniapp.dcloud.io", niceDate: "1小时前", origin: "", originId: -1, publishTime: Date.now() - 3600000, title: "Uniapp框架Material Design实践指南", userId: 12345, visible: 1, zan: 28 } ], offset: 0, over: true, pageCount: 1, size: 20, total: 2 }, errorCode: 0, errorMsg: "" }); }); // 分享列表API - https://www.wanandroid.com/user/2/share_articles/1/json app.get('/api/share/list/json', (req, res) => { // 检查是否登录 const authHeader = req.headers.authorization; if (!authHeader) { res.json({ errorCode: -1001, errorMsg: "请先登录!", data: null }); return; } // 模拟分享数据 res.json({ data: { curPage: 0, datas: [ { author: "蔡叔叔", chapterId: 3, chapterName: "Android开发", collect: false, courseId: 13, desc: "分享一篇关于Material Design的文章", envelopePic: "", fresh: false, id: 101, link: "https://www.wanandroid.com", niceDate: "1天前", origin: "", originId: -1, publishTime: Date.now() - 86400000, title: "Material Design在Android应用中的实践", userId: 12345, visible: 1, zan: 15 }, { author: "蔡叔叔", chapterId: 4, chapterName: "Uniapp", collect: false, courseId: 13, desc: "分享Uniapp开发经验", envelopePic: "", fresh: false, id: 102, link: "https://uniapp.dcloud.io", niceDate: "2天前", origin: "", originId: -1, publishTime: Date.now() - 172800000, title: "使用Uniapp开发跨平台应用的经验分享", userId: 12345, visible: 1, zan: 8 } ], offset: 0, over: true, pageCount: 1, size: 20, total: 2 }, errorCode: 0, errorMsg: "" }); }); // 登录API app.post('/api/user/login/json', (req, res) => { const { username, password } = req.body; if (!username || !password) { res.json({ errorCode: -1, errorMsg: "用户名或密码不能为空", data: null }); return; } // 模拟登录成功 res.json({ data: { admin: false, chapterTops: [], coinCount: 128, collectIds: [], email: username + "@example.com", icon: "", id: 12345, nickname: username, password: "", publicName: username, token: "mock_token_" + Date.now(), type: 0, username: username }, errorCode: 0, errorMsg: "" }); }); // 退出登录API - https://www.wanandroid.com/user/logout/json app.get('/api/user/logout/json', (req, res) => { res.json({ data: null, errorCode: 0, errorMsg: "" }); }); // 健康检查 app.get('/health', (req, res) => { res.json({ status: 'healthy', timestamp: new Date().toISOString(), service: 'wanandroid-material-server', version: '1.0.0', uptime: process.uptime() }); }); // 404处理 app.use((req, res) => { res.status(404).send(` 404 - 页面未找到
🔍
404 - 页面未找到
请求的页面不存在
${req.originalUrl}
返回首页
`); }); // 启动服务器 app.listen(PORT, HOST, () => { console.log(` ============================================== 玩Android Material Design开发服务器 ============================================== ✅ 服务器启动成功! 📱 本地访问: http://localhost:${PORT} http://127.0.0.1:${PORT} 🌐 公网访问: http://129.211.173.87:${PORT} 📁 项目信息: 项目路径: /home/ubuntu/wanandroid/uniapp_android 服务器IP: ${HOST} 服务端口: ${PORT} Node版本: ${process.version} 🚀 可用路由: / - 首页预览 /index_correct.html - 正确首页(文章列表) /projects.html - 项目页面 /profile.html - 我的页面 /material_preview.html - Material Design预览 /api/banner/json - Banner数据API /api/hotkey/json - 搜索热词API /api/article/list/:page/json - 文章列表API /api/project/tree/json - 项目分类API /api/project/list/:page/json - 项目列表API /api/tree/json - 体系分类API /api/user/info/json - 用户信息API /api/coin/userinfo/json - 用户积分API /api/collect/list/json - 收藏列表API /api/share/list/json - 分享列表API /health - 健康检查 ⏰ 启动时间: ${new Date().toLocaleString()} ============================================== `); // 打印网络信息 const os = require('os'); const networkInterfaces = os.networkInterfaces(); console.log('📡 网络接口信息:'); Object.keys(networkInterfaces).forEach(interfaceName => { networkInterfaces[interfaceName].forEach(interface => { if (interface.family === 'IPv4' && !interface.internal) { console.log(` ${interfaceName}: ${interface.address}`); } }); }); console.log('==============================================\n'); }); // 优雅关闭 process.on('SIGINT', () => { console.log('\n🛑 收到关闭信号,正在停止服务器...'); process.exit(0); }); process.on('SIGTERM', () => { console.log('\n🛑 收到终止信号,正在停止服务器...'); process.exit(0); });