From 81dbb5d80f59a434702ea9264c66a93411430325 Mon Sep 17 00:00:00 2001
From: 周宾 <2802492122@qq.com>
Date: 星期四, 25 十二月 2025 17:37:14 +0800
Subject: [PATCH] 天津双奇点-仓储物流开发

---
 src/pages/index.vue                                       |   12 
 src/pages/inventoryManagement/receiptManagement/index.vue |   21 +
 src/api/inventoryManagement/receiptManagement.js          |    9 
 src/api/inventoryManagement/stockManagement.js            |   27 ++
 src/pages.json                                            |   25 ++
 src/pages/inventoryManagement/stockManagement/edit.vue    |   99 ++++++++
 src/api/inventoryManagement/dispatchLog.js                |   28 ++
 src/config.js                                             |    2 
 src/pages/inventoryManagement/stockManagement/index.vue   |  221 ++++++++++++++++++
 src/pages/inventoryManagement/dispatchLog/index.vue       |  226 ++++++++++++++++++
 10 files changed, 667 insertions(+), 3 deletions(-)

diff --git a/src/api/inventoryManagement/dispatchLog.js b/src/api/inventoryManagement/dispatchLog.js
new file mode 100644
index 0000000..cafc422
--- /dev/null
+++ b/src/api/inventoryManagement/dispatchLog.js
@@ -0,0 +1,28 @@
+// 宸℃涓婁紶
+import request from '@/utils/request'
+
+// 閲囪喘鍑哄簱鍙拌处鍒楄〃
+export function listPage(query) {
+    return request({
+        url: '/stockmanagement/listPage',
+        method: 'get',
+        params: query
+    })
+}
+//鑷畾涔夊嚭搴撳彴璐﹀垪琛�
+export function listPageByCustom(query) {
+    return request({
+        url: '/stockmanagement/listPageByCustom',
+        method: 'get',
+        params: query
+    })
+}
+//鍒犻櫎
+export function stockmanagementDel(query) {
+  return request({
+    url: '/stockmanagement/del',
+    method: 'post',
+    data: query
+  })
+}
+
diff --git a/src/api/inventoryManagement/receiptManagement.js b/src/api/inventoryManagement/receiptManagement.js
index 3f25d66..84543ac 100644
--- a/src/api/inventoryManagement/receiptManagement.js
+++ b/src/api/inventoryManagement/receiptManagement.js
@@ -26,3 +26,12 @@
     data: query
   })
 }
+
+// 鍒犻櫎鑷畾涔夊叆搴�
+ export function deleteCustom(query) {
+  return request({
+    url: '/stockin/deleteCustom',
+    method: 'delete',
+    data: query
+  })
+}
diff --git a/src/api/inventoryManagement/stockManagement.js b/src/api/inventoryManagement/stockManagement.js
new file mode 100644
index 0000000..d4cbab0
--- /dev/null
+++ b/src/api/inventoryManagement/stockManagement.js
@@ -0,0 +1,27 @@
+// 宸℃涓婁紶
+import request from '@/utils/request'
+
+// 閲囪喘鍏ュ簱鍒楄〃
+export function listPage(query) {
+    return request({
+        url: '/stockin/listPageCopy',
+        method: 'get',
+        params: query
+    })
+}
+//鑷畾涔夊叆搴撳垪琛�
+export function listPageByCustom(query) {
+    return request({
+        url: '/stockin/listPageCopyByCustom',
+        method: 'get',
+        params: query
+    })
+}
+//淇敼鑷畾涔夊叆搴撳簱瀛�
+export function updateManagementByCustom(query) {
+  return request({
+    url: '/stockin/updateManagementByCustom',
+    method: 'post',
+    data: query
+  })
+}
diff --git a/src/config.js b/src/config.js
index a7d2575..8374896 100644
--- a/src/config.js
+++ b/src/config.js
@@ -2,7 +2,7 @@
 const config = {
   //  baseUrl: 'https://vue.ruoyi.vip/prod-api',
   // baseUrl: 'http://localhost/prod-api',
-	baseUrl: 'http://192.168.1.211:8888', // 澶╂触鍙屽鐐�
+	baseUrl: 'http://192.168.1.147:7003', // 澶╂触鍙屽鐐�
   // baseUrl: 'http://114.132.189.42:9066', // 瀹佸娑︽嘲
   // baseUrl: 'http://114.132.189.42:9068', // 鏂扮枂娴峰窛寮�蹇�
   // baseUrl: 'http://192.168.1.147:9036',
diff --git a/src/pages.json b/src/pages.json
index f6fb3eb..2d2d953 100644
--- a/src/pages.json
+++ b/src/pages.json
@@ -645,6 +645,31 @@
 						"navigationBarTitleText": "鑷畾涔夊嚭搴�",
             "navigationStyle": "custom"
 					}
+				},
+        {
+					"path": "dispatchLog/index",
+					"style": {
+						"navigationBarTitleText": "鍑哄簱鍙拌处",
+            "navigationStyle": "custom",
+            "enablePullDownRefresh": true,
+            "backgroundColor": "#f8f8f8"
+					}
+				},
+        {
+					"path": "stockManagement/index",
+					"style": {
+						"navigationBarTitleText": "搴撳瓨绠$悊",
+            "navigationStyle": "custom",
+            "enablePullDownRefresh": true,
+            "backgroundColor": "#f8f8f8"
+					}
+				},
+        {
+					"path": "stockManagement/edit",
+					"style": {
+						"navigationBarTitleText": "淇敼搴撳瓨",
+            "navigationStyle": "custom"
+					}
 				}
 			]
 		}
diff --git a/src/pages/index.vue b/src/pages/index.vue
index 7964b47..47eee18 100644
--- a/src/pages/index.vue
+++ b/src/pages/index.vue
@@ -11,7 +11,7 @@
 		<view class="hero-section">
 			<view class="bg-img">
 				<view class="hero-content">
-					<text class="hero-title">娑︽嘲鐢熺墿绉戞妧</text>
+					<text class="hero-title">鍙屽鐐�</text>
 				</view>
 				<view class="hero-wave"></view>
 			</view>
@@ -548,6 +548,16 @@
 				url: '/pages/inventoryManagement/issueManagement/index'
 			});
 			break
+		case '鍑哄簱鍙拌处':
+			uni.navigateTo({
+				url: '/pages/inventoryManagement/dispatchLog/index'
+			});
+			break
+		case '搴撳瓨绠$悊':
+			uni.navigateTo({
+				url: '/pages/inventoryManagement/stockManagement/index'
+			});
+			break
 		default:
 			uni.showToast({
 				title: `鐐瑰嚮浜�${item.label}`,
diff --git a/src/pages/inventoryManagement/dispatchLog/index.vue b/src/pages/inventoryManagement/dispatchLog/index.vue
new file mode 100644
index 0000000..3213394
--- /dev/null
+++ b/src/pages/inventoryManagement/dispatchLog/index.vue
@@ -0,0 +1,226 @@
+<template>
+	<view>
+		<PageHeader title="鍑哄簱鍙拌处" @back="goBack" />
+		<view class="tabs">
+			<uni-segmented-control :current="tabCurrent" :values="tabItems" @clickItem="switchTab" />
+		</view>
+		<!-- <button class="mini-btn" type="primary" size="mini" style="margin-left: 0;margin-right: 0;" @click="openForm({},'add')">鏂板鍏ュ簱</button> -->
+		<view v-if="contentList?.length !== 0" class="content">
+			<view v-if="tabCurrent === 0">
+				<block v-for="item in contentList" :key="item.id">
+					<view class="item-box item-box0"></view>
+				</block>
+				<uni-load-more :status="loadMoreStatus"></uni-load-more>
+			</view>
+			<view v-if="tabCurrent === 1">
+				<block v-for="item in contentList" :key="item.id">
+					<view class="item-box item-box1">
+						<view class="item">
+							<view class="label">浜у搧鍥剧墖</view>
+							<view class="value">
+								<image class="img" :src="baseUrl + item.url" mode="aspectFill鈥�" lazy-load></image>
+							</view>
+						</view>
+						<view class="item">
+							<view class="label">鍑哄簱鏃ユ湡</view>
+							<view class="value">{{ item.createTime }}</view>
+						</view>
+						<view class="item">
+							<view class="label">浜у搧鍚嶇О</view>
+							<view class="value">{{ item.productCategory }}</view>
+						</view>
+						<view class="item">
+							<view class="label">浜у搧楂樺害</view>
+							<view class="value">{{ item.specificationModel }}{{ item.unit }}</view>
+						</view>
+						<view class="item">
+							<view class="label">鍑哄簱鏁伴噺/浠�</view>
+							<view class="value">{{ item.inboundNum }}</view>
+						</view>
+						<view class="item">
+							<view class="label">姣忎欢鏁伴噺/鏀�</view>
+							<view class="value">{{ item.boxNum }}</view>
+						</view>
+						<view class="item">
+							<view class="label">鍗曚环锛堝厓锛�/鏀�</view>
+							<view class="value">{{ item.taxInclusiveUnitPrice }}</view>
+						</view>
+						<view class="item">
+							<view class="label">绾哥瑙勬牸</view>
+							<view class="value">{{ item.cartonSpecifications }}cm</view>
+						</view>
+						<view class="item">
+							<view class="label">鍑哄簱浜�</view>
+							<view class="value">{{ item.createBy }}</view>
+						</view>
+						<view class="item" style="justify-content: flex-end;">
+							<button class="mini-btn" type="warn" size="mini" style="margin-left: 0;margin-right: 0;" @click="deleteGoods(item)">鍒犻櫎</button>
+						</view>
+					</view>
+				</block>
+				<uni-load-more :status="loadMoreStatus"></uni-load-more>
+			</view>
+		</view>
+		<view v-if="contentList?.length === 0" class="no-data">
+			<text>鏆傛棤鏁版嵁</text>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref, reactive, computed } from 'vue'
+import { listPage, listPageByCustom,stockmanagementDel } from '@/api/inventoryManagement/dispatchLog.js'
+import { onShow, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'
+import config from '@/config'
+const baseUrl = config.baseUrl
+// tab鐩稿叧
+const tabItems = reactive(['閲囪喘鍑哄簱', '鎴愬搧鍑哄簱'])
+const tabCurrent = ref(0)
+
+const switchTab = (e) => {
+	if (tabCurrent.value !== e.currentIndex) {
+		tabCurrent.value = e.currentIndex
+	}
+	reloadPage()
+}
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+	uni.navigateBack()
+}
+
+// 鍒嗛〉鐩稿叧
+const pageParams = reactive({
+	size: 10,
+	current: 1
+})
+const totalSize = ref(0)
+const noMore = computed(() => {
+	return contentList.value.length >= totalSize.value
+})
+const loading = ref(false)
+const contentList = ref([])
+const loadMoreStatus = computed(() => {
+	if (loading.value) {
+		return 'loading'
+	}
+	if (noMore.value) {
+		return 'noMore'
+	}
+	return 'more'
+})
+const loadPage = () => {
+	if (noMore.value || loading.value) {
+		return
+	}
+	pageParams.current += 1
+	getList()
+}
+const reloadPage = () => {
+	pageParams.current = 1
+	contentList.value = []
+	getList()
+}
+const deleteGoods = async (goods) => { 
+	uni.showModal({
+		title: '鎻愮ず',
+		content: '纭畾瑕佸垹闄よ鍟嗗搧鐨勫嚭搴撳彴璐﹀悧锛�',
+		success: function (res) {
+			if (res.confirm) {
+				uni.showLoading({
+					title: '鍒犻櫎涓�...'
+				})
+				let params = [goods.id]
+				stockmanagementDel(params).then(res => {
+					uni.hideLoading()
+					reloadPage()
+				})
+			}
+		}
+	})
+}
+const getList = async () => {
+	let getListApi = null
+	if (tabCurrent.value == 1) {
+		getListApi = listPageByCustom
+	} else if (tabCurrent.value == 0) {
+		getListApi = listPage
+	}
+	loading.value = true
+	let resp = await getListApi(pageParams)
+	loading.value = false
+	if (resp.code != 200 || !resp.data) {
+		contentList.value = []
+		totalSize.value = 0
+		return
+	}
+	contentList.value = [...contentList.value, ...resp.data.records]
+	console.log(resp.data.records)
+	totalSize.value = resp.data.total
+}
+
+onReachBottom(() => {
+	loadPage()
+})
+onPullDownRefresh(() => {
+	reloadPage()
+	uni.stopPullDownRefresh()
+})
+onShow(() => {
+	reloadPage()
+})
+
+</script>
+
+<style lang='scss' scoped>
+.tabs {
+	box-sizing: border-box;
+	padding: 20rpx 40rpx;
+}
+
+.no-data {
+	text-align: center;
+	padding: 40px 20px;
+	color: #999;
+	font-size: 14px;
+}
+.item-box{
+	box-sizing: border-box;
+	margin: 20rpx;
+	padding: 20rpx;
+	border-radius: 10rpx;
+	background-color: #f5f5f5;
+}
+
+.item {
+	display: flex;
+	justify-content: space-between;
+	margin: 10rpx 0;
+
+	.label {}
+
+	.value {
+		.img {
+			width: 200rpx;
+			height: 200rpx;
+			background-color: #999;
+			border-radius: 10rpx;
+		}
+	}
+}
+// 娴姩鎸夐挳鏍峰紡
+.fab-button {
+	position: fixed;
+	bottom: calc(30px + env(safe-area-inset-bottom));
+	right: 30px;
+	width: 56px;
+	height: 56px;
+	background: #2979ff;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 4px 16px rgba(41, 121, 255, 0.3);
+	z-index: 1000;
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/inventoryManagement/receiptManagement/index.vue b/src/pages/inventoryManagement/receiptManagement/index.vue
index 369b1f4..81a3a2c 100644
--- a/src/pages/inventoryManagement/receiptManagement/index.vue
+++ b/src/pages/inventoryManagement/receiptManagement/index.vue
@@ -54,6 +54,7 @@
 							<view class="value">{{ item.createBy }}</view>
 						</view>
 						<view class="item" style="justify-content: flex-end;">
+							<button class="mini-btn" type="warn" size="mini" style="margin-left: 0;margin-right: 20rpx;" @click="deleteGoods(item)">鍒犻櫎</button>
 							<button class="mini-btn" type="primary" size="mini" style="margin-left: 0;margin-right: 0;" @click="openForm(item,'edit')">缂栬緫</button>
 						</view>
 					</view>
@@ -72,7 +73,7 @@
 
 <script setup>
 import { ref, reactive, computed } from 'vue'
-import { listPage, listPageByCustom } from '@/api/inventoryManagement/receiptManagement.js'
+import { listPage, listPageByCustom,deleteCustom } from '@/api/inventoryManagement/receiptManagement.js'
 import { onShow, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'
 import config from '@/config'
 const baseUrl = config.baseUrl
@@ -131,6 +132,24 @@
 	contentList.value = []
 	getList()
 }
+const deleteGoods = async (goods) => { 
+	uni.showModal({
+		title: '鎻愮ず',
+		content: '纭畾瑕佸垹闄よ鍟嗗搧鐨勫叆搴撳悧锛�',
+		success: function (res) {
+			if (res.confirm) {
+				uni.showLoading({
+					title: '鍒犻櫎涓�...'
+				})
+				let params = [goods.id]
+				deleteCustom(params).then(res => {
+					uni.hideLoading()
+					reloadPage()
+				})
+			}
+		}
+	})
+}
 const getList = async () => {
 	let getListApi = null
 	if (tabCurrent.value == 1) {
diff --git a/src/pages/inventoryManagement/stockManagement/edit.vue b/src/pages/inventoryManagement/stockManagement/edit.vue
new file mode 100644
index 0000000..d51108b
--- /dev/null
+++ b/src/pages/inventoryManagement/stockManagement/edit.vue
@@ -0,0 +1,99 @@
+<template>
+    <PageHeader :title="pageTitle" @back="goBack" />
+    <view class="account-detail">
+        <view class="box">
+            <view class="form-box">
+                <uni-forms :key="index" label-position="top" label-width="400rpx">
+
+                    <uni-forms-item label="鍚嶇О" required>
+                        <uni-easyinput v-model="goods.productCategory" placeholder="" disabled />
+                    </uni-forms-item>
+                    <uni-forms-item label="搴撳瓨鏁伴噺/浠�" required>
+                        <uni-number-box v-model="goods.inboundNum" :min="0"></uni-number-box>
+                    </uni-forms-item>
+                    <uni-forms-item label="鍏ュ簱鏃ユ湡" required>
+                        <uni-datetime-picker type="date" :clear-icon="false" v-model="goods.createTime" />
+                    </uni-forms-item>
+                </uni-forms>
+            </view>
+            <view style="display: flex;justify-content: flex-end;">
+                <button class="mini-btn" type="primary" size="mini"
+                    style="margin-left: 0;margin-right: 0;margin-right: 20rpx;" @click="submitForm">纭畾</button>
+                <button class="mini-btn" size="mini" style="margin-left: 0;margin-right: 0;" @click="goBack">鍙栨秷</button>
+            </view>
+        </view>
+    </view>
+</template>
+
+<script setup>
+import { onMounted, ref } from 'vue'
+import { updateManagementByCustom } from '@/api/inventoryManagement/stockManagement.js'
+import { userListNoPageByTenantId } from "@/api/system/user"
+const pageTitle = ref('棰嗙敤浜у搧')
+const userList = ref([])
+const goods = ref({
+    id: 0,
+    inboundNum: 0,
+    createTime: "",
+})
+const props = defineProps(['goods'])
+
+const goBack = () => {
+    uni.navigateBack()
+}
+const submitForm = async () => {
+    let res = await updateManagementByCustom(goods.value)
+    if (res.code !== 200) {
+        uni.showToast({
+            title: res.msg,
+            icon: 'none'
+        })
+        return
+    }
+    uni.showToast({
+        title: '鎴愬姛棰嗙敤',
+        icon: 'none'
+    })
+    goBack()
+}
+const initContacts = () => {
+  userListNoPageByTenantId().then((res) => {
+    console.log('userListNoPageByTenantId',res.data)
+    userList.value = res.data
+  })
+}
+
+
+onMounted(() => {
+    let _goods = JSON.parse(props.goods)
+    console.log('_goods',_goods)
+    goods.value = {..._goods}
+    initContacts()
+})
+</script>
+<style lang="scss" scoped>
+.box {
+    background-color: #fff;
+    box-sizing: border-box;
+    padding: 20rpx;
+    min-height: 80rpx;
+    padding-bottom: calc(30rpx + env(safe-area-inset-bottom));
+}
+
+.form-box {
+    box-sizing: border-box;
+    margin-bottom: 20rpx;
+    padding: 20rpx;
+    background-color: #f5f5f5;
+    border-radius: 20rpx;
+}
+
+.add-img {
+    .img {
+        background-color: #efefef;
+        border-radius: 10rpx;
+        width: 200rpx;
+        height: 200rpx;
+    }
+}
+</style>
\ No newline at end of file
diff --git a/src/pages/inventoryManagement/stockManagement/index.vue b/src/pages/inventoryManagement/stockManagement/index.vue
new file mode 100644
index 0000000..1adaca5
--- /dev/null
+++ b/src/pages/inventoryManagement/stockManagement/index.vue
@@ -0,0 +1,221 @@
+<template>
+	<view>
+		<PageHeader title="搴撳瓨绠$悊" @back="goBack" />
+		<view class="tabs">
+			<uni-segmented-control :current="tabCurrent" :values="tabItems" @clickItem="switchTab" />
+		</view>
+		<view v-if="contentList?.length !== 0" class="content">
+			<view v-if="tabCurrent === 0">
+				<block v-for="item in contentList" :key="item.id">
+					<view class="item-box item-box0"></view>
+				</block>
+				<uni-load-more :status="loadMoreStatus"></uni-load-more>
+			</view>
+			<view v-if="tabCurrent === 1">
+				<block v-for="item in contentList" :key="item.id">
+					<view class="item-box item-box1">
+						<view class="item">
+							<view class="label">浜у搧鍥剧墖</view>
+							<view class="value">
+								<image class="img" :src="baseUrl + item.url" mode="aspectFill鈥�" lazy-load></image>
+							</view>
+						</view>
+						<view class="item">
+							<view class="label">鍏ュ簱鏃堕棿</view>
+							<view class="value">{{ item.inboundDate }}</view>
+						</view>
+						<view class="item">
+							<view class="label">浜у搧鍚嶇О</view>
+							<view class="value">{{ item.productCategory }}</view>
+						</view>
+						<view class="item">
+							<view class="label">浜у搧楂樺害</view>
+							<view class="value">{{ item.specificationModel }}{{ item.unit }}</view>
+						</view>
+						<view class="item">
+							<view class="label">鍏ュ簱鏁伴噺/浠�</view>
+							<view class="value">{{ item.inboundNum }}</view>
+						</view>
+						<view class="item">
+							<view class="label">搴撳瓨鏁伴噺/浠�</view>
+							<view class="value">{{ item.inboundNum0 }}</view>
+						</view>
+						<view class="item">
+							<view class="label">姣忎欢鏁伴噺/鏀�</view>
+							<view class="value">{{ item.boxNum }}</view>
+						</view>
+						<view class="item">
+							<view class="label">鍗曚环锛堝厓锛�/鏀�</view>
+							<view class="value">{{ item.taxInclusiveUnitPrice }}</view>
+						</view>
+						<view class="item">
+							<view class="label">绾哥瑙勬牸</view>
+							<view class="value">{{ item.cartonSpecifications }}cm</view>
+						</view>
+						<view class="item">
+							<view class="label">鍏ュ簱浜�</view>
+							<view class="value">{{ item.createBy }}</view>
+						</view>
+						<view class="item" style="justify-content: flex-end;">
+							<button class="mini-btn" type="primary" size="mini" style="margin-left: 0;margin-right: 0;"
+								@click="openForm(item, 'edit')">缂栬緫</button>
+						</view>
+					</view>
+				</block>
+				<uni-load-more :status="loadMoreStatus"></uni-load-more>
+			</view>
+		</view>
+		<view v-if="contentList?.length === 0" class="no-data">
+			<text>鏆傛棤鏁版嵁</text>
+		</view>
+	</view>
+</template>
+
+<script setup>
+import { ref, reactive, computed } from 'vue'
+import { listPage, listPageByCustom } from '@/api/inventoryManagement/stockManagement.js'
+import { onShow, onReachBottom, onPullDownRefresh } from '@dcloudio/uni-app'
+import config from '@/config'
+const baseUrl = config.baseUrl
+// tab鐩稿叧
+const tabItems = reactive(['閲囪喘搴撳瓨', '鎴愬搧搴撳瓨'])
+const tabCurrent = ref(0)
+
+const switchTab = (e) => {
+	if (tabCurrent.value !== e.currentIndex) {
+		tabCurrent.value = e.currentIndex
+	}
+	reloadPage()
+}
+
+// 杩斿洖涓婁竴椤�
+const goBack = () => {
+	uni.navigateBack()
+}
+
+// 鎵撳紑缂栬緫/鏂板
+const openForm = (goods, type) => {
+	uni.navigateTo({
+		url: '/pages/inventoryManagement/stockManagement/edit?goods=' + JSON.stringify(goods)
+	})
+}
+
+// 鍒嗛〉鐩稿叧
+const pageParams = reactive({
+	size: 10,
+	current: 1
+})
+const totalSize = ref(0)
+const noMore = computed(() => {
+	return contentList.value.length >= totalSize.value
+})
+const loading = ref(false)
+const contentList = ref([])
+const loadMoreStatus = computed(() => {
+	if (loading.value) {
+		return 'loading'
+	}
+	if (noMore.value) {
+		return 'noMore'
+	}
+	return 'more'
+})
+const loadPage = () => {
+	if (noMore.value || loading.value) {
+		return
+	}
+	pageParams.current += 1
+	getList()
+}
+const reloadPage = () => {
+	pageParams.current = 1
+	contentList.value = []
+	getList()
+}
+const getList = async () => {
+	let getListApi = null
+	if (tabCurrent.value == 1) {
+		getListApi = listPageByCustom
+	} else if (tabCurrent.value == 0) {
+		getListApi = listPage
+	}
+	loading.value = true
+	let resp = await getListApi(pageParams)
+	loading.value = false
+	if (resp.code != 200 || !resp.data) {
+		contentList.value = []
+		totalSize.value = 0
+		return
+	}
+	contentList.value = [...contentList.value, ...resp.data.records]
+	console.log(resp.data.records)
+	totalSize.value = resp.data.total
+}
+
+onReachBottom(() => {
+	loadPage()
+})
+onPullDownRefresh(() => {
+	reloadPage()
+	uni.stopPullDownRefresh()
+})
+onShow(() => {
+	reloadPage()
+})
+
+</script>
+
+<style lang='scss' scoped>
+.tabs {
+	box-sizing: border-box;
+	padding: 20rpx 40rpx;
+}
+
+.no-data {
+	text-align: center;
+	padding: 40px 20px;
+	color: #999;
+	font-size: 14px;
+}
+
+.item-box {
+	box-sizing: border-box;
+	margin: 20rpx;
+	padding: 20rpx;
+	border-radius: 10rpx;
+	background-color: #f5f5f5;
+}
+
+.item {
+	display: flex;
+	justify-content: space-between;
+	margin: 10rpx 0;
+
+	.label {}
+
+	.value {
+		.img {
+			width: 200rpx;
+			height: 200rpx;
+			background-color: #999;
+			border-radius: 10rpx;
+		}
+	}
+}
+
+// 娴姩鎸夐挳鏍峰紡
+.fab-button {
+	position: fixed;
+	bottom: calc(30px + env(safe-area-inset-bottom));
+	right: 30px;
+	width: 56px;
+	height: 56px;
+	background: #2979ff;
+	border-radius: 50%;
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	box-shadow: 0 4px 16px rgba(41, 121, 255, 0.3);
+	z-index: 1000;
+}
+</style>
\ No newline at end of file

--
Gitblit v1.9.3