feat: zeng增加删除记录功能

This commit is contained in:
2026-09-06 19:37:40 +08:00
parent 423e8a3a2f
commit 6d60784deb
4 changed files with 61 additions and 25 deletions

View File

@@ -27,7 +27,6 @@
<wd-upload v-model:file-list="recordStore.imageFileList" accept="image" multiple <wd-upload v-model:file-list="recordStore.imageFileList" accept="image" multiple
:limit="9" image-mode="aspectFill" :limit="9" image-mode="aspectFill"
:action="action" :success-status="[200, 201]" :action="action" :success-status="[200, 201]"
:before-choose="beforeImageChoose"
:before-upload="beforeImageUpload" :before-upload="beforeImageUpload"
:before-remove="beforeImageRemove" :before-remove="beforeImageRemove"
@success="handleImageSuccess" @success="handleImageSuccess"
@@ -38,7 +37,6 @@
<wd-upload v-model:file-list="recordStore.videoFileList" accept="video" multiple <wd-upload v-model:file-list="recordStore.videoFileList" accept="video" multiple
:limit="3" :limit="3"
:action="action" :success-status="[200, 201]" :action="action" :success-status="[200, 201]"
:before-choose="beforeVideoChoose"
:before-upload="beforeVideoUpload" :before-upload="beforeVideoUpload"
:before-remove="beforeVideoRemove" :before-remove="beforeVideoRemove"
@success="handleVideoSuccess"></wd-upload> @success="handleVideoSuccess"></wd-upload>
@@ -49,6 +47,9 @@
<wd-button type="info" @click="cancelClick"> <wd-button type="info" @click="cancelClick">
取消 取消
</wd-button> </wd-button>
<wd-button v-if="recordStore.recordApiType === 'UPDATE'" type="danger" @click="deleteClick">
删除
</wd-button>
<wd-button type="primary" @click="confirmClick"> <wd-button type="primary" @click="confirmClick">
保存 保存
</wd-button> </wd-button>
@@ -58,16 +59,16 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { ref } from 'vue' import { ref, computed } from 'vue'
import { useAppStore } from "@/store/app"; import { useAppStore } from "@/store/app";
import { useRecordStore } from "@/store/record"; import { useRecordStore } from "@/store/record";
import type { UploadFile, UploadBeforeUploadOption, UploadSuccessEvent, UploadRemoveEvent } from '@wot-ui/ui/components/wd-upload/types' import type { UploadBeforeUploadOption, UploadSuccessEvent, UploadRemoveEvent } from '@wot-ui/ui/components/wd-upload/types'
import { generateUniqueId } from "@/utils"; import { generateUniqueId } from "@/utils";
const appStore = useAppStore() const appStore = useAppStore()
const recordStore = useRecordStore() const recordStore = useRecordStore()
const action = ref<string>('') const action = ref(`${appStore.baseUrl}/family-api/file/upload`)
function handeClosePopup() { function handeClosePopup() {
setTimeout(() => { setTimeout(() => {
@@ -75,11 +76,6 @@ function handeClosePopup() {
}, 300) }, 300)
} }
function beforeImageChoose() {
action.value = `${appStore.baseUrl}/family-api/file/upload?md5=${generateUniqueId()}`
return true
}
function beforeImageUpload(options: UploadBeforeUploadOption) { function beforeImageUpload(options: UploadBeforeUploadOption) {
const file = options.files[0] const file = options.files[0]
const maxSize = 10 * 1024 * 1024 const maxSize = 10 * 1024 * 1024
@@ -125,11 +121,11 @@ function beforeVideoChoose() {
function beforeVideoUpload(options: UploadBeforeUploadOption) { function beforeVideoUpload(options: UploadBeforeUploadOption) {
const file = options.files[0] const file = options.files[0]
const maxSize = 200 * 1024 * 1024 const maxSize = 500 * 1024 * 1024
if (file.size > maxSize) { if (file.size > maxSize) {
uni.showToast({ uni.showToast({
title: '文件大小不能超过 200MB', title: '文件大小不能超过 500MB',
icon: 'none', icon: 'none',
duration: 2500 duration: 2500
}) })
@@ -160,6 +156,21 @@ function cancelClick() {
handeClosePopup() handeClosePopup()
} }
function deleteClick() {
wx.showModal({
title: '提示',
content: '确定删除这条记录吗?',
async success(res) {
if (res.confirm) {
recordStore.recordApiType = 'DELETE'
await recordStore.handleRecordApi()
recordStore.showRecordPopup = false
handeClosePopup()
}
},
})
}
async function confirmClick() { async function confirmClick() {
if (recordStore.recordForm.content) { if (recordStore.recordForm.content) {
await recordStore.handleRecordApi() await recordStore.handleRecordApi()

View File

@@ -17,7 +17,6 @@
<wd-upload v-model:file-list="userStore.imageFileList" accept="image" <wd-upload v-model:file-list="userStore.imageFileList" accept="image"
:limit="1" image-mode="aspectFill" :limit="1" image-mode="aspectFill"
:action="action" :success-status="[200, 201]" :action="action" :success-status="[200, 201]"
:before-choose="beforeImageChoose"
:before-upload="beforeImageUpload" :before-upload="beforeImageUpload"
:before-remove="beforeImageRemove" :before-remove="beforeImageRemove"
@success="handleImageSuccess" @success="handleImageSuccess"
@@ -40,7 +39,6 @@
<script lang="ts" setup> <script lang="ts" setup>
import { useUserStore } from '@/store/user' import { useUserStore } from '@/store/user'
import { useAppStore } from "@/store/app"; import { useAppStore } from "@/store/app";
import { generateUniqueId } from "@/utils";
import type { import type {
UploadBeforeUploadOption, UploadBeforeUploadOption,
UploadRemoveEvent, UploadRemoveEvent,
@@ -51,12 +49,7 @@ import { ref } from "vue";
const userStore = useUserStore() const userStore = useUserStore()
const appStore = useAppStore() const appStore = useAppStore()
const action = ref<string>('') const action = ref(`${appStore.baseUrl}/family-api/file/upload`)
function beforeImageChoose() {
action.value = `${appStore.baseUrl}/family-api/file/upload?md5=${generateUniqueId()}`
return true
}
function beforeImageUpload(options: UploadBeforeUploadOption) { function beforeImageUpload(options: UploadBeforeUploadOption) {
const file = options.files[0] const file = options.files[0]

View File

@@ -7,6 +7,10 @@
<text class="truncate text-lg text-white font-semibold">{{ greeting }}</text> <text class="truncate text-lg text-white font-semibold">{{ greeting }}</text>
<text class="mt-0.5 text-xs text-white/70">{{ today }} · 记录每一个瞬间</text> <text class="mt-0.5 text-xs text-white/70">{{ today }} · 记录每一个瞬间</text>
</view> </view>
<wd-button type="info" size="mini" @click="recordStore.refreshRecord()">
刷新
</wd-button>
</view> </view>
<wd-card v-for="item in recordStore.recordList" :key="item.id"> <wd-card v-for="item in recordStore.recordList" :key="item.id">
@@ -22,14 +26,16 @@
<view class="px-3 pt-2 pb-3"> <view class="px-3 pt-2 pb-3">
<wd-text type="primary" :text="item.content"/> <wd-text type="primary" :text="item.content"/>
<view v-if="item.image_list.length" class="grid grid-cols-3 gap-2 mt-2"> <view v-if="item.image_list.length" :class="`grid gap-2 mt-2 ${gridCols(item.image_list.length)}`">
<view <view
v-for="(url, i) in item.image_list.slice(0, 9)" v-for="(url, i) in item.image_list"
:key="i" :key="i"
class="relative w-full overflow-hidden rounded-lg aspect-square" class="relative w-full overflow-hidden rounded-lg aspect-square"
@click="previewImages(item.image_list, i)" @click="previewImages(item.image_list, i)"
> >
<wd-img :src="`${appStore.baseUrl}/${url}`" width="100%" height="100%" radius="8" /> <wd-img :src="`${appStore.baseUrl}/${url}`"
width="100%" height="100%"
mode="aspectFit" lazy-load :radius="8"/>
</view> </view>
</view> </view>
@@ -41,7 +47,7 @@
@click="playVideo(url)" @click="playVideo(url)"
> >
<view class="w-full h-[360rpx] flex items-center justify-center"> <view class="w-full h-[360rpx] flex items-center justify-center">
<wd-icon name="play-circle-filled" size="40px" color="#fff" /> <wd-icon name="play-circle-fill" size="40px" color="#fff" />
</view> </view>
</view> </view>
</view> </view>
@@ -144,6 +150,13 @@ function toggleLike(item: IRecord) {
} }
function gridCols(count: number): string {
if (count === 1) return 'grid-cols-1'
if (count === 2) return 'grid-cols-2'
if (count === 4) return 'grid-cols-2'
return 'grid-cols-3'
}
function previewImages(urls: string[], index: number) { function previewImages(urls: string[], index: number) {
const fullUrls = urls.map(url => `${appStore.baseUrl}/${url}`) const fullUrls = urls.map(url => `${appStore.baseUrl}/${url}`)
uni.previewImage({ urls: fullUrls, current: fullUrls[index] }) uni.previewImage({ urls: fullUrls, current: fullUrls[index] })

View File

@@ -14,7 +14,7 @@ export const useRecordStore = defineStore('record', {
} as IRecordForm, } as IRecordForm,
currentRecordId: 0, currentRecordId: 0,
showRecordPopup: false, showRecordPopup: false,
recordApiType: 'ADD' as 'ADD' | 'UPDATE', recordApiType: 'ADD' as 'ADD' | 'UPDATE' | 'DELETE',
imageFileList: [] as UploadFile[], imageFileList: [] as UploadFile[],
videoFileList: [] as UploadFile[], videoFileList: [] as UploadFile[],
}), }),
@@ -24,6 +24,8 @@ export const useRecordStore = defineStore('record', {
await this.addRecordApi() await this.addRecordApi()
} else if (this.recordApiType === 'UPDATE') { } else if (this.recordApiType === 'UPDATE') {
await this.updateRecordApi() await this.updateRecordApi()
} else if (this.recordApiType === 'DELETE') {
await this.deleteRecordApi()
} }
await this.refreshRecord() await this.refreshRecord()
@@ -95,6 +97,23 @@ export const useRecordStore = defineStore('record', {
fail: (err) => reject(err), fail: (err) => reject(err),
}) })
}) })
},
async deleteRecordApi() {
return new Promise((resolve, reject) => {
wx.request({
url: `${this.baseUrl}/family-api/records/${this.currentRecordId}`,
method: 'DELETE',
header: { 'Content-Type': 'application/json' },
success: (res) => {
if (res.statusCode >= 200 && res.statusCode < 300) {
resolve(res.data)
} else {
reject({ status: res.statusCode, data: res.data })
}
},
fail: (err) => reject(err),
})
})
} }
}, },
}) })