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 @@
+
+
+
+
+ {{ title }}
+
+
+
+
+
+
+
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"
+ }
+}