haveyou 1 gadu atpakaļ
vecāks
revīzija
43f7f93f70

+ 1 - 0
App.vue

@@ -31,6 +31,7 @@
 <style lang="scss">
 	@import "@/uni_modules/uview-plus/index.scss";
 	@import "@/static/css/mystyle.css";
+	@import '@/static/css/common.scss';
 	/*每个页面公共css */
 	page{
 		background: #F5F6FA;

+ 55 - 2
pages/index/audit/confirm-receipt.vue

@@ -1,3 +1,56 @@
 <template>
-	<view>1</view>
-</template>
+	<view class="container">
+
+		<!-- 底部按钮 -->
+		<view class="footer">
+			<!-- 查询区域 -->
+			<view class="query-section">
+				<u-radio-group v-model="queryType">
+					<u-radio label="查订单" name="order" />
+					<u-radio label="查物流" custom-style="margin-left:20px" name="logistics" />
+				</u-radio-group>
+
+				<view class="search-box">
+					<u-input custom-style="width:100rpx" v-model="searchKeyword" placeholder="扫描/输入物流单号"
+						border="surround" clearable>
+					</u-input>
+					<u-button color="#c8c8c8" text="查询" @click="handleSearch" />
+				</view>
+			</view>
+
+			<u-divider></u-divider>
+
+			<view style="display: flex;">
+				<u-button size="large" type="success" text="确认收货扫码" @click="handleScan" />
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup>
+	import {
+		ref
+	} from 'vue';
+
+	const queryType = ref('order');
+	const searchKeyword = ref('');
+
+	// 处理查询
+	const handleSearch = () => {
+		console.log('查询:', searchKeyword.value);
+	};
+
+	// 处理扫码
+	const handleScan = () => {
+		uni.scanCode({
+			success: (res) => {
+				searchKeyword.value = res.result;
+				handleSearch();
+			}
+		});
+	};
+</script>
+
+<style lang="scss" scoped>
+	@import '../components/common.scss';
+</style>

+ 225 - 2
pages/index/audit/scan-order.vue

@@ -1,3 +1,226 @@
 <template>
-	<view>1</view>
-</template>
+  <view class="container">
+    <!-- 顶部操作栏 -->
+    <view class="header">
+      <text>清除全部</text>
+    </view>
+
+    <!-- 提示信息 -->
+    <view class="tips">
+      <text>请勿录入审核为不良的书籍ISBN!</text>
+      <text class="sub-tips">不良书籍的ISBN可能是错误的!</text>
+    </view>
+
+    <!-- ISBN列表 -->
+    <scroll-view scroll-y class="isbn-list">
+      <view 
+        v-for="(item, index) in isbnList" 
+        :key="index"
+        class="isbn-item"
+      >
+        <view class="item-left">
+          <u-icon
+            name="minus-circle-fill"
+            color="#dd524d"
+            size="24"
+            @click="removeItem(index)"
+          />
+          <text class="index">{{ index + 1 }}、</text>
+          <text class="isbn">{{ item.isbn }}</text>
+        </view>
+
+        <view class="quantity-control">
+          <u-button
+            text="-"
+            size="mini"
+            @click="decreaseQuantity(index)"
+            :disabled="item.quantity <= 1"
+          />
+          <text class="quantity">{{ item.quantity }}</text>
+          <u-button
+            text="+"
+            size="mini"
+            @click="increaseQuantity(index)"
+          />
+        </view>
+      </view>
+    </scroll-view>
+
+    <!-- 底部按钮 -->
+    <view class="footer">
+      <u-button
+        type="warning"
+        text="扫码加书"
+        @click="handleScan"
+      />
+      <u-button
+        type="primary"
+        text="查询"
+        @click="handleQuery"
+      />
+    </view>
+  </view>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+
+// ISBN列表数据
+const isbnList = ref([
+  { isbn: '9787050405548', quantity: 1 },
+  { isbn: '9787050405548', quantity: 3 },
+  { isbn: '9787050405548', quantity: 3 },
+  { isbn: '9787050405548', quantity: 3 },
+  { isbn: '9787050405548', quantity: 3 },
+  { isbn: '9787050405548', quantity: 3 },
+  { isbn: '9787050405548', quantity: 3 },
+  { isbn: '9787050405548', quantity: 3 },
+  { isbn: '9787050405548', quantity: 3 }
+]);
+
+// 移除项目
+const removeItem = (index) => {
+  isbnList.value.splice(index, 1);
+};
+
+// 减少数量
+const decreaseQuantity = (index) => {
+  if (isbnList.value[index].quantity > 1) {
+    isbnList.value[index].quantity--;
+  }
+};
+
+// 增加数量
+const increaseQuantity = (index) => {
+  isbnList.value[index].quantity++;
+};
+
+// 扫码处理
+const handleScan = () => {
+  uni.scanCode({
+    success: (res) => {
+      // 验证ISBN格式
+      if (isValidISBN(res.result)) {
+        isbnList.value.push({
+          isbn: res.result,
+          quantity: 1
+        });
+      } else {
+        uni.showToast({
+          title: '无效的ISBN',
+          icon: 'none'
+        });
+      }
+    }
+  });
+};
+
+// ISBN格式验证
+const isValidISBN = (isbn) => {
+  // 简单的ISBN-13验证
+  return /^97[89]\d{10}$/.test(isbn);
+};
+
+// 查询处理
+const handleQuery = () => {
+  if (isbnList.value.length === 0) {
+    uni.showToast({
+      title: '请先添加ISBN',
+      icon: 'none'
+    });
+    return;
+  }
+  console.log('查询ISBN列表:', isbnList.value);
+};
+</script>
+
+<style lang="scss" scoped>
+.container {
+  min-height: 100vh;
+  display: flex;
+  flex-direction: column;
+  background-color: #f5f5f5;
+}
+
+.header {
+  padding: 12px;
+  background-color: #999;
+  color: #fff;
+  text-align: center;
+}
+
+.tips {
+  padding: 16px;
+  background-color: #f8f8f8;
+  text-align: center;
+  
+  text {
+    display: block;
+    color: #666;
+    font-size: 14px;
+  }
+  
+  .sub-tips {
+    font-size: 12px;
+    margin-top: 4px;
+  }
+}
+
+.isbn-list {
+  flex: 1;
+  padding: 12px;
+}
+
+.isbn-item {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  padding: 12px;
+  background-color: #fff;
+  margin-bottom: 8px;
+  border-radius: 4px;
+  
+  .item-left {
+    display: flex;
+    align-items: center;
+    gap: 8px;
+  }
+  
+  .index {
+    color: #666;
+  }
+  
+  .isbn {
+    color: #333;
+  }
+
+}
+
+.quantity-control {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  
+  .quantity {
+    min-width: 24px;
+    text-align: center;
+  }
+  
+  :deep(.u-button) {
+    min-width: 32px;
+    height: 32px;
+    padding: 0;
+  }
+}
+
+.footer {
+  padding: 12px;
+  display: flex;
+  gap: 12px;
+  background-color: #fff;
+  
+  .u-button {
+    flex: 1;
+  }
+}
+</style>

+ 55 - 2
pages/index/audit/sender.vue

@@ -1,3 +1,56 @@
 <template>
-	<view>1</view>
-</template>
+	<view class="common-page" style="padding: 0;">
+		<PageScroll requestStr="/team/token/shop/invite/page" @updateList="updateList" ref="scrollRef"
+			:otherParams="otherParams">
+			<u-sticky :customNavHeight="0">
+				<view class="search-area">
+					<u-search placeholder="请输入发件人姓名或电话" :searchIconSize="18" bgColor="#f6f7f6" @search="refreshList"
+						v-model="otherParams.sender" :clearabled="true" :focus="false" :showAction="false"
+						:height="36"></u-search>
+				</view>
+			</u-sticky>
+
+			<order-item style="margin-top:10px"></order-item>
+			<order-item></order-item>
+
+			<view class="list-con" v-if="dataList.length">
+				<OrderItem v-for="cell in dataList" :key="cell.id" :item="cell" class="mt-20">
+				</OrderItem>
+			</view>
+		</PageScroll>
+	</view>
+</template>
+
+<script setup>
+	import {
+		reactive
+	} from 'vue';
+	import PageScroll from '@/components/pageScroll/index.vue'
+	import OrderItem from '@/pages/my/components/orderItem.vue';
+	import {
+		ref
+	} from 'vue';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app'
+
+	const otherParams = ref({
+		sender: '',
+	})
+	const scrollRef = ref(null)
+	const refreshList = () => {
+		scrollRef.value?.resetUpScroll()
+	}
+
+	let dataList = ref([])
+	const updateList = (data) => {
+		dataList.value = data
+	}
+</script>
+<style lang="scss">
+	.search-area {
+		padding: 24rpx;
+		background-color: #ffffff;
+		z-index: 9;
+	}
+</style>

+ 85 - 0
pages/index/components/BookItem.vue

@@ -0,0 +1,85 @@
+<template>
+	<view class="book-item">
+		<image class="book-image"
+			src="https://img20.360buyimg.com/da/jfs/t1/141592/25/8861/261559/5f68d8c1E33ed78ab/698ad655bfcfbaed.png"
+			mode="aspectFill" />
+		<view class="book-info">
+			<view class="book-title">
+				<text>{{ book.title }}</text>
+				<u-icon name="close" size="18" @click="removeBook" />
+			</view>
+			<view class="flex-a">
+				<view class="book-details flex-d">
+					<text>ISBN: {{ book.isbn }}</text>
+					<text>定价: {{ book.price }}</text>
+					<text>折扣: {{ book.discount }}</text>
+				</view>
+				<view class="book-stats flex-d ml-20">
+					<text>数量: {{ book.quantity }}</text>
+					<text>预估单价: {{ book.estimatedPrice }}</text>
+					<text>审核金额: {{ book.reviewAmount }}</text>
+				</view>
+			</view>
+
+			<view class="book-rating flex-a flex-j-b mt-6">
+				<text>良好 ({{ book.good }})</text>
+				<text>一般 ({{ book.average }})</text>
+				<text>极差 ({{ book.poor }})</text>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script setup>
+	const props = defineProps({
+		book: Object
+	});
+
+	const emit = defineEmits(['remove']);
+
+	const removeBook = () => {
+		emit('remove', props.book);
+	};
+</script>
+
+<style scoped>
+	.book-item {
+		display: flex;
+		padding: 8px;
+		background-color: #fff;
+		border-radius: 8px;
+		margin-bottom: 12px;
+		box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);
+	}
+
+	.book-image {
+		width: 80px;
+		height: 100px;
+		border-radius: 4px;
+		margin-right: 12px;
+	}
+
+	.book-info {
+		flex: 1;
+	}
+
+	.book-title {
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		font-weight: bold;
+		margin-bottom: 8px;
+	}
+
+	.book-details,
+	.book-stats,
+	.book-rating {
+		font-size: 26rpx;
+		color: #666;
+		line-height: 36rpx;
+	}
+
+	.book-rating text {
+		margin-right: 8px;
+	}
+</style>

+ 109 - 0
pages/index/components/common.scss

@@ -0,0 +1,109 @@
+.select-section {
+	background-color: #fff;
+	padding: 12px;
+	border-radius: 4px;
+	margin-bottom: 12px;
+	position: relative;
+}
+
+.batch-select {
+	display: flex;
+	align-items: center;
+
+	.required {
+		color: #ff0000;
+		margin-right: 4px;
+	}
+}
+
+.count-badge {
+	position: absolute;
+	right: 0;
+	top: 50%;
+	background-color: #4CAF50;
+	color: #fff;
+	padding: 8px;
+	font-size: 13px;
+}
+
+.query-section {
+	background-color: #fff;
+	padding: 12px;
+	border-radius: 4px;
+}
+
+
+
+.footer {
+	position: fixed;
+	left: 0;
+	right: 0;
+	bottom: 0;
+	display: flex;
+	flex-direction: column;
+	background-color: #fff;
+
+	.u-button {
+		width: 100%;
+		border-radius: 0;
+	}
+	
+	.search-box {
+		display: flex;
+		gap: 12px;
+		margin-top: 12px;
+		:deep(.u-input){
+			flex: 1;
+		}
+		:deep(.u-button){
+			width: 80px;
+			border-radius: 5px;
+		}
+	}
+}
+
+.batch-popup {
+	background-color: #fff;
+	border-radius: 16px 16px 0 0;
+
+	.popup-header {
+		padding: 12px;
+		display: flex;
+		justify-content: space-between;
+		align-items: center;
+		border-bottom: 1px solid #eee;
+		box-sizing: border-box;
+
+		.header-right {
+			display: flex;
+			align-items: center;
+			gap: 12px;
+
+			.new-batch {
+				color: #2979ff;
+				min-width: 70px;
+			}
+			.u-button{
+				height: 64rpx;
+			}
+		}
+	}
+
+	.batch-list {
+		max-height: 60vh;
+		padding: 0 16px;
+		box-sizing: border-box;
+	}
+
+	.batch-item {
+		padding: 13px 0;
+		box-sizing: border-box;
+		display: flex;
+		justify-content: space-between;
+		border-bottom: 1px solid #eee;
+
+		&.active {
+			color: #2979ff;
+		}
+	}
+}

+ 262 - 2
pages/index/entry/scan-book.vue

@@ -1,3 +1,263 @@
 <template>
-	<view>1</view>
-</template>
+	<view class="container">
+		<!-- 顶部搜索框 -->
+		<u-sticky>
+			<view class="search-area">
+				<u-search v-model="searchValue" placeholder="扫描/输入ISBN或SH码" :show-action="true" actionText="查询"
+					@search="handleSearch" @custom="handleSearch">
+					<template #suffixIcon>
+						<u-icon name="close" size="20" v-if="searchValue" @click="searchValue = ''" />
+					</template>
+				</u-search>
+			</view>
+		</u-sticky>
+
+		<!-- 已扫描ISBN显示 -->
+		<view class="isbn-display" v-if="scannedISBN">
+			<text>已成功添加:{{ scannedISBN }}</text>
+		</view>
+
+		<!-- 内容区域 -->
+		<view class="content">
+			<!-- 空状态 -->
+			<view class="empty-state" v-if="!bookInfo">
+				<u-empty mode="data" text="暂无扫描数据" margin-top="100" />
+			</view>
+
+			<!-- 书籍详情 -->
+			<view class="book-detail" v-else>
+				<view class="common-card mb-20">
+					<view class="flex flex-a-e">
+						<image class="book-image" :src="bookInfo.image" mode="heightFix" />
+						<text class="ml-20 font-15">{{bookInfo.name}}</text>
+					</view>
+
+					<view class="book-status">
+						<text class="status-text">状态:已加入回收书单</text>
+						<text class="time-text">加入时间:{{ bookInfo.addTime }}</text>
+					</view>
+				</view>
+				<!-- 基本信息 -->
+				<view class="common-card info-section mb-20">
+					<view class="price-info">
+						<text class="label">定价:</text>
+						<text class="price">¥{{ bookInfo.price }}</text>
+						<text class="recycle-price">回收价:¥{{ bookInfo.recyclePrice }}</text>
+					</view>
+
+					<view class="book-info">
+						<view class="info-item">
+							<text class="label">ISBN:</text>
+							<text>{{ bookInfo.isbn }}</text>
+						</view>
+						<view class="info-item">
+							<text class="label">语言:</text>
+							<text>{{ bookInfo.language }}</text>
+						</view>
+						<view class="info-item">
+							<text class="label">作者:</text>
+							<text>{{ bookInfo.author }}</text>
+						</view>
+						<view class="info-item">
+							<text class="label">出版社:</text>
+							<text>{{ bookInfo.publisher }}</text>
+						</view>
+						<view class="info-item">
+							<text class="label">出版时间:</text>
+							<text>{{ bookInfo.publishDate }}</text>
+						</view>
+					</view>
+				</view>
+
+				<!-- 简介和轨迹 -->
+				<view class="common-card tabs-section" style="padding:0">
+					<u-tabs :list="tabsList" v-model="currentTab" lineColor="#19be6b" />
+					<view class="tab-content">
+						<view v-if="currentTab === 0" class="intro-content">
+							<text class="section-title">内容简介:</text>
+							<text class="content-text">{{ bookInfo.introduction }}</text>
+							<text class="section-title">作者简介:</text>
+							<text class="content-text">{{ bookInfo.authorIntro }}</text>
+						</view>
+						<view v-else class="track-content">
+							<text>{{ bookInfo.track }}</text>
+						</view>
+					</view>
+				</view>
+			</view>
+		</view>
+
+		<!-- 底部扫描按钮 -->
+		<view class="fixed-bottom">
+			<u-button size="large" type="primary" text="扫码(ISBN或SH码)" @click="handleScan" />
+		</view>
+	</view>
+</template>
+
+<script setup>
+	import {
+		ref
+	} from 'vue';
+
+	const searchValue = ref('');
+	const scannedISBN = ref('');
+	const currentTab = ref(0);
+	const tabsList = [{
+			name: '简介'
+		},
+		{
+			name: '轨迹'
+		}
+	];
+
+	// 模拟书籍信息
+	const bookInfo = ref(null);
+
+	// 处理搜索
+	const handleSearch = () => {
+		if (!searchValue.value) return;
+		loadBookInfo(searchValue.value);
+	};
+
+	// 处理扫描
+	const handleScan = () => {
+		uni.scanCode({
+			success: (res) => {
+				searchValue.value = res.result;
+				scannedISBN.value = res.result;
+				loadBookInfo(res.result);
+			}
+		});
+	};
+
+	// 加载书籍信息
+	const loadBookInfo = (isbn) => {
+		// 模拟数据
+		bookInfo.value = {
+			name: '圆圈正义',
+			image: 'https://img20.360buyimg.com/da/jfs/t1/141592/25/8861/261559/5f68d8c1E33ed78ab/698ad655bfcfbaed.png',
+			addTime: '2023-05-15 12:15:12',
+			price: '46',
+			recyclePrice: '4.6[1折]',
+			isbn: '9787015454545',
+			language: '中文',
+			author: '罗翔',
+			publisher: '中国法治出版社',
+			publishDate: '2019-08-12',
+			introduction: '《圆圈正义》一书共收录作者的40篇微信文章...',
+			authorIntro: '罗翔,男,中国政法大学教授...',
+			track: '轨迹信息...'
+		};
+	};
+</script>
+
+<style lang="scss" scoped>
+	.container {
+		display: flex;
+		flex-direction: column;
+		box-sizing: border-box;
+		padding-bottom: 50px;
+	}
+
+	.search-box {
+		padding: 12px;
+		background-color: #fff;
+	}
+
+	.isbn-display {
+		padding: 8px 12px;
+		background-color: #e8f5e9;
+		color: #19be6b;
+		font-size: 14px;
+	}
+
+	.book-detail {
+		margin: 12px;
+		border-radius: 8px;
+		overflow: hidden;
+	}
+
+	.book-image {
+		width: 100%;
+		height: 300rpx;
+		object-fit: cover;
+		border-radius: 5px;
+	}
+
+	.book-status {
+		padding: 12px;
+
+		.status-text {
+			font-size: 16px;
+			color: #19be6b;
+			margin-bottom: 4px;
+			display: block;
+		}
+
+		.time-text {
+			font-size: 14px;
+			color: #999;
+		}
+	}
+
+	.info-section {
+		padding: 16px;
+
+		.price-info {
+			margin-bottom: 16px;
+
+			.price {
+				color: #19be6b;
+				font-size: 18px;
+				font-weight: bold;
+				margin-right: 12px;
+			}
+
+			.recycle-price {
+				color: #666;
+				font-size: 14px;
+			}
+		}
+	}
+
+	.info-item {
+		margin-bottom: 8px;
+		font-size: 14px;
+
+		.label {
+			color: #666;
+			margin-right: 8px;
+		}
+	}
+
+	.tab-content {
+		padding: 16px;
+		padding-top: 0;
+
+		.section-title {
+			font-weight: bold;
+			margin-top: 12px;
+			margin-bottom: 6px;
+			display: block;
+		}
+
+		.content-text {
+			font-size: 14px;
+			color: #666;
+			line-height: 1.6;
+			margin-bottom: 16px;
+		}
+	}
+
+	.footer {
+		padding: 12px;
+		background-color: #fff;
+	}
+
+	.empty-state {
+		flex: 1;
+		display: flex;
+		align-items: center;
+		justify-content: center;
+	}
+</style>

+ 1 - 100
pages/index/express/quick-check.vue

@@ -142,104 +142,5 @@
 </script>
 
 <style lang="scss" scoped>
-	.select-section {
-		background-color: #fff;
-		padding: 12px;
-		border-radius: 4px;
-		margin-bottom: 12px;
-		position: relative;
-	}
-
-	.batch-select {
-		display: flex;
-		align-items: center;
-
-		.required {
-			color: #ff0000;
-			margin-right: 4px;
-		}
-	}
-
-	.count-badge {
-		position: absolute;
-		right: 0;
-		top: 50%;
-		background-color: #4CAF50;
-		color: #fff;
-		padding: 8px;
-		font-size: 13px;
-	}
-
-	.query-section {
-		background-color: #fff;
-		padding: 12px;
-		border-radius: 4px;
-	}
-
-	.search-box {
-		display: flex;
-		gap: 12px;
-		margin-top: 12px;
-	}
-
-	.footer {
-		position: fixed;
-		left: 0;
-		right: 0;
-		bottom: 0;
-		display: flex;
-		flex-direction: column;
-		background-color: #fff;
-
-		.u-button {
-			flex: 1;
-			border-radius: 0;
-		}
-	}
-
-	.batch-popup {
-		background-color: #fff;
-		border-radius: 16px 16px 0 0;
-
-		.popup-header {
-			padding: 12px;
-			display: flex;
-			justify-content: space-between;
-			align-items: center;
-			border-bottom: 1px solid #eee;
-			box-sizing: border-box;
-
-			.header-right {
-				display: flex;
-				align-items: center;
-				gap: 12px;
-
-				.new-batch {
-					color: #2979ff;
-					min-width: 70px;
-				}
-				.u-button{
-					height: 64rpx;
-				}
-			}
-		}
-
-		.batch-list {
-			max-height: 60vh;
-			padding: 0 16px;
-			box-sizing: border-box;
-		}
-
-		.batch-item {
-			padding: 13px 0;
-			box-sizing: border-box;
-			display: flex;
-			justify-content: space-between;
-			border-bottom: 1px solid #eee;
-
-			&.active {
-				color: #2979ff;
-			}
-		}
-	}
+	@import "../components/common.scss"
 </style>

+ 6 - 5
pages/index/index.vue

@@ -181,18 +181,18 @@
 	// 统计操作列表
 	const statisticsOperations = ref([{
 			name: '审核统计',
-			path: '/pages/index/statistics/audit',
+			path: '/pages/index/statistic/audit',
 			type: 'warning',
 			span: 24
 		},
 		{
 			name: '售后统计',
-			path: '/pages/index/statistics/after-sale',
+			path: '/pages/index/statistic/after-sale',
 			type: 'primary'
 		},
 		{
 			name: '打包统计',
-			path: '/pages/index/statistics/package',
+			path: '/pages/index/statistic/package',
 			type: 'warning'
 		},
 	])
@@ -239,8 +239,8 @@
 <style lang="scss" scoped>
 	.operation-container {
 		padding: 20rpx;
-		background: #f5f6fa;
-		min-height: 100vh;
+		box-sizing: border-box;
+		padding-bottom: 100rpx;
 	}
 
 	.section {
@@ -255,6 +255,7 @@
 			font-weight: 600;
 			color: #333;
 			padding: 20rpx;
+			padding-top: 0;
 			border-bottom: 2rpx solid #f0f0f0;
 			margin-bottom: 20rpx;
 		}

+ 86 - 2
pages/index/offline/check-order.vue

@@ -1,3 +1,87 @@
 <template>
-	<view>1</view>
-</template>
+    <view class="container">
+		<view class="book-list">
+			<book-item v-for="(book, index) in bookList" :key="index" :book="book" @remove="removeBook" />
+		</view>
+
+        <!-- 底部信息和按钮 -->
+        <view class="footer fixed-bottom flex-d" style="padding-top:10rpx">
+            <text class="pad-10">共 {{ totalBooks }} 本,预估回收价 ¥{{ totalPrice }}</text>
+            <view class="flex-a mt-12">
+                <u-button size="large" type="primary" text="提交" @click="handleSubmit" />
+                <u-button size="large" type="warning" text="扫码" @click="handleScan" />
+            </view>
+        </view>
+    </view>
+</template>
+
+<script setup>
+import { ref } from 'vue';
+import BookItem from '../components/BookItem.vue';
+import PageScroll from '@/components/PageScroll/index.vue';
+
+const bookList = ref([
+    {
+        title: '动物解剖生理第三版',
+        isbn: '9787109260962',
+        price: '39.6',
+        discount: '0',
+        quantity: '1/1',
+        estimatedPrice: '2.8',
+        reviewAmount: '0',
+        good: 0,
+        average: 0,
+        poor: 0,
+        image: 'https://example.com/book.jpg'
+    },
+    // ...更多书籍
+]);
+
+const totalBooks = ref(bookList.value.length);
+const totalPrice = ref(bookList.value.reduce((sum, book) => sum + parseFloat(book.estimatedPrice), 0).toFixed(2));
+
+const removeBook = (book) => {
+    const index = bookList.value.indexOf(book);
+    if (index > -1) {
+        bookList.value.splice(index, 1);
+        updateTotals();
+    }
+};
+
+const updateTotals = () => {
+    totalBooks.value = bookList.value.length;
+    totalPrice.value = bookList.value.reduce((sum, book) => sum + parseFloat(book.estimatedPrice), 0).toFixed(2);
+};
+
+const handleSubmit = () => {
+    console.log('提交订单');
+};
+
+const handleScan = () => {
+    uni.scanCode({
+        success: (res) => {
+            console.log('扫码结果:', res.result);
+            // 添加新书逻辑
+        }
+    });
+};
+</script>
+
+<style scoped>
+.container {
+    display: flex;
+    flex-direction: column;
+    padding: 12px;
+	box-sizing: border-box;
+	height: 100%;
+	.book-list{
+		height: calc(100% - 96px);
+		overflow: auto;
+	}
+}
+
+.footer {
+    background-color: #fff;
+    border-top: 1px solid #eee;
+}
+</style>

+ 70 - 2
pages/index/offline/check-record.vue

@@ -1,3 +1,71 @@
 <template>
-	<view>1</view>
-</template>
+	<view class="common-page" style="padding:0">
+		<PageScroll requestStr="/team/token/shop/invite/page" @updateList="updateList" ref="scrollRef"
+			:otherParams="otherParams">
+			<u-sticky :customNavHeight="0">
+				<view class="search-area flex-a">
+					<view class="text-item flex-1">核单时间</view>
+					<view class="text-item flex-1">核单数量</view>
+					<view class="text-item flex-1">核单本数</view>
+					<view class="text-item flex-1">预估金额</view>
+				</view>
+			</u-sticky>
+			<view class="list-con">
+				<view v-for="(item,index) in dataList" :key="index" class="flex-a">
+					<view class="text-item flex-1">{{item.date}}</view>
+					<view class="text-item flex-1">{{item.orderNum}}</view>
+					<view class="text-item flex-1">{{item.auditNum}}</view>
+					<view class="text-item flex-1">{{item.trueNum}}</view>
+				</view>
+			</view>
+		</PageScroll>
+	</view>
+</template>
+
+<script setup>
+	import {
+		reactive
+	} from 'vue';
+	import PageScroll from '@/components/pageScroll/index.vue'
+	import {
+		ref
+	} from 'vue';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app'
+
+	const otherParams = ref({
+		sender: '',
+	})
+	const scrollRef = ref(null)
+	const refreshList = () => {
+		scrollRef.value?.resetUpScroll()
+	}
+
+	let dataList = ref([{
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	}, {
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	}, {
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	}])
+	const updateList = (data) => {
+		dataList.value = data
+	}
+</script>
+<style lang="scss">
+	.search-area {
+		padding: 24rpx;
+		background-color: #ffffff;
+		z-index: 9;
+	}
+</style>

+ 87 - 2
pages/index/statistic/after-sale.vue

@@ -1,3 +1,88 @@
 <template>
-	<view>1</view>
-</template>
+	<view class="common-page" style="padding:0">
+		<PageScroll requestStr="/team/token/shop/invite/page" @updateList="updateList" ref="scrollRef"
+			:otherParams="otherParams">
+			<u-sticky :customNavHeight="0">
+				<view class="search-area flex-d">
+					<view class="flex-a mb-12">
+						<text class="font-13 mr-10">开始时间:</text>
+						<uni-datetime-picker type="datetime" v-model="form.startTime" />
+					</view>
+					<view class="flex-a">
+						<text class="font-13 mr-10">结束时间:</text>
+						<uni-datetime-picker type="datetime" v-model="form.endTime" />
+						<u-button type="primary" custom-style="width:160rpx;height:72rpx;margin-left:10px">查询</u-button>
+					</view>
+					<u-divider></u-divider>
+					<view class="flex-a">
+						<view class="text-item flex-1">审核日期</view>
+						<view class="text-item flex-1">订单数量</view>
+						<view class="text-item flex-1">审书数量</view>
+						<view class="text-item flex-1">实际回收</view>
+					</view>
+				</view>
+			</u-sticky>
+			<view class="list-con">
+				<view v-for="(item,index) in dataList" :key="index" class="flex-a">
+					<view class="text-item flex-1">{{item.date}}</view>
+					<view class="text-item flex-1">{{item.orderNum}}</view>
+					<view class="text-item flex-1">{{item.auditNum}}</view>
+					<view class="text-item flex-1">{{item.trueNum}}</view>
+				</view>
+			</view>
+		</PageScroll>
+	</view>
+</template>
+
+<script setup>
+	import {
+		reactive
+	} from 'vue';
+	import PageScroll from '@/components/pageScroll/index.vue'
+	import {
+		ref
+	} from 'vue';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app'
+
+	const otherParams = ref({
+		sender: '',
+	})
+	const scrollRef = ref(null)
+	const refreshList = () => {
+		scrollRef.value?.resetUpScroll()
+	}
+
+	let dataList = ref([{
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	}, {
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	}, {
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	}])
+	const updateList = (data) => {
+		dataList.value = data
+	}
+
+	const form = reactive({
+		startTime: "",
+		endTime: ''
+	})
+</script>
+<style lang="scss">
+	.search-area {
+		padding: 24rpx;
+		background-color: #ffffff;
+		z-index: 9;
+	}
+</style>

+ 70 - 2
pages/index/statistic/audit.vue

@@ -1,3 +1,71 @@
 <template>
-	<view>1</view>
-</template>
+	<view class="common-page" style="padding:0">
+		<PageScroll requestStr="/team/token/shop/invite/page" @updateList="updateList" ref="scrollRef"
+			:otherParams="otherParams">
+			<u-sticky :customNavHeight="0">
+				<view class="search-area flex-a">
+					<view class="text-item flex-1">审核日期</view>
+					<view class="text-item flex-1">订单数量</view>
+					<view class="text-item flex-1">审书数量</view>
+					<view class="text-item flex-1">实际回收</view>
+				</view>
+			</u-sticky>
+			<view class="list-con">
+				<view v-for="(item,index) in dataList" :key="index" class="flex-a">
+					<view class="text-item flex-1">{{item.date}}</view>
+					<view class="text-item flex-1">{{item.orderNum}}</view>
+					<view class="text-item flex-1">{{item.auditNum}}</view>
+					<view class="text-item flex-1">{{item.trueNum}}</view>
+				</view>
+			</view>
+		</PageScroll>
+	</view>
+</template>
+
+<script setup>
+	import {
+		reactive
+	} from 'vue';
+	import PageScroll from '@/components/pageScroll/index.vue'
+	import {
+		ref
+	} from 'vue';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app'
+
+	const otherParams = ref({
+		sender: '',
+	})
+	const scrollRef = ref(null)
+	const refreshList = () => {
+		scrollRef.value?.resetUpScroll()
+	}
+
+	let dataList = ref([{
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	},{
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	},{
+		date: '2024-10-24',
+		orderNum: 423,
+		auditNum: 293,
+		trueNum: 323
+	}])
+	const updateList = (data) => {
+		dataList.value = data
+	}
+</script>
+<style lang="scss">
+	.search-area {
+		padding: 24rpx;
+		background-color: #ffffff;
+		z-index: 9;
+	}
+</style>

+ 60 - 2
pages/index/statistic/package.vue

@@ -1,3 +1,61 @@
 <template>
-	<view>1</view>
-</template>
+	<view class="common-page" style="padding:0">
+		<PageScroll requestStr="/team/token/shop/invite/page" @updateList="updateList" ref="scrollRef"
+			:otherParams="otherParams">
+			<u-sticky :customNavHeight="0">
+				<view class="search-area flex-a">
+					<view class="text-item flex-1">审核日期</view>
+					<view class="text-item flex-1">数量</view>
+				</view>
+			</u-sticky>
+			<view class="list-con">
+				<view v-for="(item,index) in dataList" :key="index" class="flex-a">
+					<view class="text-item flex-1">{{item.date}}</view>
+					<view class="text-item flex-1">{{item.orderNum}}</view>
+				</view>
+			</view>
+		</PageScroll>
+	</view>
+</template>
+
+<script setup>
+	import {
+		reactive
+	} from 'vue';
+	import PageScroll from '@/components/pageScroll/index.vue'
+	import {
+		ref
+	} from 'vue';
+	import {
+		onLoad
+	} from '@dcloudio/uni-app'
+
+	const otherParams = ref({
+		sender: '',
+	})
+	const scrollRef = ref(null)
+	const refreshList = () => {
+		scrollRef.value?.resetUpScroll()
+	}
+
+	let dataList = ref([{
+		date: '2024-10-24',
+		orderNum: 423,
+	}, {
+		date: '2024-10-24',
+		orderNum: 423,
+	}, {
+		date: '2024-10-24',
+		orderNum: 423,
+	}])
+	const updateList = (data) => {
+		dataList.value = data
+	}
+</script>
+<style lang="scss">
+	.search-area {
+		padding: 24rpx;
+		background-color: #ffffff;
+		z-index: 9;
+	}
+</style>

+ 20 - 13
pages/my/components/orderItem.vue

@@ -2,13 +2,15 @@
 	<view class="order-card">
 		<!-- 用户信息 -->
 		<view class="user-info">
-			<image class="avatar" src="https://img20.360buyimg.com/da/jfs/t1/141592/25/8861/261559/5f68d8c1E33ed78ab/698ad655bfcfbaed.png" mode="aspectFill"></image>
+			<image class="avatar"
+				src="https://img20.360buyimg.com/da/jfs/t1/141592/25/8861/261559/5f68d8c1E33ed78ab/698ad655bfcfbaed.png"
+				mode="aspectFill"></image>
 			<view class="user-details">
 				<text class="username">微信用户(南**)</text>
 				<text class="date">共卖出7本书</text>
 				<text class="date">来自河南省郑州市中牟县</text>
 			</view>
-			
+
 			<view class="user-details right-items">
 				<text class="date">2024-06-01 17:00:00</text>
 				<text class="status" :style="{ color: statusColor }">[待收货审核]</text>
@@ -17,20 +19,24 @@
 
 		<!-- 订单信息 -->
 		<view class="order-info">
-			
+
 		</view>
 
 		<!-- 订单详情 -->
 		<view class="order-details">
 			<view class="detail-row">
-				<text>订单ID:</text>
-				<text class="link" @click="copyToClipboard(orderId)">{{ orderId }}</text>
-				<text>运单号:</text>
-				<text class="link" @click="copyToClipboard(trackingId)">{{ trackingId }}</text>
+				<view class="flex-1">
+					<text>订单ID:</text>
+					<text class="link" @click="copyToClipboard(orderId)">{{ orderId }}</text>
+				</view>
+				<view class="flex-1" style="flex:1.3">
+					<text>运单号:</text>
+					<text class="link" @click="copyToClipboard(trackingId)">{{ trackingId }}</text>
+				</view>
 			</view>
 			<view class="detail-row">
-				<text>预估金额:{{ estimatedAmount }}</text>
-				<text>审核金额:{{ auditAmount }}</text>
+				<text class="flex-1">预估金额:{{ estimatedAmount }}</text>
+				<text class="flex-1" style="flex:1.3">审核金额:{{ auditAmount }}</text>
 			</view>
 			<view class="detail-row">
 				<text>内部备注:{{ internalNote }}</text>
@@ -39,7 +45,7 @@
 
 		<!-- 操作按钮 -->
 		<view class="action-buttons">
-			<u-button size="small" @click="handleAudit">到货审核</u-button>
+			<u-button size="small" type="primary" @click="handleAudit">到货审核</u-button>
 			<u-button size="small" @click="handleView">查看</u-button>
 		</view>
 	</view>
@@ -53,8 +59,8 @@
 	// 模拟数据
 	const orderId = ref('66478425')
 	const trackingId = ref('DPK202356410215')
-	const estimatedAmount = ref('66.6')
-	const auditAmount = ref('待核')
+	const estimatedAmount = ref('66.6')
+	const auditAmount = ref('待核')
 	const internalNote = ref('已反馈')
 	const statusColor = ref('#FF4D4F')
 
@@ -108,7 +114,8 @@
 				flex: 1;
 				display: flex;
 				flex-direction: column;
-				&.right-items{
+
+				&.right-items {
 					align-items: flex-end;
 				}
 

+ 344 - 0
static/css/common.scss

@@ -0,0 +1,344 @@
+$theme-color:#707bce;
+$theme-dark-color:rgba(#e4c491,.8);
+$bg-theme-color:rgba(#e4c491,.1);
+$blue:#03A9F4;
+$yellow:#f9ae3d;
+$yellow-text:#f9ae3d;
+$font-normal:#333333;
+$font-middle:#666666;
+$font-light:#333333;
+
+view{
+	font-size: 28rpx;
+	box-sizing: border-box;
+}
+.page{
+	background-color: #F5F5F5;
+	min-height: 100vh;
+}
+.page-top{
+	padding-top:30rpx;
+}
+.flex,.flex-box,.flex-row{
+	display: flex;
+}
+.flex-column{
+	flex-direction: column;
+}
+.flex-end{
+	justify-content:flex-end;
+}
+.flex-align{
+	align-items: center;
+}
+.flex-center{
+	align-items: center;
+	justify-content: center;
+}
+.flex-a-c{
+	align-items: center;
+}
+.flex-j-c{
+	justify-content: center;
+}
+.flex-j-e{
+	justify-content: flex-end;
+}
+.space-between{
+	justify-content: space-between;
+}
+.flex-wrap{
+	flex-wrap: wrap;
+}
+.text-center{
+	text-align: center !important;
+}
+.pad{
+	padding-left:30rpx;
+	padding-right:30rpx;
+}
+@keyframes circle {
+	0%{transform: rotate(0);}
+	100%{transform: rotate(360deg);}
+}
+.px-15{
+	padding-top:15rpx;
+	padding-bottom:15rpx;
+}
+.input-placeholder{
+	font-size: 26rpx;
+	color:#999999;
+}
+.mb-20 {
+	margin-bottom: 20rpx;
+}
+.c-4{
+	color: #ad2305;
+}
+.c-3{
+	color:#333739;
+}
+.c-5{
+	color:#545657;
+}
+.c-6{
+	color:#666769;
+}
+.c-9{
+	color:#999A9A;
+}
+.c-f{
+	color:#FFFFFF;
+}
+.c-y{
+	color:$yellow;
+}
+.text-y{
+	color:$yellow-text;
+}
+.px-15{
+	padding-left:15rpx;
+	padding-right:15rpx;
+}
+.bg-white{
+	background-color: #FFFFFF;
+}
+.bg-gray{
+	background-color: #ecf7f3;
+}
+.bg-gray-light{
+	background-color: #FAFAFA;
+}
+.bg-gray-empha{
+	background-color: #F1F2F3;
+}
+.border{
+	border:1rpx solid #EFEFEF;
+}
+.border-bottom{
+	border-bottom: 1rpx solid #EFEFEF;
+}
+.btn{
+	width:auto;
+	margin-left:0;
+	margin-right:0;
+	padding-left:30rpx;
+	padding-right:30rpx;
+	font-size: 14px;
+	background-color: transparent;
+	&.primary{
+		background-color:$theme-color;
+		color:#FFFFFF;
+	}
+	&.info{
+		border:1rpx solid #DCDCDC;
+	}
+}
+.font-bold{
+	font-weight: bold;
+}
+.font-normal{
+	font-weight: normal;
+	font-style: normal;
+}
+
+@for $i from 0 through 30 {
+	.ml-#{$i*2} {
+		margin-left: #{$i * 2}rpx;
+	}
+	.mr-#{$i * 2} {
+		margin-right: #{$i * 2}rpx;
+	}
+	.mt-#{$i * 2} {
+		margin-top: #{$i * 2}rpx;
+	}
+	.mb-#{$i * 2} {
+		margin-bottom: #{$i * 2}rpx;
+	}
+	.pad-#{$i * 2}{
+		padding: #{$i * 2}rpx;
+		box-sizing: border-box;
+	}
+}
+@for $i from 0 through 20 {
+	.pt-#{$i*2}{
+		padding-top:#{$i * 2}rpx;
+	}
+	.px-#{$i * 2} {
+		padding-left: #{$i* 2}rpx!important;
+		padding-right: #{$i* 2}rpx!important;
+	}
+	.py-#{$i * 2} {
+		padding-top: #{$i * 2}rpx!important;
+		padding-bottom: #{$i * 2}rpx!important;
+	}
+	.pad-#{$i * 2}{
+		padding:#{$i * 2}rpx;
+	}
+	.radius-#{$i * 2}{
+		border-radius: #{$i * 2}rpx;
+	}
+	.font-#{20 + $i * 2}{
+		font-size: #{22 + $i * 2}rpx;
+	}
+}
+@for $i from 1 through 5{
+	.text-line#{$i}{
+		overflow: hidden;
+		display: -webkit-box!important;
+		text-overflow: ellipsis;
+		word-break: break-all;
+		-webkit-line-clamp: #{$i};
+		-webkit-box-orient: vertical!important;
+	}
+}
+
+
+.operat-btns {
+	padding: 16px;
+	box-sizing: border-box;
+	width: 100%;
+	position: fixed;
+	bottom: 20px;
+	left: 0;
+	right: 0;
+}
+
+.operat-btns .u-button + .u-button {
+	margin-left: 14px;
+}
+
+// 超出省略,最多5行
+@for $i from 12 through 30 {
+    .font-#{$i} {
+        // vue下,单行和多行显示省略号需要单独处理
+        font-size: #{$i} + 'px' !important;
+    }
+}
+.common-title {
+	font-size: 15px;
+	font-family: PingFang SC;
+	font-weight: bold;
+	color: #101010;
+	line-height: 19px;
+}
+
+.flex {
+	display: flex;
+}
+.flex-j-b{
+	justify-content: space-between;
+}
+.flex-1 {
+	flex: 1;
+}
+
+.flex-a {
+	display: flex;
+	align-items: center;
+}
+
+.flex-a-s {
+	align-items: flex-start;
+}
+
+.flex-a-c {
+	align-items: center;
+}
+
+.flex-a-e {
+	align-items: flex-end;
+}
+
+.flex-c {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+}
+
+.flex-d {
+	display: flex;
+	flex-direction: column;
+}
+
+.common-text{
+	font-family: PingFang SC;
+	font-weight: 500;
+	font-size: 13px;
+	color: #666666;
+	line-height: 24px;
+	text-align: left;
+}
+
+.common-num-text{
+	font-family: AlibabaSans102 V2 Num_Alipay;
+	font-weight: normal;
+	font-size: 18px;
+	color: #111111;
+	line-height: 24px;
+	text-align: left;
+}
+
+.common-card {
+	padding: 14px 12px 21px;
+	background: #FFFFFF;
+	border-radius: 10px;
+	opacity: 1;
+}
+
+.white-bg{
+	padding: 0;
+	box-sizing: border-box;
+	background-color: #ffffff;
+	border-radius: 10px;
+}
+
+.common-tag {
+	padding: 2px 4px;
+	background: linear-gradient(180deg, #DBC4A3 0%, #D2B692 100%);
+	border-radius: 3px 3px 3px 3px;
+	opacity: 1;
+	position: relative;
+	font-size:11px;
+	font-family: PingFang SC;
+	font-weight: 400;
+	color: #FFFFFF;
+	margin-left: 6px;
+}
+
+.common-number-text{
+	font-family: AlibabaSans102 V2 Num_Alipay;
+	font-weight: normal;
+	font-size: 16px;
+	color: #111111;
+	line-height: 28px;
+}
+
+.common-btn{
+	padding: 8rpx 20rpx;
+	box-sizing: border-box;
+	background: #ff6c22;
+	color: #ffffff;
+	font-size: 26rpx;
+	border-radius: 28rpx;
+	border: 2rpx solid #ff6c22;
+	
+	&.plain{
+		border: 2rpx solid #707bce;
+		color: #707bce;
+		background: #ffffff;
+	}
+}
+.color-primary{
+	color: #707bce !important;
+}
+
+.team-title {
+	font-size: 28rpx;
+	color: #707bce;
+}
+
+.common-page{
+	padding: 30rpx;
+	box-sizing: border-box;
+}

+ 20 - 0
static/css/mystyle.css

@@ -190,4 +190,24 @@
 
 :deep(.fixed-bottom .u-button) {
 	border-radius: 0 !important;
+}
+
+.common-page {
+	padding: 24rpx;
+	box-sizing: border-box;
+}
+
+.search-area {
+	padding: 24rpx;
+	background-color: #ffffff;
+	z-index: 9;
+}
+
+.text-item{
+	font-size: 26rpx;
+	text-align: center;
+}
+.list-con .text-item {
+	flex: 1;
+	line-height: 60rpx;
 }