From 47306782a8d0c7071002ae7537cec4d1c0008f49 Mon Sep 17 00:00:00 2001 From: Kubbo <390378816@qq.com> Date: Sat, 19 Apr 2025 19:31:33 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=92=8C=E5=90=8E=E7=AB=AF=E9=A1=B9=E7=9B=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建前端项目结构,包括 Vue 3、Uni-app 等相关配置 - 添加后端项目结构,使用 Express 和 TypeORM 连接数据库 - 实现基本的体重记录 CRUD 功能 - 配置项目相关文件,如 .gitignore、.npmrc 等 --- frontend/.gitignore | 21 ++++++++ frontend/.npmrc | 1 + frontend/index.html | 20 ++++++++ frontend/package.json | 67 +++++++++++++++++++++++++ frontend/shims-uni.d.ts | 10 ++++ frontend/src/App.vue | 17 +++++++ frontend/src/main.js | 10 ++++ frontend/src/manifest.json | 72 +++++++++++++++++++++++++++ frontend/src/pages.json | 16 ++++++ frontend/src/pages/index/index.vue | 48 ++++++++++++++++++ frontend/src/shime-uni.d.ts | 6 +++ frontend/src/static/logo.png | Bin 0 -> 4023 bytes frontend/src/uni.scss | 76 +++++++++++++++++++++++++++++ frontend/vite.config.js | 8 +++ server/app.js | 51 +++++++++++++++++++ server/entity/WeightRecord.js | 27 ++++++++++ server/ormconfig.json | 18 +++++++ server/package.json | 15 ++++++ 18 files changed, 483 insertions(+) create mode 100644 frontend/.gitignore create mode 100644 frontend/.npmrc create mode 100644 frontend/index.html create mode 100644 frontend/package.json create mode 100644 frontend/shims-uni.d.ts create mode 100644 frontend/src/App.vue create mode 100644 frontend/src/main.js create mode 100644 frontend/src/manifest.json create mode 100644 frontend/src/pages.json create mode 100644 frontend/src/pages/index/index.vue create mode 100644 frontend/src/shime-uni.d.ts create mode 100644 frontend/src/static/logo.png create mode 100644 frontend/src/uni.scss create mode 100644 frontend/vite.config.js create mode 100644 server/app.js create mode 100644 server/entity/WeightRecord.js create mode 100644 server/ormconfig.json create mode 100644 server/package.json diff --git a/frontend/.gitignore b/frontend/.gitignore new file mode 100644 index 0000000..7ce6e50 --- /dev/null +++ b/frontend/.gitignore @@ -0,0 +1,21 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +.DS_Store +dist +*.local + +# Editor directories and files +.idea +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? \ No newline at end of file diff --git a/frontend/.npmrc b/frontend/.npmrc new file mode 100644 index 0000000..90d4528 --- /dev/null +++ b/frontend/.npmrc @@ -0,0 +1 @@ +registry = http://registry.npmmirror.com diff --git a/frontend/index.html b/frontend/index.html new file mode 100644 index 0000000..fb81ddc --- /dev/null +++ b/frontend/index.html @@ -0,0 +1,20 @@ + + + + + + + + + + +
+ + + diff --git a/frontend/package.json b/frontend/package.json new file mode 100644 index 0000000..e6c3bd2 --- /dev/null +++ b/frontend/package.json @@ -0,0 +1,67 @@ +{ + "name": "kuafu-health-frontend", + "version": "0.0.0", + "scripts": { + "dev:custom": "uni -p", + "dev:h5": "uni", + "dev:h5:ssr": "uni --ssr", + "dev:mp-alipay": "uni -p mp-alipay", + "dev:mp-baidu": "uni -p mp-baidu", + "dev:mp-jd": "uni -p mp-jd", + "dev:mp-kuaishou": "uni -p mp-kuaishou", + "dev:mp-lark": "uni -p mp-lark", + "dev:mp-qq": "uni -p mp-qq", + "dev:mp-toutiao": "uni -p mp-toutiao", + "dev:mp-harmony": "uni -p mp-harmony", + "dev:mp-weixin": "uni -p mp-weixin", + "dev:mp-xhs": "uni -p mp-xhs", + "dev:quickapp-webview": "uni -p quickapp-webview", + "dev:quickapp-webview-huawei": "uni -p quickapp-webview-huawei", + "dev:quickapp-webview-union": "uni -p quickapp-webview-union", + "build:custom": "uni build -p", + "build:h5": "uni build", + "build:h5:ssr": "uni build --ssr", + "build:mp-alipay": "uni build -p mp-alipay", + "build:mp-baidu": "uni build -p mp-baidu", + "build:mp-jd": "uni build -p mp-jd", + "build:mp-kuaishou": "uni build -p mp-kuaishou", + "build:mp-lark": "uni build -p mp-lark", + "build:mp-qq": "uni build -p mp-qq", + "build:mp-toutiao": "uni build -p mp-toutiao", + "build:mp-harmony": "uni build -p mp-harmony", + "build:mp-weixin": "uni build -p mp-weixin", + "build:mp-xhs": "uni build -p mp-xhs", + "build:quickapp-webview": "uni build -p quickapp-webview", + "build:quickapp-webview-huawei": "uni build -p quickapp-webview-huawei", + "build:quickapp-webview-union": "uni build -p quickapp-webview-union" + }, + "dependencies": { + "@dcloudio/uni-app": "3.0.0-4050720250324001", + "@dcloudio/uni-app-harmony": "3.0.0-4050720250324001", + "@dcloudio/uni-app-plus": "3.0.0-4050720250324001", + "@dcloudio/uni-components": "3.0.0-4050720250324001", + "@dcloudio/uni-h5": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-alipay": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-baidu": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-harmony": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-jd": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-kuaishou": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-lark": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-qq": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-toutiao": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-weixin": "3.0.0-4050720250324001", + "@dcloudio/uni-mp-xhs": "3.0.0-4050720250324001", + "@dcloudio/uni-quickapp-webview": "3.0.0-4050720250324001", + "vue": "^3.4.21", + "vue-i18n": "^9.1.9" + }, + "devDependencies": { + "@dcloudio/types": "^3.4.8", + "@dcloudio/uni-automator": "3.0.0-4050720250324001", + "@dcloudio/uni-cli-shared": "3.0.0-4050720250324001", + "@dcloudio/uni-stacktracey": "3.0.0-4050720250324001", + "@dcloudio/vite-plugin-uni": "3.0.0-4050720250324001", + "@vue/runtime-core": "^3.4.21", + "vite": "5.2.8" + } +} diff --git a/frontend/shims-uni.d.ts b/frontend/shims-uni.d.ts new file mode 100644 index 0000000..ed4adcf --- /dev/null +++ b/frontend/shims-uni.d.ts @@ -0,0 +1,10 @@ +/// +import 'vue' + +declare module '@vue/runtime-core' { + type Hooks = App.AppInstance & Page.PageInstance; + + interface ComponentCustomOptions extends Hooks { + + } +} diff --git a/frontend/src/App.vue b/frontend/src/App.vue new file mode 100644 index 0000000..52dd89d --- /dev/null +++ b/frontend/src/App.vue @@ -0,0 +1,17 @@ + + + diff --git a/frontend/src/main.js b/frontend/src/main.js new file mode 100644 index 0000000..0f3a925 --- /dev/null +++ b/frontend/src/main.js @@ -0,0 +1,10 @@ +import { + createSSRApp +} from "vue"; +import App from "./App.vue"; +export function createApp() { + const app = createSSRApp(App); + return { + app, + }; +} diff --git a/frontend/src/manifest.json b/frontend/src/manifest.json new file mode 100644 index 0000000..309b9ec --- /dev/null +++ b/frontend/src/manifest.json @@ -0,0 +1,72 @@ +{ + "name" : "", + "appid" : "", + "description" : "", + "versionName" : "1.0.0", + "versionCode" : "100", + "transformPx" : false, + /* 5+App特有相关 */ + "app-plus" : { + "usingComponents" : true, + "nvueStyleCompiler" : "uni-app", + "compilerVersion" : 3, + "splashscreen" : { + "alwaysShowBeforeRender" : true, + "waiting" : true, + "autoclose" : true, + "delay" : 0 + }, + /* 模块配置 */ + "modules" : {}, + /* 应用发布信息 */ + "distribute" : { + /* android打包配置 */ + "android" : { + "permissions" : [ + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "" + ] + }, + /* ios打包配置 */ + "ios" : {}, + /* SDK配置 */ + "sdkConfigs" : {} + } + }, + /* 快应用特有相关 */ + "quickapp" : {}, + /* 小程序特有相关 */ + "mp-weixin" : { + "appid" : "", + "setting" : { + "urlCheck" : false + }, + "usingComponents" : true + }, + "mp-alipay" : { + "usingComponents" : true + }, + "mp-baidu" : { + "usingComponents" : true + }, + "mp-toutiao" : { + "usingComponents" : true + }, + "uniStatistics": { + "enable": false + }, + "vueVersion" : "3" +} diff --git a/frontend/src/pages.json b/frontend/src/pages.json new file mode 100644 index 0000000..1aea851 --- /dev/null +++ b/frontend/src/pages.json @@ -0,0 +1,16 @@ +{ + "pages": [ //pages数组中第一项表示应用启动页,参考:https://uniapp.dcloud.io/collocation/pages + { + "path": "pages/index/index", + "style": { + "navigationBarTitleText": "uni-app" + } + } + ], + "globalStyle": { + "navigationBarTextStyle": "black", + "navigationBarTitleText": "uni-app", + "navigationBarBackgroundColor": "#F8F8F8", + "backgroundColor": "#F8F8F8" + } +} diff --git a/frontend/src/pages/index/index.vue b/frontend/src/pages/index/index.vue new file mode 100644 index 0000000..6ea68cd --- /dev/null +++ b/frontend/src/pages/index/index.vue @@ -0,0 +1,48 @@ + + + + + diff --git a/frontend/src/shime-uni.d.ts b/frontend/src/shime-uni.d.ts new file mode 100644 index 0000000..b3d3cc9 --- /dev/null +++ b/frontend/src/shime-uni.d.ts @@ -0,0 +1,6 @@ +export {}; + +declare module "vue" { + type Hooks = App.AppInstance & Page.PageInstance; + interface ComponentCustomOptions extends Hooks {} +} \ No newline at end of file diff --git a/frontend/src/static/logo.png b/frontend/src/static/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..b5771e209bb677e2ebd5ff766ad5ee11790f305a GIT binary patch literal 4023 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 SYs}WS&%*SCNx89m_ { + console.log('数据库连接成功'); + + const weightRecordRepository = connection.getRepository('WeightRecord'); + + // 添加体重记录 + app.post('/api/weight', async (req, res) => { + try { + const { date, weight, unit } = req.body; + const weightRecord = weightRecordRepository.create({ date, weight, unit }); + await weightRecordRepository.save(weightRecord); + res.status(200).send('体重记录成功'); + } catch (error) { + console.error('保存体重记录失败:', error); + res.status(500).send('保存体重记录失败'); + } + }); + + // 获取所有体重记录 + app.get('/api/weight', async (req, res) => { + try { + const weightRecords = await weightRecordRepository.find({ + order: { + date: 'DESC' + } + }); + res.status(200).json(weightRecords); + } catch (error) { + console.error('获取体重记录失败:', error); + res.status(500).send('获取体重记录失败'); + } + }); + + app.listen(port, () => { + console.log(`后端服务运行在 http://localhost:${port}`); + }); +}).catch(error => { + console.error('数据库连接失败:', error); +}); diff --git a/server/entity/WeightRecord.js b/server/entity/WeightRecord.js new file mode 100644 index 0000000..69684ad --- /dev/null +++ b/server/entity/WeightRecord.js @@ -0,0 +1,27 @@ +const EntitySchema = require("typeorm").EntitySchema; + +module.exports = new EntitySchema({ + name: "WeightRecord", + tableName: "weight_records", + columns: { + id: { + primary: true, + type: "int", + generated: true + }, + date: { + type: "date" + }, + weight: { + type: "float" + }, + unit: { + type: "varchar", + length: 10 + }, + createdAt: { + type: "timestamp", + createDate: true + } + } +}); diff --git a/server/ormconfig.json b/server/ormconfig.json new file mode 100644 index 0000000..afed63d --- /dev/null +++ b/server/ormconfig.json @@ -0,0 +1,18 @@ +{ + "type": "mysql", + "host": "192.168.25.110", + "port": 3306, + "username": "root", + "password": "mysql_Adkijc", + "database": "kuafu_health", + "synchronize": true, + "logging": false, + "entities": ["entity/**/*.js"], + "migrations": ["migration/**/*.js"], + "subscribers": ["subscriber/**/*.js"], + "cli": { + "entitiesDir": "entity", + "migrationsDir": "migration", + "subscribersDir": "subscriber" + } +} diff --git a/server/package.json b/server/package.json new file mode 100644 index 0000000..959d739 --- /dev/null +++ b/server/package.json @@ -0,0 +1,15 @@ +{ + "name": "kuafu-health-backend", + "version": "1.0.0", + "main": "app.js", + "scripts": { + "start": "node app.js" + }, + "dependencies": { + "express": "^4.17.1", + "body-parser": "^1.19.0", + "mysql2": "^2.3.3", + "reflect-metadata": "^0.1.13", + "typeorm": "^0.2.45" + } +}