Commit da7858714321fbb9a777c5b54375d3c65c952db2

Authored by 郭伟龙
1 parent 15769f10
Exists in develop

fix: 样式修改 删除mobile文件夹 支持新老二维码 扫码枪覆盖

mobile/pages/api/api.vue
@@ -1,27 +0,0 @@ @@ -1,27 +0,0 @@
1 -<template>  
2 - <view class="container">  
3 - <button @click="showModel">uni.showModal</button>  
4 - </view>  
5 -</template>  
6 -  
7 -<script>  
8 - export default {  
9 - data() {  
10 - return {}  
11 - },  
12 - methods: {  
13 - showModel() {  
14 - uni.showModal({  
15 - content: this.$t('api.message'),  
16 - success: (res) => {  
17 - console.log(res);  
18 - }  
19 - })  
20 - }  
21 - }  
22 - }  
23 -</script>  
24 -  
25 -<style>  
26 -  
27 -</style>  
mobile/pages/component/AuxiliaryModule.vue
@@ -1,145 +0,0 @@ @@ -1,145 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <view class="empty" v-if="auxiliaryData.length <= 0 || auxiliaryData === null">  
4 - <u-empty :text="$t('hdk.AttachmentIsEmpty')" mode="data"  
5 - icon="http://cdn.uviewui.com/uview/empty/data.png"></u-empty>  
6 - </view>  
7 - <view class="auxiliaryModule" v-for="(item,index) in auxiliaryData" :key="index" v-else>  
8 - <view class="title">{{$t('hdk.AttachmentModel')}}:{{item.type}}</view>  
9 - <view class="photo">  
10 - <u-swiper @click="previewLargeImage(item.productPicturePath,index)" :current="currents[index]"  
11 - :list="item.productPicturePath" indicator indicatorMode="dot" circular imgMode="aspectFit"  
12 - :height="$isMobile?'400rpx':'600px'" indicatorActiveColor="#00aeaa"  
13 - indicatorInactiveColor="rgba(0, 174, 170, 0.3)" @change=" e => currents[index] = e.current"  
14 - :indicatorStyle="{bottom:'20px',right:'5px'}"></u-swiper>  
15 - </view>  
16 - <view class="title">{{$t('hdk.OrderCode')}}:{{item.orderCode}}</view>  
17 - <UploadFile :fileType="1" :downloadFileName="item.productManual"  
18 - :downloadFileNamePath="item.productManualPath" />  
19 - </view>  
20 - </view>  
21 -</template>  
22 -  
23 -<script>  
24 - import UploadFile from './UploadFile.vue'  
25 - export default {  
26 - components: {  
27 - UploadFile  
28 - },  
29 - props: {  
30 - auxiliaryData: {  
31 - type: Array  
32 - }  
33 - },  
34 - data() {  
35 - return {  
36 - currents: []  
37 - }  
38 - },  
39 - computed: {  
40 -  
41 - },  
42 - mounted() {  
43 - this.currents = this.auxiliaryData.map(() => 0)  
44 - },  
45 - methods: {  
46 - previewLargeImage(productPicturePath, index) {  
47 - console.log("第几组图", index);  
48 - console.log("图片列表", productPicturePath);  
49 - console.log("滑块", this.currents[index]);  
50 - const current = this.currents[index]  
51 - wx.previewImage({  
52 - current: productPicturePath[current],  
53 - urls: productPicturePath  
54 - });  
55 - }  
56 - }  
57 - }  
58 -</script>  
59 -  
60 -<style lang="scss" scoped>  
61 - .containers {  
62 - display: flex;  
63 - justify-content: center;  
64 - align-items: center;  
65 - flex-direction: column;  
66 - }  
67 -  
68 - @media screen and (max-width: 767px) {  
69 - .title {  
70 - font-size: 15px;  
71 - margin: 19px 0 0 14px;  
72 - }  
73 -  
74 - .flex-between {  
75 - margin: 16.5px;  
76 - display: flex;  
77 - justify-content: space-between;  
78 - font-size: 13px;  
79 - }  
80 -  
81 - .auxiliaryModule {  
82 - width: 95%;  
83 - margin: 16px 24px 20px 24px;  
84 - padding: 2px 2px 2px 2px;  
85 - border-radius: 20px;  
86 - background-color: #ffffff;  
87 - box-sizing: border-box;  
88 - }  
89 - }  
90 -  
91 - //PC端样式  
92 - @media screen and (min-width: 768px) {  
93 - .title {  
94 - font-size: 30px;  
95 - margin: 38px 0 0 28px;  
96 - }  
97 -  
98 - .flex-between {  
99 - margin: 33px;  
100 - display: flex;  
101 - justify-content: space-between;  
102 - font-size: 26px;  
103 - }  
104 -  
105 - .auxiliaryModule {  
106 - width: 80%;  
107 - margin: 16px 24px 20px 24px;  
108 - padding: 2px 2px 2px 2px;  
109 - border-radius: 20px;  
110 - background-color: #ffffff;  
111 - box-sizing: border-box;  
112 - }  
113 - }  
114 -  
115 - .empty {  
116 - width: 100%;  
117 - height: 100%;  
118 - }  
119 -  
120 -  
121 -  
122 - .photo {  
123 - margin: 30px;  
124 - }  
125 -  
126 -  
127 -  
128 - .leftT {  
129 - background-color: rgba(255, 255, 255, 0);  
130 - box-sizing: border-box;  
131 - font-family: '苹方 中等', '苹方', sans-serif;  
132 - color: #999db0;  
133 - text-align: left;  
134 - line-height: normal;  
135 - }  
136 -  
137 - .rightT {  
138 - background-color: rgba(255, 255, 255, 0);  
139 - box-sizing: border-box;  
140 - font-family: '苹方 中等', '苹方', sans-serif;  
141 - color: #2b3950;  
142 - text-align: left;  
143 - line-height: normal;  
144 - }  
145 -</style>  
146 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/component/InformationModule.vue
@@ -1,196 +0,0 @@ @@ -1,196 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <u-swiper class="swiperCss" :list="informationData.lampPath"  
4 - @click="previewLargeImage(informationData.lampPath,current)" :current="current" indicator  
5 - indicatorMode="dot" imgMode="aspectFit" circular :height="$isMobile?'400rpx':'600px'"  
6 - indicatorActiveColor="#00aeaa" indicatorInactiveColor="rgba(0, 174, 170, 0.3)" @change="changeSwiper"  
7 - :indicatorStyle="{bottom:'20px',right:'5px'}"></u-swiper>  
8 - <view class="informationModule">  
9 - <view class="title">  
10 - {{$t('hdk.productInformation')}}  
11 - </view>  
12 - <view class="flex-between">  
13 - <text class="leftT">{{$t('hdk.SnCode')}}</text>  
14 - <text class="rightT">{{informationData.sn || ""}}</text>  
15 - </view>  
16 - <view class="flex-between">  
17 - <text class="leftT">{{$t('hdk.ProductName')}}</text>  
18 - <text class="rightT">{{informationData.productName || ""}}</text>  
19 - </view>  
20 - <view class="flex-between">  
21 - <text class="leftT">{{$t('hdk.Model')}}</text>  
22 - <text class="rightT">{{informationData.type || ""}}</text>  
23 - </view>  
24 - <view class="flex-between">  
25 - <text class="leftT">{{$t('hdk.DateOfProduction')}}</text>  
26 - <text class="rightT">{{$u.timeFormat(informationData.productionTime, 'yyyy-mm-dd') || ""}}</text>  
27 - </view>  
28 - <view class="flex-between">  
29 - <text class="leftT">{{$t('hdk.ProductionPersonnel')}}</text>  
30 - <text class="rightT">{{informationData.productionUserName || ""}}</text>  
31 - </view>  
32 - </view>  
33 - <view class="fileViewingModule">  
34 - <view class="title">  
35 - {{$t('hdk.ProductSpecification')}}  
36 - </view>  
37 - <UploadFile :fileType="1" :downloadFileName="informationData.productDatasheet"  
38 - :downloadFileNamePath="informationData.productDatasheetPath" />  
39 - </view>  
40 -  
41 - <view class="fileViewingModule">  
42 - <view class="title">  
43 - {{$t('hdk.ProductManual')}}  
44 - </view>  
45 - <UploadFile :fileType="1" :downloadFileName="informationData.productManual"  
46 - :downloadFileNamePath="informationData.productManualPath" />  
47 - </view>  
48 - </view>  
49 -</template>  
50 -  
51 -<script>  
52 - import UploadFile from './UploadFile.vue'  
53 - export default {  
54 - components: {  
55 - UploadFile  
56 - },  
57 - props: {  
58 - informationData: {  
59 - type: Object  
60 - }  
61 - },  
62 - data() {  
63 - return {  
64 - current: 0  
65 - }  
66 - },  
67 - computed: {  
68 -  
69 - },  
70 - onLoad() {},  
71 - methods: {  
72 - changeSwiper(e) {  
73 - this.current = e.current  
74 - // console.log("当前滑块", this.current);  
75 - },  
76 - previewLargeImage(productPicturePath, current) {  
77 - console.log("图片列表", productPicturePath);  
78 - console.log("滑块", current);  
79 - wx.previewImage({  
80 - current: productPicturePath[current],  
81 - urls: productPicturePath  
82 - });  
83 - }  
84 - }  
85 - }  
86 -</script>  
87 -  
88 -<style lang="scss" scoped>  
89 - .containers {  
90 - display: flex;  
91 - justify-content: center;  
92 - align-items: center;  
93 - flex-direction: column;  
94 - }  
95 -  
96 -  
97 - //移动端样式  
98 - @media screen and (max-width: 767px) {  
99 - .title {  
100 - font-size: 15px;  
101 - margin: 19px 0 0 14px;  
102 - }  
103 -  
104 - .swiperCss {  
105 - width: 95%;  
106 - }  
107 -  
108 - .flex-between {  
109 - margin: 16.5px;  
110 - display: flex;  
111 - justify-content: space-between;  
112 - font-size: 13px;  
113 - }  
114 -  
115 - .pdfTitle {  
116 - font-size: 13px;  
117 - margin-left: 8px;  
118 - }  
119 -  
120 - .informationModule {  
121 - width: 95%;  
122 - margin: 20px 24px;  
123 - padding: 2px;  
124 - border-radius: 20px;  
125 - background-color: #ffffff;  
126 - box-sizing: border-box;  
127 - }  
128 -  
129 - .fileViewingModule {  
130 - width: 95%;  
131 - min-height: 100px;  
132 - margin: 20px 24px;  
133 - padding: 2px 2px 2px 2px;  
134 - border-radius: 20px;  
135 - background-color: #ffffff;  
136 - box-sizing: border-box;  
137 - }  
138 -  
139 - }  
140 -  
141 - //PC端样式  
142 - @media screen and (min-width: 768px) {  
143 - .title {  
144 - font-size: 30px;  
145 - margin: 38px 0 0 28px;  
146 - }  
147 -  
148 - .swiperCss {  
149 - width: 80%;  
150 - }  
151 -  
152 - .flex-between {  
153 - margin: 33px;  
154 - display: flex;  
155 - justify-content: space-between;  
156 - font-size: 26px;  
157 - }  
158 -  
159 - .informationModule {  
160 - width: 80%;  
161 - margin: 20px 24px;  
162 - padding: 2px;  
163 - border-radius: 20px;  
164 - background-color: #ffffff;  
165 - box-sizing: border-box;  
166 - }  
167 -  
168 -  
169 - .fileViewingModule {  
170 - width: 80%;  
171 - min-height: 100px;  
172 - margin: 20px 24px;  
173 - padding: 2px 2px 2px 2px;  
174 - border-radius: 20px;  
175 - background-color: #ffffff;  
176 - box-sizing: border-box;  
177 - }  
178 - }  
179 - .leftT {  
180 - background-color: rgba(255, 255, 255, 0);  
181 - box-sizing: border-box;  
182 - font-family: '苹方 中等', '苹方', sans-serif;  
183 - color: #999db0;  
184 - text-align: left;  
185 - line-height: normal;  
186 - }  
187 -  
188 - .rightT {  
189 - background-color: rgba(255, 255, 255, 0);  
190 - box-sizing: border-box;  
191 - font-family: '苹方 中等', '苹方', sans-serif;  
192 - color: #2b3950;  
193 - text-align: left;  
194 - line-height: normal;  
195 - }  
196 -</style>  
197 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/component/InspectionModule.vue
@@ -1,224 +0,0 @@ @@ -1,224 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <!-- <view class="empty" v-if="inspectionData === null">  
4 - <u-empty text="附件为空" mode="data" icon="http://cdn.uviewui.com/uview/empty/data.png"></u-empty>  
5 - </view> -->  
6 - <view class="informationModule">  
7 - <view class="title">  
8 - {{$t('hdk.inspectionInformation')}}  
9 - </view>  
10 - <view class="flex-between">  
11 - <text class="leftT">{{$t('hdk.SoftwareVersion')}}</text>  
12 - <text class="rightT">{{inspectionData.softwareVersion || ''}}</text>  
13 - </view>  
14 - <view class="flex-between">  
15 - <text class="leftT">{{$t('hdk.HardwareVersion')}}</text>  
16 - <text class="rightT">{{inspectionData.hardwareVersion || ''}}</text>  
17 - </view>  
18 - <view class="flex-between">  
19 - <text class="leftT">{{$t('hdk.TestDate')}}</text>  
20 - <text class="rightT">{{$u.timeFormat(inspectionData.checkTime, 'yyyy年mm月dd日') || ''}}</text>  
21 - </view>  
22 - </view>  
23 -  
24 - <view class="informationModule">  
25 - <view class="title">  
26 - {{$t('hdk.ElectricalParameters')}}  
27 - </view>  
28 - <view class="flex-between">  
29 - <text class="leftT">{{$t('hdk.Power')}}</text>  
30 - <text class="rightT">{{inspectionData.power || ''}}</text>  
31 - </view>  
32 - <view class="flex-between">  
33 - <text class="leftT">{{$t('hdk.PowerFactor')}}</text>  
34 - <text class="rightT">{{inspectionData.powerFactor || ''}}</text>  
35 - </view>  
36 - </view>  
37 -  
38 - <view class="dataViewingModule">  
39 - <view class="title">  
40 - {{$t('hdk.LightIntensityDistribution')}}  
41 - </view>  
42 - <view class="photo">  
43 - <u-swiper :list="inspectionData.lightIntensityPhoto"  
44 - @click="previewLargeImage(inspectionData.lightIntensityPhoto,current)" :current="current"  
45 - v-if="inspectionData.lightIntensityPhoto.length > 0" indicator indicatorMode="dot" circular  
46 - imgMode="aspectFit" :height="$isMobile?'400rpx':'600px'" indicatorActiveColor="#00aeaa"  
47 - @change="changeSwiper" indicatorInactiveColor="rgba(0, 174, 170, 0.3)"  
48 - :indicatorStyle="{bottom:'20px',right:'5px'}"></u-swiper>  
49 - </view>  
50 - <UploadFile :fileType="2" v-for="(item,index) in inspectionData.lightIntensityFile" :key="index"  
51 - :downloadFileName="item" :downloadFileNamePath="item" :isCsv="true" />  
52 - </view>  
53 -  
54 - <view class="fileViewingModule">  
55 - <view class="title">  
56 - {{$t('hdk.AirTightnessInspectionDocuments')}}  
57 - </view>  
58 - <UploadFile :fileType="2" :downloadFileName="inspectionData.tightnessCheckFile"  
59 - :downloadFileNamePath="inspectionData.tightnessCheckFilePath" />  
60 - </view>  
61 -  
62 - </view>  
63 -</template>  
64 -  
65 -<script>  
66 - import UploadFile from './UploadFile.vue'  
67 - export default {  
68 - components: {  
69 - UploadFile  
70 - },  
71 - props: {  
72 - inspectionData: {  
73 - type: Object  
74 - }  
75 - },  
76 - data() {  
77 - return {  
78 - current: 0  
79 - }  
80 - },  
81 - computed: {  
82 -  
83 - },  
84 - onLoad() {  
85 -  
86 - },  
87 - methods: {  
88 - changeSwiper(e) {  
89 - this.current = e.current  
90 - // console.log("当前滑块",this.current);  
91 - },  
92 - previewLargeImage(productPicturePath, current) {  
93 - console.log("图片列表", productPicturePath);  
94 - console.log("滑块", current);  
95 - wx.previewImage({  
96 - current: productPicturePath[current],  
97 - urls: productPicturePath  
98 - });  
99 - }  
100 - }  
101 - }  
102 -</script>  
103 -  
104 -<style lang="scss" scoped>  
105 - .containers {  
106 - display: flex;  
107 - justify-content: center;  
108 - align-items: center;  
109 - flex-direction: column;  
110 - }  
111 -  
112 - //移动端样式  
113 - @media screen and (max-width: 767px) {  
114 - .title {  
115 - font-size: 15px;  
116 - margin: 19px 0 0 14px;  
117 - }  
118 -  
119 - .flex-between {  
120 - margin: 16.5px;  
121 - display: flex;  
122 - justify-content: space-between;  
123 - font-size: 13px;  
124 - }  
125 -  
126 - .informationModule {  
127 - width: 95%;  
128 - max-height: 467px;  
129 - margin: 20px 24px;  
130 - padding: 2px 2px 2px 2px;  
131 - border-radius: 20px;  
132 - background-color: #ffffff;  
133 - box-sizing: border-box;  
134 - }  
135 -  
136 - .fileViewingModule {  
137 - width: 95%;  
138 - margin: 20px 24px;  
139 - padding: 2px 2px 2px 2px;  
140 - border-radius: 20px;  
141 - background-color: #ffffff;  
142 - box-sizing: border-box;  
143 - }  
144 -  
145 -  
146 - .dataViewingModule {  
147 - width: 95%;  
148 - margin: 20px 24px;  
149 - padding: 2px 2px 2px 2px;  
150 - border-radius: 20px;  
151 - background-color: #ffffff;  
152 - box-sizing: border-box;  
153 - }  
154 - }  
155 -  
156 - //PC端样式  
157 - @media screen and (min-width: 768px) {  
158 - .title {  
159 - font-size: 30px;  
160 - margin: 38px 0 0 28px;  
161 - }  
162 -  
163 - .flex-between {  
164 - margin: 33px;  
165 - display: flex;  
166 - justify-content: space-between;  
167 - font-size: 26px;  
168 - }  
169 -  
170 - .informationModule {  
171 - width: 80%;  
172 - max-height: 467px;  
173 - margin: 20px 24px;  
174 - padding: 2px 2px 2px 2px;  
175 - border-radius: 20px;  
176 - background-color: #ffffff;  
177 - box-sizing: border-box;  
178 - }  
179 -  
180 - .fileViewingModule {  
181 - width: 80%;  
182 - margin: 20px 24px;  
183 - padding: 2px 2px 2px 2px;  
184 - border-radius: 20px;  
185 - background-color: #ffffff;  
186 - box-sizing: border-box;  
187 - }  
188 -  
189 -  
190 - .dataViewingModule {  
191 - width: 80%;  
192 - margin: 20px 24px;  
193 - padding: 2px 2px 2px 2px;  
194 - border-radius: 20px;  
195 - background-color: #ffffff;  
196 - box-sizing: border-box;  
197 - }  
198 - }  
199 -  
200 -  
201 -  
202 - .photo {  
203 - margin: 30px;  
204 - }  
205 -  
206 -  
207 - .leftT {  
208 - background-color: rgba(255, 255, 255, 0);  
209 - box-sizing: border-box;  
210 - font-family: '苹方 中等', '苹方', sans-serif;  
211 - color: #999db0;  
212 - text-align: left;  
213 - line-height: normal;  
214 - }  
215 -  
216 - .rightT {  
217 - background-color: rgba(255, 255, 255, 0);  
218 - box-sizing: border-box;  
219 - font-family: '苹方 中等', '苹方', sans-serif;  
220 - color: #2b3950;  
221 - text-align: left;  
222 - line-height: normal;  
223 - }  
224 -</style>  
225 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/component/QrScan.vue
@@ -1,100 +0,0 @@ @@ -1,100 +0,0 @@
1 -<template>  
2 - <div class="qrcode">  
3 - <div id="reader">  
4 - </div>  
5 - </div>  
6 -</template>  
7 -  
8 -<script>  
9 - import {  
10 - Html5Qrcode  
11 - } from 'html5-qrcode';  
12 - export default {  
13 - created() {  
14 - this.getCameras();  
15 - navigator.mediaDevices.getUserMedia({  
16 - video: true  
17 - })  
18 - .then(stream => {  
19 - this.$refs.qrcodeReader.$refs.reader.$refs.video.srcObject = stream  
20 - })  
21 - .catch(error => {  
22 - console.log(error)  
23 - alert('Failed to access camera.')  
24 - })  
25 - },  
26 - beforeDestroy() {  
27 - this.stop();  
28 - },  
29 - methods: {  
30 - getCameras() {  
31 - Html5Qrcode.getCameras()  
32 - .then((devices) => {  
33 - if (devices && devices.length) {  
34 - this.html5QrCode = new Html5Qrcode('reader');  
35 - this.start();  
36 - }  
37 - })  
38 - .catch((err) => {  
39 - // handle err  
40 - this.html5QrCode = new Html5Qrcode('reader');  
41 - this.error = 'ERROR: 您需要授予相机访问权限';  
42 - this.$emit('err', this.error, err);  
43 - });  
44 - },  
45 - start() {  
46 - //environment后置 user前置  
47 - this.html5QrCode  
48 - .start({  
49 - facingMode: 'environment'  
50 - }, {  
51 - fps: 10, // 设置每秒多少帧  
52 - aspectRatio: 1,  
53 - qrbox: 250, // 设置取景范围  
54 - colorDark: '#0000ff', //加深二维码黑色部分的颜色提高识别度  
55 - colorLight: '#ffffff', //这个应该是提高非黑即白部分的亮度 提高识别度  
56 - visualFeedback: true, //开启视觉反馈 没有体会到  
57 - halfSample: true, //缩小二维码提高识别精度吧  
58 - },  
59 - (decodedText) => {  
60 - this.$emit('ok', decodedText);  
61 - },  
62 - )  
63 - .catch((err) => {  
64 - this.$emit('err', err);  
65 - });  
66 - },  
67 - stop() {  
68 - this.html5QrCode  
69 - .stop()  
70 - .then((ignore) => {  
71 - // QR Code scanning is stopped.  
72 - this.$emit('err', ignore);  
73 - console.log('QR Code scanning stopped.');  
74 - })  
75 - .catch((err) => {  
76 - this.$emit('err', err);  
77 - // Stop failed, handle it.  
78 - console.log('Unable to stop scanning.');  
79 - });  
80 - },  
81 - },  
82 - };  
83 -</script>  
84 -  
85 -<style lang="scss" scoped>  
86 - .qrcode {  
87 - position: absolute;  
88 - height: 100%;  
89 - width: 100%;  
90 - // background: rgba($color: #000000, $alpha: 0.48);  
91 - background:rgba(0, 0, 0, 1.48);  
92 - }  
93 -  
94 -  
95 - #reader {  
96 - top: 50%;  
97 - left: 0;  
98 - transform: translateY(-50%);  
99 - }  
100 -</style>  
101 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/component/UploadFile.vue
@@ -1,207 +0,0 @@ @@ -1,207 +0,0 @@
1 -<template>  
2 - <view>  
3 - <view class="flex-content">  
4 - <view class="iconText">  
5 - <u-icon name="/static/images/icon/pdfIcon.png" size="33px" v-if="fileType == 1"></u-icon>  
6 - <u-icon name="/static/images/icon/excelIcon.png" size="33px" v-if="fileType == 2"></u-icon>  
7 - <u-icon name="/static/images/icon/csvIcon.png" size="33px" v-if="fileType == 3"></u-icon>  
8 - <text class="iconTitle"  
9 - @click="seeFile">{{downloadFileName ? downloadFileName.substring(downloadFileName.lastIndexOf('/') + 1) : $t('hdk.noFile')}}</text>  
10 - </view>  
11 - <view class="rightText" @click="seeFile('preview')" v-if="downloadFileNamePath != ''">  
12 - {{$t('hdk.Check')}}  
13 - </view>  
14 - </view>  
15 - </view>  
16 -</template>  
17 -  
18 -<script>  
19 - import {  
20 - downloadTemplateFile  
21 - } from '@/api/scan.js'  
22 - import config from '@/common/config'  
23 - export default {  
24 - components: {},  
25 - props: {  
26 - fileType: {  
27 - type: Number,  
28 - require: true  
29 - },  
30 - downloadFileName: {  
31 - type: String,  
32 - require: true  
33 - },  
34 - downloadFileNamePath: {  
35 - type: String,  
36 - require: true  
37 - },  
38 - isCsv: {  
39 - type: Boolean,  
40 - default: false  
41 - },  
42 - },  
43 - data() {  
44 - return {}  
45 - },  
46 - computed: {  
47 -  
48 - },  
49 - onLoad() {  
50 - uni.showShareMenu({  
51 - withShareTicket: true,  
52 - menus: ['shareAppMessage'],  
53 - success: function() {  
54 - console.log('分享菜单显示成功');  
55 - },  
56 - fail: function(res) {  
57 - console.log('分享菜单显示失败', res);  
58 - }  
59 - });  
60 - },  
61 - methods: {  
62 - seeFile(acceptType) {  
63 - console.log(acceptType);  
64 - // if (this.isCsv) {  
65 - // return  
66 - // }  
67 - console.log('查看文件');  
68 - uni.showLoading({  
69 - title: "加载中"  
70 - })  
71 - let that = this;  
72 -  
73 - if (!this.isCsv) {  
74 - const count = (this.downloadFileNamePath.match(/;/g) || []).length;  
75 - console.log(this.downloadFileNamePath, "解析文件有", count, "个")  
76 - if (count > 1) {  
77 - uni.showToast({  
78 - icon: 'none',  
79 - title: '导入格式有误'  
80 - });  
81 - return  
82 - }  
83 - }  
84 - //去除分号分割符  
85 - let downloadName = that.downloadFileNamePath.replace(/;/g, "");  
86 - console.log("下载名", downloadName);  
87 - // let query = `/download?bucketName=hdk&file=${downloadName}`  
88 - // console.log("query", config.baseUrl + query)  
89 - const parts = downloadName.split(".");  
90 - // 取数组最后一个元素作为后缀名  
91 - let fileType = parts[parts.length - 1];  
92 - console.log("后缀", fileType);  
93 - let environment = uni.getSystemInfoSync().platform  
94 - console.log("当前环境", environment);  
95 - const urls = config.fileUrl + `/${encodeURI(downloadName)}`  
96 - let fileName = downloadName.substring(downloadName.lastIndexOf('/') + 1);  
97 - this.checkUrlValidity(urls).then(isExistence => {  
98 - if (isExistence) {  
99 - uni.hideLoading()  
100 - window.open(urls, '_blank');  
101 - } else {  
102 - uni.hideLoading()  
103 - uni.showToast({  
104 - icon: 'none',  
105 - title: '文件未上传!'  
106 - });  
107 - }  
108 - })  
109 - },  
110 - //检查是否有效  
111 - checkUrlValidity(url) {  
112 - return new Promise((resolve, reject) => {  
113 - uni.request({  
114 - url,  
115 - header: {  
116 - 'tenant-id': 1,  
117 - },  
118 - method: 'HEAD',  
119 - success(res) {  
120 - console.log("检验地址", res);  
121 - if (res.statusCode >= 200 && res.statusCode < 400) {  
122 - resolve(true); // URL有效  
123 - } else {  
124 - console.log("地址无效");  
125 - resolve(false); // URL无效  
126 - }  
127 - },  
128 - fail(err) {  
129 - reject(err); // 请求失败  
130 - }  
131 - });  
132 - });  
133 - },  
134 - }  
135 - }  
136 -</script>  
137 -  
138 -<style lang="scss" scoped>  
139 - @media screen and (max-width: 767px) {  
140 - .iconTitle {  
141 - width: 200px;  
142 - font-size: 13px;  
143 - margin-left: 8px;  
144 - white-space: nowrap;  
145 - /* 防止换行 */  
146 - overflow: hidden;  
147 - /* 超出部分隐藏 */  
148 - text-overflow: ellipsis;  
149 - /* 显示省略号 */  
150 - }  
151 - .rightText {  
152 - padding: 5px;  
153 - color: #00aeaa;  
154 - font-size: 14px;  
155 - }  
156 -  
157 - .flex-content {  
158 - display: flex;  
159 - justify-content: space-between;  
160 - font-size: 26px;  
161 - align-items: center;  
162 - margin: 30px;  
163 -  
164 - .iconText {  
165 - display: flex;  
166 - align-items: center;  
167 - height: 50px;  
168 - color: #2b3950;  
169 - }  
170 - }  
171 - }  
172 -  
173 - //PC端样式  
174 - @media screen and (min-width: 768px) {  
175 - .iconTitle {  
176 - width: 400px;  
177 - font-size: 26px;  
178 - margin-left: 16px;  
179 - white-space: nowrap;  
180 - /* 防止换行 */  
181 - overflow: hidden;  
182 - /* 超出部分隐藏 */  
183 - text-overflow: ellipsis;  
184 - /* 显示省略号 */  
185 - }  
186 - .rightText {  
187 - padding: 10px;  
188 - color: #00aeaa;  
189 - font-size: 28px;  
190 - }  
191 -  
192 - .flex-content {  
193 - display: flex;  
194 - justify-content: space-between;  
195 - font-size: 26px;  
196 - align-items: center;  
197 - margin: 30px;  
198 -  
199 - .iconText {  
200 - display: flex;  
201 - align-items: center;  
202 - height: 50px;  
203 - color: #2b3950;  
204 - }  
205 - }  
206 - }  
207 -</style>  
208 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/component/component.vue
@@ -1,22 +0,0 @@ @@ -1,22 +0,0 @@
1 -<template>  
2 - <view class="container">  
3 - <no-data></no-data>  
4 - </view>  
5 -</template>  
6 -  
7 -<script>  
8 - export default {  
9 - data() {  
10 - return {  
11 - title: this.$t('')  
12 - }  
13 - },  
14 - methods: {  
15 -  
16 - }  
17 - }  
18 -</script>  
19 -  
20 -<style>  
21 -  
22 -</style>  
mobile/pages/component/goback.vue
@@ -1,46 +0,0 @@ @@ -1,46 +0,0 @@
1 -<template>  
2 - <view class="back" @click="goback" v-if="!$isMobile">  
3 - <u-image src="/static/images/icon/back.png" mode="witFix" width="100px" height="100px"></u-image>  
4 - </view>  
5 -</template>  
6 -  
7 -<script>  
8 - export default {  
9 - components: {},  
10 - props: {  
11 -  
12 - },  
13 - data() {  
14 - return {  
15 -  
16 - }  
17 - },  
18 - computed: {  
19 -  
20 - },  
21 - onLoad() {  
22 -  
23 - },  
24 - methods: {  
25 - goback() {  
26 - window.history.back();  
27 - }  
28 - }  
29 - }  
30 -</script>  
31 -  
32 -<style lang="scss" scoped>  
33 - .back {  
34 - width: 50px;  
35 - height: 50px;  
36 - border-radius: 50px;  
37 - position: fixed;  
38 - display: flex;  
39 - flex-direction: column;  
40 - justify-content: center;  
41 - align-items: center;  
42 - left:1%;  
43 - top: 10%;  
44 - bottom: 0;  
45 - }  
46 -</style>  
47 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/component/topWindow.vue
@@ -1,160 +0,0 @@ @@ -1,160 +0,0 @@
1 -<template>  
2 - <view>  
3 - <b-navbar toggleable="lg" type="dark" class="b-navbar">  
4 - <b-navbar-brand :title="$t('hdk.gohome')" href="/mobile">  
5 - <img src="@/static/hdk-top-logo.png" width="63px" height="32px" style="margin-left: 10px;" alt="Kitten">  
6 - </b-navbar-brand>  
7 - <b-navbar-toggle target="nav-collapse"></b-navbar-toggle>  
8 - <b-collapse id="nav-collapse" is-nav class="collapseR">  
9 - <b-navbar-nav>  
10 - <b-nav-item v-show="!isHome" @click="handleClick('productInformation')"  
11 - :class="{ 'activeCSS': selectedNavItem === 'productInformation' }">  
12 - {{$t('hdk.productInformation')}}  
13 - </b-nav-item>  
14 - <b-nav-item v-show="!isHome" @click="handleClick('inspectionInformation')"  
15 - :class="{ 'activeCSS': selectedNavItem === 'inspectionInformation' }">  
16 - {{$t('hdk.inspectionInformation')}}  
17 - </b-nav-item>  
18 - <b-nav-item v-show="!isHome" @click="handleClick('attachmentInformation')"  
19 - :class="{ 'activeCSS': selectedNavItem === 'attachmentInformation' }">  
20 - {{$t('hdk.attachmentInformation')}}  
21 - </b-nav-item>  
22 - <b-nav-item-dropdown :text="selectedLanguage" right>  
23 - <template #button-content>  
24 - <img src="@/static/images/icon/language.png" width="17px" height="17px"  
25 - alt="Kitten" style="margin:2px 2px 5px 2px;">  
26 - <text>{{selectedLanguage}}</text>  
27 - </template>  
28 - <b-dropdown-item href="#" @click="changeLanguage('en')">{{$t('locale.en')}}  
29 - </b-dropdown-item>  
30 - <b-dropdown-item href="#" @click="changeLanguage('zh-hans')">{{$t('locale.zh-hans')}}  
31 - </b-dropdown-item>  
32 - </b-nav-item-dropdown>  
33 - </b-navbar-nav>  
34 - </b-collapse>  
35 - </b-navbar>  
36 - </view>  
37 -</template>  
38 -  
39 -<script>  
40 - export default {  
41 - data() {  
42 - return {  
43 - selectedLanguage: this.$t('index.language'),  
44 - selectedNavItem: 'productInformation'  
45 - }  
46 - },  
47 - props: {  
48 - isHome: {  
49 - type: Boolean,  
50 - default: true  
51 - },  
52 - },  
53 - mounted() {  
54 - var url = window.location.href;  
55 - var lang = this.getQueryString('lang');  
56 - console.log("地址携带语种", lang);  
57 - if (lang === "zh") {  
58 - this.$i18n.locale = 'zh-Hans';  
59 - uni.setLocale('zh-Hans');  
60 - this.selectedLanguage = `${this.$t('index.language')}:${this.$t('locale.zh-hans')}`;  
61 - } else if (lang === "en") {  
62 - this.$i18n.locale = 'en';  
63 - uni.setLocale('en');  
64 - this.selectedLanguage = `${this.$t('index.language')}:${this.$t('locale.en')}`;  
65 - } else {  
66 - let Localelang = uni.getLocale();  
67 - console.log("本地语言", Localelang);  
68 - this.selectedLanguage = Localelang == 'en' ? `${this.$t('index.language')}:${this.$t('locale.en')}` :  
69 - `${this.$t('index.language')}:${this.$t('locale.zh-hans')}`  
70 - }  
71 - },  
72 - methods: {  
73 - getQueryString(key) {  
74 - const url = new URL(decodeURIComponent(location.href));  
75 - return url.searchParams.get(key);  
76 - },  
77 - handleClick(item) {  
78 - this.selectedNavItem = item;  
79 - this.$emit('item-click', item);  
80 - },  
81 - changeLanguage(locale) {  
82 - console.log('切换语言为:', locale);  
83 - // 更新选择的语言  
84 - if (locale === 'en') {  
85 - this.$i18n.locale = 'en';  
86 - uni.setLocale('en');  
87 - this.selectedLanguage = `${this.$t('index.language')}:${this.$t('locale.en')}`;  
88 - } else if (locale === 'zh-hans') {  
89 - this.$i18n.locale = 'zh-Hans';  
90 - uni.setLocale('zh-Hans');  
91 - this.selectedLanguage = `${this.$t('index.language')}:${this.$t('locale.zh-hans')}`;  
92 - }  
93 - }  
94 - }  
95 - }  
96 -</script>  
97 -  
98 -<style scoped lang="scss">  
99 - .uni-top-window {  
100 - padding: 0 15px;  
101 - display: flex;  
102 - flex-direction: row;  
103 - justify-content: space-between;  
104 - align-items: center;  
105 - box-sizing: border-box;  
106 - border-bottom: 1px solid #e1e1e1;  
107 - background-color: #00AEAA;  
108 - color: #333;  
109 - }  
110 -  
111 - .b-navbar {  
112 - width: 100vw;  
113 - background-color: #00AEAA;  
114 - display: flex;  
115 - }  
116 -  
117 - /* PC端样式 */  
118 - @media screen and (min-width: 768px) {  
119 - .b-navbar {  
120 - padding: 0 10%;  
121 - height: 50px;  
122 - }  
123 -  
124 - .navbar-nav {  
125 - height: 100%;  
126 - }  
127 -  
128 - .nav-item {  
129 - padding: 0 20px;  
130 - }  
131 -  
132 - .collapseR {  
133 - width: 100%;  
134 - height: 100%;  
135 - line-height: 30px !important;  
136 - justify-content: flex-end;  
137 - }  
138 - }  
139 -  
140 - /* 移动端样式 */  
141 - @media screen and (max-width: 767px) {  
142 - .nav-item {  
143 - padding-left: 10px;  
144 - }  
145 - }  
146 -  
147 - .activeCSS {  
148 - .nav-link {  
149 - color: #000;  
150 - }  
151 -  
152 - background: #fff;  
153 - }  
154 -  
155 -  
156 -  
157 - .b-navCss {  
158 - color: #fff;  
159 - }  
160 -</style>  
mobile/pages/homePage/index.vue
@@ -1,265 +0,0 @@ @@ -1,265 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <topWindow :isHome="true"></topWindow>  
4 - <view class="content">  
5 - <image src="@/static/logo.png" style="width: 100px; height: 50px;" mode="aspectFit"></image>  
6 - <view class="tipsCss">{{$t('hdk.tips')}}</view>  
7 - <view class="flex-row">  
8 - <b-input ref="inputField" class="inputCss" autofocus="autofocus" :placeholder="$t('hdk.placeholder')"  
9 - @change="handleChange" v-model="SNcode"></b-input>  
10 - <!-- <input type="text"> -->  
11 - <b-button class="SearchBtnCss my-2 my-sm-0" size="sm" @click="search"  
12 - style="background:#00AEAA;">{{$t('hdk.search')}}</b-button>  
13 - </view>  
14 - <view class="errorTipCss" v-if="isError">  
15 - <image class="errorImageCss" src="/static/images/icon/warning.png" style="width:16px;height:16px;margin: 2px;" mode="widthFix" />  
16 - <text>{{$t('hdk.sninexistence')}}</text>  
17 - </view>  
18 - <view class="btnSNscan" @click="scanClick" v-if="$isMobile">  
19 - <u-icon name="/static/images/icon/scan2.png"></u-icon>  
20 - <text style="margin-left: 10rpx;">{{$t('hdk.scan')}}</text>  
21 - </view>  
22 - </view>  
23 - </view>  
24 -</template>  
25 -  
26 -<script>  
27 - import {  
28 - getProductFind  
29 - } from '@/api/scan'  
30 - import topWindow from "@/pages/component/topWindow.vue"  
31 - export default {  
32 - data() {  
33 - return {  
34 - systemLocale: '',  
35 - applicationLocale: '',  
36 - isError: false,  
37 - SNcode: "",  
38 - open: false,  
39 - lastTimeLen: null  
40 - }  
41 - },  
42 - components: {  
43 - topWindow,  
44 - },  
45 - computed: {  
46 - locales() {  
47 - return [{  
48 - text: this.$t('locale.en'),  
49 - code: 'en'  
50 - },  
51 - {  
52 - text: this.$t('locale.zh-hans'),  
53 - code: 'zh-Hans'  
54 - },  
55 - ]  
56 - }  
57 - },  
58 - mounted() {  
59 - // const inputElement = this.$refs.inputField.$el.querySelector('input');  
60 - document.addEventListener('keydown', this.handleKeyDown);  
61 - },  
62 - onLoad() {  
63 - let systemInfo = uni.getSystemInfoSync();  
64 - this.systemLocale = systemInfo.language;  
65 - this.applicationLocale = uni.getLocale();  
66 - this.isAndroid = systemInfo.platform.toLowerCase() === 'android';  
67 - },  
68 - methods: {  
69 - getFirstSnFromUrl(url) {  
70 - const regex = /sn=([^&]+)/;  
71 - const match = url.match(regex);  
72 - if (match && match.length > 1) {  
73 - const sn = match[1];  
74 - return sn;  
75 - }  
76 - return url;  
77 - },  
78 - handleChange(event) {  
79 - this.isError = false;  
80 - this.SNcode = this.getFirstSnFromUrl(event);  
81 - // if (sncode) {  
82 - // this.SNcode = sncode;  
83 - // this.lastTimeLen = eventLen; // 重置 lastTimeLen  
84 - // } else {  
85 - // if (eventLen > this.lastTimeLen) {  
86 - // this.SNcode = event.slice(this.lastTimeLen, eventLen);  
87 - // this.lastTimeLen = eventLen;  
88 - // }  
89 - // }  
90 - },  
91 - handleBarcodeInput(event) {  
92 - // 捕获扫码枪输入的内容  
93 - console.log(event);  
94 - const barcodeContent = event.target.value;  
95 - console.log(barcodeContent);  
96 - if (key === 'Enter') {  
97 - console.log(event);  
98 - }  
99 -  
100 - },  
101 - search() {  
102 - console.log("查询");  
103 - if (this.SNcode === "") {  
104 - return  
105 - }  
106 - uni.showLoading({  
107 - title: '查询中...'  
108 - })  
109 - getProductFind(this.SNcode).then(res => {  
110 - uni.hideLoading()  
111 - if (res.code == 0) {  
112 - console.log("sn查询结果", res)  
113 - const data = res.data;  
114 - uni.navigateTo({  
115 - url: "/pages/product/index?sn=" + this.SNcode  
116 - })  
117 - } else {  
118 - this.isError = true  
119 - }  
120 - })  
121 - },  
122 - scanClick() {  
123 - uni.navigateTo({  
124 - url: "/pages/product/scan"  
125 - })  
126 - },  
127 - getResult(res) {  
128 - console.log(res);  
129 - },  
130 - geterror(e) {  
131 - console.log(e);  
132 - }  
133 - }  
134 - }  
135 -</script>  
136 -  
137 -<style lang="scss" scoped>  
138 - .containers {  
139 - width: 100vw;  
140 - height: 100vh;  
141 - background: #1E5866;  
142 - }  
143 -  
144 - .content {  
145 - display: flex;  
146 - flex-direction: column;  
147 - justify-content: center;  
148 - align-items: center;  
149 - height: 80vh;  
150 - }  
151 -  
152 - .flex-row {  
153 - display: flex;  
154 - justify-content: center;  
155 - align-items: center;  
156 - }  
157 -  
158 - //移动端样式  
159 - @media screen and (max-width: 767px) {  
160 - .inputCss {  
161 - width: 278px;  
162 - height: 44px;  
163 - }  
164 -  
165 - .btnSNscan {  
166 - width: 100px;  
167 - height: 38px;  
168 - margin: 8px;  
169 - padding: 2px;  
170 - display: flex;  
171 - align-items: center;  
172 - justify-content: center;  
173 - border-radius: 54px;  
174 - background-color: rgba(0, 174, 170, 0.25);  
175 - box-sizing: border-box;  
176 - font-family: '苹方 中等', '苹方', sans-serif;  
177 - color: #ffffff;  
178 - text-align: center;  
179 - }  
180 -  
181 - .SearchBtnCss {  
182 - width: 80px;  
183 - height: 44px;  
184 - border-radius: 4px;  
185 - background-color: #00aeaa;  
186 - box-sizing: border-box;  
187 - font-family: '苹方 中等', '苹方', sans-serif;  
188 - color: #ffffff;  
189 - text-align: center;  
190 - }  
191 -  
192 - .tipsCss {  
193 - margin: 16px 0 22px 0;  
194 - font-size: 16px;  
195 - color: #ffffff;  
196 - }  
197 -  
198 - .errorTipCss {  
199 - overflow: hidden;  
200 - display: flex;  
201 - align-items: flex-start;  
202 - margin-top: 16px;  
203 - font-size: 16px;  
204 - color: red;  
205 - }  
206 - .errorImageCss{  
207 - margin-top: 4px !important;  
208 - }  
209 -  
210 - }  
211 -  
212 - //PC端样式  
213 - @media screen and (min-width: 768px) {  
214 -  
215 - .tipsCss {  
216 - margin: 16px 0 22px 0;  
217 - font-size: 16px;  
218 - color: #ffffff;  
219 - }  
220 -  
221 - .errorTipCss {  
222 - display: flex;  
223 - align-items: center;  
224 - overflow: hidden;  
225 - margin-top: 16px;  
226 - font-size: 16px;  
227 - color: red;  
228 - }  
229 -  
230 -  
231 - .inputCss {  
232 - width: 566px;  
233 - height: 44px;  
234 - }  
235 -  
236 - .btnSNscan {  
237 - width: 130px;  
238 - height: 44px;  
239 - margin: 20px 0 0 0;  
240 - padding: 2px;  
241 - display: flex;  
242 - justify-content: center;  
243 - align-items: center;  
244 - border-radius: 54px;  
245 - background-color: rgba(0, 174, 170, 0.25);  
246 - box-sizing: border-box;  
247 - font-family: '苹方 中等', '苹方', sans-serif;  
248 - color: #ffffff;  
249 - text-align: center;  
250 - }  
251 -  
252 - .SearchBtnCss {  
253 - width: 80px;  
254 - height: 44px;  
255 - border-radius: 4px;  
256 - background-color: #00aeaa;  
257 - box-sizing: border-box;  
258 - font-family: '苹方 中等', '苹方', sans-serif;  
259 - color: #ffffff;  
260 - text-align: center;  
261 - }  
262 - }  
263 -  
264 -  
265 -</style>  
266 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/product/index.vue
@@ -1,332 +0,0 @@ @@ -1,332 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <topWindow :isHome="false" @item-click="handleItemClick"></topWindow>  
4 - <goback></goback>  
5 - <view class="ComponentsBody">  
6 - <view class="productInformation" v-if="current == 'productInformation'">  
7 - <InformationModule v-if="informationData != null" :informationData="informationData">  
8 - </InformationModule>  
9 - </view>  
10 - <view class="inspectionInformation" v-else-if="current == 'inspectionInformation'">  
11 - <InspectionModule v-if="inspectionData != null" :inspectionData="inspectionData"></InspectionModule>  
12 - </view>  
13 - <view class="attachmentInformation" v-else-if="current == 'attachmentInformation'">  
14 - <AuxiliaryModule v-if="auxiliaryData != null" :auxiliaryData="auxiliaryData"></AuxiliaryModule>  
15 - </view>  
16 - <view class="repairReportBtnCss" @click="jumpService">  
17 - <u-image src="/static/images/icon/repair.png" mode="witFix" :width="$isMobile?'100px':'200px'"  
18 - :height="$isMobile?'100px':'200px'"></u-image>  
19 - <text class="repairReportTextCss">{{$t("hdk.Repair")}}</text>  
20 - </view>  
21 - </view>  
22 -  
23 - </view>  
24 -</template>  
25 -  
26 -<script>  
27 - import config from '@/common/config.js'  
28 - import {  
29 - getProductFind  
30 - } from '@/api/scan'  
31 - import topWindow from "@/pages/component/topWindow.vue"  
32 - import goback from "@/pages/component/goback.vue"  
33 - import InformationModule from '@/pages/component/InformationModule.vue'  
34 - import InspectionModule from '@/pages/component/InspectionModule.vue'  
35 - import AuxiliaryModule from '@/pages/component/AuxiliaryModule.vue'  
36 - export default {  
37 - components: {  
38 - InformationModule,  
39 - InspectionModule,  
40 - AuxiliaryModule,  
41 - topWindow,  
42 - goback  
43 - },  
44 - data() {  
45 - return {  
46 - sn: "",  
47 - productObject: null,  
48 - informationData: null,  
49 - inspectionData: null,  
50 - auxiliaryData: null,  
51 - repairInformation: null,  
52 - current: "productInformation"  
53 - }  
54 - },  
55 - computed: {  
56 -  
57 - },  
58 - onLoad(data) {  
59 - console.log(data);  
60 - if (data) {  
61 - this.sn = data.sn;  
62 - }  
63 - this.initData()  
64 - },  
65 - methods: {  
66 - initData() {  
67 - // uni.showLoading({title: '查询中...'})  
68 - getProductFind(this.sn).then(res => {  
69 - uni.hideLoading()  
70 - if (res.code == 0) {  
71 - console.log("sn查询结果", res)  
72 - this.productObject = res.data  
73 - this.initializationMethod()  
74 - } else {  
75 - uni.showToast({  
76 - icon: 'error',  
77 - title: '网络错误',  
78 - })  
79 - }  
80 - })  
81 - },  
82 - initializationMethod() {  
83 - //重新组装产品信息数据  
84 - this.informationData = {  
85 - lamp: this.productObject.productRespVO?.lamp || null,  
86 - lampPath: this.productObject.productRespVO?.lampPath || [require('@/static/images/noPhoto.png')],  
87 - sn: this.productObject.sn,  
88 - productName: this.productObject.productRespVO?.productName || null,  
89 - type: this.productObject.productRespVO?.type || null,  
90 - productionTime: this.productObject.productionTime,  
91 - productionUserName: this.productObject.productionUserName,  
92 - productDatasheet: this.productObject.productRespVO?.productDatasheet || null,  
93 - productDatasheetPath: this.productObject.productRespVO?.productDatasheetPath || [],  
94 - productManual: this.productObject.productRespVO?.productManual || null,  
95 - productManualPath: this.productObject.productRespVO?.productManualPath || []  
96 - };  
97 - console.log("产品信息", this.informationData);  
98 -  
99 - this.repairInformation = {  
100 - sn: this.productObject.sn,  
101 - productName: this.productObject.productRespVO?.productName || null,  
102 - type: this.productObject.productRespVO?.type || null  
103 - }  
104 -  
105 - //重新组装检验信息数据  
106 - this.inspectionData = {  
107 - softwareVersion: this.productObject.softwareVersion,  
108 - hardwareVersion: this.productObject.hardwareVersion,  
109 - checkTime: this.productObject.checkTime,  
110 - type: this.productObject.productRespVO?.type || null,  
111 - power: this.productObject.power,  
112 - powerFactor: this.productObject.powerFactor,  
113 - tightnessCheckFile: this.productObject.tightnessCheckFile,  
114 - tightnessCheckFilePath: this.productObject.tightnessCheckFilePath,  
115 - lightIntensityPhoto: [],  
116 - lightIntensityFile: ''  
117 - };  
118 - console.log("检验信息", this.inspectionData);  
119 - //重新组装附件信息数据  
120 - this.auxiliaryData = this.productObject.attachmentRespVOList || [];  
121 -  
122 -  
123 - // console.log("重新组装检验信息", this.inspectionData);  
124 - if (this.productObject.attachmentRespVOList === null) {  
125 - this.auxiliaryData = [];  
126 - } else {  
127 - this.auxiliaryData = this.productObject.attachmentRespVOList.map(obj => ({  
128 - ...obj,  
129 - current: 0  
130 - }));  
131 - }  
132 - console.log("附件信息", this.auxiliaryData);  
133 - //产品数据转图片  
134 - if (this.productObject && this.productObject.productRespVO) {  
135 - const productRespVO = this.productObject.productRespVO;  
136 - // console.log("灯具", productRespVO);  
137 - // const modifiedManuals = this.generateDownloadUrls(productRespVO.lamp);  
138 - // this.informationData.lamp = modifiedManuals;  
139 - this.generateDownloadUrls(productRespVO.lampPath)  
140 - .then(modifiedManuals => {  
141 - // console.log("灯具==>", modifiedManuals);  
142 - this.informationData.lampPath = modifiedManuals;  
143 - })  
144 - .catch(error => {  
145 - console.error(error);  
146 - });  
147 - }  
148 - //光强数据转图片  
149 - if (this.productObject && this.productObject.lightIntensityPath) {  
150 - if (this.productObject.lightIntensityPath) {  
151 - this.generateDownloadUrls(this.productObject.lightIntensityPath)  
152 - .then(modifiedManuals => {  
153 - // console.log("光强==>", modifiedManuals);  
154 - this.inspectionData.lightIntensityPhoto = modifiedManuals.filter(url => this.isPicture(  
155 - url));  
156 - this.inspectionData.lightIntensityFile = modifiedManuals.filter(filename => !this  
157 - .isPicture(filename) && filename.includes('.'));  
158 - // 在这里可以访问已更新的inspectionData.lightIntensityPhoto和inspectionData.lightIntensityFile的值  
159 - })  
160 - .catch(error => {  
161 - console.error(error);  
162 - });  
163 - }  
164 - }  
165 - //附件信息转图片  
166 - if (this.auxiliaryData) {  
167 - this.auxiliaryData.forEach(attachment => {  
168 - if (attachment.productPicturePath) {  
169 - this.generateDownloadUrls(attachment.productPicturePath)  
170 - .then(modifiedPictures => {  
171 - // console.log("附件图片==>", modifiedPictures);  
172 - attachment.productPicturePath = modifiedPictures;  
173 - })  
174 - .catch(error => {  
175 - console.error(error);  
176 - });  
177 - }  
178 - });  
179 - }  
180 -  
181 - },  
182 - jumpService() {  
183 - console.log(this.repairInformation);  
184 - uni.navigateTo({  
185 - url: "/pages/product/repairReport?repairpObject=" + encodeURIComponent(JSON.stringify(  
186 - this.repairInformation)),  
187 - })  
188 - },  
189 - generateDownloadUrls(filenames) {  
190 - // console.log("filenames", filenames)  
191 - if (!filenames || filenames.length === 0) {  
192 - // 如果 filenames 为空或者null,则执行相应的操作  
193 - return Promise.resolve(require('@/static/images/noPhoto.png'))  
194 - }  
195 - const modifiedFilenames = filenames.replace(/;+$/, '');  
196 - const modifiedUrls = modifiedFilenames.split(";").map(filename => {  
197 - const trimmedFilename = filename.trim();  
198 - if (trimmedFilename.endsWith('.png') || trimmedFilename.endsWith('.jpg')) {  
199 - // const encodedFilename = Buffer.from(trimmedFilename, 'utf-8').toString('base64');  
200 - const url = config.fileUrl + `/${trimmedFilename}`;  
201 - // console.log(url);  
202 - return this.checkUrlValidity(url).catch(error => {  
203 - // console.error(error);  
204 - // console.log("请求失败", trimmedFilename)  
205 - return Promise.resolve(require('@/static/images/noPhoto.png'));  
206 - });  
207 - } else if (trimmedFilename.includes('.')) {  
208 - return Promise.resolve(trimmedFilename);  
209 - } else {  
210 - return Promise.resolve(require('@/static/images/noPhoto.png'));  
211 - }  
212 - });  
213 -  
214 - return Promise.all(modifiedUrls).then(results => {  
215 - const validUrls = results.filter(url => url !== null);  
216 - if (validUrls.length > 0) {  
217 - // console.log("有效地址",validUrls);  
218 - return validUrls;  
219 - } else {  
220 - return [require('@/static/images/noPhoto.png')];  
221 - }  
222 - });  
223 - },  
224 - checkUrlValidity(url) {  
225 - return new Promise((resolve, reject) => {  
226 - uni.request({  
227 - url,  
228 - method: 'HEAD',  
229 - success(res) {  
230 - // console.log("检验地址",res);  
231 - if (res.statusCode >= 200 && res.statusCode < 400) {  
232 - resolve(url); // URL有效  
233 - } else {  
234 - // console.log("地址无效");  
235 - resolve(null); // URL无效  
236 - }  
237 - },  
238 - fail(err) {  
239 - reject(err); // 请求失败  
240 - }  
241 - });  
242 - });  
243 - },  
244 - isPicture(str) {  
245 - // 正则表达式判断是否为网址类型的字符串  
246 - const pictureRegex = /\.(jpg|jpeg|png|gif)$/i;  
247 - return pictureRegex.test(str);  
248 - },  
249 - handleItemClick(item) {  
250 - this.current = item;  
251 - console.log('点击的菜单项:', item);  
252 - // 在此处处理被点击的菜单项  
253 - }  
254 - }  
255 - }  
256 -</script>  
257 -  
258 -<style lang="scss" scoped>  
259 - .containers {  
260 - width: 100%;  
261 - height: 100%;  
262 - background: #F9FAF9;  
263 - }  
264 -  
265 - .ComponentsBody {  
266 - // width:100%;  
267 - // display: flex;  
268 - // justify-content: center;  
269 - // align-items: center;  
270 - }  
271 -  
272 - // .productInformation{  
273 - // width: 100%;  
274 - // }  
275 -  
276 - // .inspectionInformation{  
277 - // width: 100%;  
278 - // }  
279 -  
280 - // .attachmentInformation{  
281 - // width: 100%;  
282 - // }  
283 -  
284 - @media screen and (max-width: 767px) {  
285 - .repairReportBtnCss {  
286 - width: 100px;  
287 - height: 100px;  
288 - border-radius: 100px;  
289 - position: fixed;  
290 - display: flex;  
291 - flex-direction: column;  
292 - justify-content: center;  
293 - align-items: center;  
294 - right: 0;  
295 - bottom: 100px;  
296 - // background-color: #00aeaa;  
297 - }  
298 -  
299 - .repairReportTextCss {  
300 - position: absolute;  
301 - bottom: 30px;  
302 - color: #fff;  
303 - font-size: 10px;  
304 - }  
305 - }  
306 -  
307 -  
308 -  
309 - // //PC端样式  
310 - @media screen and (min-width: 768px) {  
311 - .repairReportBtnCss {  
312 - width: 100px;  
313 - height: 100px;  
314 - border-radius: 100px;  
315 - position: fixed;  
316 - display: flex;  
317 - flex-direction: column;  
318 - justify-content: center;  
319 - align-items: center;  
320 - right: 20px;  
321 - bottom: 100px;  
322 - // background-color: #00aeaa;  
323 - }  
324 -  
325 - .repairReportTextCss {  
326 - position: absolute;  
327 - bottom: 15px;  
328 - color: #fff;  
329 - }  
330 -  
331 - }  
332 -</style>  
333 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/product/invalidCode.vue
@@ -1,147 +0,0 @@ @@ -1,147 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <topWindow></topWindow>  
4 - <view class="invalidPhoto">  
5 - <u-image src="/static/images/icon/invalidPhoto.png" width="400rpx" height="400rpx"></u-image>  
6 - </view>  
7 - <view class="flex-column">  
8 - <view class="snCodeText">{{$t('hdk.QRCodeContent')}}:{{snCode}}</view>  
9 - <!-- <view class="firstLine">  
10 - 当前SN码不存在  
11 - </view>  
12 - <view class="secondLine">  
13 - 请扫描正确的二维码  
14 - </view> -->  
15 - <view class="errorBar">  
16 - <view class="errorIcon">  
17 - <u-image width="44rpx" height="44rpx" src="/static/images/icon/warning.png"></u-image>  
18 - </view>  
19 - <view class="errorText">  
20 - {{isSNCode(snCode)?error1:error2}}  
21 - </view>  
22 - </view>  
23 - </view>  
24 - <view class="rescan" @click="rescan">  
25 - {{$t('hdk.Rescan')}}  
26 - </view>  
27 - </view>  
28 -</template>  
29 -  
30 -<script>  
31 - import topWindow from "@/pages/component/topWindow.vue"  
32 - export default {  
33 - components: {  
34 - topWindow  
35 - },  
36 - props: {  
37 -  
38 - },  
39 - data() {  
40 - return {  
41 - snCode: "",  
42 - error1: this.$t('hdk.ErrorPrompt1'),  
43 - error2: this.$t('hdk.ErrorPrompt2')  
44 - }  
45 - },  
46 - computed: {  
47 -  
48 - },  
49 - onLoad(data) {  
50 - console.log("无效参数", data);  
51 - this.snCode = data.snCode;  
52 - },  
53 - methods: {  
54 - rescan() {  
55 - uni.redirectTo({  
56 - url: '/pages/product/scan'  
57 - })  
58 - },  
59 - // 判断字符串是否为SN码格式  
60 - isSNCode(str) {  
61 - // SN码的正则表达式  
62 - const snRegex = /^[a-zA-Z0-9]+$/;  
63 - return snRegex.test(str);  
64 - },  
65 - // 判断字符串是否为其他非SN码格式  
66 - isNonSNCode(str) {  
67 - // 非SN码的正则表达式  
68 - const nonSNRegex = /^[A-Za-z0-9]{6,}$/;  
69 - return nonSNRegex.test(str);  
70 - }  
71 - }  
72 - }  
73 -</script>  
74 -  
75 -<style lang="scss" scoped>  
76 - .containers {  
77 - width: 100vw;  
78 - height: 100vh;  
79 - display: flex;  
80 - flex-direction: column;  
81 - align-items: center;  
82 -  
83 - .invalidPhoto {  
84 - margin: 80rpx 0 0 0;  
85 - }  
86 -  
87 - .flex-column {  
88 - display: flex;  
89 - flex-direction: column;  
90 - justify-content: center;  
91 - align-items: center;  
92 - text-align: center;  
93 - font-size: 28rpx;  
94 -  
95 - .snCodeText {  
96 - margin: 20px 0 44px 0;  
97 - color: #333333;  
98 - }  
99 -  
100 - .firstLine {  
101 - margin: 20px 0;  
102 - color: #333333;  
103 - }  
104 -  
105 - .secondLine {  
106 - margin: 20px 0;  
107 - color: #333333;  
108 - }  
109 - }  
110 -  
111 - .errorBar {  
112 - width: 702px;  
113 - height: 88px;  
114 - padding: 2px;  
115 - border-radius: 4px;  
116 - background-color: #fef1f1;  
117 - box-sizing: border-box;  
118 - display: flex;  
119 - align-items: center;  
120 - justify-content: flex-start;  
121 -  
122 - .errorIcon {  
123 - margin: 22px 20px;  
124 - }  
125 -  
126 - .errorText {  
127 - font-size: 28rpx;  
128 - color: #6d727a;  
129 - }  
130 - }  
131 -  
132 -  
133 - .rescan {  
134 - width: 690px;  
135 - height: 88px;  
136 - margin: 50px 0 0 0;  
137 - padding: 2px;  
138 - background-color: #00aeaa;  
139 - box-sizing: border-box;  
140 - font-family: '苹方 中等', '苹方', sans-serif;  
141 - color: #ffffff;  
142 - text-align: center;  
143 - line-height: 88px;  
144 - font-size: 32px;  
145 - }  
146 - }  
147 -</style>  
148 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/product/repairReport.vue
@@ -1,467 +0,0 @@ @@ -1,467 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <topWindow></topWindow>  
4 - <goback></goback>  
5 - <view class="content">  
6 - <u-form labelPosition="top" labelAlign="left" :model="modal" :rules="rules" ref="uForm"  
7 - :labelStyle="{fonSize:'26px',color:'#8B91A4',paddingLeft:'10px'}">  
8 - <view class="basicInformation">  
9 - <view class="title">{{$t('hdk.Basicinformation')}}<text  
10 - style="color:#8B91A4;">{{$t('hdk.Required')}}</text></view>  
11 - <view class="uform">  
12 - <u-form-item required :label="$t('hdk.SnCode')" labelWidth="50%" prop="formInfo.sn" borderBottom  
13 - ref="item1">  
14 - <u-input v-model="modal.formInfo.sn" maxlength="10" border="none"></u-input>  
15 - </u-form-item>  
16 - <u-form-item required :label="$t('hdk.ProductName')" labelWidth="50%"  
17 - prop="formInfo.productName" borderBottom ref="item2">  
18 - <u-input v-model="modal.formInfo.productName" maxlength="20" border="none"></u-input>  
19 - </u-form-item>  
20 - <u-form-item :label="$t('hdk.Model')" labelWidth="50%" prop="formInfo.type" borderBottom  
21 - ref="item3">  
22 - <u-input v-model="modal.formInfo.type" maxlength="20" border="none"></u-input>  
23 - </u-form-item>  
24 - </view>  
25 - </view>  
26 - <view class="basicInformation">  
27 - <view class="title">{{$t('hdk.ProblemDescription')}}<text  
28 - style="color:#8B91A4;">{{$t('hdk.Required')}}</text></view>  
29 - <view class="textAreaCss">  
30 - <u-textarea :placeholderStyle="!$isMobile?'font-size:18px':''" v-model="modal.formInfo.repairDescribe" count maxlength="200"  
31 - :placeholder="$t('hdk.DescriptionPlaceholder')"></u-textarea>  
32 - </view>  
33 - <view class="uploadCss">  
34 - <u-upload upload-icon="plus" :fileList="fileList" @afterRead="afterRead"  
35 - @delete="deletePic" :previewFullImage="true" name="faultPicture" multiple :maxCount="5"  
36 - accept="image"></u-upload>  
37 - </view>  
38 - </view>  
39 - <view class="basicInformation">  
40 - <view class="title">{{$t('hdk.ContactInformation')}}<text  
41 - style="color:#8B91A4;">{{$t('hdk.Required')}}</text></view>  
42 - <view class="uform">  
43 - <u-form-item required :label="$t('hdk.AirportName')" labelWidth="50%"  
44 - prop="formInfo.airportName" borderBottom ref="item3">  
45 - <u-input v-model="modal.formInfo.airportName" maxlength="20" border="none"></u-input>  
46 - </u-form-item>  
47 - <u-form-item required :label="$t('hdk.Name')" labelWidth="50%" prop="formInfo.contactPersonName"  
48 - borderBottom ref="item4">  
49 - <u-input v-model="modal.formInfo.contactPersonName" maxlength="10" border="none"></u-input>  
50 - </u-form-item>  
51 - <u-form-item :label="$t('hdk.ContactInformation')" labelWidth="50%" prop="formInfo.phone"  
52 - borderBottom ref="item5">  
53 - <u-input v-model="modal.formInfo.contactPersonPhone" maxlength="20" border="none"></u-input>  
54 - </u-form-item>  
55 - <u-form-item required :label="$t('hdk.Email')" labelWidth="50%" prop="formInfo.email"  
56 - borderBottom ref="item6">  
57 - <u-input v-model="modal.formInfo.email" maxlength="20" border="none"></u-input>  
58 - </u-form-item>  
59 - <u-form-item :label="$t('hdk.DetailedAddress')" labelWidth="100%" prop="formInfo.address"  
60 - borderBottom ref="item7">  
61 - <u-input v-model="modal.formInfo.address" maxlength="30" border="none"></u-input>  
62 - </u-form-item>  
63 - </view>  
64 - </view>  
65 - </u-form>  
66 - <view class="submitBtn" @click="openModal()">  
67 - {{$t('hdk.ConfirmAndReport')}}  
68 - </view>  
69 - <u-modal :show="confirmModal" :title="title" :confirmText="$t('hdk.Confirm')" :cancelText="$t('hdk.Cancel')" showCancelButton @confirm="submit()"  
70 - @cancel="confirmModal = false">  
71 - <view class="slot-content">  
72 - <rich-text class="contentTextCss" :nodes="content"></rich-text>  
73 - </view>  
74 - </u-modal>  
75 - <u-toast ref="uToast"></u-toast>  
76 - </view>  
77 - </view>  
78 -</template>  
79 -  
80 -<script>  
81 - import topWindow from "@/pages/component/topWindow.vue"  
82 - import goback from "@/pages/component/goback.vue"  
83 - import {  
84 - createAFaultReport  
85 - } from "@/api/scan.js"  
86 - import config from '@/common/config'  
87 - export default {  
88 - components: {  
89 - topWindow,  
90 - goback  
91 - },  
92 - props: {  
93 -  
94 - },  
95 - data() {  
96 - return {  
97 - modal: {  
98 - formInfo: {  
99 - sn: "",  
100 - productName: "",  
101 - type: "",  
102 - repairDescribe: "",  
103 - picPath: "",  
104 - airportName: "",  
105 - contactPersonName: "",  
106 - contactPersonPhone: "",  
107 - email: "",  
108 - address: "",  
109 - },  
110 - },  
111 - fileList: [],  
112 - confirmModal: false,  
113 - title: "",  
114 - content: "",  
115 - rules: {  
116 - 'formInfo.sn': {  
117 - type: 'string',  
118 - required: true,  
119 - message: this.$t('hdk.FillSNCode'),  
120 - trigger: ['blur', 'change']  
121 - },  
122 - 'formInfo.productName': {  
123 - type: 'string',  
124 - required: true,  
125 - message: this.$t('hdk.FillProductName'),  
126 - trigger: ['blur', 'change']  
127 - },  
128 - 'formInfo.contactPersonName': {  
129 - type: 'string',  
130 - required: true,  
131 - message: this.$t('hdk.FillName'),  
132 - trigger: ['blur', 'change']  
133 - },  
134 - 'formInfo.email': {  
135 - type: 'email',  
136 - required: true,  
137 - message: this.$t('hdk.FillEmail'),  
138 - trigger: ['blur', 'change']  
139 - },  
140 - 'formInfo.repairDescribe': {  
141 - type: 'string',  
142 - required: true,  
143 - message: this.$t('hdk.FillDescription'),  
144 - trigger: ['blur', 'change']  
145 - },  
146 - 'formInfo.airportName': {  
147 - type: 'string',  
148 - required: true,  
149 - message: this.$t('hdk.FillAirportName'),  
150 - trigger: ['blur', 'change']  
151 - },  
152 - },  
153 - }  
154 - },  
155 - computed: {  
156 -  
157 - },  
158 - onReady() {},  
159 - onLoad(data) {  
160 - if (data.repairpObject) {  
161 - const repairpObject = JSON.parse(decodeURIComponent(data.repairpObject))  
162 - console.log(repairpObject);  
163 - this.modal.formInfo = {  
164 - ...this.modal.formInfo,  
165 - ...repairpObject  
166 - };  
167 - console.log(this.modal.formInfo);  
168 - }  
169 - },  
170 - methods: {  
171 - deletePic(event) {  
172 - this.fileList.splice(event.index, 1)  
173 - },  
174 - async afterRead(event) {  
175 - console.log(event);  
176 - let that = this;  
177 - let lists = [].concat(event.file)  
178 - let fileListLen = that.fileList.length  
179 - lists.map((item) => {  
180 - that.fileList.push({  
181 - ...item,  
182 - status: 'uploading',  
183 - message: that.$t('hdk.Uploading')  
184 - })  
185 - })  
186 - for (let i = 0; i < lists.length; i++) {  
187 - const result = await that.uploadFilePromise(lists[i].url)  
188 - let item = that.fileList[fileListLen]  
189 - that.fileList.splice(fileListLen, 1, Object.assign(item, {  
190 - status: 'success',  
191 - message: '',  
192 - realUrl: result,  
193 - url: config.prefixUrl + result  
194 - }))  
195 - console.log(that.fileList);  
196 - fileListLen++  
197 - }  
198 - },  
199 - uploadFilePromise(url) {  
200 - console.log(url);  
201 - const filename = url.substring(url.indexOf('tmp/') + 4);  
202 - // return;  
203 - return new Promise((resolve, reject) => {  
204 - let a = uni.uploadFile({  
205 - url: config.baseUrl + '/upload-file',  
206 - header: {  
207 - 'tenant-id': '1',  
208 - // 'Content-Type': 'multipart/form-data;'  
209 - },  
210 - filePath: url,  
211 - name: "file",  
212 -  
213 - success: (res) => {  
214 - console.log(res);  
215 - let data = JSON.parse(res.data);  
216 - console.log(data);  
217 - if (data.code === 0) {  
218 - setTimeout(() => {  
219 - resolve(data.data)  
220 - }, 500)  
221 - } else {  
222 - reject("")  
223 - }  
224 - }  
225 - });  
226 - })  
227 - },  
228 - openModal() {  
229 - this.$refs.uForm.validate().then(res => {  
230 - this.title = this.$t('hdk.Reminder');  
231 - this.content = this.$t('hdk.PromptContent');  
232 - this.confirmModal = true  
233 - })  
234 - },  
235 - submit() {  
236 - console.log(this.modal.formInfo);  
237 - this.$refs.uForm.validate().then(res => {  
238 - let ohterValidate = this.checkOtherItems()  
239 - if (ohterValidate) {  
240 - createAFaultReport(this.modal.formInfo).then(res => {  
241 - console.log(res);  
242 - if (res.code === 0) {  
243 - this.$refs.uToast.show({  
244 - type: 'success',  
245 - message: this.$t('hdk.SuccessfullyReported'),  
246 - iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/success.png',  
247 - complete() {  
248 - uni.navigateBack(1)  
249 - }  
250 - })  
251 - } else if (res.code === 1400001001) {  
252 - this.$refs.uToast.show({  
253 - type: 'error',  
254 - icon: false,  
255 - message: this.$t('hdk.CheckSN'),  
256 - iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/error.png'  
257 - })  
258 - }  
259 - })  
260 - } else {  
261 - this.$refs.uToast.show({  
262 - type: 'error',  
263 - icon: false,  
264 - message: this.$t('hdk.FillDescription'),  
265 - iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/error.png'  
266 - })  
267 - }  
268 - }).catch(errors => {  
269 - this.$refs.uToast.show({  
270 - type: 'error',  
271 - icon: false,  
272 - message: this.$t('hdk.CheckForUnfilledItems'),  
273 - iconUrl: 'https://cdn.uviewui.com/uview/demo/toast/error.png'  
274 - })  
275 - console.log(errors);  
276 - })  
277 - this.confirmModal = false;  
278 - },  
279 - checkOtherItems() {  
280 - let data = this.modal.formInfo;  
281 - if (data.repairDescribe === "" && this.fileList.length <= 0) {  
282 - // uni.$u.toast('描述或图片未上传');  
283 - return false;  
284 - }  
285 - data.picPath = JSON.stringify(this.fileList.map(it => `${it.realUrl}`));  
286 - // delete data.fileList;  
287 - console.log(data.picPath);  
288 - return true;  
289 - }  
290 - }  
291 - }  
292 -</script>  
293 -  
294 -<style lang="scss" scoped>  
295 - .containers {  
296 - display: flex;  
297 - flex-direction: column;  
298 - justify-content: center;  
299 - align-items: center;  
300 - background: #F2F4F3;  
301 - }  
302 -  
303 - /deep/.uni-input-input{  
304 - padding-left: 10px  
305 - }  
306 -  
307 - .uform {  
308 - margin: 20px;  
309 - position:relative;  
310 - }  
311 -  
312 - .textAreaCss {  
313 - margin: 30px;  
314 - background-color: #f8f9fd;  
315 - }  
316 -  
317 - .uploadCss {  
318 - margin: 30px;  
319 - }  
320 -  
321 - /deep/.u-modal__title {  
322 - display: flex;  
323 - justify-content: center;  
324 - }  
325 -  
326 -  
327 -  
328 - //移动端样式  
329 - @media screen and (max-width: 767px) {  
330 - .title {  
331 - min-width: 114px;  
332 - margin: 20px 0 0 15px;  
333 - font-size: 15px;  
334 - background-color: rgba(255, 255, 255, 0);  
335 - box-sizing: border-box;  
336 - font-family: '苹方 中等', '苹方', sans-serif;  
337 - color: #333333;  
338 - text-align: left;  
339 - }  
340 - .content{  
341 - width: 100%;  
342 - }  
343 -  
344 - .basicInformation {  
345 - width: 95%;  
346 - height: auto;  
347 - padding: 2px;  
348 - border-radius: 10px;  
349 - background-color: #ffffff;  
350 - box-sizing: border-box;  
351 - margin: 10px 12px;  
352 - padding-bottom: 80px;  
353 - }  
354 -  
355 - .submitBtn {  
356 - width: 350px;  
357 - height: 40px;  
358 - padding: 2px;  
359 - margin: 24px;  
360 - position: fixed;  
361 - bottom: 0px;  
362 - display: flex;  
363 - justify-content: center;  
364 - align-items: center;  
365 - border-radius: 8px;  
366 - background-color: #00aeaa;  
367 - box-sizing: border-box;  
368 - font-family: '苹方 中等', '苹方', sans-serif;  
369 - color: #ffffff;  
370 - text-align: center;  
371 - line-height: normal;  
372 - z-index: 999;  
373 - }  
374 -  
375 - .contentTextCss {  
376 - font-size: 14px;  
377 - color: #999999;  
378 - }  
379 - }  
380 -  
381 - //PC端样式  
382 - @media screen and (min-width: 768px) {  
383 - .title {  
384 - min-width: 228px;  
385 - margin: 40px 0 0 30px;  
386 - font-size: 30px;  
387 - background-color: rgba(255, 255, 255, 0);  
388 - box-sizing: border-box;  
389 - font-family: '苹方 中等', '苹方', sans-serif;  
390 - color: #333333;  
391 - text-align: left;  
392 - }  
393 -  
394 - .contentTextCss {  
395 - font-size: 20px;  
396 - color: #999999;  
397 - }  
398 -  
399 - .content{  
400 - width: 80%;  
401 - position: relative;  
402 - }  
403 -  
404 - /deep/.u-modal{  
405 - width: 500px !important;  
406 - }  
407 -  
408 - /deep/.u-modal__title{  
409 - height: 80px;  
410 - font-size: 24px  
411 - }  
412 -  
413 - /deep/.u-modal__content{  
414 - height: 80px;  
415 - }  
416 -  
417 - /deep/.uni-textarea-textarea{  
418 - font-size: 18px;  
419 - }  
420 -  
421 - /deep/.uni-input-input{  
422 - font-size: 20px !important;  
423 - }  
424 -  
425 - /deep/.u-form-item__body__right__message{  
426 - font-size: 18px;  
427 - }  
428 -  
429 - /deep/.u-form-item__body__left__content__label {  
430 - font-size: 22px;  
431 - }  
432 -  
433 - .basicInformation {  
434 - width: 100%;  
435 - height: auto;  
436 - padding: 2px;  
437 - border-radius: 20px;  
438 - background-color: #ffffff;  
439 - box-sizing: border-box;  
440 - margin: 20px 24px;  
441 - padding-bottom: 40px;  
442 - }  
443 -  
444 - .submitBtn {  
445 - width: 500px;  
446 - height: 39px;  
447 - padding: 2px;  
448 - position: fixed;  
449 - left: 0;right: 0;  
450 - bottom: 30px;  
451 - margin: 0 auto;  
452 - display: flex;  
453 - justify-content: center;  
454 - align-items: center;  
455 - border-radius: 4px;  
456 - background-color: #00aeaa;  
457 - box-sizing: border-box;  
458 - font-family: '苹方 中等', '苹方', sans-serif;  
459 - color: #ffffff;  
460 - text-align: center;  
461 - line-height: normal;  
462 - z-index: 999;  
463 - }  
464 - }  
465 -  
466 -  
467 -</style>  
468 \ No newline at end of file 0 \ No newline at end of file
mobile/pages/product/scan.vue
@@ -1,89 +0,0 @@ @@ -1,89 +0,0 @@
1 -<template>  
2 - <view class="containers">  
3 - <topWindow></topWindow>  
4 - <QrScan ref="qrcode" @ok="getResult" @err="geterror" v-if="open" />  
5 - </view>  
6 -</template>  
7 -  
8 -<script>  
9 - import topWindow from "@/pages/component/topWindow.vue"  
10 - import QrScan from "@/pages/component/QrScan.vue"  
11 - import config from '@/common/config.js'  
12 - import {  
13 - getProductFind  
14 - } from '@/api/scan'  
15 - var browser = { // 判断浏览器内核  
16 - versions: (function() {  
17 - var u = navigator.userAgent;  
18 - return {  
19 - trident: u.indexOf('Trident') > -1, //IE内核  
20 - presto: u.indexOf('Presto') > -1, //opera内核  
21 - webKit: u.indexOf('AppleWebKit') > -1, //苹果、谷歌内核  
22 - gecko: u.indexOf('Gecko') > -1 && u.indexOf('KHTML') == -1, //火狐内核  
23 - weixin: u.indexOf('MicroMessenger') > -1, //是否微信 (2015-01-22新增)  
24 - };  
25 - })(),  
26 - };  
27 - export default {  
28 - components: {  
29 - QrScan,  
30 - topWindow  
31 - },  
32 - props: {  
33 -  
34 - },  
35 - data() {  
36 - return {  
37 - open: false  
38 - }  
39 - },  
40 - computed: {  
41 -  
42 - },  
43 - mounted() {  
44 - if (browser.versions.webKit || browser.versions.weixin || browser.versions.gecko) {  
45 - this.open = true;  
46 - } else {  
47 - Toast('Browser not supported');  
48 - }  
49 - },  
50 - onLoad() {  
51 -  
52 - },  
53 - methods: {  
54 - getResult(sn) {  
55 - console.log(sn);  
56 - this.open = false;  
57 - const regex = /sn=([^&]+)/;  
58 - const match = regex.exec(sn);  
59 - const sncode = match ? match[1] : sn;  
60 - // let sncode = sn.substring(sn.lastIndexOf(":") + 1);  
61 - getProductFind(sncode).then(res => {  
62 - console.log(res);  
63 - if (res.code === 1400001001) {  
64 - uni.navigateTo({  
65 - url: '/pages/product/invalidCode?snCode='+sncode,  
66 - success() {  
67 - this.open = true  
68 - }  
69 - });  
70 - } else {  
71 - uni.navigateTo({  
72 - url: "/pages/product/index?sn=" + sncode  
73 - })  
74 - }  
75 - })  
76 -  
77 - },  
78 - geterror(e) {  
79 - console.log(e);  
80 - },  
81 - }  
82 - }  
83 -</script>  
84 -  
85 -<style lang="scss" scoped>  
86 - .containers {  
87 - width: 100vw;  
88 - }  
89 -</style>  
90 \ No newline at end of file 0 \ No newline at end of file
pages/component/QrScan.vue
@@ -20,7 +20,7 @@ @@ -20,7 +20,7 @@
20 }) 20 })
21 .catch(error => { 21 .catch(error => {
22 console.log(error) 22 console.log(error)
23 - // alert('Failed to access camera.') 23 + // alert(error)
24 }) 24 })
25 }, 25 },
26 beforeDestroy() { 26 beforeDestroy() {
@@ -93,7 +93,7 @@ @@ -93,7 +93,7 @@
93 93
94 94
95 #reader { 95 #reader {
96 - top: 50%; 96 + top: 45%;
97 left: 0; 97 left: 0;
98 transform: translateY(-50%); 98 transform: translateY(-50%);
99 } 99 }
pages/component/topWindow.vue
@@ -90,6 +90,7 @@ @@ -90,6 +90,7 @@
90 uni.setLocale('zh-Hans'); 90 uni.setLocale('zh-Hans');
91 this.selectedLanguage = `${this.$t('index.language')}:${this.$t('locale.zh-hans')}`; 91 this.selectedLanguage = `${this.$t('index.language')}:${this.$t('locale.zh-hans')}`;
92 } 92 }
  93 + this.$emit('lanChange',uni.getLocale())
93 } 94 }
94 } 95 }
95 } 96 }
pages/homePage/index.vue
@@ -5,8 +5,9 @@ @@ -5,8 +5,9 @@
5 <image src="@/static/logo.png" style="width: 100px; height: 50px;" mode="aspectFit"></image> 5 <image src="@/static/logo.png" style="width: 100px; height: 50px;" mode="aspectFit"></image>
6 <view class="tipsCss">{{$t('hdk.tips')}}</view> 6 <view class="tipsCss">{{$t('hdk.tips')}}</view>
7 <view class="flex-row"> 7 <view class="flex-row">
8 - <b-input id="input" ref="inputField" class="inputCss" autofocus="autofocus" :placeholder="$t('hdk.placeholder')"  
9 - @input="handleChange" @keypress.enter="handleScan" v-model="SNcode"></b-input> 8 + <b-input id="input" ref="inputField" type="text" class="inputCss" maxLength="100" autofocus="autofocus"
  9 + :placeholder="$t('hdk.placeholder')" οnkeyup="this.value=this.value.replace(/\D|/g,'')"
  10 + @input="handleChange" @keypress.enter="handleScan" v-model="SNcode"></b-input>
10 <b-button class="SearchBtnCss my-2 my-sm-0" size="sm" @click="search" 11 <b-button class="SearchBtnCss my-2 my-sm-0" size="sm" @click="search"
11 style="background:#00AEAA;">{{$t('hdk.search')}}</b-button> 12 style="background:#00AEAA;">{{$t('hdk.search')}}</b-button>
12 </view> 13 </view>
@@ -24,17 +25,6 @@ @@ -24,17 +25,6 @@
24 </template> 25 </template>
25 26
26 <script> 27 <script>
27 - // window.document.onkeydown = (e) => {  
28 - // console.log(e);  
29 - // let input = document.getElementById('input');  
30 - // input.focus()  
31 - // if (e.keyCode === 20) {  
32 - // console.log(input.value);  
33 - // input.innerHTML = input.value;  
34 - // // input.value = ''  
35 - // }  
36 - // }  
37 -  
38 import { 28 import {
39 getProductFind 29 getProductFind
40 } from '@/api/scan' 30 } from '@/api/scan'
@@ -45,10 +35,13 @@ @@ -45,10 +35,13 @@
45 systemLocale: '', 35 systemLocale: '',
46 applicationLocale: '', 36 applicationLocale: '',
47 isError: false, 37 isError: false,
48 - SNcode: "",  
49 open: false, 38 open: false,
50 - lastTimeLen: null,  
51 - lastCode: "" 39 + SNcode: "",
  40 + code: "",
  41 + lastTime: "",
  42 + lastCode: "",
  43 + nextTime: "",
  44 + nextCode: "",
52 } 45 }
53 }, 46 },
54 components: { 47 components: {
@@ -67,10 +60,48 @@ @@ -67,10 +60,48 @@
67 ] 60 ]
68 } 61 }
69 }, 62 },
70 - mounted() {  
71 - // const inputElement = this.$refs.inputField.$el.querySelector('input');  
72 - document.addEventListener('keydown', this.handleKeyDown);  
73 - }, 63 + created() {
  64 +
  65 + window.document.onkeypress = (e) => {
  66 + if (window.event) {
  67 + // IE
  68 + this.nextCode = e.keyCode;
  69 + } else if (e.which) {
  70 + // Netscape/Firefox/Opera
  71 + this.nextCode = e.which;
  72 + }
  73 + if (e.which === 20) {
  74 + // 键盘回车事件
  75 + if (this.code.length < 3) return; // 扫码枪的速度很快,手动输入的时间不会让code的长度大于2,所以这里不会对扫码枪有效
  76 + console.log("扫码结束。");
  77 + console.log("条形码:", this.code);
  78 + this.handleScan(this.code); // 获取到扫码枪输入的内容,做别的操作
  79 + this.lastCode = "";
  80 + this.lastTime = "";
  81 + return;
  82 + }
  83 + this.nextTime = new Date().getTime();
  84 + if (!this.lastTime && !this.lastCode) {
  85 + this.code = ""; // 清空上次的条形码
  86 + this.code += e.key;
  87 + console.log("扫码开始---", this.code);
  88 + }
  89 + if (
  90 + this.lastCode &&
  91 + this.lastTime &&
  92 + this.nextTime - this.lastTime > 500
  93 + ) {
  94 + // 当扫码前有keypress事件时,防止首字缺失
  95 + this.code = e.key;
  96 + // console.log("防止首字缺失。。。", this.code);
  97 + } else if (this.lastCode && this.lastTime) {
  98 + this.code += e.key;
  99 + // console.log("扫码中。。。", this.code);
  100 + }
  101 + this.lastCode = this.nextCode;
  102 + this.lastTime = this.nextTime;
  103 + };
  104 + },
74 onLoad() { 105 onLoad() {
75 let systemInfo = uni.getSystemInfoSync(); 106 let systemInfo = uni.getSystemInfoSync();
76 this.systemLocale = systemInfo.language; 107 this.systemLocale = systemInfo.language;
@@ -79,23 +110,22 @@ @@ -79,23 +110,22 @@
79 }, 110 },
80 methods: { 111 methods: {
81 getFirstSnFromUrl(url) { 112 getFirstSnFromUrl(url) {
82 - const regex = /sn=([^&]+)/; 113 + // const regex = /sn=([^&]+)/;
  114 + const regex = /((?<=\?sn=)|(?<=HDKSN:))\w+/;
83 const match = url.match(regex); 115 const match = url.match(regex);
  116 + console.log(match)
84 if (match && match.length > 1) { 117 if (match && match.length > 1) {
85 - const sn = match[1]; 118 + const sn = match[0];
86 return sn; 119 return sn;
87 } 120 }
88 return url; 121 return url;
89 }, 122 },
90 handleChange(event) { 123 handleChange(event) {
91 - console.log(event);  
92 - this.SNcode = this.getFirstSnFromUrl(event); 124 + // console.log(event);
  125 + // this.SNcode = this.getFirstSnFromUrl(event);
93 }, 126 },
94 handleScan(event) { 127 handleScan(event) {
95 - // console.log(this.SNcode);  
96 - // 捕获扫码枪输入的内容  
97 - // this.isError = false;  
98 - 128 + this.SNcode = this.getFirstSnFromUrl(this.code);
99 }, 129 },
100 search() { 130 search() {
101 console.log("查询"); 131 console.log("查询");
pages/product/invalidCode.vue
@@ -130,6 +130,27 @@ @@ -130,6 +130,27 @@
130 } 130 }
131 131
132 132
  133 +
  134 + }
  135 + //移动端样式
  136 + @media screen and (max-width: 767px) {
  137 + .rescan {
  138 + width: 345px;
  139 + height: 44px;
  140 + margin: 25px 0 0 0;
  141 + padding: 2px;
  142 + background-color: #00aeaa;
  143 + box-sizing: border-box;
  144 + font-family: '苹方 中等', '苹方', sans-serif;
  145 + color: #ffffff;
  146 + text-align: center;
  147 + line-height: 44px;
  148 + font-size: 16px;
  149 + }
  150 + }
  151 +
  152 + //PC端样式
  153 + @media screen and (min-width: 768px) {
133 .rescan { 154 .rescan {
134 width: 690px; 155 width: 690px;
135 height: 88px; 156 height: 88px;
pages/product/repairReport.vue
1 <template> 1 <template>
2 <view class="containers"> 2 <view class="containers">
3 - <topWindow></topWindow> 3 + <topWindow @lanChange="changeLan"></topWindow>
4 <goback></goback> 4 <goback></goback>
5 <view class="content"> 5 <view class="content">
6 <u-form labelPosition="top" labelAlign="left" :model="modal" :rules="rules" ref="uForm" 6 <u-form labelPosition="top" labelAlign="left" :model="modal" :rules="rules" ref="uForm"
@@ -27,12 +27,13 @@ @@ -27,12 +27,13 @@
27 <view class="title">{{$t('hdk.ProblemDescription')}}<text 27 <view class="title">{{$t('hdk.ProblemDescription')}}<text
28 style="color:#8B91A4;">{{$t('hdk.Required')}}</text></view> 28 style="color:#8B91A4;">{{$t('hdk.Required')}}</text></view>
29 <view class="textAreaCss"> 29 <view class="textAreaCss">
30 - <u-textarea :placeholderStyle="!$isMobile?'font-size:18px':''" v-model="modal.formInfo.repairDescribe" count maxlength="200" 30 + <u-textarea :placeholderStyle="!$isMobile?'font-size:18px':''"
  31 + v-model="modal.formInfo.repairDescribe" count maxlength="200"
31 :placeholder="$t('hdk.DescriptionPlaceholder')"></u-textarea> 32 :placeholder="$t('hdk.DescriptionPlaceholder')"></u-textarea>
32 </view> 33 </view>
33 <view class="uploadCss"> 34 <view class="uploadCss">
34 - <u-upload upload-icon="plus" :fileList="fileList" @afterRead="afterRead"  
35 - @delete="deletePic" :previewFullImage="true" name="faultPicture" multiple :maxCount="5" 35 + <u-upload upload-icon="plus" :fileList="fileList" @afterRead="afterRead" @delete="deletePic"
  36 + :previewFullImage="true" name="faultPicture" multiple :maxCount="5"
36 accept="image"></u-upload> 37 accept="image"></u-upload>
37 </view> 38 </view>
38 </view> 39 </view>
@@ -66,8 +67,8 @@ @@ -66,8 +67,8 @@
66 <view class="submitBtn" @click="openModal()"> 67 <view class="submitBtn" @click="openModal()">
67 {{$t('hdk.ConfirmAndReport')}} 68 {{$t('hdk.ConfirmAndReport')}}
68 </view> 69 </view>
69 - <u-modal :show="confirmModal" :title="title" :confirmText="$t('hdk.Confirm')" :cancelText="$t('hdk.Cancel')" showCancelButton @confirm="submit()"  
70 - @cancel="confirmModal = false"> 70 + <u-modal :show="confirmModal" :title="title" :confirmText="$t('hdk.Confirm')" :cancelText="$t('hdk.Cancel')"
  71 + showCancelButton @confirm="submit()" @cancel="confirmModal = false">
71 <view class="slot-content"> 72 <view class="slot-content">
72 <rich-text class="contentTextCss" :nodes="content"></rich-text> 73 <rich-text class="contentTextCss" :nodes="content"></rich-text>
73 </view> 74 </view>
@@ -168,6 +169,17 @@ @@ -168,6 +169,17 @@
168 } 169 }
169 }, 170 },
170 methods: { 171 methods: {
  172 + changeLan(locale) {
  173 + console.log("切换语言,重新触发提示语", locale);
  174 + // 清除校验状态
  175 + this.$refs.uForm.clearValidate();
  176 + // 重新校验
  177 + this.$forceUpdate()
  178 + this.$nextTick(() => {
  179 + this.$refs.uForm.validate();
  180 + });
  181 +
  182 + },
171 deletePic(event) { 183 deletePic(event) {
172 this.fileList.splice(event.index, 1) 184 this.fileList.splice(event.index, 1)
173 }, 185 },
@@ -202,14 +214,14 @@ @@ -202,14 +214,14 @@
202 // return; 214 // return;
203 return new Promise((resolve, reject) => { 215 return new Promise((resolve, reject) => {
204 let a = uni.uploadFile({ 216 let a = uni.uploadFile({
205 - url: config.baseUrl + '/upload-file', 217 + url: config.baseUrl + '/upload-file',
206 header: { 218 header: {
207 'tenant-id': '1', 219 'tenant-id': '1',
208 // 'Content-Type': 'multipart/form-data;' 220 // 'Content-Type': 'multipart/form-data;'
209 }, 221 },
210 filePath: url, 222 filePath: url,
211 name: "file", 223 name: "file",
212 - 224 +
213 success: (res) => { 225 success: (res) => {
214 console.log(res); 226 console.log(res);
215 let data = JSON.parse(res.data); 227 let data = JSON.parse(res.data);
@@ -299,14 +311,14 @@ @@ -299,14 +311,14 @@
299 align-items: center; 311 align-items: center;
300 background: #F2F4F3; 312 background: #F2F4F3;
301 } 313 }
302 -  
303 - /deep/.uni-input-input{ 314 +
  315 + /deep/.uni-input-input {
304 padding-left: 10px 316 padding-left: 10px
305 } 317 }
306 318
307 .uform { 319 .uform {
308 margin: 20px; 320 margin: 20px;
309 - position:relative; 321 + position: relative;
310 } 322 }
311 323
312 .textAreaCss { 324 .textAreaCss {
@@ -322,8 +334,8 @@ @@ -322,8 +334,8 @@
322 display: flex; 334 display: flex;
323 justify-content: center; 335 justify-content: center;
324 } 336 }
325 -  
326 - 337 +
  338 +
327 339
328 //移动端样式 340 //移动端样式
329 @media screen and (max-width: 767px) { 341 @media screen and (max-width: 767px) {
@@ -337,10 +349,19 @@ @@ -337,10 +349,19 @@
337 color: #333333; 349 color: #333333;
338 text-align: left; 350 text-align: left;
339 } 351 }
340 - .content{ 352 +
  353 + .content {
341 width: 100%; 354 width: 100%;
342 } 355 }
343 356
  357 + /deep/.uni-textarea-textarea {
  358 + font-size: 15px;
  359 + }
  360 +
  361 + /deep/.uni-textarea-placeholder {
  362 + font-size: 15px;
  363 + }
  364 +
344 .basicInformation { 365 .basicInformation {
345 width: 95%; 366 width: 95%;
346 height: auto; 367 height: auto;
@@ -371,7 +392,7 @@ @@ -371,7 +392,7 @@
371 line-height: normal; 392 line-height: normal;
372 z-index: 999; 393 z-index: 999;
373 } 394 }
374 - 395 +
375 .contentTextCss { 396 .contentTextCss {
376 font-size: 14px; 397 font-size: 14px;
377 color: #999999; 398 color: #999999;
@@ -390,39 +411,39 @@ @@ -390,39 +411,39 @@
390 color: #333333; 411 color: #333333;
391 text-align: left; 412 text-align: left;
392 } 413 }
393 - 414 +
394 .contentTextCss { 415 .contentTextCss {
395 font-size: 20px; 416 font-size: 20px;
396 color: #999999; 417 color: #999999;
397 } 418 }
398 -  
399 - .content{ 419 +
  420 + .content {
400 width: 80%; 421 width: 80%;
401 position: relative; 422 position: relative;
402 } 423 }
403 -  
404 - /deep/.u-modal{ 424 +
  425 + /deep/.u-modal {
405 width: 500px !important; 426 width: 500px !important;
406 } 427 }
407 -  
408 - /deep/.u-modal__title{ 428 +
  429 + /deep/.u-modal__title {
409 height: 80px; 430 height: 80px;
410 font-size: 24px 431 font-size: 24px
411 } 432 }
412 -  
413 - /deep/.u-modal__content{ 433 +
  434 + /deep/.u-modal__content {
414 height: 80px; 435 height: 80px;
415 } 436 }
416 -  
417 - /deep/.uni-textarea-textarea{ 437 +
  438 + /deep/.uni-textarea-textarea {
418 font-size: 18px; 439 font-size: 18px;
419 } 440 }
420 -  
421 - /deep/.uni-input-input{ 441 +
  442 + /deep/.uni-input-input {
422 font-size: 20px !important; 443 font-size: 20px !important;
423 } 444 }
424 -  
425 - /deep/.u-form-item__body__right__message{ 445 +
  446 + /deep/.u-form-item__body__right__message {
426 font-size: 18px; 447 font-size: 18px;
427 } 448 }
428 449
@@ -446,7 +467,8 @@ @@ -446,7 +467,8 @@
446 height: 39px; 467 height: 39px;
447 padding: 2px; 468 padding: 2px;
448 position: fixed; 469 position: fixed;
449 - left: 0;right: 0; 470 + left: 0;
  471 + right: 0;
450 bottom: 30px; 472 bottom: 30px;
451 margin: 0 auto; 473 margin: 0 auto;
452 display: flex; 474 display: flex;
@@ -462,6 +484,4 @@ @@ -462,6 +484,4 @@
462 z-index: 999; 484 z-index: 999;
463 } 485 }
464 } 486 }
465 -  
466 -  
467 </style> 487 </style>
468 \ No newline at end of file 488 \ No newline at end of file
pages/product/scan.vue
@@ -54,9 +54,9 @@ @@ -54,9 +54,9 @@
54 getResult(sn) { 54 getResult(sn) {
55 console.log(sn); 55 console.log(sn);
56 this.open = false; 56 this.open = false;
57 - const regex = /sn=([^&]+)/; 57 + const regex = /((?<=\?sn=)|(?<=HDKSN:))\w+/;
58 const match = regex.exec(sn); 58 const match = regex.exec(sn);
59 - const sncode = match ? match[1] : sn; 59 + const sncode = match ? match[0] : sn;
60 // let sncode = sn.substring(sn.lastIndexOf(":") + 1); 60 // let sncode = sn.substring(sn.lastIndexOf(":") + 1);
61 getProductFind(sncode).then(res => { 61 getProductFind(sncode).then(res => {
62 console.log(res); 62 console.log(res);
postcss.config.js
@@ -9,7 +9,7 @@ module.exports = { @@ -9,7 +9,7 @@ module.exports = {
9 fontViewportUnit: 'px', // 字体使用的视口单位 9 fontViewportUnit: 'px', // 字体使用的视口单位
10 // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。 10 // 需要忽略的CSS选择器,不会转为视口单位,使用原有的px等单位。
11 // 下面配置表示类名中含有'keep-px'都不会被转换 11 // 下面配置表示类名中含有'keep-px'都不会被转换
12 - selectorBlackList: ['keep-px','u-modal','u-form-item','u-upload',"uni-input"], 12 + selectorBlackList: ['keep-px','u-modal','u-form-item','u-upload',"uni-input","uni-textarea-textarea","uni-textarea-placeholder","u-toast"],
13 minPixelValue: 1, // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换 13 minPixelValue: 1, // 设置最小的转换数值,如果为1的话,只有大于1的值会被转换
14 mediaQuery: false, // 媒体查询里的单位是否需要转换单位 14 mediaQuery: false, // 媒体查询里的单位是否需要转换单位
15 replace: true, // 是否直接更换属性值,而不添加备用属性 15 replace: true, // 是否直接更换属性值,而不添加备用属性