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