commit 47306782a8d0c7071002ae7537cec4d1c0008f49 Author: Kubbo <390378816@qq.com> Date: Sat Apr 19 19:31:33 2025 +0800 feat: 初始化前端和后端项目 - 创建前端项目结构,包括 Vue 3、Uni-app 等相关配置 - 添加后端项目结构,使用 Express 和 TypeORM 连接数据库 - 实现基本的体重记录 CRUD 功能 - 配置项目相关文件,如 .gitignore、.npmrc 等 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 0000000..b5771e2 Binary files /dev/null and b/frontend/src/static/logo.png differ diff --git a/frontend/src/uni.scss b/frontend/src/uni.scss new file mode 100644 index 0000000..288300d --- /dev/null +++ b/frontend/src/uni.scss @@ -0,0 +1,76 @@ +/** + * 这里是uni-app内置的常用样式变量 + * + * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量 + * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App + * + */ + +/** + * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能 + * + * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件 + */ + +/* 颜色变量 */ + +/* 行为相关颜色 */ +$uni-color-primary: #007aff; +$uni-color-success: #4cd964; +$uni-color-warning: #f0ad4e; +$uni-color-error: #dd524d; + +/* 文字基本颜色 */ +$uni-text-color: #333; // 基本色 +$uni-text-color-inverse: #fff; // 反色 +$uni-text-color-grey: #999; // 辅助灰色,如加载更多的提示信息 +$uni-text-color-placeholder: #808080; +$uni-text-color-disable: #c0c0c0; + +/* 背景颜色 */ +$uni-bg-color: #fff; +$uni-bg-color-grey: #f8f8f8; +$uni-bg-color-hover: #f1f1f1; // 点击状态颜色 +$uni-bg-color-mask: rgba(0, 0, 0, 0.4); // 遮罩颜色 + +/* 边框颜色 */ +$uni-border-color: #c8c7cc; + +/* 尺寸变量 */ + +/* 文字尺寸 */ +$uni-font-size-sm: 12px; +$uni-font-size-base: 14px; +$uni-font-size-lg: 16; + +/* 图片尺寸 */ +$uni-img-size-sm: 20px; +$uni-img-size-base: 26px; +$uni-img-size-lg: 40px; + +/* Border Radius */ +$uni-border-radius-sm: 2px; +$uni-border-radius-base: 3px; +$uni-border-radius-lg: 6px; +$uni-border-radius-circle: 50%; + +/* 水平间距 */ +$uni-spacing-row-sm: 5px; +$uni-spacing-row-base: 10px; +$uni-spacing-row-lg: 15px; + +/* 垂直间距 */ +$uni-spacing-col-sm: 4px; +$uni-spacing-col-base: 8px; +$uni-spacing-col-lg: 12px; + +/* 透明度 */ +$uni-opacity-disabled: 0.3; // 组件禁用态的透明度 + +/* 文章场景相关 */ +$uni-color-title: #2c405a; // 文章标题颜色 +$uni-font-size-title: 20px; +$uni-color-subtitle: #555; // 二级标题颜色 +$uni-font-size-subtitle: 18px; +$uni-color-paragraph: #3f536e; // 文章段落颜色 +$uni-font-size-paragraph: 15px; \ No newline at end of file diff --git a/frontend/vite.config.js b/frontend/vite.config.js new file mode 100644 index 0000000..6f7b2c3 --- /dev/null +++ b/frontend/vite.config.js @@ -0,0 +1,8 @@ +import { defineConfig } from 'vite' +import uni from '@dcloudio/vite-plugin-uni' +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + uni(), + ], +}) diff --git a/server/app.js b/server/app.js new file mode 100644 index 0000000..ef5dcd6 --- /dev/null +++ b/server/app.js @@ -0,0 +1,51 @@ +const express = require('express'); +const bodyParser = require('body-parser'); +const typeorm = require('typeorm'); +const app = express(); +const port = 3000; + +// 引入 reflect-metadata,这是 TypeORM 的依赖 +require('reflect-metadata'); + +app.use(bodyParser.json()); + +// 连接到数据库 +typeorm.createConnection().then(connection => { + 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" + } +}