From 4b5f8536035cc3c2406f239a3e7cadb848cb8cd3 Mon Sep 17 00:00:00 2001 From: Cxx0822 <1556464090@qq.com> Date: Mon, 20 Jul 2026 23:19:14 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E5=A2=9E=E5=8A=A0=E6=B1=BD=E8=BD=A6?= =?UTF-8?q?=E4=BA=8B=E4=BB=B6=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/apis/car.ts | 29 ++++++ src/components/Car/CarCard.vue | 108 ++++++++++++++++++++ src/components/Car/CarQuery.vue | 33 +++++++ src/layout/TabBar.vue | 6 ++ src/store/car.ts | 62 ++++++++++++ src/styles/index.module.scss | 2 +- src/types/car.ts | 16 +++ src/types/index.ts | 3 +- src/utils/element/elRules.ts | 24 +++++ src/views/car/detail[id].vue | 170 ++++++++++++++++++++++++++++++++ src/views/car/list.vue | 36 +++++++ src/views/home/index.vue | 5 + src/views/meta.ts | 16 ++- vite.config.ts | 12 +-- 14 files changed, 509 insertions(+), 13 deletions(-) create mode 100644 src/apis/car.ts create mode 100644 src/components/Car/CarCard.vue create mode 100644 src/components/Car/CarQuery.vue create mode 100644 src/store/car.ts create mode 100644 src/types/car.ts create mode 100644 src/views/car/detail[id].vue create mode 100644 src/views/car/list.vue diff --git a/src/apis/car.ts b/src/apis/car.ts new file mode 100644 index 0000000..63dfc52 --- /dev/null +++ b/src/apis/car.ts @@ -0,0 +1,29 @@ +import { cloudService } from './index' +import { ICarEvent, ICarEventQuery } from '@/types/car.ts' + +export const addCarEventApi = (carEvent: ICarEvent): Promise => + cloudService({ + url: '/home-api/car', + method: 'post', + data: carEvent + }) + +export const updateCarEventApi = (id: number, carEvent: ICarEvent): Promise => + cloudService({ + url: `/home-api/car/${id}`, + method: 'put', + data: carEvent + }) + +export const deleteCarEventApi = (id: number): Promise => + cloudService({ + url: `/home-api/car/${id}`, + method: 'delete' + }) + +export const queryCarEventListApi = (query: ICarEventQuery): Promise => + cloudService({ + url: '/home-api/car', + method: 'get', + params: query + }) diff --git a/src/components/Car/CarCard.vue b/src/components/Car/CarCard.vue new file mode 100644 index 0000000..ab9a64f --- /dev/null +++ b/src/components/Car/CarCard.vue @@ -0,0 +1,108 @@ + + + + + diff --git a/src/components/Car/CarQuery.vue b/src/components/Car/CarQuery.vue new file mode 100644 index 0000000..0f0f5c3 --- /dev/null +++ b/src/components/Car/CarQuery.vue @@ -0,0 +1,33 @@ + + + diff --git a/src/layout/TabBar.vue b/src/layout/TabBar.vue index 7565651..1109da7 100644 --- a/src/layout/TabBar.vue +++ b/src/layout/TabBar.vue @@ -98,6 +98,12 @@ 清单 + + + 清单 + + diff --git a/src/store/car.ts b/src/store/car.ts new file mode 100644 index 0000000..f6e7a8c --- /dev/null +++ b/src/store/car.ts @@ -0,0 +1,62 @@ +import { defineStore } from 'pinia' +import type { IHandleApi } from 'vue3-common/types' +import { ElMessage } from 'element-plus' +import { ImagePathEnum } from '@/types' +import { ICarEvent, ICarEventQuery } from '@/types/car.ts' +import { addCarEventApi, deleteCarEventApi, queryCarEventListApi, updateCarEventApi } from '@/apis/car.ts' + +export const useCarStore = defineStore('car', { + state: () => ({ + carEventList: [] as ICarEvent[], + queryInfo: { + type: '' + } as ICarEventQuery, + carEventApiType: 'ADD' as IHandleApi, + currentCarEvent: { + + } as ICarEvent, + carImagePath: ImagePathEnum.CAR, + isScrollEnd: false, + isRefresh: false + }), + actions: { + async queryCarEventList() { + this.carEventList = await queryCarEventListApi(this.queryInfo) + }, + async handleCarEventApi(carEvent: ICarEvent) { + switch (this.carEventApiType) { + case 'ADD': + await addCarEventApi(carEvent) + ElMessage.success('新增汽车事件成功') + break + case 'UPDATE': + await updateCarEventApi(carEvent.id as number, carEvent) + ElMessage.success('更新汽车事件成功') + break + case 'DELETE': + await deleteCarEventApi(carEvent.id as number) + ElMessage.success('删除汽车事件成功') + break + default: + break + } + }, + async refreshInfo() { + await this.queryCarEventList() + this.isRefresh = !this.isRefresh + }, + getEmptyCarEvent(): ICarEvent { + return { + cost: 0, + date: '', + description: '', + imageUrl: '', + location: '', + mileage: 0, + name: '', + remark: '', + type: '' + } + } + } +}) diff --git a/src/styles/index.module.scss b/src/styles/index.module.scss index 4bbc727..752f079 100644 --- a/src/styles/index.module.scss +++ b/src/styles/index.module.scss @@ -82,4 +82,4 @@ span, input { font-style: normal; } -@import "//at.alicdn.com/t/c/font_4793264_mkjt7tcwxmc.css"; +@import "//at.alicdn.com/t/c/font_4793264_lul7gdj5f2.css"; diff --git a/src/types/car.ts b/src/types/car.ts new file mode 100644 index 0000000..34662a5 --- /dev/null +++ b/src/types/car.ts @@ -0,0 +1,16 @@ +export interface ICarEvent { + id?: number; + name: string; + type: string; + date: string; + mileage: number; + cost: number; + location: string; + description: string; + imageUrl: string; + remark: string; +} + +export interface ICarEventQuery { + type: string; +} diff --git a/src/types/index.ts b/src/types/index.ts index 1cb3586..499be6a 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -7,7 +7,8 @@ export enum ImagePathEnum { JOURNAL = 'journal', LEDGER = 'ledger', AWARD = 'award', - USER = 'user' + USER = 'user', + CAR = 'car', } export interface IPageRecord { diff --git a/src/utils/element/elRules.ts b/src/utils/element/elRules.ts index 4c893df..3cd80c1 100644 --- a/src/utils/element/elRules.ts +++ b/src/utils/element/elRules.ts @@ -247,6 +247,30 @@ export const productRules = { ] } +export const carRules = { + name: [ + { required: true, message: '请输入汽车名称', trigger: 'blur' } + ], + type: [ + { required: true, message: '请选择事件类型', trigger: 'change' } + ], + date: [ + { required: true, message: '请选择事件日期', trigger: 'change' } + ], + mileage: [ + { required: true, message: '请输入当前里程', trigger: 'blur' } + ], + cost: [ + { required: true, message: '请输入事件费用', trigger: 'blur' } + ], + location: [ + { required: true, message: '请输入事件地点', trigger: 'blur' } + ], + description: [ + { required: true, message: '请输入事件描述', trigger: 'blur' } + ] +} + export const journalRules = { content: [ { required: true, message: '请输入内容', trigger: 'blur' } diff --git a/src/views/car/detail[id].vue b/src/views/car/detail[id].vue new file mode 100644 index 0000000..61e2fd3 --- /dev/null +++ b/src/views/car/detail[id].vue @@ -0,0 +1,170 @@ + + + diff --git a/src/views/car/list.vue b/src/views/car/list.vue new file mode 100644 index 0000000..8729a46 --- /dev/null +++ b/src/views/car/list.vue @@ -0,0 +1,36 @@ + + + diff --git a/src/views/home/index.vue b/src/views/home/index.vue index a03841a..aebeae5 100644 --- a/src/views/home/index.vue +++ b/src/views/home/index.vue @@ -30,6 +30,10 @@ title="物品记录" sub-title="收纳生活琐碎" router="/product/list"/> + + @@ -147,6 +151,7 @@ const titleClick = () => { display: grid; grid-template-columns: repeat(2, 1fr); gap: 10px; + overflow: auto; } .note-container { diff --git a/src/views/meta.ts b/src/views/meta.ts index 95d4079..c33720a 100644 --- a/src/views/meta.ts +++ b/src/views/meta.ts @@ -249,10 +249,24 @@ export const mobileHomeMeta: IRouteMetaConfig = { title: '内容', icon: '' }, + '/car': { + title: '汽车管理', + icon: 'home-car', + order: 15, + redirect: '/car/list' + }, + '/car/list': { + title: '清单', + icon: '' + }, + '/car/detail/id': { + title: '内容', + icon: '' + }, '/profile': { title: '个人信息', icon: '', - order: 15, + order: 16, hidden: true, redirect: '/profile/index' }, diff --git a/vite.config.ts b/vite.config.ts index bf57e7b..5395995 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -4,9 +4,6 @@ import path from 'path' import { createSvgIconsPlugin } from 'vite-plugin-svg-icons' import { viteMockServe } from 'vite-plugin-mock' -// const API_HOST = '192.168.1.7' -const API_HOST = '127.0.0.1' - // https://vitejs.dev/config/ export default defineConfig({ plugins: [ @@ -41,15 +38,10 @@ export default defineConfig({ // 服务器代理 服务器没有部署Nginx的情况下使用 proxy: { '/home-api': { - target: `http://${API_HOST}:8081`, + target: 'http://127.0.0.1:8081', changeOrigin: true, rewrite: (item) => item.replace(/^\/home-api/, '') }, - '/blog-api': { - target: `http://${API_HOST}:8082`, - changeOrigin: true, - rewrite: (item) => item.replace(/^\/blog-api/, '') - }, '/alist-api': { target: 'http://192.168.1.7:5244', changeOrigin: true, @@ -61,7 +53,7 @@ export default defineConfig({ rewrite: (item) => item.replace(/^\/image-api/, '') }, '/agent-api': { - target: `http://${API_HOST}:8000`, + target: 'http://127.0.0.1:8000', changeOrigin: true, rewrite: (item) => item.replace(/^\/agent-api/, '') }