Explorar el Código

Merge branch 'master' of http://106.52.242.177:3000/askqvn/crm-app

Yannay hace 2 meses
padre
commit
e5a983692e

+ 1 - 0
App.vue

@@ -225,5 +225,6 @@
225 225
 	}
226 226
 
227 227
 	@import "@/uni_modules/uview-ui/index.scss";
228
+	@import "@/common/iconfont/iconfont.css";
228 229
 	/*每个页面公共css */
229 230
 </style>

+ 33 - 0
common/iconfont/iconfont.css

@@ -0,0 +1,33 @@
1
+/* 在线链接服务仅供平台体验和调试使用,平台不承诺服务的稳定性,企业客户需下载字体包自行发布使用并做好备份。 */
2
+@font-face {
3
+  font-family: 'iconfont';
4
+  /* Project id 5096589 */
5
+  src: url('/common/iconfont/iconfont.ttf') format('ttf'),
6
+    url('//at.alicdn.com/t/c/font_5096589_rab6h2csv4.woff2?t=1766568458540') format('woff2'),
7
+    url('//at.alicdn.com/t/c/font_5096589_rab6h2csv4.woff?t=1766568458540') format('woff'),
8
+    url('//at.alicdn.com/t/c/font_5096589_rab6h2csv4.ttf?t=1766568458540') format('truetype');
9
+}
10
+
11
+.iconfont {
12
+  font-family: "iconfont" !important;
13
+  font-size: 16px;
14
+  font-style: normal;
15
+  -webkit-font-smoothing: antialiased;
16
+  -moz-osx-font-smoothing: grayscale;
17
+}
18
+
19
+.icon-crm-tubiao-zhexiantu:before {
20
+  content: "\eb96";
21
+}
22
+
23
+.icon-crm-jiangbei:before {
24
+  content: "\e604";
25
+}
26
+
27
+.icon-crm-tongji:before {
28
+  content: "\e649";
29
+}
30
+
31
+.icon-crm-dayin:before {
32
+  content: "\e841";
33
+}

BIN
common/iconfont/iconfont.ttf


+ 40 - 0
components/custom-tab-radio/index.scss

@@ -0,0 +1,40 @@
1
+.tab-radio-container {
2
+  display: grid;
3
+  gap: 16rpx;
4
+  align-items: center;
5
+  background-color: #ffffff;
6
+  border-radius: 8rpx;
7
+  padding: 4rpx;
8
+  margin: 10rpx 0;
9
+  width: 100%;
10
+  box-sizing: border-box;
11
+}
12
+
13
+.tab-item {
14
+  flex: 1;
15
+  display: flex;
16
+  justify-content: center;
17
+  align-items: center;
18
+  transition: all 0.3s ease;
19
+  cursor: pointer;
20
+  background-color: #f9f9f9;
21
+  border:1px solid transparent;
22
+  border-radius: 40rpx;
23
+  padding:14rpx 20rpx;
24
+  font-size: 24rpx;
25
+
26
+  .tab-item__text {
27
+    color: #484848;
28
+    font-weight: 400;
29
+    transition: all 0.3s ease;
30
+  }
31
+}
32
+
33
+.tab-item--active {
34
+  border:1px solid #2563eb;
35
+  background-color: transparent;
36
+  .tab-item__text {
37
+    color: #2563eb;
38
+    font-weight: 500;
39
+  }
40
+}

+ 52 - 0
components/custom-tab-radio/index.vue

@@ -0,0 +1,52 @@
1
+<template>
2
+  <view class="tab-radio-container" :style="{ gridTemplateColumns: `repeat(${colNum}, 1fr)` }">
3
+    <view 
4
+      class="tab-item"
5
+      v-for="(item, index) in tabList"
6
+      :key="index"
7
+      :class="{ 'tab-item--active': activeValue === item.value }"
8
+      @click="handleTabClick(item)"
9
+    >
10
+      <text class="tab-item__text">{{ item.name }}</text>
11
+    </view>
12
+  </view>
13
+</template>
14
+
15
+<script>
16
+export default {
17
+  name: "TabRadio",
18
+  props: {
19
+    tabList: {
20
+      type: Array,
21
+      required: true,
22
+      default: () => []
23
+    },
24
+    defaultActive: {
25
+      type: [String, Number],
26
+      default: ""
27
+    },
28
+    colNum: {
29
+      type: Number,
30
+      default: 4
31
+    }
32
+  },
33
+  data() {
34
+    return {
35
+      activeValue: this.defaultActive
36
+    };
37
+  },
38
+  methods: {
39
+    handleTabClick(item) {
40
+      this.activeValue = item.value;
41
+      this.$emit("tabChange", {
42
+        name: item.name,
43
+        value: item.value
44
+      });
45
+    }
46
+  }
47
+};
48
+</script>
49
+
50
+<style lang="scss" scoped>
51
+@import "./index.scss";
52
+</style>

+ 9 - 0
components/form-select-to-page/index.scss

@@ -0,0 +1,9 @@
1
+.form_select_to_page{
2
+    width: 100%;
3
+    display: flex;
4
+    justify-content: flex-end;
5
+    align-items: center;
6
+    font-size: 28rpx;
7
+    font-weight: 600;
8
+    gap: 14rpx;
9
+}

+ 43 - 0
components/form-select-to-page/index.vue

@@ -0,0 +1,43 @@
1
+<template>
2
+    <view class="form_select_to_page" @click="handleClickToPage">
3
+        <view>{{ val }}</view>
4
+        <u-icon size="13" name="close-circle" @click="clear" v-if="val"></u-icon>
5
+        <u-icon size="20" name="arrow-right"></u-icon>
6
+    </view>
7
+</template>
8
+<script>
9
+export default {
10
+    components: {
11
+    },
12
+    props: {
13
+        val: {
14
+            type: String || Number,
15
+            default: '' || null,
16
+        },
17
+        url: {
18
+            type: String,
19
+            default: '',
20
+        }
21
+    },
22
+    emits: ['handleClear'],
23
+    data() {
24
+        return {
25
+
26
+        }
27
+    },
28
+    methods: {
29
+        clear(){
30
+            console.log(this.val);
31
+            this.$emit('handleClear');
32
+        },
33
+        handleClickToPage(){
34
+            uni.navigateTo({
35
+                url: this.url
36
+            })
37
+        }
38
+    }
39
+}
40
+</script>
41
+<style lang="scss" scoped>
42
+@import './index.scss';
43
+</style>

+ 45 - 3
pages.json

@@ -115,8 +115,7 @@
115 115
 				"enablePullDownRefresh": false,
116 116
 				"navigationStyle": "custom"
117 117
 			}
118
-		}
119
-		,
118
+		},
120 119
 		{
121 120
 			"path": "pages/clue/index",
122 121
 			"style": {
@@ -161,6 +160,42 @@
161 160
 			}
162 161
 		},
163 162
 		{
163
+			"path" : "pages/wareHouse/index",
164
+			"style" : 
165
+			{
166
+				"navigationBarTitleText" : "仓库",
167
+				"enablePullDownRefresh": true,
168
+				"navigationStyle": "custom"
169
+			}
170
+		},
171
+		{
172
+			"path" : "pages/wareHouse/detail",
173
+			"style" : 
174
+			{
175
+				"navigationBarTitleText" : "仓库详情",
176
+				"enablePullDownRefresh": true,
177
+				"navigationStyle": "custom"
178
+			}
179
+		},
180
+		{
181
+			"path" : "pages/wareHouse/add",
182
+			"style" : 
183
+			{
184
+				"navigationBarTitleText" : "仓库新增",
185
+				"enablePullDownRefresh": true,
186
+				"navigationStyle": "custom"
187
+			}
188
+		},
189
+		{
190
+			"path" : "pages/wareHouse/brandList",
191
+			"style" : 
192
+			{
193
+				"navigationBarTitleText" : "仓库品牌列表",
194
+				"enablePullDownRefresh": true,
195
+				"navigationStyle": "custom"
196
+			}
197
+		},
198
+		{
164 199
 			"path" : "pages/privateClue/index",
165 200
 			"style" : 
166 201
 			{
@@ -284,7 +319,14 @@
284 319
 			"pagePath": "pages/publicClue/index",
285 320
 			"iconPath": "static/tabs/public.png",
286 321
 			"selectedIconPath": "static/tabs/public1.png"
287
-		}, {
322
+		}, 
323
+		{
324
+			"text": "仓库",
325
+			"pagePath": "pages/wareHouse/index",
326
+			"iconPath": "static/tabs/warehouse.png",
327
+			"selectedIconPath": "static/tabs/warehouse-active.png"
328
+		}, 
329
+		{
288 330
 			"text": "销售线索",
289 331
 			"pagePath": "pages/privateClue/index",
290 332
 			"iconPath": "static/tabs/private.png",

+ 277 - 0
pages/person/cards/index.vue

@@ -0,0 +1,277 @@
1
+<template>
2
+    <view class="person_cards_wrap">
3
+        <view class="cards_container">
4
+            <!-- 今天消耗 -->
5
+            <view class="card_item today">
6
+                <view class="card_item_content">
7
+                    <view class="card_header">
8
+                        <text class="card_title">今天消耗(元)</text>
9
+                    </view>
10
+                    <view class="card_content">
11
+                        <text class="card_value">{{ cardData.todayConsume }}</text>
12
+                    </view>
13
+                </view>
14
+                <view class="card_item_content">
15
+                    <view class="card_header">
16
+                        <text class="card_title">今天业绩(元)</text>
17
+                    </view>
18
+                    <view class="card_content">
19
+                        <text class="card_value">{{ cardData.todayPerformance }}</text>
20
+                    </view>
21
+                </view>
22
+            </view>
23
+            <!-- 条数统计 -->
24
+            <view class="card_item card_item_full">
25
+                <view class="card_header count">
26
+                    <i class="iconfont icon-crm-tongji" style="font-size: 30rpx;color: #4c8afe;"></i>
27
+                    <text class="card_title">条数统计</text>
28
+                </view>
29
+                <view class="card_content">
30
+                    <view class="count_stats">
31
+                        <view class="count_item">
32
+                            <text class="count_value">{{ cardData.countTypeA }}</text>
33
+                            <text class="count_label">A类</text>
34
+                        </view>
35
+                        <view class="count_item">
36
+                            <text class="count_value">{{ cardData.countTypeB }}</text>
37
+                            <text class="count_label">B类</text>
38
+                        </view>
39
+                        <view class="count_item">
40
+                            <text class="count_value">{{ cardData.countTypeC }}</text>
41
+                            <text class="count_label">C类</text>
42
+                        </view>
43
+                    </view>
44
+                </view>
45
+            </view>
46
+
47
+            <!-- 上门 -->
48
+            <view class="card_item card_item_full">
49
+                <view class="card_content">
50
+                    <view class="visit_stats">
51
+                        <view class="visit_item">
52
+                            <text class="visit_label">上门</text>
53
+                            <text class="visit_value visitc_count">{{ cardData.visitCount }}</text>
54
+                        </view>
55
+                        <view class="visit_item">
56
+                            <text class="visit_label">上门率</text>
57
+                            <text class="visit_value">{{ cardData.visitRate }}</text>
58
+                        </view>
59
+                        <view class="visit_item">
60
+                            <text class="visit_label">成交率</text>
61
+                            <text class="visit_value">{{ cardData.dealRate }}</text>
62
+                        </view>
63
+                        <view class="visit_item">
64
+                            <text class="visit_label">投产比</text>
65
+                            <text class="visit_value">{{ cardData.roi }}</text>
66
+                        </view>
67
+                    </view>
68
+                </view>
69
+            </view>
70
+
71
+            <!-- 当前排名 -->
72
+            <view class="card_item card_item_full">
73
+                <view class="card_content">
74
+                    <view class="ranking_stats">
75
+                        <view class="ranking_info">
76
+                            <view class="ranking_icon">
77
+                                <i class="iconfont icon-crm-jiangbei" style="font-size: 30rpx;color: #ca8a04;"></i>
78
+                            </view>
79
+                            <view class="ranking_info_text">
80
+                                <text class="card_title">当前排名</text>
81
+                                <text class="ranking_text">击败了{{ cardData.beatRate }}的同事</text>
82
+                            </view>
83
+                        </view>
84
+                        <view class="ranking_details">
85
+                            <view class="ranking_detail_item">
86
+                                <text class="ranking_detail_value">{{ cardData.level }}</text>
87
+                                <text class="ranking_detail_label">等级</text>
88
+                            </view>
89
+                            <view class="ranking_detail_item">
90
+                                <text class="ranking_detail_value">{{ cardData.score }}</text>
91
+                                <text class="ranking_detail_label">评分</text>
92
+                            </view>
93
+                        </view>
94
+                    </view>
95
+                </view>
96
+            </view>
97
+
98
+            <!-- 折线图 -->
99
+            <view class="card_item">
100
+                <view class="chart_header">
101
+                    <i class="iconfont icon-crm-tubiao-zhexiantu" style="font-size: 30rpx;color: #6b7280;"></i>
102
+                    <text class="card_title">近7天排名折线图</text>
103
+                </view>
104
+                <view class="charts_box">
105
+                    <qiun-data-charts type="line" :chartData="chartData" canvasId="uniqueLineChart" :opts="opts"
106
+                        width="700rpx" height="350rpx" backgroundColor="#ffffff" />
107
+                </view>
108
+            </view>
109
+        </view>
110
+        <!-- 最新线索 -->
111
+        <view class="latest_clue">
112
+            <view class="clue_header">
113
+                <text class="card_title">最新线索</text>
114
+                <view class="more_btn" @click="toPrivateClue">
115
+                    <text>更多</text>
116
+                    <u-icon name="arrow-right" size="16" color="#2563eb"></u-icon>
117
+                </view>
118
+            </view>
119
+            <view class="clue_list">
120
+                <view class="clue_item" v-for="(item, index) in clueList" :key="index">
121
+                    <view class="clue_star">
122
+                        <u-icon name="star-fill" size="20" color="#facc15"></u-icon>
123
+                        <text class="clue_name">{{ item.star }}</text>
124
+                    </view>
125
+                    <text class="clue_name">{{ item.clueName }}</text>
126
+                    <view class="clue_info">
127
+                        <text class="clue_title">{{ item.title }}</text>
128
+                        <text class="clue_desc">{{ item.desc }}</text>
129
+                    </view>
130
+                </view>
131
+            </view>
132
+        </view>
133
+    </view>
134
+</template>
135
+
136
+<script>
137
+export default {
138
+    data() {
139
+        return {
140
+            // 卡片数据
141
+            cardData: {
142
+                todayConsume: '0',
143
+                todayPerformance: '12,500',
144
+                countTypeA: '0',
145
+                countTypeB: '2',
146
+                countTypeC: '5',
147
+                visitCount: '1',
148
+                visitRate: '50%',
149
+                dealRate: '25%',
150
+                roi: '1.2',
151
+                beatRate: '60%',
152
+                level: '中',
153
+                score: 'A'
154
+            },
155
+            chartData: {
156
+                categories: ["1", "2", "3", "4", "5", "6", "7"],
157
+                series: [
158
+                    {
159
+                        name: "核心数据",
160
+                        data: [80, 120, 90, 150, 130, 180, 160],
161
+                        color: "#1890ff"
162
+                    }
163
+                ]
164
+            },
165
+            opts: {
166
+                padding: [5, 0, 10, -20],
167
+                backgroundColor: "#ffffff",
168
+                xAxis: {
169
+                    axisLine: { show: true, color: "#e5e5e5", width: 1 },
170
+                    gridLine: { show: true, color: "#f5f5f5", width: 1 },
171
+                    label: { fontSize: 24, color: "#666666", margin: 15 },
172
+                    tickLine: { show: false },
173
+                    lineStyle: {
174
+                        type: 'solid'
175
+                    },
176
+                    axisLabel: {
177
+                        padding: [0, 0, 0, -20]
178
+                    }
179
+                },
180
+                yAxis: {
181
+                    axisLine: { show: true, color: "#e5e5e5", width: 1 },
182
+                    gridLine: { show: true, color: "#f5f5f5", width: 1 },
183
+                    label: { fontSize: 24, color: "#666666", margin: 15 },
184
+                    tickLine: { show: false },
185
+                    splitNumber: 4,
186
+                    min: 0,
187
+                    max: 200
188
+                },
189
+                series: {
190
+                    line: {
191
+                        width: 6, // 折线宽度,确保可见
192
+                        smooth: true, // 先设为直线,便于调试,后续可改为true
193
+                        showSymbol: true, // 显示数据点,确保折线锚点可见
194
+                        symbol: "circle",
195
+                        symbolSize: 24,
196
+                        symbolColor: "#ffffff",
197
+                        symbolBorderColor: "#1890ff",
198
+                        symbolBorderWidth: 8,
199
+                        area: {
200
+                            show: false,
201
+                            color: "linear-gradient(to bottom, rgba(24,144,255,0.2), rgba(24,144,255,0))"
202
+                        }
203
+                    }
204
+                },
205
+                // 提示框:确保悬浮正常显示
206
+                tooltip: {
207
+                    show: true,
208
+                    backgroundColor: "rgba(0,0,0,0.7)",
209
+                    borderRadius: 6,
210
+                    padding: [8, 12],
211
+                    labelFontSize: 22,
212
+                    labelColor: "#ffffff"
213
+                },
214
+                legend: {
215
+                    show: false,
216
+                    position: "top-right",
217
+                    fontSize: 24,
218
+                    color: "#666666",
219
+                    margin: [0, 20, 0, 0]
220
+                },
221
+                title: {
222
+                    show: false,
223
+                    name: "趋势折线图",
224
+                    fontSize: 28,
225
+                    color: "#333333",
226
+                    align: "left",
227
+                    margin: [0, 0, 15, 0]
228
+                }
229
+            },
230
+            clueList: [
231
+                {
232
+                    star: '1',
233
+                    clueName: '张先生',
234
+                    title: 'LV 发财桶',
235
+                    desc: '已经电话沟通,待预约上门'
236
+                },
237
+                {
238
+                    star: '1',
239
+                    clueName: '李女士',
240
+                    title: 'LV 发财桶',
241
+                    desc: '客户说价格有点低...'
242
+                },
243
+                {
244
+                    star: '1',
245
+                    clueName: '王女士',
246
+                    title: 'Hermes Birkin',
247
+                    desc: '暂时没有时间接待'
248
+                },
249
+            ],
250
+        };
251
+    },
252
+
253
+    methods: {
254
+        // 获取卡片数据
255
+        getCardData() {
256
+            // 预留数据获取逻辑
257
+            // 示例:
258
+            // uni.$u.api.getPersonCards().then(res => {
259
+            //   if (res.code === 0) {
260
+            //     this.cardData = res.data;
261
+            //   }
262
+            // });
263
+        },
264
+        // 跳转私有线索页面
265
+        toPrivateClue() {
266
+            uni.switchTab({ url: '/pages/privateClue/index' });
267
+        },
268
+    },
269
+    mounted() {
270
+        this.getCardData();
271
+    }
272
+};
273
+</script>
274
+
275
+<style lang="scss" scoped>
276
+@import './styles/index.scss';
277
+</style>

+ 288 - 0
pages/person/cards/styles/index.scss

@@ -0,0 +1,288 @@
1
+// 卡片容器样式
2
+.person_cards_wrap {
3
+  padding: 20rpx;
4
+  width: 100%;
5
+  box-sizing: border-box;
6
+}
7
+
8
+.cards_container {
9
+  display: flex;
10
+  gap: 10px;
11
+  width: 100%;
12
+  flex-direction: column;
13
+}
14
+
15
+// 卡片基础样式
16
+.card_item {
17
+  background-color: #ffffff;
18
+  border-radius: 20px;
19
+  padding: 24rpx;
20
+  box-sizing: border-box;
21
+  
22
+  &.today {
23
+    display: flex;
24
+    justify-content: space-around;
25
+    .card_item_content{
26
+      display: flex;
27
+      justify-content: center;
28
+      align-items: center;
29
+      flex-direction: column;
30
+      width: 50%;
31
+      border-right: 1rpx solid #e5e7eb;
32
+      &:nth-last-of-type(1){
33
+        border-right: none;
34
+      }
35
+      .card_header{
36
+        .card_title{
37
+          color: #9ca3af;
38
+        }
39
+      }
40
+    }
41
+  }
42
+  
43
+  // 卡片头部样式
44
+  .card_header {
45
+    display: flex;
46
+    justify-content: space-between;
47
+    align-items: center;
48
+    margin-bottom: 20rpx;
49
+    
50
+    &.count{
51
+      justify-content: flex-start;
52
+      gap: 10rpx;
53
+    }
54
+    .card_title {
55
+      font-size: 28rpx;
56
+      font-weight: 600;
57
+      color: #333333;
58
+    }
59
+  }
60
+  
61
+  // 卡片内容样式
62
+  .card_content {
63
+    display: flex;
64
+    flex-direction: column;
65
+    align-items: flex-start;
66
+    
67
+    .card_value {
68
+      font-size: 48rpx;
69
+      font-weight: 700;
70
+      color: #333333;
71
+      margin-bottom: 8rpx;
72
+    }
73
+    
74
+    .card_extra {
75
+      font-size: 24rpx;
76
+      color: #999999;
77
+    }
78
+  }
79
+  
80
+  // 条数统计特殊样式
81
+  .count_stats {
82
+    display: flex;
83
+    width: 100%;
84
+    justify-content: space-around;
85
+    align-items: center;
86
+    .count_item {
87
+      width: 33%;
88
+      display: flex;
89
+      flex-direction: column;
90
+      align-items: center;
91
+      border-right: 1px solid #e5e7eb;
92
+      &:nth-last-of-type(1){
93
+        border-right: none;
94
+      }
95
+      .count_value {
96
+        font-size: 36rpx;
97
+        font-weight: 700;
98
+        color: #333333;
99
+        margin-bottom: 4rpx;
100
+      }
101
+      
102
+      .count_label {
103
+        font-size: 24rpx;
104
+        color: #999999;
105
+      }
106
+    }
107
+  }
108
+  
109
+  // 上门模块特殊样式
110
+  .visit_stats {
111
+    display: flex;
112
+    width: 100%;
113
+    justify-content: space-around;
114
+    align-items: center;
115
+    
116
+    .visit_item {
117
+      display: flex;
118
+      flex-direction: column;
119
+      align-items: center;
120
+      .visit_label {
121
+        font-size: 24rpx;
122
+        color: #999999;
123
+        margin-bottom: 4rpx;
124
+        font-weight: 600;
125
+      }
126
+      
127
+      .visit_value {
128
+        font-size: 38rpx;
129
+        font-weight: 700;
130
+        color: #333333;
131
+        &.visitc_count{
132
+          color: #2563eb;
133
+        }
134
+      }
135
+    }
136
+  }
137
+  
138
+  // 当前排名模块特殊样式
139
+  .ranking_stats {
140
+    display: flex;
141
+    align-items: center;
142
+    justify-content: space-between;
143
+    width: 100%;
144
+    .ranking_icon{
145
+      border-radius: 50%;
146
+      background-color: #fefce8;
147
+      width: 60rpx;
148
+      height: 60rpx;
149
+      display: flex;
150
+      justify-content: center;
151
+      align-items: center;
152
+      margin-right: 20rpx;
153
+    }
154
+    .ranking_info {
155
+      display: flex;
156
+      align-items: center;
157
+      .ranking_info_text{
158
+        display: flex;
159
+        flex-direction: column;
160
+        .card_title{
161
+          font-size: 26rpx;
162
+          font-weight:600;
163
+        }
164
+        .ranking_text {
165
+          font-size: 24rpx;
166
+          color: #9ca3af;
167
+        }
168
+      }
169
+    }
170
+    
171
+    .ranking_details {
172
+      display: flex;
173
+      justify-content: space-around;
174
+      align-items: center;
175
+      .ranking_detail_item {
176
+        display: flex;
177
+        flex-direction: column;
178
+        align-items: center;
179
+        &:nth-of-type(1){
180
+          padding-right: 30rpx;
181
+          border-right: 2rpx solid #e5e7eb;
182
+        }
183
+        &:nth-last-of-type(1){
184
+          padding-left: 30rpx;
185
+        }
186
+        .ranking_detail_label {
187
+          font-size: 24rpx;
188
+          color: #999999;
189
+          margin-bottom: 4rpx;
190
+        }
191
+        
192
+        .ranking_detail_value {
193
+          font-size: 40rpx;
194
+          font-weight: 700;
195
+          color: #000;
196
+        }
197
+      }
198
+    }
199
+  }
200
+  
201
+  // 折线图容器样式
202
+  .charts_box {
203
+    width: 100%;
204
+    height: 200rpx;
205
+    margin-top: 20rpx;
206
+    background-color: #ffffff;
207
+    border-radius: 8rpx;
208
+    box-sizing: border-box;
209
+    box-sizing: border-box;
210
+  }
211
+  .chart_header{
212
+    color: #6b7280;
213
+    font-size: 24rpx;
214
+    font-weight: 600;
215
+    .card_title{
216
+      margin-left: 10rpx;
217
+    }
218
+  }
219
+}
220
+// 最新线索模块特殊样式
221
+.latest_clue{
222
+  margin: 20rpx 0 140rpx;
223
+  display: flex;
224
+  flex-direction: column;
225
+  background-color: #ffffff;
226
+  border-radius: 20rpx;
227
+  .clue_header{
228
+    padding:24rpx;
229
+    display: flex;
230
+    justify-content: space-between;
231
+    align-items: center;
232
+    background-color: #f9fafb;
233
+    border-radius: 10rpx;
234
+    .card_title{
235
+      color: #6b7280;
236
+      font-size:24rpx;
237
+      font-weight: 600;
238
+    }
239
+    .more_btn{
240
+      display:flex;
241
+      justify-content: center;
242
+      align-items: center;
243
+      gap: 4rpx;
244
+      font-size: 24rpx;
245
+      color: #2563eb;
246
+    }
247
+  }
248
+  .clue_list{
249
+    display: flex;
250
+    flex-direction: column;
251
+    gap: 20rpx;
252
+    padding:24rpx;
253
+    .clue_item{
254
+      display: grid;
255
+      grid-template-columns: 1fr 2fr 6fr;
256
+      justify-content: space-between;
257
+      align-items: center;
258
+      color: #333;
259
+      font-size: 28rpx;
260
+      font-weight: 600;
261
+      .clue_star{
262
+        display:flex;
263
+        flex-direction: column;
264
+        justify-content: flex-start;
265
+        align-items: center;
266
+        gap: 4rpx;
267
+        .clue_name{
268
+          font-size: 24rpx;
269
+          font-weight: 600;
270
+          color: #9ca3af;
271
+        }
272
+      }
273
+      .clue_name{
274
+
275
+      }
276
+      .clue_info{
277
+        display:flex;
278
+        flex-direction: column;
279
+        gap: 8rpx;
280
+        .clue_desc{
281
+          font-size: 22rpx;
282
+          color:#9ca3af ;
283
+        }
284
+      }
285
+    }
286
+  }
287
+}
288
+

+ 14 - 4
pages/person/index.vue

@@ -55,8 +55,8 @@
55 55
 					</view>
56 56
 				</view>
57 57
 			</view>
58
-			<view class="secondHalf">
59
-				<option-list></option-list>
58
+			<view class="cards_wrap">
59
+				<cards></cards>
60 60
 			</view>
61 61
 		</template>
62 62
 		<u-loading-page :loading="true" v-else></u-loading-page>
@@ -64,11 +64,13 @@
64 64
 </template>
65 65
 
66 66
 <script>
67
-import optionList from "./option/index.vue"
67
+import cards from "./cards/index.vue"
68
+// import optionList from "./option/index.vue"
68 69
 import permision from "@/js_sdk/wa-permission/permission.js";
69 70
 export default {
70 71
 	components: {
71
-		optionList
72
+		// optionList,
73
+		cards
72 74
 	},
73 75
 	data() {
74 76
 		return {
@@ -342,6 +344,14 @@ export default {
342 344
 			}
343 345
 		}
344 346
 
347
+		.cards_wrap {
348
+			padding: 0 30rpx 0 30rpx;
349
+		}
350
+
351
+		.box {
352
+			height: 200vh;
353
+		}
354
+
345 355
 		.parson_menu_wrap {
346 356
 			background: #ffffff;
347 357
 			border-radius: 20px;

+ 5 - 4
pages/person/option/index.vue

@@ -84,13 +84,14 @@
84 84
 
85 85
 <style lang="scss" scoped>
86 86
 	.option_list {
87
-		margin-top: 30rpx;
88 87
 		.option_item {
89 88
 			display: flex;
90 89
 			justify-content: space-between;
91 90
 			align-items: center;
92
-			height: 120rpx;
91
+			height: 100rpx;
93 92
 			border-bottom: 2rpx solid #dfdfdf;
93
+			background-color: #fff;
94
+			padding: 0 30rpx;
94 95
 			.item_left {
95 96
 				display: flex;
96 97
 				align-items: center;
@@ -101,8 +102,8 @@
101 102
 				}
102 103
 
103 104
 				.label {
104
-					font-size: 30rpx;
105
-					color: #666666;
105
+					font-size: 28rpx;
106
+					color: #202020;
106 107
 				}
107 108
 			}
108 109
 

+ 8 - 3
pages/setting/index.vue

@@ -20,6 +20,9 @@
20 20
 					<u-icon name="arrow-right" color="#aaa"></u-icon>
21 21
 				</view>
22 22
 			</view>
23
+
24
+			<option-list></option-list>
25
+
23 26
 		</view>
24 27
 		<view class="logout_btn">
25 28
 			<u-button type="warning" :plain="true" text="退出账号" size="large" @click="handleShowModal"></u-button>
@@ -33,14 +36,17 @@
33 36
 			cancelColor="#409eff"
34 37
 			:confirmText="'退出登录'" confirmColor="#f8836c">
35 38
 			<view class="modal_box">
36
-				确定要出当前账号
39
+				确定要退出当前账号
37 40
 			</view>
38 41
 		</u-modal>
39 42
 	</view>
40 43
 </template>
41
-
42 44
 <script>
45
+	import OptionList from '@/pages/person/option/index.vue'
43 46
 	export default {
47
+		components: {
48
+			OptionList
49
+		},
44 50
 		data() {
45 51
 			return {
46 52
 				showModal: false
@@ -101,7 +107,6 @@
101 107
 	}
102 108
 
103 109
 	.option_list {
104
-		margin-top: 30rpx;
105 110
 
106 111
 		.option_item {
107 112
 			display: flex;

+ 443 - 0
pages/wareHouse/add.vue

@@ -0,0 +1,443 @@
1
+<template>
2
+    <view>
3
+        <view class="add_page">
4
+            <u-navbar class="nav-bar" title="商品入库" :autoBack="true" :placeholder="true" v-hideNav>
5
+                <view class="u-nav-slot" slot="right">
6
+                    <u-checkbox-group v-model="checkboxValue" placement="column" @change="checkboxChange">
7
+                        <u-checkbox label="连续入库" name="continuous"></u-checkbox>
8
+                    </u-checkbox-group>
9
+                </view>
10
+            </u-navbar>
11
+            <view class="form_list">
12
+                <u--form labelPosition="left" :model="formData" :rules="rules" ref="uForm" labelWidth="100%">
13
+                    <u-form-item label="商品图片" required prop="formData.imgs" borderBottom>
14
+                        <u-upload :fileList="goodPicFileList" @afterRead="afterReadGoodPic" @delete="deleteGoodPic"
15
+                            name="3" multiple :maxCount="9" :previewFullImage="true"></u-upload>
16
+                    </u-form-item>
17
+                    <u-form-item label="商品描述(详细的描述让用户更好的了解您的产品)" required prop="formData.desc" borderBottom>
18
+                        <u--textarea v-model="formData.desc" clearable :placeholder="descPlaceholder" count autoHeight
19
+                            maxlength="250" height="100" confirmType="done"></u--textarea>
20
+                    </u-form-item>
21
+                    <u-form-item label="商品分类" required prop="formData.type" borderBottom>
22
+                        <TabRadio :tabList="typeList" defaultActive="1" @tabChange="handleTabChangeType"></TabRadio>
23
+                    </u-form-item>
24
+                    <u-form-item label="品牌" required prop="formData.brand" class="u-form-item-row" borderBottom>
25
+                        <FormSelectToPage :val="formData.brand" :url="brandToUrl" @handleClear="clear('brand')">
26
+                        </FormSelectToPage>
27
+                    </u-form-item>
28
+                    <u-form-item label="系列" class="u-form-item-row" borderBottom>
29
+                        <u--input v-model="formData.series" placeholder="请输入" clearable border="none"></u--input>
30
+                    </u-form-item>
31
+                    <u-form-item label="型号" class="u-form-item-row" borderBottom>
32
+                        <u--input v-model="formData.model" placeholder="请输入" clearable border="none"></u--input>
33
+                    </u-form-item>
34
+                    <u-form-item label="机芯类型" class="u-form-item-row" borderBottom>
35
+                        <u--input v-model="formData.brand" placeholder="请输入" clearable border="none"></u--input>
36
+                    </u-form-item>
37
+                    <u-form-item label="表壳材质" class="u-form-item-row" borderBottom>
38
+                        <u--input v-model="formData.caseMaterial" placeholder="请输入" clearable border="none"></u--input>
39
+                    </u-form-item>
40
+                    <u-form-item label="表盘直径" class="u-form-item-row" borderBottom>
41
+                        <u--input v-model="formData.dialDiameter" placeholder="请输入" clearable border="none"></u--input>
42
+                    </u-form-item>
43
+                    <u-form-item label="材质" class="u-form-item-row" borderBottom>
44
+                        <u--input v-model="formData.material" placeholder="请输入" clearable border="none"></u--input>
45
+                    </u-form-item>
46
+                    <u-form-item label="尺寸" class="u-form-item-row" borderBottom>
47
+                        <u--input v-model="formData.size" placeholder="请输入" clearable border="none"></u--input>
48
+                    </u-form-item>
49
+                    <u-form-item label="尺码" class="u-form-item-row" borderBottom>
50
+                        <u--input v-model="formData.yardage" placeholder="请输入" clearable border="none"></u--input>
51
+                    </u-form-item>
52
+                    <u-form-item label="官方指导价" class="u-form-item-row" borderBottom>
53
+                        <u--input v-model="formData.price" placeholder="请输入" clearable border="none"></u--input>
54
+                    </u-form-item>
55
+                    <u-form-item label="商品成色" required prop="formData.productCondition" borderBottom>
56
+                        <TabRadio :tabList="productConditionList" defaultActive="2" :colNum="2"
57
+                            @tabChange="handleTabChangeProductCondition"></TabRadio>
58
+                    </u-form-item>
59
+                    <u-form-item label="细节图" borderBottom>
60
+                        <u-upload :fileList="detailVideoFileList" @afterRead="afterReadDeatilVideo"
61
+                            @delete="deleteDetailVideo" name="2" multiple :maxCount="10" accept="video"></u-upload>
62
+                        <u-upload :fileList="detailPicFileList" @afterRead="afterReadDetailPic"
63
+                            @delete="deleteDetailPic" name="1" multiple :maxCount="10"></u-upload>
64
+                    </u-form-item>
65
+                    <u-form-item label="商品标题" borderBottom>
66
+                        <u--textarea v-model="formData.title" clearable :placeholder="titlePlaceholder" count autoHeight
67
+                            maxlength="50" height="100" confirmType="done"></u--textarea>
68
+                    </u-form-item>
69
+                    <u-form-item label="商品货号" class="u-form-item-row" borderBottom>
70
+                        <u--input v-model="formData.productNo" placeholder="请输入" clearable border="none"></u--input>
71
+                    </u-form-item>
72
+                    <u-form-item label="商品属性" required prop="formData.productAttribute" borderBottom>
73
+                        <TabRadio :tabList="productAttributeList" defaultActive="2"
74
+                            @tabChange="handleTabChangeProductAttribute"></TabRadio>
75
+                    </u-form-item>
76
+                    <u-form-item label="库存数量" required prop="formData.stock" class="u-form-item-row" borderBottom>
77
+                        <u--input v-model="formData.stock" placeholder="请输入" clearable border="none"></u--input>
78
+                    </u-form-item>
79
+                    <u-form-item label="总成本价" class="u-form-item-row" borderBottom>
80
+                        <u--input v-model="formData.costPrice" placeholder="请输入" clearable border="none"></u--input>
81
+                    </u-form-item>
82
+                    <u-form-item label="同行价格" class="u-form-item-row" borderBottom>
83
+                        <u--input v-model="formData.samePrice" placeholder="请输入" clearable border="none"></u--input>
84
+                    </u-form-item>
85
+                    <u-form-item label="代理价格" class="u-form-item-row" borderBottom>
86
+                        <u--input v-model="formData.agentPrice" placeholder="请输入" clearable border="none"></u--input>
87
+                    </u-form-item>
88
+                    <u-form-item label="销售价格" class="u-form-item-row" borderBottom>
89
+                        <u--input v-model="formData.salePrice" placeholder="请输入" clearable border="none"></u--input>
90
+                    </u-form-item>
91
+                    <u-form-item label="商品位置" class="u-form-item-row" borderBottom>
92
+                        <u--input v-model="formData.productPosition" placeholder="请输入" clearable
93
+                            border="none"></u--input>
94
+                    </u-form-item>
95
+                    <u-form-item label="鉴定人员" class="u-form-item-row" borderBottom>
96
+                        <u--input v-model="formData.identifyingPerson" placeholder="请输入" clearable
97
+                            border="none"></u--input>
98
+                    </u-form-item>
99
+                    <u-form-item label="回收类型" borderBottom>
100
+                        <TabRadio :tabList="recycleTypeList" defaultActive="2" @tabChange="handleTabChangeRecycleType">
101
+                        </TabRadio>
102
+                    </u-form-item>
103
+                    <u-form-item label="回收人员" class="u-form-item-row" borderBottom>
104
+                        <u--input v-model="formData.recyclePerson" disabled clearable border="none"></u--input>
105
+                    </u-form-item>
106
+                    <u-form-item label="回收留底图" borderBottom>
107
+                        <view class="recycle_bottom_desc">
108
+                            <u--textarea v-model="formData.recycleBottomDesc" clearable count autoHeight maxlength="250"
109
+                                height="100" confirmType="done"></u--textarea>
110
+                            <u-upload :fileList="recycleBottomFileList" @afterRead="afterReadRecycleBottom"
111
+                                @delete="deleteRecycleBottom" name="1" multiple :maxCount="1" accept="image"></u-upload>
112
+                        </view>
113
+                    </u-form-item>
114
+                    <u-form-item label="回收时间" required prop="formData.recycleTime" class="u-form-item-row" borderBottom
115
+                        @click="clickRecycleTimeRow">
116
+                        <FormSelectToPage :val="formData.recycleTime" @deleteItem.stop="clear('recycleTime')">
117
+                        </FormSelectToPage>
118
+                        <u-datetime-picker @confirm="confirmRecycleTime" @close="closeRecycleTimePicker"
119
+                            @cancel="closeRecycleTimePicker" :show="recycleTimeShow" v-model="formData.recycleTime"
120
+                            mode="date"></u-datetime-picker>
121
+                    </u-form-item>
122
+                    <u-form-item label="独立编码" class="u-form-item-row" borderBottom>
123
+                        <u--input v-model="formData.indentifyCode" placeholder="请输入" clearable border="none"></u--input>
124
+                    </u-form-item>
125
+                    <u-form-item label="适用人群" class="u-form-item-row" borderBottom>
126
+                        <u-radio-group v-model="formData.targetAudience" placement="row">
127
+                            <u-radio activeColor="#3c9cff" name="general" label="通用"></u-radio>
128
+                            <u-radio activeColor="#3c9cff" name="man" label="男"></u-radio>
129
+                            <u-radio activeColor="#3c9cff" name="woman" label="女"></u-radio>
130
+                        </u-radio-group>
131
+                    </u-form-item>
132
+                    <u-form-item label="商品保卡" class="u-form-item-row" borderBottom>
133
+                        <u-radio-group v-model="formData.productCard" placement="row">
134
+                            <u-radio activeColor="#3c9cff" name="has" label="有保卡"></u-radio>
135
+                            <u-radio activeColor="#3c9cff" name="no" label="无保卡"></u-radio>
136
+                        </u-radio-group>
137
+                    </u-form-item>
138
+                    <u-form-item label="保卡年份" class="u-form-item-row" borderBottom
139
+                        v-if="formData.productCard === 'has'">
140
+                        <u--input v-model="formData.cardYear" placeholder="不填写默认空白保卡" clearable
141
+                            border="none"></u--input>
142
+                    </u-form-item>
143
+                    <u-form-item label="保卡图片或独立编码照片留底(仅内部人员可见)" borderBottom>
144
+                        <u-upload :fileList="productCardFileList" @afterRead="afterReadProductCard"
145
+                            @delete="deleteProductCard" name="3" multiple :maxCount="9"
146
+                            :previewFullImage="true"></u-upload>
147
+                    </u-form-item>
148
+                    <u-form-item label="商品标签" class="u-form-item-row" borderBottom>
149
+                        <u--input v-model="formData.productTag" placeholder="请输入" clearable border="none"></u--input>
150
+                    </u-form-item>
151
+                    <u-form-item label="商品附件" class="u-form-item-row" borderBottom>
152
+                        <u--input v-model="formData.productAttachment" placeholder="请输入" clearable
153
+                            border="none"></u--input>
154
+                    </u-form-item>
155
+                    <u-form-item label="备注(仅内部人员可见)">
156
+                        <view class="recycle_bottom_desc">
157
+                            <u--textarea v-model="formData.productDesc" clearable count autoHeight maxlength="250"
158
+                                height="100" confirmType="done"></u--textarea>
159
+                            <u-upload :fileList="productCardFileList" @afterRead="afterReadProductCard"
160
+                                @delete="deleteProductCard" name="1" multiple :maxCount="1" accept="image"></u-upload>
161
+                        </view>
162
+                    </u-form-item>
163
+                </u--form>
164
+            </view>
165
+
166
+        </view>
167
+        <view class="btn_group">
168
+            <u-button plain type="primary" @click="submitForm('onlyIn')">仅入库</u-button>
169
+            <u-button type="primary" @click="submitForm('inAndUp')">入库并上架</u-button>
170
+        </view>
171
+    </view>
172
+</template>
173
+<script>
174
+import TabRadio from '@/components/custom-tab-radio/index.vue'
175
+import FormSelectToPage from '@/components/form-select-to-page/index.vue'
176
+export default {
177
+    components: {
178
+        TabRadio,
179
+        FormSelectToPage,
180
+    },
181
+    data() {
182
+        return {
183
+            checkboxValue: [],
184
+
185
+            formData: {
186
+                imgs: [],
187
+                desc: '',
188
+                type: '',
189
+                brand: '',
190
+                series: '',
191
+                model: '',
192
+                caseMaterial: '',
193
+                dialDiameter: '',
194
+                material: '',
195
+                size: '',
196
+                yardage: '',
197
+                price: '',
198
+                productCondition: '',
199
+                productNo: '',
200
+                stock: 1,
201
+                costPrice: '',
202
+                samePrice: '',
203
+                agentPrice: '',
204
+                salePrice: '',
205
+                productPosition: '',
206
+                identifyingPerson: '',
207
+                recycleType: '',
208
+                recyclePerson: '',
209
+                recycleBottomDesc: '',
210
+                recycleTime: null,
211
+                indentifyCode: '',
212
+                targetAudience: '',
213
+                productCard: '',
214
+                cardYear: '',
215
+                productTag: '',
216
+                productAttachment: '',
217
+                productDesc: '',
218
+            },
219
+            rules: {
220
+                imgs: [
221
+                    { required: true, message: '请上传商品图片', trigger: 'blur' },
222
+                ],
223
+                desc: [
224
+                    { required: true, message: '请输入商品描述', trigger: 'blur' },
225
+                ],
226
+                type: [
227
+                    { required: true, message: '请选择商品分类', trigger: 'blur' },
228
+                ],
229
+                brand: [
230
+                    { required: true, message: '请选择品牌', trigger: 'blur' },
231
+                ],
232
+                productCondition: [
233
+                    { required: true, message: '请选择商品成色', trigger: 'blur' },
234
+                ],
235
+                productAttribute: [
236
+                    { required: true, message: '请选择商品属性', trigger: 'blur' },
237
+                ],
238
+                stock: [
239
+                    { required: true, message: '请输入库存数量', trigger: 'blur' },
240
+                ],
241
+                recycleTime: [
242
+                    { required: true, message: '请选择回收时间', trigger: 'blur' },
243
+                ],
244
+
245
+            },
246
+            recycleTimeShow: false,
247
+            descPlaceholder: '95新 WHZ19219H CHANEL香奈儿链条单肩包 21开 牛皮 尺寸25 4 15 配件中溯卡',
248
+            titlePlaceholder: '如不填,自动截取商品描述前50字',
249
+            typeList: [
250
+                {
251
+                    name: '腕表',
252
+                    value: '1',
253
+                },
254
+                {
255
+                    name: '箱包',
256
+                    value: '2',
257
+                },
258
+                {
259
+                    name: '珠宝',
260
+                    value: '3',
261
+                },
262
+                {
263
+                    name: '鞋靴',
264
+                    value: '4',
265
+                },
266
+                {
267
+                    name: '配饰',
268
+                    value: '5',
269
+                },
270
+                {
271
+                    name: '服饰',
272
+                    value: '6',
273
+                },
274
+                {
275
+                    name: '其他',
276
+                    value: '7',
277
+                },
278
+            ],
279
+            productConditionList: [
280
+                {
281
+                    name: '闲置未使用',
282
+                    value: '1',
283
+                },
284
+                {
285
+                    name: '二手',
286
+                    value: '2',
287
+                },
288
+            ],
289
+            productAttributeList: [
290
+                {
291
+                    name: '自有商品',
292
+                    value: '1',
293
+                },
294
+                {
295
+                    name: '寄卖商品',
296
+                    value: '2',
297
+                },
298
+                {
299
+                    name: '质押商品',
300
+                    value: '3',
301
+                },
302
+                {
303
+                    name: '其它',
304
+                    value: '4',
305
+                },
306
+            ],
307
+            recycleTypeList: [
308
+                {
309
+                    name: '其它',
310
+                    value: '1',
311
+                },
312
+                {
313
+                    name: '线上',
314
+                    value: '2',
315
+                },
316
+                {
317
+                    name: '同行',
318
+                    value: '3',
319
+                },
320
+                {
321
+                    name: '门店',
322
+                    value: '4',
323
+                },
324
+            ],
325
+            brandToUrl: '/pages/wareHouse/brandList',
326
+            // 上传
327
+            goodPicFileList: [{ url: 'https://uviewui.com/swiper/1.jpg' }],//商品图片
328
+            detailPicFileList: [],//细节图片
329
+            detailVideoFileList: [],//细节视频
330
+            recycleBottomFileList: [],//回收留底图
331
+            productCardFileList: [],//商品保卡图片或独立编码照片留底
332
+            productTagFileList: [],//商品标签图片留底
333
+        }
334
+    },
335
+    methods: {
336
+        handleTabChange(e) {
337
+            console.log(e);
338
+        },
339
+        clear(key) {
340
+            this.formData[key] = '';
341
+        },
342
+        // 商品成色
343
+        handleTabChangeProductCondition(e) {
344
+            console.log(e);
345
+        },
346
+        // 商品属性
347
+        handleTabChangeProductAttribute(e) {
348
+            console.log(e);
349
+        },
350
+        // 回收类型
351
+        handleTabChangeRecycleType(e) {
352
+            console.log(e);
353
+        },
354
+
355
+        clickRecycleTimeRow() {
356
+            this.recycleTimeShow = true;
357
+        },
358
+        confirmRecycleTime(val) {
359
+            this.formData.recycleTime = this.$dayjs(val.value).format('YYYY-MM-DD');
360
+            console.log(val, this.formData.recycleTime);
361
+            this.recycleTimeShow = false;
362
+        },
363
+        closeRecycleTimePicker(val) {
364
+            console.log(val);
365
+            this.recycleTimeShow = false;
366
+        },
367
+        cancelRecycleTimePicker(val) {
368
+            console.log(val);
369
+            this.recycleTimeShow = false;
370
+        },
371
+        recycleTimeFormatter(value) {
372
+            if (value) {
373
+                console.log(value);
374
+
375
+            }
376
+            return ''
377
+        },
378
+        // 删除商品图片
379
+        deleteGoodPic(event) {
380
+            console.log(event);
381
+            // this[`fileList${event.name}`].splice(event.index, 1);
382
+        },
383
+        // 新增商品图片
384
+        async afterReadGoodPic(event) {
385
+            console.log(event);
386
+            // this.fileList = [...this.fileList, ...event.fileList];
387
+        },
388
+        // 删除细节视频
389
+        deleteVideo(event) {
390
+            console.log(event);
391
+            // this[`fileList${event.name}`].splice(event.index, 1);
392
+        },
393
+        // 新增细节视频
394
+        async afterReadVideo(event) {
395
+            console.log(event);
396
+            // this.fileList2 = [...this.fileList2, ...event.fileList];
397
+        },
398
+        // 删除细节图片
399
+        deleteDetailPic(event) {
400
+            console.log(event);
401
+            // this[`fileList${event.name}`].splice(event.index, 1);
402
+        },
403
+        // 新增细节图片
404
+        async afterReadDetailPic(event) {
405
+            console.log(event);
406
+            // this.fileList1 = [...this.fileList1, ...event.fileList];
407
+        },
408
+        // 删除回收留底图
409
+        deleteRecycleBottom(event) {
410
+            console.log(event);
411
+            // this[`fileList${event.name}`].splice(event.index, 1);
412
+        },
413
+        // 新增回收留底图
414
+        async afterReadRecycleBottom(event) {
415
+            console.log(event);
416
+            // this.fileList3 = [...this.fileList3, ...event.fileList];
417
+        },
418
+        // 删除商品保卡图片或独立编码照片留底
419
+        deleteProductCard(event) {
420
+            console.log(event);
421
+            // this[`fileList${event.name}`].splice(event.index, 1);
422
+        },
423
+        // 新增商品保卡图片或独立编码照片留底
424
+        async afterReadProductCard(event) {
425
+            console.log(event);
426
+            // this.fileList4 = [...this.fileList4, ...event.fileList];
427
+        },
428
+        // 删除商品标签图片留底
429
+        deleteProductTag(event) {
430
+            console.log(event);
431
+            // this[`fileList${event.name}`].splice(event.index, 1);
432
+        },
433
+        // 新增商品标签图片留底
434
+        async afterReadProductTag(event) {
435
+            console.log(event);
436
+            // this.fileList5 = [...this.fileList5, ...event.fileList];
437
+        },
438
+    }
439
+}
440
+</script>
441
+<style lang="scss" scoped>
442
+@import './styles/add.scss';
443
+</style>

+ 368 - 0
pages/wareHouse/brandList.vue

@@ -0,0 +1,368 @@
1
+<template>
2
+    <view class="brand_list_page">
3
+        <view class="brand_list">
4
+            <u-navbar class="nav-bar" title="品牌" :autoBack="true" :placeholder="true" v-hideNav>
5
+                <!-- <view class="u-nav-slot" slot="right" @click="handleAddBrand">
6
+                    <u-icon name="plus-circle" color="#2979ff" size="20"></u-icon>
7
+                    <text>新增</text>
8
+                </view> -->
9
+            </u-navbar>
10
+            <u-search placeholder="搜索" v-model="keyword"></u-search>
11
+            <view class="suggest_list">
12
+                <view class="brand_item" v-for="item in brandList" :key="item.id">
13
+                    <img class="brand_img" :src="item.url" alt="">
14
+                    <view class="brand_name">{{ item.name }}</view>
15
+                </view>
16
+            </view>
17
+        </view>
18
+        <u-index-list :index-list="indexList" class="index_list">
19
+            <template v-for="(item, index) in itemArr">
20
+                <!-- #ifdef APP-NVUE -->
21
+                <u-index-anchor :text="indexList[index]"></u-index-anchor>
22
+                <!-- #endif -->
23
+                <u-index-item>
24
+                    <!-- #ifndef APP-NVUE -->
25
+                    <u-index-anchor :text="indexList[index]"></u-index-anchor>
26
+                    <!-- #endif -->
27
+                    <view class="list-cell" v-for="(cell, index) in item">
28
+                        <img :src="cell.url" alt="">
29
+                        {{ cell.name }}
30
+                    </view>
31
+                </u-index-item>
32
+            </template>
33
+        </u-index-list>
34
+        <view class="no_brand">
35
+            <u-button type="primary" :plain="true" text="找不到品牌" color="#108cff"></u-button>
36
+        </view>
37
+    </view>
38
+</template>
39
+<script>
40
+export default {
41
+    components: {
42
+    },
43
+    props: {
44
+    },
45
+    emits: [],
46
+    data() {
47
+        return {
48
+            keyword: '',
49
+            brandList: [
50
+                {
51
+                    id: 1,
52
+                    name: '品牌1',
53
+                    code: '001',
54
+                    url: './imgs/1.jpg',
55
+                },
56
+                {
57
+                    id: 2,
58
+                    name: '品牌2',
59
+                    code: '002',
60
+                    url: './imgs/1.jpg',
61
+                },
62
+                {
63
+                    id: 1,
64
+                    name: '品牌1',
65
+                    code: '001',
66
+                    url: './imgs/1.jpg',
67
+                },
68
+                {
69
+                    id: 2,
70
+                    name: '品牌2',
71
+                    code: '002',
72
+                    url: './imgs/1.jpg',
73
+                },
74
+                {
75
+                    id: 1,
76
+                    name: '品牌1',
77
+                    code: '001',
78
+                    url: './imgs/1.jpg',
79
+                },
80
+                {
81
+                    id: 1,
82
+                    name: '品牌1',
83
+                    code: '001',
84
+                    url: './imgs/1.jpg',
85
+                },
86
+            ],
87
+            indexList: ["A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z","#"],
88
+            itemArr: [
89
+                [
90
+                    {
91
+                        name:'品牌1',
92
+                        url:require('./imgs/1.jpg'),
93
+                    },
94
+                    {
95
+                        name:'品牌2',
96
+                        url:'./imgs/1.jpg',
97
+                    },
98
+                ],
99
+                [
100
+                    {
101
+                        name:'品牌3',
102
+                        url:'./imgs/1.jpg',
103
+                    },
104
+                    {
105
+                        name:'品牌4',
106
+                        url:'./imgs/1.jpg',
107
+                    },
108
+                ],
109
+                [
110
+                    {
111
+                        name:'品牌5',
112
+                        url:'./imgs/1.jpg',
113
+                    },
114
+                    {
115
+                        name:'品牌6',
116
+                        url:'./imgs/1.jpg',
117
+                    },
118
+                ],
119
+                [
120
+                    {
121
+                        name:'品牌7',
122
+                        url:'./imgs/1.jpg',
123
+                    },
124
+                    {
125
+                        name:'品牌8',
126
+                        url:'./imgs/1.jpg',
127
+                    },
128
+                ],
129
+                [
130
+                    {
131
+                        name:'品牌9',
132
+                        url:'./imgs/1.jpg',
133
+                    },
134
+                    {
135
+                        name:'品牌10',
136
+                        url:'./imgs/1.jpg',
137
+                    },
138
+                ],
139
+                [
140
+                    {
141
+                        name:'品牌11',
142
+                        url:'./imgs/1.jpg',
143
+                    },
144
+                    {
145
+                        name:'品牌12',
146
+                        url:'./imgs/1.jpg',
147
+                    },
148
+                ],
149
+                [
150
+                    {
151
+                        name:'品牌13',
152
+                        url:'./imgs/1.jpg',
153
+                    },
154
+                    {
155
+                        name:'品牌14',
156
+                        url:'./imgs/1.jpg',
157
+                    },
158
+                ],
159
+                [
160
+                    {
161
+                        name:'品牌15',
162
+                        url:'./imgs/1.jpg',
163
+                    },
164
+                    {
165
+                        name:'品牌16',
166
+                        url:'./imgs/1.jpg',
167
+                    },
168
+                ],
169
+                [
170
+                    {
171
+                        name:'品牌17',
172
+                        url:'./imgs/1.jpg',
173
+                    },
174
+                    {
175
+                        name:'品牌18',
176
+                        url:'./imgs/1.jpg',
177
+                    },
178
+                ],
179
+                [
180
+                    {
181
+                        name:'品牌19',
182
+                        url:'./imgs/1.jpg',
183
+                    },
184
+                    {
185
+                        name:'品牌20',
186
+                        url:'./imgs/1.jpg',
187
+                    },
188
+                ],
189
+                [
190
+                    {
191
+                        name:'品牌21',
192
+                        url:'./imgs/1.jpg',
193
+                    },
194
+                    {
195
+                        name:'品牌22',
196
+                        url:'./imgs/1.jpg',
197
+                    },
198
+                ],
199
+                [
200
+                    {
201
+                        name:'品牌23',
202
+                        url:'./imgs/1.jpg',
203
+                    },
204
+                    {
205
+                        name:'品牌24',
206
+                        url:'./imgs/1.jpg',
207
+                    },
208
+                ],
209
+                [
210
+                    {
211
+                        name:'品牌25',
212
+                        url:'./imgs/1.jpg',
213
+                    },
214
+                    {
215
+                        name:'品牌26',
216
+                        url:'./imgs/1.jpg',
217
+                    },
218
+                ],
219
+                [
220
+                    {
221
+                        name:'品牌27',
222
+                        url:'./imgs/1.jpg',
223
+                    },
224
+                    {
225
+                        name:'品牌28',
226
+                        url:'./imgs/1.jpg',
227
+                    },
228
+                ],
229
+                [
230
+                    {
231
+                        name:'品牌25',
232
+                        url:'./imgs/1.jpg',
233
+                    },
234
+                    {
235
+                        name:'品牌26',
236
+                        url:'./imgs/1.jpg',
237
+                    },
238
+                ],
239
+                [
240
+                    {
241
+                        name:'品牌27',
242
+                        url:'./imgs/1.jpg',
243
+                    },
244
+                    {
245
+                        name:'品牌28',
246
+                        url:'./imgs/1.jpg',
247
+                    },
248
+                ],
249
+                [
250
+                    {
251
+                        name:'品牌25',
252
+                        url:'./imgs/1.jpg',
253
+                    },
254
+                    {
255
+                        name:'品牌26',
256
+                        url:'./imgs/1.jpg',
257
+                    },
258
+                ],
259
+                [
260
+                    {
261
+                        name:'品牌27',
262
+                        url:'./imgs/1.jpg',
263
+                    },
264
+                    {
265
+                        name:'品牌28',
266
+                        url:'./imgs/1.jpg',
267
+                    },
268
+                ],
269
+                [
270
+                    {
271
+                        name:'品牌25',
272
+                        url:'./imgs/1.jpg',
273
+                    },
274
+                    {
275
+                        name:'品牌26',
276
+                        url:'./imgs/1.jpg',
277
+                    },
278
+                ],
279
+                [
280
+                    {
281
+                        name:'品牌27',
282
+                        url:'./imgs/1.jpg',
283
+                    },
284
+                    {
285
+                        name:'品牌28',
286
+                        url:'./imgs/1.jpg',
287
+                    },
288
+                ],
289
+                [
290
+                    {
291
+                        name:'品牌25',
292
+                        url:'./imgs/1.jpg',
293
+                    },
294
+                    {
295
+                        name:'品牌26',
296
+                        url:'./imgs/1.jpg',
297
+                    },
298
+                ],
299
+                [
300
+                    {
301
+                        name:'品牌27',
302
+                        url:'./imgs/1.jpg',
303
+                    },
304
+                    {
305
+                        name:'品牌28',
306
+                        url:'./imgs/1.jpg',
307
+                    },
308
+                ],
309
+                [
310
+                    {
311
+                        name:'品牌25',
312
+                        url:'./imgs/1.jpg',
313
+                    },
314
+                    {
315
+                        name:'品牌26',
316
+                        url:'./imgs/1.jpg',
317
+                    },
318
+                ],
319
+                [
320
+                    {
321
+                        name:'品牌27',
322
+                        url:'./imgs/1.jpg',
323
+                    },
324
+                    {
325
+                        name:'品牌28',
326
+                        url:'./imgs/1.jpg',
327
+                    },
328
+                ],
329
+                [
330
+                    {
331
+                        name:'品牌25',
332
+                        url:'./imgs/1.jpg',
333
+                    },
334
+                    {
335
+                        name:'品牌26',
336
+                        url:'./imgs/1.jpg',
337
+                    },
338
+                ],
339
+                [
340
+                    {
341
+                        name:'品牌27',
342
+                        url:'./imgs/1.jpg',
343
+                    },
344
+                    {
345
+                        name:'品牌28',
346
+                        url:'./imgs/1.jpg',
347
+                    },
348
+                ],
349
+                [
350
+                    {
351
+                        name:'##品牌27',
352
+                        url:'./imgs/1.jpg',
353
+                    },
354
+                    {
355
+                        name:'#品牌28',
356
+                        url:'./imgs/1.jpg',
357
+                    },
358
+                ]
359
+            ]
360
+        }
361
+    },
362
+    methods: {
363
+    }
364
+}
365
+</script>
366
+<style lang="scss" scoped>
367
+@import './styles/brandList.scss';
368
+</style>

+ 376 - 0
pages/wareHouse/detail.vue

@@ -0,0 +1,376 @@
1
+<template>
2
+    <view class="detail" @click="handleClickOutside">
3
+        <u-navbar class="nav-bar" title="商品详情档案" :autoBack="true" :placeholder="true" rightIcon="more-dot-fill" v-hideNav></u-navbar>
4
+        <u-swiper :list="imgs" keyName="url" indicator indicatorMode="line" circular>
5
+            <!-- <template v-slot:item="{ item, index }">
6
+                <view style="width: 100%; height: 600rpx;">
7
+                    <image :src="item.url" mode="aspectFill" style="width: 100%; height: 100%; object-fit: cover;"></image>
8
+                </view>
9
+            </template> -->
10
+        </u-swiper>
11
+        
12
+        <!-- 立即下架按钮 -->
13
+        <view class="immediate-off-shelf">
14
+            <u-button type="error" shape="circle" size="large" @click="handleOffShelf">
15
+                <u-icon name="download" size="38rpx" color="#ffffff"></u-icon>
16
+                <text>立即下架</text>
17
+            </u-button>
18
+        </view>
19
+        
20
+        <!-- 轮播图下方操作按钮 -->
21
+        <view class="swiper-actions">
22
+            <view class="action-item">
23
+                <u-icon name="download" size="44rpx" color="#606266"></u-icon>
24
+                <text class="action-text">下载图文</text>
25
+            </view>
26
+            <view class="action-item">
27
+                <u-icon name="share" size="44rpx" color="#606266"></u-icon>
28
+                <text class="action-text">分享</text>
29
+            </view>
30
+            <view class="action-item">
31
+                <u-icon name="camera" size="44rpx" color="#606266"></u-icon>
32
+                <text class="action-text">切换单图</text>
33
+            </view>
34
+            <view class="action-item">
35
+                <u-icon name="cut" size="44rpx" color="#606266"></u-icon>
36
+                <text class="action-text">智能抠图</text>
37
+            </view>
38
+        </view>
39
+        
40
+        <!-- 核心信息区域 -->
41
+        <view class="core-info">
42
+            <view class="section-title">核心信息</view>
43
+            <view class="info-row">
44
+                <view class="info-label">品牌</view>
45
+                <view class="info-value" @click.stop="toggleEditField('brand', coreInfo.brand)">
46
+                    <u-input v-if="editMode.brand" v-model="tempValues.brand" @blur="saveEditField('brand', tempValues.brand, 'core', 'brand')" :autoFocus="true" />
47
+                    <span v-else>{{ coreInfo.brand }}</span>
48
+                </view>
49
+            </view>
50
+            <view class="info-row">
51
+                <view class="info-label">型号</view>
52
+                <view class="info-value" @click.stop="toggleEditField('model', coreInfo.model)">
53
+                    <u-input v-if="editMode.model" v-model="tempValues.model" @blur="saveEditField('model', tempValues.model, 'core', 'model')" :autoFocus="true" />
54
+                    <span v-else>{{ coreInfo.model }}</span>
55
+                </view>
56
+            </view>
57
+            <view class="info-row">
58
+                <view class="info-label">独立编码</view>
59
+                <view class="info-value code" @click.stop="toggleEditField('code', coreInfo.code)">
60
+                    <u-input v-if="editMode.code" v-model="tempValues.code" @blur="saveEditField('code', tempValues.code, 'core', 'code')" :autoFocus="true" />
61
+                    <span v-else>{{ coreInfo.code }}</span>
62
+                </view>
63
+            </view>
64
+            <view class="info-row">
65
+                <view class="info-label">入库日期</view>
66
+                <view class="info-value">{{ coreInfo.warehouseDate }}</view>
67
+            </view>
68
+            <view class="info-row">
69
+                <view class="info-label">付款方式</view>
70
+                <view class="info-value">{{ coreInfo.paymentMethod }}</view>
71
+            </view>
72
+            <view class="info-row col">
73
+                <view class="info-label">备注信息</view>
74
+                <view class="info-value note" @click.stop="toggleEditField('note', coreInfo.note)">
75
+                    <textarea v-if="editMode.note" v-model="tempValues.note" @blur="saveEditField('note', tempValues.note, 'core', 'note')" :autoFocus="true" rows="3" />
76
+                    <span v-else>{{ coreInfo.note }}</span>
77
+                </view>
78
+            </view>
79
+        </view>
80
+        
81
+        <!-- 财务与价格区域 -->
82
+        <view class="finance-price">
83
+            <view class="section-title">财务与价格</view>
84
+            <view class="price-group">
85
+                <view class="price-item">
86
+                    <view class="price-label">原始成本</view>
87
+                    <view class="price-value original" @click.stop="toggleEditField('originalCost', financePrice.originalCost)">
88
+                        <u-input v-if="editMode.originalCost" v-model="tempValues.originalCost" @blur="saveEditField('originalCost', tempValues.originalCost, 'finance', 'originalCost')" :autoFocus="true" />
89
+                        <span v-else>¥{{ financePrice.originalCost }}</span>
90
+                    </view>
91
+                </view>
92
+                <view class="price-item">
93
+                    <view class="price-label">附加成本</view>
94
+                    <view class="price-value additional" @click.stop="toggleEditField('additionalCost', financePrice.additionalCost)">
95
+                        <u-input v-if="editMode.additionalCost" v-model="tempValues.additionalCost" @blur="saveEditField('additionalCost', tempValues.additionalCost, 'finance', 'additionalCost')" :autoFocus="true" />
96
+                        <span v-else>¥{{ financePrice.additionalCost }}</span>
97
+                    </view>
98
+                </view>
99
+            </view>
100
+            <view class="price-group">
101
+                <view class="price-item">
102
+                    <view class="price-label">代理价格</view>
103
+                    <view class="price-value agent" @click.stop="toggleEditField('agentPrice', financePrice.agentPrice)">
104
+                        <u-input v-if="editMode.agentPrice" v-model="tempValues.agentPrice" @blur="saveEditField('agentPrice', tempValues.agentPrice, 'finance', 'agentPrice')" :autoFocus="true" />
105
+                        <span v-else>¥{{ financePrice.agentPrice }}</span>
106
+                    </view>
107
+                </view>
108
+                <view class="price-item">
109
+                    <view class="price-label">建议售价</view>
110
+                    <view class="price-value suggested" @click.stop="toggleEditField('suggestedPrice', financePrice.suggestedPrice)">
111
+                        <u-input v-if="editMode.suggestedPrice" v-model="tempValues.suggestedPrice" @blur="saveEditField('suggestedPrice', tempValues.suggestedPrice, 'finance', 'suggestedPrice')" :autoFocus="true" />
112
+                        <span v-else>¥{{ financePrice.suggestedPrice }}</span>
113
+                    </view>
114
+                </view>
115
+            </view>
116
+        </view>
117
+        
118
+        <!-- 溯源与位置区域 -->
119
+        <view class="traceability-location">
120
+            <view class="section-title">溯源与位置</view>
121
+            <view class="info-row">
122
+                <view class="info-label">商品位置</view>
123
+                <view class="info-value" @click.stop="toggleEditField('location', traceability.location)">
124
+                    <u-input v-if="editMode.location" v-model="tempValues.location" @blur="saveEditField('location', tempValues.location, 'trace', 'location')" :autoFocus="true" />
125
+                    <span v-else>{{ traceability.location }}</span>
126
+                </view>
127
+            </view>
128
+            <view class="info-row">
129
+                <view class="info-label">回收人员</view>
130
+                <view class="info-value" @click.stop="toggleEditField('recoveryPerson', traceability.recoveryPerson)">
131
+                    <u-input v-if="editMode.recoveryPerson" v-model="tempValues.recoveryPerson" @blur="saveEditField('recoveryPerson', tempValues.recoveryPerson, 'trace', 'recoveryPerson')" :autoFocus="true" />
132
+                    <span v-else>{{ traceability.recoveryPerson }}</span>
133
+                </view>
134
+            </view>
135
+            <view class="info-row">
136
+                <view class="info-label">鉴定人员</view>
137
+                <view class="info-value" @click.stop="toggleEditField('authenticationPerson', traceability.authenticationPerson)">
138
+                    <u-input v-if="editMode.authenticationPerson" v-model="tempValues.authenticationPerson" @blur="saveEditField('authenticationPerson', tempValues.authenticationPerson, 'trace', 'authenticationPerson')" :autoFocus="true" />
139
+                    <span v-else>{{ traceability.authenticationPerson }}</span>
140
+                </view>
141
+            </view>
142
+            <view class="action-button">
143
+                <u-button type="primary" plain size="mini" @click="viewLog">查看操作日志(12条)</u-button>
144
+            </view>
145
+        </view>
146
+        
147
+        <!-- 底部功能按钮栏 -->
148
+        <view class="bottom-bar">
149
+            <view class="bar-item" @click.stop="enterGlobalEdit">
150
+                <u-icon name="edit-pen" size="46rpx" color="#9ca3af"></u-icon>
151
+                <text class="bar-text">编辑</text>
152
+            </view>
153
+            <view class="bar-item">
154
+                <u-icon name="lock" size="46rpx" color="#9ca3af"></u-icon>
155
+                <text class="bar-text">锁单</text>
156
+            </view>
157
+            <view class="bar-item">
158
+                <i class="iconfont icon-crm-dayin" style="font-size:46rpx;color: #9ca3af;"></i>
159
+                <text class="bar-text">打印</text>
160
+            </view>
161
+            <view class="bar-item">
162
+                <view class="primary">
163
+                    <u-icon name="bag" size="44rpx" color="#fff"></u-icon>
164
+                    <text class="bar-text">开单</text>
165
+                </view>
166
+            </view>
167
+        </view>
168
+    </view>
169
+</template>
170
+
171
+<script>
172
+    export default {
173
+        data() {
174
+            return {
175
+                imgs: [
176
+                    {
177
+                        url: 'https://img2.baidu.com/it/u=2737617573,3814711807&fm=253&fmt=auto&app=120&f=JPEG?w=800&h=800'
178
+                    },
179
+                    {
180
+                        url: 'https://img2.baidu.com/it/u=3621921167,4010012360&fm=253&fmt=auto?w=760&h=760'
181
+                    },
182
+                    {
183
+                        url: 'https://img2.baidu.com/it/u=1250952949,1454201719&fm=253&fmt=auto&app=138&f=JPEG?w=800&h=1067'
184
+                    }
185
+                ],
186
+                // 核心信息模拟数据
187
+                coreInfo: {
188
+                    brand: 'Rolex',
189
+                    model: 'Submariner Date 126610LN',
190
+                    code: 'AUTO_1002391',
191
+                    warehouseDate: '2025-12-14 10:00',
192
+                    paymentMethod: '线上转账',
193
+                    note: '单包 附件齐全 成色极好'
194
+                },
195
+                // 财务与价格模拟数据
196
+                financePrice: {
197
+                    originalCost: '82,000',
198
+                    additionalCost: '500',
199
+                    agentPrice: '85,500',
200
+                    suggestedPrice: '89,000'
201
+                },
202
+                // 溯源与位置模拟数据
203
+                traceability: {
204
+                    location: '上海A仓',
205
+                    recoveryPerson: 'IT秦',
206
+                    authenticationPerson: '中检-刘师傅'
207
+                },
208
+                // 编辑状态管理
209
+                editMode: {
210
+                    // 核心信息编辑状态
211
+                    brand: false,
212
+                    model: false,
213
+                    code: false,
214
+                    note: false,
215
+                    // 财务与价格编辑状态
216
+                    originalCost: false,
217
+                    additionalCost: false,
218
+                    agentPrice: false,
219
+                    suggestedPrice: false,
220
+                    // 溯源与位置编辑状态
221
+                    location: false,
222
+                    recoveryPerson: false,
223
+                    authenticationPerson: false
224
+                },
225
+                // 全局编辑模式
226
+                globalEditMode: false,
227
+                // 临时存储编辑值
228
+                tempValues: {}
229
+            }
230
+        },
231
+        methods: {
232
+            // 查看操作日志的方法
233
+            viewLog() {
234
+                // 查看操作日志的方法
235
+                console.log('查看操作日志');
236
+            },
237
+            
238
+            // 立即下架按钮处理方法
239
+            handleOffShelf() {
240
+                // 处理下架逻辑
241
+                uni.showModal({
242
+                    title: '确认下架',
243
+                    content: '确定要将此商品下架吗?',
244
+                    success: (res) => {
245
+                        if (res.confirm) {
246
+                            console.log('商品已下架');
247
+                            uni.showToast({
248
+                                title: '已下架',
249
+                                icon: 'success'
250
+                            });
251
+                        }
252
+                    }
253
+                });
254
+            },
255
+            // 切换单个字段的编辑状态
256
+            toggleEditField(field, value) {
257
+                // 如果不是全局编辑模式
258
+                if (!this.globalEditMode) {
259
+                    // 重置所有编辑状态
260
+                    this.resetEditMode();
261
+                    // 设置当前字段为编辑状态
262
+                    this.editMode[field] = true;
263
+                    // 保存临时值
264
+                    this.tempValues[field] = value;
265
+                }
266
+            },
267
+            // 保存单个字段的编辑值
268
+            saveEditField(field, newValue, type, fieldName) {
269
+                // 更新对应的数据
270
+                if (type === 'core') {
271
+                    this.coreInfo[fieldName] = newValue;
272
+                } else if (type === 'finance') {
273
+                    this.financePrice[fieldName] = newValue;
274
+                } else if (type === 'trace') {
275
+                    this.traceability[fieldName] = newValue;
276
+                }
277
+                // 退出编辑状态
278
+                this.editMode[field] = false;
279
+                // 清空临时值
280
+                delete this.tempValues[field];
281
+                // 模拟保存操作
282
+                console.log(`保存${field}字段值: ${newValue}`);
283
+            },
284
+            // 进入全局编辑模式
285
+            enterGlobalEdit() {
286
+                this.globalEditMode = true;
287
+                // 设置所有可编辑字段为编辑状态
288
+                this.editMode = {
289
+                    brand: true,
290
+                    model: true,
291
+                    code: true,
292
+                    note: true,
293
+                    originalCost: true,
294
+                    additionalCost: true,
295
+                    agentPrice: true,
296
+                    suggestedPrice: true,
297
+                    location: true,
298
+                    recoveryPerson: true,
299
+                    authenticationPerson: true
300
+                };
301
+                // 保存所有字段的临时值
302
+                this.tempValues = {
303
+                    brand: this.coreInfo.brand,
304
+                    model: this.coreInfo.model,
305
+                    code: this.coreInfo.code,
306
+                    note: this.coreInfo.note,
307
+                    originalCost: this.financePrice.originalCost,
308
+                    additionalCost: this.financePrice.additionalCost,
309
+                    agentPrice: this.financePrice.agentPrice,
310
+                    suggestedPrice: this.financePrice.suggestedPrice,
311
+                    location: this.traceability.location,
312
+                    recoveryPerson: this.traceability.recoveryPerson,
313
+                    authenticationPerson: this.traceability.authenticationPerson
314
+                };
315
+            },
316
+            // 保存全局编辑模式下的所有修改
317
+            saveGlobalEdit() {
318
+                // 保存所有临时值到原始数据
319
+                // 核心信息
320
+                if (this.tempValues.brand !== undefined) this.coreInfo.brand = this.tempValues.brand;
321
+                if (this.tempValues.model !== undefined) this.coreInfo.model = this.tempValues.model;
322
+                if (this.tempValues.code !== undefined) this.coreInfo.code = this.tempValues.code;
323
+                if (this.tempValues.note !== undefined) this.coreInfo.note = this.tempValues.note;
324
+                
325
+                // 财务与价格
326
+                if (this.tempValues.originalCost !== undefined) this.financePrice.originalCost = this.tempValues.originalCost;
327
+                if (this.tempValues.additionalCost !== undefined) this.financePrice.additionalCost = this.tempValues.additionalCost;
328
+                if (this.tempValues.agentPrice !== undefined) this.financePrice.agentPrice = this.tempValues.agentPrice;
329
+                if (this.tempValues.suggestedPrice !== undefined) this.financePrice.suggestedPrice = this.tempValues.suggestedPrice;
330
+                
331
+                // 溯源与位置
332
+                if (this.tempValues.location !== undefined) this.traceability.location = this.tempValues.location;
333
+                if (this.tempValues.recoveryPerson !== undefined) this.traceability.recoveryPerson = this.tempValues.recoveryPerson;
334
+                if (this.tempValues.authenticationPerson !== undefined) this.traceability.authenticationPerson = this.tempValues.authenticationPerson;
335
+                
336
+                this.globalEditMode = false;
337
+                // 退出所有编辑状态
338
+                this.resetEditMode();
339
+                // 清空临时值
340
+                this.tempValues = {};
341
+                // 模拟保存操作
342
+                console.log('保存所有字段值');
343
+            },
344
+            // 重置所有编辑状态
345
+            resetEditMode() {
346
+                Object.keys(this.editMode).forEach(key => {
347
+                    this.editMode[key] = false;
348
+                });
349
+            },
350
+            // 点击页面其他地方保存所有编辑
351
+            handleClickOutside() {
352
+                if (this.globalEditMode) {
353
+                    this.saveGlobalEdit();
354
+                } else {
355
+                    // 保存当前正在编辑的字段
356
+                    Object.keys(this.editMode).forEach(key => {
357
+                        if (this.editMode[key]) {
358
+                            // 根据字段名确定类型和字段名
359
+                            if (['brand', 'model', 'code', 'note'].includes(key)) {
360
+                                this.saveEditField(key, this.tempValues[key], 'core', key);
361
+                            } else if (['originalCost', 'additionalCost', 'agentPrice', 'suggestedPrice'].includes(key)) {
362
+                                this.saveEditField(key, this.tempValues[key], 'finance', key);
363
+                            } else if (['location', 'recoveryPerson', 'authenticationPerson'].includes(key)) {
364
+                                this.saveEditField(key, this.tempValues[key], 'trace', key);
365
+                            }
366
+                        }
367
+                    });
368
+                }
369
+            }
370
+        }
371
+    }
372
+</script>
373
+
374
+<style lang="scss" scoped>
375
+@import "./styles/detail.scss";
376
+</style>

BIN
pages/wareHouse/imgs/1.jpg


+ 211 - 0
pages/wareHouse/index.vue

@@ -0,0 +1,211 @@
1
+<template>
2
+	<view class="page">
3
+		<view class="page-container">
4
+			<u-navbar class="nav-bar" title="库存管理" :autoBack="true" :placeholder="true" v-hideNav></u-navbar>
5
+			<!-- 总资产成本区域 -->
6
+			<view class="asset-header">
7
+				<view class="asset-text-wrap">
8
+					<view class="asset-title-con">
9
+						<view class="asset-title">总资产成本(元)</view>
10
+						<u-icon name="question-circle" size="14" color="#999999"></u-icon>
11
+					</view>
12
+					<text class="asset-value">3,869,014</text>
13
+				</view>
14
+				<u-button class="view-btn" type="text" size="mini">查看财务报表</u-button>
15
+			</view>
16
+			<view class="data-cards">
17
+				<view class="card-item">
18
+					<text class="card-label">今日上传</text>
19
+					<text class="card-value">12</text>
20
+				</view>
21
+				<view class="card-item">
22
+					<text class="card-label">今日下架</text>
23
+					<text class="card-value green">8</text>
24
+				</view>
25
+				<view class="card-item">
26
+					<text class="card-label">商品总数</text>
27
+					<text class="card-value">2</text>
28
+				</view>
29
+			</view>
30
+
31
+			<view class="search-wrapper">
32
+				<u-search placeholder="搜索编号、名称、品牌..." bg-color="#f9fafb" border-radius="4rpx"
33
+					:show-action="false" class="search-input-wrap"></u-search>
34
+				<view class="search-filter-btn">
35
+					<u-icon name="list" size="22" color="#666666"></u-icon>
36
+				</view>
37
+			</view>
38
+
39
+			<view class="category-tabs-wrap">
40
+				<u-tabs :list="tabList" :is-scroll="true" active-color="#007aff" inactive-color="#666666" font-size="28rpx"
41
+					border-bottom="none" @change="switchTab" class="u-tabs-custom"></u-tabs>
42
+			</view>
43
+
44
+			<view class="filter-bar">
45
+				<view class="sort-btn">
46
+					<text class="sort-text">{{ currentSortText }}</text>
47
+					<u-icon name="arrow-down" size="12" color="#666666" class="sort-icon"></u-icon>
48
+				</view>
49
+
50
+				<view class="price-layout-btn">
51
+					<view class="price-btn" type="text">
52
+						<u-icon name="eye" size="18" color="#1890ff" class="price-icon"></u-icon>
53
+						<text class="price-text">价格可见</text>
54
+					</view>
55
+
56
+					<view class="layout-btn" type="text" size="mini">
57
+						<u-icon name="grid" size="20" color="#666666"></u-icon>
58
+					</view>
59
+				</view>
60
+			</view>
61
+
62
+			<view class="goods-list">
63
+				<view @click="handleToDetail" class="goods-item" v-for="(goods, goodsIndex) in goodsList" :key="`goods-${goodsIndex}`">
64
+					<view class="goods-img-container">
65
+						<image class="goods-img" :src="goods.imgUrl" mode="aspectFill" lazy-load></image>
66
+						<view class="stock-indicator"
67
+							v-if="goods.stock !== null && goods.stock !== undefined && goods.stock > 0"></view>
68
+					</view>
69
+
70
+					<view class="goods-info">
71
+						<text class="goods-brand">{{ goods.brand || '' }}</text>
72
+						<text class="goods-name">{{ goods.name || '' }}</text>
73
+
74
+						<view class="price-group">
75
+							<view class="price-items">
76
+								<view class="price-item">
77
+									<text class="price-type">成本价</text>
78
+									<text class="price">¥{{ goods.costPrice }}</text>
79
+								</view>
80
+								<view class="price-item">
81
+									<text class="price-type">销售价</text>
82
+									<text class="price sales">¥{{ goods.salesPrice }}</text>
83
+								</view>
84
+							</view>
85
+							<view class="price-items">
86
+								<view class="price-item">
87
+									<text class="price-type">同行价</text>
88
+									<text class="price">¥{{ goods.peerPrice }}</text>
89
+								</view>
90
+								<view class="price-item">
91
+									<text class="price-type">代理价</text>
92
+									<text class="price">¥{{ goods.agentPrice }}</text>
93
+								</view>
94
+							</view>
95
+						</view>
96
+
97
+						<view class="others">
98
+							<view class="other-item stock" >得</view>
99
+							<view class="other-item">得</view>
100
+							<view class="other-item">得</view>
101
+						</view>
102
+					</view>
103
+					<view class="more">
104
+						<u-icon name="more-dot-fill" size="16" color="#666666"></u-icon>
105
+						<text class="goods-stock"
106
+							v-if="goods.stock !== null && goods.stock !== undefined && goods.stock > 0">数量:{{ goods.stock
107
+							}}</text>
108
+					</view>
109
+				</view>
110
+			</view>
111
+			
112
+		</view>
113
+		<!-- 添加按钮 -->
114
+		<view class="add-button" @click="handleAdd">
115
+			<u-icon name="plus" size="36" color="#ffffff"></u-icon>
116
+		</view>
117
+	</view>
118
+	
119
+</template>
120
+
121
+<script>
122
+export default {
123
+	data() {
124
+		return {
125
+			tabList: [
126
+				{ name: "全部" },
127
+				{ name: "腕表" },
128
+				{ name: "箱包" },
129
+				{ name: "珠宝" },
130
+				{ name: "鞋靴" },
131
+				{ name: "配饰" },
132
+				{ name: "服饰" },
133
+				{ name: "其它" }
134
+			],
135
+			currentSortText: '按最近更新排序',
136
+			goodsList: [
137
+				{
138
+					imgUrl: require("./imgs/1.jpg"),
139
+					brand: "ROLEX",
140
+					name: "Submariner Date 126610LN",
141
+					costPrice: "92,500",
142
+					salesPrice: "89,000",
143
+					peerPrice: "92,500",
144
+					agentPrice: "89,000",
145
+					stock: 1
146
+				},
147
+				{
148
+					imgUrl: require("./imgs/1.jpg"),
149
+					brand: "ROLEX",
150
+					name: "Submariner Date 126610LN",
151
+					costPrice: "92,500",
152
+					salesPrice: "89,000",
153
+					peerPrice: "92,500",
154
+					agentPrice: "89,000",
155
+					stock: 1
156
+				},
157
+				{
158
+					imgUrl: require("./imgs/1.jpg"),
159
+					brand: "ROLEX",
160
+					name: "Submariner Date 126610LN",
161
+					costPrice: "92,500",
162
+					salesPrice: "89,000",
163
+					peerPrice: "92,500",
164
+					agentPrice: "89,000",
165
+					stock: 1
166
+				},
167
+				{
168
+					imgUrl: require("./imgs/1.jpg"),
169
+					brand: "ROLEX",
170
+					name: "Submariner Date 126610LN",
171
+					costPrice: "92,500",
172
+					salesPrice: "89,000",
173
+					peerPrice: "92,500",
174
+					agentPrice: "89,000",
175
+					stock: 1
176
+				},
177
+				{
178
+					imgUrl: require("./imgs/1.jpg"),
179
+					brand: "ROLEX",
180
+					name: "Submariner Date 126610LN",
181
+					costPrice: "92,500",
182
+					salesPrice: "89,000",
183
+					peerPrice: "92,500",
184
+					agentPrice: "89,000",
185
+					stock: 1
186
+				}
187
+			]
188
+		};
189
+	},
190
+	methods: {
191
+		switchTab(index) {
192
+			console.log("当前选中标签索引:", index);
193
+		},
194
+		handleToDetail() {
195
+			uni.navigateTo({
196
+				url: `/pages/wareHouse/detail`
197
+			});
198
+		},
199
+		handleAdd() {
200
+			console.log("点击添加按钮");
201
+			uni.navigateTo({
202
+				url: `/pages/wareHouse/add`
203
+			});
204
+		},
205
+	}
206
+};
207
+</script>
208
+
209
+<style lang="scss" scoped>
210
+@import "./styles/index.scss";
211
+</style>

+ 50 - 0
pages/wareHouse/styles/add.scss

@@ -0,0 +1,50 @@
1
+.add_page {
2
+    background-color: #f9fafb;
3
+    height: 100%;
4
+    padding: 20rpx;
5
+
6
+    .form_list {
7
+        background-color: #fff;
8
+        padding: 0 20rpx;
9
+        margin-bottom: 120rpx;
10
+    }
11
+
12
+}
13
+
14
+.btn_group {
15
+    position: fixed;
16
+    bottom: 0;
17
+    padding: 20rpx;
18
+    display: grid;
19
+    grid-template-columns: 1fr 1fr;
20
+    gap: 10px;
21
+    box-shadow: 0 4px 25px 2px rgba(0, 0, 0, 0.1);
22
+    background: #fff;
23
+    z-index: 1;
24
+    width:fill-available;
25
+}
26
+
27
+::v-deep .u-form-item {
28
+    .recycle_bottom_desc {
29
+        display: flex;
30
+        flex-direction: column;
31
+        gap: 20rpx;
32
+        width: 100%;
33
+    }
34
+
35
+    .u-form-item__body {
36
+        display: flex;
37
+        flex-direction: column !important;
38
+        gap: 20rpx;
39
+    }
40
+
41
+    &.u-form-item-row {
42
+        .u-form-item__body {
43
+            flex-direction: row !important;
44
+
45
+            .u-form-item__body__left {
46
+                width: auto !important;
47
+            }
48
+        }
49
+    }
50
+}

+ 73 - 0
pages/wareHouse/styles/brandList.scss

@@ -0,0 +1,73 @@
1
+.brand_list_page {
2
+    width: 100%;
3
+
4
+    .brand_list {
5
+        background-color: #fff;
6
+        padding: 20rpx;
7
+
8
+        .u-nav-slot {
9
+            display: flex;
10
+            align-items: center;
11
+            gap: 10rpx;
12
+        }
13
+
14
+        .suggest_list {
15
+            margin-top: 20rpx;
16
+            display: grid;
17
+            grid-template-columns: repeat(4, 1fr);
18
+            gap: 20rpx;
19
+
20
+            .brand_item {
21
+                display: flex;
22
+                flex-direction: column;
23
+                align-items: center;
24
+
25
+                .brand_img {
26
+                    width: 100rpx;
27
+                    height: 100rpx;
28
+                }
29
+
30
+                .brand_name {
31
+                    font-size: 28rpx;
32
+                    font-weight: 600;
33
+                }
34
+            }
35
+        }
36
+
37
+    }
38
+    .index_list{
39
+        ::v-deep .uni-scroll-view-content{
40
+            margin-bottom: 120rpx;
41
+        }
42
+    }
43
+    .no_brand{
44
+        position:fixed;
45
+        bottom:0;
46
+        left: 0;
47
+        right: 0;
48
+        padding: 20rpx;
49
+        background-color: #fff;
50
+        z-index: 1;
51
+        ::v-deep .u-button__text{
52
+            color: #108cff;
53
+        }
54
+    }
55
+}
56
+::v-deep .u-index-anchor{
57
+    background-color: #efefef !important;
58
+}
59
+::v-deep .u-border-bottom{
60
+    border:none;
61
+}
62
+::v-deep .list-cell{
63
+    font-size: 28rpx;
64
+    display: flex;
65
+    align-items: center;
66
+    gap: 20rpx;
67
+    padding: 16rpx;
68
+    border-bottom: 1rpx solid #f0eded;
69
+    img{
70
+        width: 160rpx;
71
+        height: 80rpx;
72
+    }
73
+}

+ 358 - 0
pages/wareHouse/styles/detail.scss

@@ -0,0 +1,358 @@
1
+.detail{
2
+    padding-bottom: 130rpx; // 为底部固定栏留出空间
3
+    // 轮播图样式
4
+    ::v-deep .u-swiper {
5
+        height: 600rpx !important;
6
+    }
7
+    
8
+    ::v-deep .u-swiper__wrapper{
9
+        height: 100% !important;
10
+    }
11
+    
12
+    ::v-deep .u-swiper__wrapper__item {
13
+        height: 100% !important;
14
+    }
15
+    
16
+    ::v-deep .u-swiper__wrapper__item__wrapper {
17
+        height: 100% !important;
18
+    }
19
+    
20
+    ::v-deep .u-swiper__wrapper__item__wrapper__image{
21
+        height: 100% !important;
22
+        width: 100% !important;
23
+        object-fit: cover !important;
24
+    }
25
+    
26
+    ::v-deep .u-swiper__indicator{
27
+        bottom: 20rpx !important;
28
+    }
29
+    
30
+    ::v-deep .u-swiper__indicator-item{
31
+        background-color: rgba(255, 255, 255, 0.5) !important;
32
+    }
33
+    
34
+    ::v-deep .u-swiper__indicator-item--active{
35
+        background-color: #ffffff !important;
36
+    }
37
+    
38
+    // 立即下架按钮
39
+    .immediate-off-shelf {
40
+        position: fixed;
41
+        bottom: 130rpx;
42
+        right: 20rpx;
43
+        z-index: 999;
44
+        animation: bounce 2s infinite;
45
+        
46
+        ::v-deep .u-button {
47
+            background-color: #1f2937;
48
+            border-radius: 60rpx;
49
+            padding: 10rpx 36rpx;
50
+            height: 84rpx;
51
+            line-height: 84rpx;
52
+            box-shadow:  0 20px 25px -5px rgb(0 0 0 / 0.1);
53
+            font-size: 28rpx;
54
+            font-weight: 600;
55
+            display: flex;
56
+            align-items: center;
57
+            gap: 8rpx;
58
+            border: none !important;
59
+        }
60
+        
61
+        ::v-deep .u-button--error {
62
+            border: none !important;
63
+        }
64
+        
65
+        ::v-deep .u-icon {
66
+            margin-right: 4rpx;
67
+        }
68
+    }
69
+    
70
+    // 上下跳动动画
71
+    @keyframes bounce {
72
+        0%, 100% {
73
+            transform: translateY(0);
74
+        }
75
+        50% {
76
+            transform: translateY(-10rpx);
77
+        }
78
+    }
79
+    
80
+    // 轮播图下方操作按钮
81
+    .swiper-actions{
82
+        display: flex;
83
+        justify-content: space-around;
84
+        align-items: center;
85
+        padding: 40rpx 0;
86
+        background-color: #ffffff;
87
+        border-bottom: 1rpx solid #e8e8e8;
88
+        
89
+        .action-item{
90
+            display: flex;
91
+            flex-direction: column;
92
+            align-items: center;
93
+            justify-content: center;
94
+            ::v-deep .u-icon{
95
+                background-color: #f9fafb;
96
+                border-radius: 20rpx;
97
+                padding:20rpx;
98
+            }
99
+            .action-text{
100
+                margin-top: 16rpx;
101
+                font-size: 22rpx;
102
+                font-weight: 500;
103
+                color: #606266;
104
+            }
105
+        }
106
+    }
107
+    
108
+    
109
+    // 底部功能按钮栏
110
+    .bottom-bar{
111
+        position: fixed;
112
+        bottom: 0;
113
+        left: 0;
114
+        right: 0;
115
+        height: 120rpx;
116
+        background-color: #fff;
117
+        display: flex;
118
+        align-items: center;
119
+        justify-content: space-around;
120
+        box-shadow: 0 -2rpx 10rpx rgba(0, 0, 0, 0.1);
121
+        
122
+        .bar-item{
123
+            flex: 1;
124
+            height: 100%;
125
+            display: flex;
126
+            flex-direction: column;
127
+            align-items: center;
128
+            justify-content: center;
129
+            
130
+            .primary{
131
+                display: flex;
132
+                align-items: center;
133
+                gap: 8rpx;
134
+                padding: 14rpx 22rpx;
135
+                border-radius: 20rpx;
136
+                background-color: #ca8a04;
137
+                box-shadow: 0 10px 15px -3px #fef08a, 0 4px 6px -4px #fef08a;
138
+                .bar-text{
139
+                    margin-top: 0;
140
+                    color: #ffffff;
141
+                    font-size: 23rpx;
142
+                }
143
+            }
144
+            
145
+            .bar-text{
146
+                margin-top: 8rpx;
147
+                font-size: 20rpx;
148
+                font-weight: 500;
149
+                color: #9ca3af;
150
+                line-height: 32rpx;
151
+            }
152
+        }
153
+    }
154
+    
155
+    // 核心信息区域样式
156
+    .core-info {
157
+        background-color: #ffffff;
158
+        margin: 20rpx 20rpx 0 20rpx;
159
+        padding: 30rpx;
160
+        border-radius: 16rpx;
161
+        box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
162
+        
163
+        .section-title {
164
+            font-size: 32rpx;
165
+            font-weight: 600;
166
+            color: #303133;
167
+            margin-bottom: 24rpx;
168
+            padding-bottom: 16rpx;
169
+            border-bottom: 1rpx solid #e8e8e8;
170
+        }
171
+        
172
+        .info-row {
173
+            display: flex;
174
+            padding: 16rpx 0;
175
+            
176
+            .info-label {
177
+                flex: 1;
178
+                color: #909399;
179
+                font-size: 28rpx;
180
+                line-height: 40rpx;
181
+            }
182
+            
183
+            .info-value {
184
+                flex: 2;
185
+                color: #303133;
186
+                font-size: 28rpx;
187
+                line-height: 40rpx;
188
+                text-align: right;  
189
+                font-weight: 600;
190
+                &.code{
191
+                    color: #909399;
192
+                }         
193
+                &.note {
194
+                    background-color: #f5f7fa;
195
+                    padding: 16rpx;
196
+                    border-radius: 10rpx;
197
+                    color: #909399;
198
+                    text-align: left;
199
+                }
200
+            }
201
+
202
+            &.col{
203
+                gap: 16rpx;
204
+                flex-direction: column;
205
+            }
206
+        }
207
+    }
208
+    
209
+    // 财务与价格区域样式
210
+    .finance-price {
211
+        background-color: #ffffff;
212
+        margin: 20rpx 20rpx 0 20rpx;
213
+        padding: 30rpx;
214
+        border-radius: 16rpx;
215
+        box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
216
+        
217
+        .section-title {
218
+            font-size: 32rpx;
219
+            font-weight: 600;
220
+            color: #303133;
221
+            margin-bottom: 24rpx;
222
+            padding-bottom: 16rpx;
223
+            border-bottom: 1rpx solid #e8e8e8;
224
+        }
225
+        
226
+        .price-group {
227
+            display: flex;
228
+            justify-content: space-between;
229
+            margin-bottom: 24rpx;
230
+            
231
+            &:last-child {
232
+                margin-bottom: 0;
233
+            }
234
+        }
235
+        
236
+        .price-item {
237
+            flex: 1;
238
+            display: flex;
239
+            flex-direction: column;
240
+            align-items: center;
241
+            
242
+            &:first-child {
243
+                padding-right: 30rpx;
244
+            }
245
+            
246
+            &:last-child {
247
+                padding-left: 30rpx;
248
+            }
249
+        }
250
+        
251
+        .price-label {
252
+            color: #909399;
253
+            font-size: 24rpx;
254
+            margin-bottom: 12rpx;
255
+        }
256
+        
257
+        .price-value {
258
+            font-size: 36rpx;
259
+            font-weight: 600;
260
+            
261
+            &.original {
262
+                color: #303133;
263
+            }
264
+            
265
+            &.additional {
266
+                color: #1890ff;
267
+            }
268
+            
269
+            &.agent {
270
+                color: #303133;
271
+            }
272
+            
273
+            &.suggested {
274
+                color: #f56c6c;
275
+            }
276
+        }
277
+    }
278
+    
279
+    // 溯源与位置区域样式
280
+    .traceability-location {
281
+        background-color: #ffffff;
282
+        margin: 20rpx;
283
+        padding: 30rpx;
284
+        border-radius: 16rpx;
285
+        box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.05);
286
+        
287
+        .section-title {
288
+            font-size: 32rpx;
289
+            font-weight: 600;
290
+            color: #303133;
291
+            margin-bottom: 24rpx;
292
+            padding-bottom: 16rpx;
293
+            border-bottom: 1rpx solid #e8e8e8;
294
+        }
295
+        
296
+        .info-row {
297
+            display: flex;
298
+            padding: 16rpx 0;
299
+            
300
+            .info-label {
301
+                flex: 1;
302
+                color: #909399;
303
+                font-size: 28rpx;
304
+                line-height: 40rpx;
305
+            }
306
+            
307
+            .info-value {
308
+                flex: 2;
309
+                color: #303133;
310
+                font-size: 28rpx;
311
+                line-height: 40rpx;
312
+                text-align: right;
313
+                ::v-deep .u-input {
314
+                    border: 1rpx solid #dcdfe6;
315
+                    border-radius: 8rpx;
316
+                    padding: 10rpx 16rpx;
317
+                    font-size: 28rpx;
318
+                    color: #303133;
319
+                    
320
+                    &:focus {
321
+                        border-color: #409eff;
322
+                        box-shadow: 0 0 0 2rpx rgba(64, 158, 255, 0.2);
323
+                    }
324
+                }
325
+                
326
+                textarea {
327
+                    width: 100%;
328
+                    border: 1rpx solid #dcdfe6;
329
+                    border-radius: 8rpx;
330
+                    padding: 10rpx 16rpx;
331
+                    font-size: 28rpx;
332
+                    color: #303133;
333
+                    line-height: 40rpx;
334
+                    resize: none;
335
+                    
336
+                    &:focus {
337
+                        border-color: #409eff;
338
+                        box-shadow: 0 0 0 2rpx rgba(64, 158, 255, 0.2);
339
+                    }
340
+                }
341
+            }
342
+        }
343
+        
344
+        .action-button {
345
+            margin-top: 24rpx;
346
+            text-align: center;
347
+            
348
+            ::v-deep .u-button {
349
+                font-weight: 600;
350
+                border: none;
351
+                background-color: #eff6ff;
352
+                border-radius: 15rpx;
353
+                font-size: 24rpx;
354
+                padding: 34rpx 0;
355
+            }
356
+        }
357
+    }
358
+}

+ 374 - 0
pages/wareHouse/styles/index.scss

@@ -0,0 +1,374 @@
1
+/* 页面容器 */
2
+.page{
3
+  width: 100%;
4
+  background-color: #fff;
5
+}
6
+.page-container {
7
+  // padding: 8rpx 15rpx;
8
+  // background-color: #f9fafb;
9
+  // background-color: red;
10
+  min-height: 100vh;
11
+}
12
+.nav-bar{
13
+  border-bottom: 1px solid #f7f6f6 !important;
14
+}
15
+/* 总资产区域 */
16
+.asset-header {
17
+  width: 100%;
18
+  background-color: #ffffff;
19
+  border-radius: 20rpx;
20
+  padding: 25rpx 20rpx;
21
+  padding-bottom: 20rpx;
22
+  display: flex;
23
+  justify-content: space-between;
24
+  align-items: flex-end;
25
+  box-sizing: border-box;
26
+
27
+  .asset-text-wrap {
28
+    flex: 1;
29
+  }
30
+  .asset-title-con{
31
+      display: flex;
32
+      align-items: center;
33
+      justify-content: flex-start;
34
+      margin-bottom: 12rpx;
35
+    .asset-title {
36
+      font-size: 26rpx;
37
+      color: #999999;
38
+      display: block;
39
+      font-weight: 500;
40
+    }
41
+  }
42
+
43
+  .asset-value {
44
+    font-size: 44rpx;
45
+    color: #333333;
46
+    display: block;
47
+    font-weight: 600;
48
+    letter-spacing: 2rpx;
49
+  }
50
+
51
+  .view-btn {
52
+    width: auto;
53
+    padding: 0 25rpx;
54
+    background-color: #e3eefd;
55
+    color: #0d83f1;
56
+    font-size: 20rpx;
57
+    border-radius: 30rpx;
58
+    font-weight: 500;
59
+    text-align: center;
60
+    border: none;
61
+    margin: 0;
62
+    float: none;
63
+  }
64
+}
65
+
66
+/* 数据卡片 */
67
+.data-cards {
68
+  display: flex;
69
+  justify-content: space-between;
70
+  padding-bottom: 20rpx;
71
+  background-color: #fff;
72
+  padding: 8rpx 15rpx;
73
+  .card-item {
74
+    flex: 1;
75
+    text-align: center;
76
+    background: #f9fafb;
77
+    padding: 24rpx 0;
78
+    margin: 0 10rpx;
79
+    border-radius: 24rpx;
80
+    .card-label {
81
+      font-size: 26rpx;
82
+      color: #666;
83
+      display: block;
84
+      margin-bottom: 8rpx;
85
+    }
86
+    .card-value {
87
+      font-size: 36rpx;
88
+      font-weight: 700;
89
+      color: #333;
90
+      display: block;
91
+      &.green {
92
+        color: #09bb07;
93
+      }
94
+    }
95
+	&:nth-of-type(1){
96
+		margin-left:0;
97
+	}
98
+	&:nth-last-of-type(1){
99
+		margin-right:0;
100
+	}
101
+  }
102
+	
103
+}
104
+
105
+/* 搜索框区域 */
106
+.search-wrapper {
107
+  padding: 8rpx 15rpx;
108
+  height: 80rpx;
109
+  padding-bottom: 20rpx;
110
+  display: flex;
111
+  justify-content: space-between;
112
+  align-items: center;
113
+  background-color: #fff;
114
+  .search-input-wrap {
115
+    height: 100%;
116
+    --u-search-bg-color: #ffffff !important;
117
+    --u-search-border-radius: 8rpx !important;
118
+    --u-search-input-height: 80rpx !important;
119
+    --u-search-padding: 0 30rpx !important;
120
+    --u-search-input-font-size: 28rpx !important;
121
+    --u-search-placeholder-color: #999 !important;
122
+    border: none !important;
123
+    box-shadow: none !important;
124
+  }
125
+  .search-filter-btn {
126
+    margin-left: 20rpx;
127
+    width: 60rpx;
128
+    height: 60rpx;
129
+    z-index: 10;
130
+    display: flex;
131
+    justify-content: center;
132
+    align-items: center;
133
+    background-color: #f9fafb;
134
+    border: 40rpx;
135
+  }
136
+}
137
+
138
+/* 分类标签 */
139
+.category-tabs-wrap {
140
+  padding: 8rpx 15rpx;
141
+  margin-bottom: 20rpx;
142
+  background: #ffffff !important;
143
+  .u-tabs-custom {
144
+    --u-tabs-bg-color: #ffffff !important;
145
+    background: #ffffff !important; 
146
+    --u-tabs-border-bottom: none !important;
147
+    --u-tabs-item-padding: 10rpx 20rpx !important;
148
+    --u-tabs-item-margin: 0 10rpx !important;
149
+
150
+    .u-tabs__item--active {
151
+      font-weight: bold;
152
+      border-bottom: 2rpx solid #007aff !important;
153
+    }
154
+
155
+    .u-tabs__item-text {
156
+      font-size: 28rpx !important;
157
+      white-space: nowrap;
158
+    }
159
+
160
+    &::-webkit-scrollbar {
161
+      display: none;
162
+    }
163
+  }
164
+}
165
+
166
+/* 筛选栏 */
167
+.filter-bar {
168
+  padding: 8rpx 15rpx;
169
+  background-color: #f9fafb;
170
+  display: flex;
171
+  align-items: center;
172
+  justify-content: space-between;
173
+  border-radius: 20rpx;
174
+
175
+  .sort-btn {
176
+    background: transparent;
177
+    padding: 0;
178
+    margin: 0;
179
+    display: flex;
180
+    align-items: center;
181
+    gap: 6rpx;
182
+
183
+    .sort-text {
184
+      font-size: 24rpx;
185
+      color: #686767;
186
+      font-weight: 500;
187
+    }
188
+
189
+    .sort-icon {
190
+      flex-shrink: 0;
191
+      transition: transform 0.3s ease;
192
+
193
+      &:active {
194
+        transform: rotate(180deg);
195
+      }
196
+    }
197
+  }
198
+  .price-layout-btn{
199
+    display: flex;
200
+    justify-content: space-between;
201
+    align-items: center;
202
+    .price-btn {
203
+      background: transparent;
204
+      padding: 0;
205
+      margin: 0;
206
+      display: flex;
207
+      align-items: center;
208
+      gap: 8rpx;
209
+
210
+      .price-icon {
211
+        flex-shrink: 0;
212
+      }
213
+
214
+      .price-text {
215
+        font-size: 22rpx;
216
+        color: #1890ff;
217
+        font-weight: 500;
218
+      }
219
+    }
220
+
221
+    .layout-btn {
222
+      background: transparent;
223
+      font-size: 22rpx;
224
+      color: #333;
225
+      width: 60rpx;
226
+      height: 60rpx;
227
+      display: flex;
228
+      align-items: center;
229
+      justify-content: center;
230
+      flex-shrink: 0;
231
+    }
232
+  }
233
+}
234
+
235
+/* 商品列表 */
236
+.goods-list {
237
+  display: flex;
238
+  flex-direction: column;
239
+  gap: 10rpx;
240
+  background-color: #f9fafb;
241
+  padding: 8rpx 15rpx;
242
+  .goods-item {
243
+    
244
+    background-color: #ffffff;
245
+    border-radius: 20rpx;
246
+    padding: 20rpx;
247
+    box-sizing: border-box;
248
+    display: flex;
249
+    align-items: flex-start;
250
+    gap: 20rpx;
251
+
252
+    .goods-img-container {
253
+      position: relative;
254
+      flex-shrink: 0;
255
+    }
256
+
257
+    .goods-img {
258
+      width: 160rpx;
259
+      height: 160rpx;
260
+      border-radius: 6rpx;
261
+      object-fit: cover;
262
+    }
263
+
264
+    .stock-indicator {
265
+      position: absolute;
266
+      bottom: 14rpx;
267
+      right: 6rpx;
268
+      width: 20rpx;
269
+      height: 20rpx;
270
+      border-radius: 50%;
271
+      background-color: #09bb07;
272
+      border: 2rpx solid #ffffff;
273
+    }
274
+    .goods-info {
275
+      flex: 1;
276
+      .goods-brand {
277
+        font-size: 32rpx;
278
+        font-weight: 700;
279
+        color: #333333;
280
+        display: block;
281
+        line-height: 1.2;
282
+      }
283
+
284
+      .goods-name {
285
+        font-size: 26rpx;
286
+        color: #666666;
287
+        display: block;
288
+        font-weight: 600;
289
+        line-height: 1.4;
290
+        word-break: break-all;
291
+      }
292
+      .price-group{
293
+        .price-items{
294
+          display: flex;
295
+          justify-content: space-between;
296
+          .price-item{
297
+            display: flex;
298
+            flex-direction: column;
299
+            justify-content: flex-start;
300
+            .price-type{
301
+              color: #d1d5db;
302
+              font-size: 24rpx;
303
+            }
304
+            .price{
305
+              font-weight: 700;
306
+            }
307
+            .sales{
308
+              color: red;
309
+            }
310
+          }
311
+        }
312
+      }
313
+      .others{
314
+        margin-top: 20rpx;
315
+        display: flex;
316
+        align-items: center;
317
+        gap: 12rpx;
318
+        .other-item{
319
+          display: flex;
320
+          align-items: center;
321
+          justify-content: center;
322
+          width: 26rpx;
323
+          height: 26rpx;
324
+          font-size: 20rpx;
325
+          color: #c5c3c3;
326
+          background-color: #f5f5f5;
327
+          padding:6rpx;
328
+          border-radius:50%;
329
+          &.stock{
330
+            background-color: #007aff;
331
+            color: #fff;
332
+          }
333
+        }
334
+      }
335
+    }
336
+    .more{
337
+      display: flex;
338
+      flex-direction: column;
339
+      height: 100%;
340
+      align-items: flex-end;
341
+      gap: 240rpx;
342
+      .goods-stock {
343
+        font-size: 24rpx;
344
+        color: #666666;
345
+        align-self: flex-end;
346
+        flex-shrink: 0;
347
+        padding-left: 10rpx;
348
+      }
349
+    }
350
+  }
351
+}
352
+
353
+/* 添加按钮 */
354
+.add-button {
355
+  position: fixed;
356
+  bottom: 150rpx;
357
+  right: 20rpx;
358
+  width: 112rpx;
359
+  height: 112rpx;
360
+  background-color: #1f2937;
361
+  border-radius: 50%;
362
+  display: flex;
363
+  align-items: center;
364
+  justify-content: center;
365
+  box-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1);
366
+  z-index: 999;
367
+  cursor: pointer;
368
+  transition: all 0.3s ease;
369
+  
370
+  &:active {
371
+    transform: scale(0.95);
372
+  }
373
+}
374
+

BIN
static/tabs/home.png


BIN
static/tabs/home1.png


BIN
static/tabs/warehouse-active.png


BIN
static/tabs/warehouse.png