Browse Source

feat:发布

chenqilong 1 year ago
parent
commit
d4f6bcb999

+ 1 - 1
package.json

@@ -107,7 +107,7 @@
     "regenerator-runtime": "^0.12.1",
     "uni-read-pages": "^1.0.5",
     "uni-simple-router": "2.0.7",
-    "uview-ui": "2.0.31",
+    "uview-ui": "2.0.34",
     "vue": "^2.6.11",
     "vue-pdf": "^4.3.0",
     "vuex": "^3.2.0",

+ 259 - 0
src/common/utils/md5.js

@@ -0,0 +1,259 @@
+/*
+ * A JavaScript implementation of the RSA Data Security, Inc. MD5 Message
+ * Digest Algorithm, as defined in RFC 1321.
+ * Version 2.1 Copyright (C) Paul Johnston 1999 - 2002.
+ * Other contributors: Greg Holt, Andrew Kepert, Ydnar, Lostinet
+ * Distributed under the BSD License
+ * See http://pajhome.org.uk/crypt/md5 for more info.
+ */
+
+/*
+ * Configurable variables. You may need to tweak these to be compatible with
+ * the server-side, but the defaults work in most cases.
+ */
+var hexcase = 0; /* hex output format. 0 - lowercase; 1 - uppercase        */
+var b64pad = ""; /* base-64 pad character. "=" for strict RFC compliance   */
+var chrsz = 8; /* bits per input character. 8 - ASCII; 16 - Unicode      */
+
+/*
+ * These are the functions you'll usually want to call
+ * They take string arguments and return either hex or base-64 encoded strings
+ */
+export function hex_md5(s) {
+	return binl2hex(core_md5(str2binl(s), s.length * chrsz));
+}
+
+export function b64_md5(s) {
+	return binl2b64(core_md5(str2binl(s), s.length * chrsz));
+}
+
+export function str_md5(s) {
+	return binl2str(core_md5(str2binl(s), s.length * chrsz));
+}
+
+export function hex_hmac_md5(key, data) {
+	return binl2hex(core_hmac_md5(key, data));
+}
+
+export function b64_hmac_md5(key, data) {
+	return binl2b64(core_hmac_md5(key, data));
+}
+
+export function str_hmac_md5(key, data) {
+	return binl2str(core_hmac_md5(key, data));
+}
+
+/*
+ * Perform a simple self-test to see if the VM is working
+ */
+function md5_vm_test() {
+	return hex_md5("abc") == "900150983cd24fb0d6963f7d28e17f72";
+}
+
+/*
+ * Calculate the MD5 of an array of little-endian words, and a bit length
+ */
+function core_md5(x, len) {
+	/* append padding */
+	x[len >> 5] |= 0x80 << ((len) % 32);
+	x[(((len + 64) >>> 9) << 4) + 14] = len;
+
+	var a = 1732584193;
+	var b = -271733879;
+	var c = -1732584194;
+	var d = 271733878;
+
+	for (var i = 0; i < x.length; i += 16) {
+		var olda = a;
+		var oldb = b;
+		var oldc = c;
+		var oldd = d;
+
+		a = md5_ff(a, b, c, d, x[i + 0], 7, -680876936);
+		d = md5_ff(d, a, b, c, x[i + 1], 12, -389564586);
+		c = md5_ff(c, d, a, b, x[i + 2], 17, 606105819);
+		b = md5_ff(b, c, d, a, x[i + 3], 22, -1044525330);
+		a = md5_ff(a, b, c, d, x[i + 4], 7, -176418897);
+		d = md5_ff(d, a, b, c, x[i + 5], 12, 1200080426);
+		c = md5_ff(c, d, a, b, x[i + 6], 17, -1473231341);
+		b = md5_ff(b, c, d, a, x[i + 7], 22, -45705983);
+		a = md5_ff(a, b, c, d, x[i + 8], 7, 1770035416);
+		d = md5_ff(d, a, b, c, x[i + 9], 12, -1958414417);
+		c = md5_ff(c, d, a, b, x[i + 10], 17, -42063);
+		b = md5_ff(b, c, d, a, x[i + 11], 22, -1990404162);
+		a = md5_ff(a, b, c, d, x[i + 12], 7, 1804603682);
+		d = md5_ff(d, a, b, c, x[i + 13], 12, -40341101);
+		c = md5_ff(c, d, a, b, x[i + 14], 17, -1502002290);
+		b = md5_ff(b, c, d, a, x[i + 15], 22, 1236535329);
+
+		a = md5_gg(a, b, c, d, x[i + 1], 5, -165796510);
+		d = md5_gg(d, a, b, c, x[i + 6], 9, -1069501632);
+		c = md5_gg(c, d, a, b, x[i + 11], 14, 643717713);
+		b = md5_gg(b, c, d, a, x[i + 0], 20, -373897302);
+		a = md5_gg(a, b, c, d, x[i + 5], 5, -701558691);
+		d = md5_gg(d, a, b, c, x[i + 10], 9, 38016083);
+		c = md5_gg(c, d, a, b, x[i + 15], 14, -660478335);
+		b = md5_gg(b, c, d, a, x[i + 4], 20, -405537848);
+		a = md5_gg(a, b, c, d, x[i + 9], 5, 568446438);
+		d = md5_gg(d, a, b, c, x[i + 14], 9, -1019803690);
+		c = md5_gg(c, d, a, b, x[i + 3], 14, -187363961);
+		b = md5_gg(b, c, d, a, x[i + 8], 20, 1163531501);
+		a = md5_gg(a, b, c, d, x[i + 13], 5, -1444681467);
+		d = md5_gg(d, a, b, c, x[i + 2], 9, -51403784);
+		c = md5_gg(c, d, a, b, x[i + 7], 14, 1735328473);
+		b = md5_gg(b, c, d, a, x[i + 12], 20, -1926607734);
+
+		a = md5_hh(a, b, c, d, x[i + 5], 4, -378558);
+		d = md5_hh(d, a, b, c, x[i + 8], 11, -2022574463);
+		c = md5_hh(c, d, a, b, x[i + 11], 16, 1839030562);
+		b = md5_hh(b, c, d, a, x[i + 14], 23, -35309556);
+		a = md5_hh(a, b, c, d, x[i + 1], 4, -1530992060);
+		d = md5_hh(d, a, b, c, x[i + 4], 11, 1272893353);
+		c = md5_hh(c, d, a, b, x[i + 7], 16, -155497632);
+		b = md5_hh(b, c, d, a, x[i + 10], 23, -1094730640);
+		a = md5_hh(a, b, c, d, x[i + 13], 4, 681279174);
+		d = md5_hh(d, a, b, c, x[i + 0], 11, -358537222);
+		c = md5_hh(c, d, a, b, x[i + 3], 16, -722521979);
+		b = md5_hh(b, c, d, a, x[i + 6], 23, 76029189);
+		a = md5_hh(a, b, c, d, x[i + 9], 4, -640364487);
+		d = md5_hh(d, a, b, c, x[i + 12], 11, -421815835);
+		c = md5_hh(c, d, a, b, x[i + 15], 16, 530742520);
+		b = md5_hh(b, c, d, a, x[i + 2], 23, -995338651);
+
+		a = md5_ii(a, b, c, d, x[i + 0], 6, -198630844);
+		d = md5_ii(d, a, b, c, x[i + 7], 10, 1126891415);
+		c = md5_ii(c, d, a, b, x[i + 14], 15, -1416354905);
+		b = md5_ii(b, c, d, a, x[i + 5], 21, -57434055);
+		a = md5_ii(a, b, c, d, x[i + 12], 6, 1700485571);
+		d = md5_ii(d, a, b, c, x[i + 3], 10, -1894986606);
+		c = md5_ii(c, d, a, b, x[i + 10], 15, -1051523);
+		b = md5_ii(b, c, d, a, x[i + 1], 21, -2054922799);
+		a = md5_ii(a, b, c, d, x[i + 8], 6, 1873313359);
+		d = md5_ii(d, a, b, c, x[i + 15], 10, -30611744);
+		c = md5_ii(c, d, a, b, x[i + 6], 15, -1560198380);
+		b = md5_ii(b, c, d, a, x[i + 13], 21, 1309151649);
+		a = md5_ii(a, b, c, d, x[i + 4], 6, -145523070);
+		d = md5_ii(d, a, b, c, x[i + 11], 10, -1120210379);
+		c = md5_ii(c, d, a, b, x[i + 2], 15, 718787259);
+		b = md5_ii(b, c, d, a, x[i + 9], 21, -343485551);
+
+		a = safe_add(a, olda);
+		b = safe_add(b, oldb);
+		c = safe_add(c, oldc);
+		d = safe_add(d, oldd);
+	}
+	return Array(a, b, c, d);
+
+}
+
+/*
+ * These functions implement the four basic operations the algorithm uses.
+ */
+function md5_cmn(q, a, b, x, s, t) {
+	return safe_add(bit_rol(safe_add(safe_add(a, q), safe_add(x, t)), s), b);
+}
+
+function md5_ff(a, b, c, d, x, s, t) {
+	return md5_cmn((b & c) | ((~b) & d), a, b, x, s, t);
+}
+
+function md5_gg(a, b, c, d, x, s, t) {
+	return md5_cmn((b & d) | (c & (~d)), a, b, x, s, t);
+}
+
+function md5_hh(a, b, c, d, x, s, t) {
+	return md5_cmn(b ^ c ^ d, a, b, x, s, t);
+}
+
+function md5_ii(a, b, c, d, x, s, t) {
+	return md5_cmn(c ^ (b | (~d)), a, b, x, s, t);
+}
+
+/*
+ * Calculate the HMAC-MD5, of a key and some data
+ */
+function core_hmac_md5(key, data) {
+	var bkey = str2binl(key);
+	if (bkey.length > 16) bkey = core_md5(bkey, key.length * chrsz);
+
+	var ipad = Array(16),
+		opad = Array(16);
+	for (var i = 0; i < 16; i++) {
+		ipad[i] = bkey[i] ^ 0x36363636;
+		opad[i] = bkey[i] ^ 0x5C5C5C5C;
+	}
+
+	var hash = core_md5(ipad.concat(str2binl(data)), 512 + data.length * chrsz);
+	return core_md5(opad.concat(hash), 512 + 128);
+}
+
+/*
+ * Add integers, wrapping at 2^32. This uses 16-bit operations internally
+ * to work around bugs in some JS interpreters.
+ */
+function safe_add(x, y) {
+	var lsw = (x & 0xFFFF) + (y & 0xFFFF);
+	var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
+	return (msw << 16) | (lsw & 0xFFFF);
+}
+
+/*
+ * Bitwise rotate a 32-bit number to the left.
+ */
+function bit_rol(num, cnt) {
+	return (num << cnt) | (num >>> (32 - cnt));
+}
+
+/*
+ * Convert a string to an array of little-endian words
+ * If chrsz is ASCII, characters >255 have their hi-byte silently ignored.
+ */
+function str2binl(str) {
+	var bin = Array();
+	var mask = (1 << chrsz) - 1;
+	for (var i = 0; i < str.length * chrsz; i += chrsz)
+		bin[i >> 5] |= (str.charCodeAt(i / chrsz) & mask) << (i % 32);
+	return bin;
+}
+
+/*
+ * Convert an array of little-endian words to a string
+ */
+function binl2str(bin) {
+	var str = "";
+	var mask = (1 << chrsz) - 1;
+	for (var i = 0; i < bin.length * 32; i += chrsz)
+		str += String.fromCharCode((bin[i >> 5] >>> (i % 32)) & mask);
+	return str;
+}
+
+/*
+ * Convert an array of little-endian words to a hex string.
+ */
+function binl2hex(binarray) {
+	var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
+	var str = "";
+	for (var i = 0; i < binarray.length * 4; i++) {
+		str += hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8 + 4)) & 0xF) +
+			hex_tab.charAt((binarray[i >> 2] >> ((i % 4) * 8)) & 0xF);
+	}
+	return str;
+}
+
+/*
+ * Convert an array of little-endian words to a base-64 string
+ */
+function binl2b64(binarray) {
+	var tab = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+	var str = "";
+	for (var i = 0; i < binarray.length * 4; i += 3) {
+		var triplet = (((binarray[i >> 2] >> 8 * (i % 4)) & 0xFF) << 16) |
+			(((binarray[i + 1 >> 2] >> 8 * ((i + 1) % 4)) & 0xFF) << 8) |
+			((binarray[i + 2 >> 2] >> 8 * ((i + 2) % 4)) & 0xFF);
+		for (var j = 0; j < 4; j++) {
+			if (i * 8 + j * 6 > binarray.length * 32) str += b64pad;
+			else str += tab.charAt((triplet >> 6 * (3 - j)) & 0x3F);
+		}
+	}
+	return str;
+}

+ 1 - 1
src/common/utils/util.js

@@ -39,7 +39,7 @@ export const uploadImg = async function(file) {
   })
 
   //获取阿里oss上传参数
-  const par = await api.get('/file/oss/config')
+  const par = await api.get('/common/oss/config')
     .then(res => {
       return res.data
     }).catch(err => {

+ 189 - 0
src/components/zj-upload/index.vue

@@ -0,0 +1,189 @@
+<template>
+	<view class="file-upload-container">
+		<view class="file-upload-view" v-for="(item,index) in files" :key="index">
+			<view class="file-upload-ckick" @click="imgView(index)">
+				<image v-if="item.url" mode="aspectFit" :src="imageUrl + item.url" style="width:100%;height:100%">
+				</image>
+				<template v-else>
+					<image mode="aspectFit" :src="item.loUrl" style="width:100%;height:100%">
+					</image>
+					<view class="mack" @tap.stop="()=>{}"></view>
+					<image @tap.stop="()=>{}" class="uploadImg" mode="aspectFit"
+						src="/static/upload/loading.png">
+					</image>
+				</template>
+				<image class="delImg" mode="aspectFit" src="/static/upload/del.png" @tap.stop="del(index)">
+				</image>
+			</view>
+		</view>
+		<view v-if="count===0?true:count-files.length" class="file-upload-view" @click="upload">
+			<view class="file-upload-ckick">
+				<image class="uploadImg" mode="aspectFit" src="/static/upload/upload.png">
+				</image>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	import {
+		uploadImg
+	} from "@/common/utils/util.js"
+	import {
+		b64_md5
+	} from "@/common/utils/md5.js"
+	import loadingImg from "./loading.png"
+	export default {
+		props: {
+			count: {
+				type: Number,
+				default: 0
+			},
+			fileList: {
+				type: Array,
+				default: () => []
+			}
+		},
+		data() {
+			return {
+				imageUrl: this.$imageUrl,
+				files: this.setFileVal(this.fileList)
+			};
+		},
+		watch: {
+			fileList() {
+				this.files = this.setFileVal(this.fileList)
+			},
+			files: {
+				handler(newName, oldName) {
+					if (newName.every(item => item.url ? true : false)) {
+						this.$emit("getFiles", newName.map(item => item.url))
+					}
+				},
+				deep: true
+			}
+		},
+		methods: {
+			setFileVal(arr) {
+				return arr.map(item => {
+					if (typeof(item) == 'string') {
+						return {
+							url: item,
+							key: b64_md5(item)
+						}
+					} else {
+						return item
+					}
+				})
+			},
+			upload() {
+				uni.chooseImage({
+					count: this.count === 0 ? 0 : this.count - this.files.length,
+					success: async res => {
+						const leng = res.tempFiles.length;
+						for (var file of res.tempFiles) {
+							this.files.push({
+								url: false,
+								key: b64_md5(file.path),
+								loUrl: file.path
+							})
+						}
+						for (var i = 0; i < leng; i++) {
+							var data = await uploadImg(res.tempFiles[i])
+							var obj = this.files.find(item => item.key === b64_md5(res.tempFiles[i]
+								.path))
+							if (obj) {
+								obj.url = data.url
+								obj.key = b64_md5(data.url)
+								delete obj.loUrl
+							}
+						}
+					},
+					fail: err => {
+						console.log(err);
+					}
+				})
+			},
+			del(index) {
+				this.files.splice(index, 1)
+			},
+			imgView(index) {
+				var list = this.files.map(item => {
+					if (item.url) {
+						return this.imageUrl + item.url
+					} else {
+						return loadingImg
+					}
+				})
+				uni.previewImage({
+					current: index,
+					urls: list
+				});
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.file-upload-container {
+		width: 100%;
+		height: 100%;
+		display: flex;
+		flex-wrap: wrap;
+		justify-content: space-between;
+
+		.file-upload-view {
+			display: inline-block;
+			margin-bottom: 20rpx;
+
+			&:nth-last-of-type(-n+2) {
+				margin-bottom: 0;
+			}
+
+			.file-upload-ckick {
+				width: 300rpx;
+				height: 190rpx;
+				background: #FFFFFF;
+				border-radius: 20rpx;
+				opacity: 1;
+				border: 1rpx solid #E4E4E4;
+				box-sizing: border-box;
+				padding: 10rpx;
+				position: relative;
+				display: flex;
+				justify-content: center;
+				align-items: center;
+
+				.mack {
+					width: 100%;
+					height: 100%;
+					position: absolute;
+					top: 50%;
+					left: 50%;
+					transform: translate(-50%, -50%);
+					z-index: 2;
+					background: rgba(0, 0, 0, 0.2);
+				}
+
+				.uploadImg {
+					width: 80rpx;
+					height: 80rpx;
+					position: absolute;
+					top: 50%;
+					left: 50%;
+					transform: translate(-50%, -50%);
+					z-index: 3;
+				}
+
+				.delImg {
+					position: absolute;
+					top: -16rpx;
+					right: -16rpx;
+					z-index: 2;
+					width: 40rpx;
+					height: 40rpx;
+				}
+			}
+		}
+	}
+</style>

BIN
src/components/zj-upload/loading.png


+ 146 - 126
src/manifest.json

@@ -1,137 +1,157 @@
 {
-    "name" : "recycle",
-    "appid" : "__UNI__ED0779D",
-    "description" : "",
-    "versionName" : "1.0.0",
-    "versionCode" : "100",
-    "transformPx" : false,
-    "networkTimeout" : {
-        "request" : 30000,
-        "connectSocket" : 10000,
-        "uploadFile" : 100000,
-        "downloadFile" : 10000
+  "name": "recycle",
+  "appid": "__UNI__ED0779D",
+  "description": "",
+  "versionName": "1.0.0",
+  "versionCode": "100",
+  "transformPx": false,
+  "networkTimeout": {
+    "request": 30000,
+    "connectSocket": 10000,
+    "uploadFile": 100000,
+    "downloadFile": 10000
+  },
+  "h5": {
+    "title": "",
+    "publicPath": "/",
+    "devServer": {
+      "https": false,
+      "port": 3000,
+      "open": true,
+      "proxy": {
+        "/api": {
+          "target": "http://127.0.0.1:3001",
+          "changeOrigin": true,
+          "secure": false,
+          "pathRewrite": {
+            "^/api": ""
+          }
+        }
+      }
     },
-    "h5" : {
-        "title" : "",
-        "publicPath": "/",
-        "devServer" : {
-            "https" : false,
-            "port" : 3000,
-            "open" : true,
-            "proxy" : {
-                "/api" : {
-                    "target" : "http://127.0.0.1:3001",
-                    "changeOrigin" : true,
-                    "secure" : false,
-                    "pathRewrite" : {
-                        "^/api" : ""
-                    }
-                }
-            }
-        },
-        "router" : {
-            "mode" : "history",
-            "base": "/"
-        },
-        "optimization" : {
-            "prefetch" : true,
-            "preload" : true,
-            "treeShaking" : {
-                "enable" : true
-            }
-        },
-        "sdkConfigs" : {}
+    "router": {
+      "mode": "history",
+      "base": "/"
     },
-    // 使用地图或位置相关功能必须填写其一
-    "mp-weixin" : {
-        /* 小程序特有相关 */
-        "requiredPrivateInfos" : [ "chooseLocation", "getLocation", "chooseAddress" ],
-        "appid" : "wx6330b74c3be6a5a2",
-        "setting" : {
-            "urlCheck" : false,
-            "es6" : true,
-            "postcss" : true,
-            "minified" : true,
-            "preloadBackgroundData" : false,
-            "newFeature" : true,
-            "coverView" : true,
-            "autoAudits" : false,
-            "showShadowRootInWxmlPanel" : true,
-            "scopeDataCheck" : false,
-            "uglifyFileName" : true,
-            "checkInvalidKey" : true,
-            "checkSiteMap" : true,
-            "uploadWithSourceMap" : true,
-            "bigPackageSizeSupport" : false /* 预览及真机调试时包体积上限是否调整为4M*/
-        },
-        "usingComponents" : true,
-        "optimization" : {
-            "subPackages" : true
-        },
-        "permission" : {
-            "scope.userLocation" : {
-                "desc" : "你的位置信息将用于小程序位置接口的效果展示"
-            }
-        }
+    "optimization": {
+      "prefetch": true,
+      "preload": true,
+      "treeShaking": {
+        "enable": true
+      }
     },
-    "app-plus" : {
-        /* 5+App特有相关 */
-        "usingComponents": false,
-        "splashscreen" : {
-            "alwaysShowBeforeRender": false,
-            "waiting" : true,
-            "autoclose" : true,
-            "delay" : 0
+    "sdkConfigs": {
+      // 使用地图或位置相关功能必须填写其一
+      "maps": {
+        "qqmap": {
+          // 腾讯地图秘钥 https://lbs.qq.com/dev/console/key/manage
+          "key": ""
+        },
+        "google": {
+          // 谷歌地图秘钥(HBuilderX 3.2.10+)https://developers.google.com/maps/documentation/javascript/get-api-key
+          "key": ""
         },
-        "modules" : {},
-        /* 模块配置 */
-        "distribute" : {
-            /* 应用发布信息 */
-            "android" : {
-                /* android打包配置 */
-                "permissions" : [
-                    "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
-                    "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
-                    "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
-                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
-                    "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
-                    "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
-                    "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
-                    "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
-                    "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
-                    "<uses-feature android:name=\"android.hardware.camera\"/>",
-                    "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
-                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
-                ]
-            },
-            "ios" : {},
-            /* ios打包配置 */
-            "sdkConfigs" : {}
+        "amap": {
+          // 高德地图秘钥(HBuilderX 3.6.0+)https://console.amap.com/dev/key/app
+          "key": "5894bf90997454b0df3c3d60cab12f64",
+          // 高德地图安全密钥(HBuilderX 3.6.0+)https://console.amap.com/dev/key/app
+          "securityJsCode": "",
+          // 高德地图安全密钥代理服务器地址(HBuilderX 3.6.0+)https://lbs.amap.com/api/jsapi-v2/guide/abc/prepare
+          "serviceHost": "https://jiasm.zfire.top/_AMapService"
         }
+      }
+    }
+  },
+  // 使用地图或位置相关功能必须填写其一
+  "mp-weixin": {
+    /* 小程序特有相关 */
+    "requiredPrivateInfos": ["chooseLocation", "getLocation", "chooseAddress"],
+    "appid": "wx6330b74c3be6a5a2",
+    "setting": {
+      "urlCheck": false,
+      "es6": true,
+      "postcss": true,
+      "minified": true,
+      "preloadBackgroundData": false,
+      "newFeature": true,
+      "coverView": true,
+      "autoAudits": false,
+      "showShadowRootInWxmlPanel": true,
+      "scopeDataCheck": false,
+      "uglifyFileName": true,
+      "checkInvalidKey": true,
+      "checkSiteMap": true,
+      "uploadWithSourceMap": true,
+      "bigPackageSizeSupport": false /* 预览及真机调试时包体积上限是否调整为4M*/
     },
-    /* SDK配置 */
-    "quickapp" : {},
-    /* 快应用特有相关 */
-    "mp-alipay" : {
-        "usingComponents" : true
-    },
-    "mp-baidu" : {
-        "usingComponents": false
+    "usingComponents": true,
+    "optimization": {
+      "subPackages": true
     },
-    "mp-toutiao" : {
-        "usingComponents" : true
+    "permission": {
+      "scope.userLocation": {
+        "desc": "你的位置信息将用于小程序位置接口的效果展示"
+      }
+    }
+  },
+  "app-plus": {
+    /* 5+App特有相关 */
+    "usingComponents": false,
+    "splashscreen": {
+      "alwaysShowBeforeRender": false,
+      "waiting": true,
+      "autoclose": true,
+      "delay": 0
     },
-    "mp-qq" : {
-        "usingComponents" : true
+    "modules": {},
+    /* 模块配置 */
+    "distribute": {
+      /* 应用发布信息 */
+      "android": {
+        /* android打包配置 */
+        "permissions": [
+          "<uses-permission android:name=\"android.permission.CHANGE_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.MOUNT_UNMOUNT_FILESYSTEMS\"/>",
+          "<uses-permission android:name=\"android.permission.READ_CONTACTS\"/>",
+          "<uses-permission android:name=\"android.permission.VIBRATE\"/>",
+          "<uses-permission android:name=\"android.permission.READ_LOGS\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_WIFI_STATE\"/>",
+          "<uses-feature android:name=\"android.hardware.camera.autofocus\"/>",
+          "<uses-permission android:name=\"android.permission.WRITE_CONTACTS\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_NETWORK_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+          "<uses-permission android:name=\"android.permission.RECORD_AUDIO\"/>",
+          "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+          "<uses-permission android:name=\"android.permission.MODIFY_AUDIO_SETTINGS\"/>",
+          "<uses-permission android:name=\"android.permission.READ_PHONE_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.CHANGE_WIFI_STATE\"/>",
+          "<uses-permission android:name=\"android.permission.WAKE_LOCK\"/>",
+          "<uses-permission android:name=\"android.permission.CALL_PHONE\"/>",
+          "<uses-permission android:name=\"android.permission.FLASHLIGHT\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_COARSE_LOCATION\"/>",
+          "<uses-feature android:name=\"android.hardware.camera\"/>",
+          "<uses-permission android:name=\"android.permission.ACCESS_FINE_LOCATION\"/>",
+          "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+        ]
+      },
+      "ios": {},
+      /* ios打包配置 */
+      "sdkConfigs": {}
     }
+  },
+  /* SDK配置 */
+  "quickapp": {},
+  /* 快应用特有相关 */
+  "mp-alipay": {
+    "usingComponents": true
+  },
+  "mp-baidu": {
+    "usingComponents": false
+  },
+  "mp-toutiao": {
+    "usingComponents": true
+  },
+  "mp-qq": {
+    "usingComponents": true
+  }
 }

+ 207 - 1
src/pages/issue/index.vue

@@ -1,15 +1,221 @@
 <template>
+  <view>
+    <!-- ---须知--- -->
     <view>
+      <u-popup :show="show" :overlay="false">
+        <view class="pop">
+          <view class="bottom-container">
+            <u-button @click="handleAgree" text="我已知晓" color="#5298ff" shape="circle"></u-button>
+          </view>
+        </view>
+      </u-popup>
+    </view>
+    <!-- ---------- -->
+    <view class="content">
+      <u--form labelPosition="top" labelWidth="150" :model="form" :rules="rules" ref="uForm">
+        <u-form-item label="商品名称" prop="form.title" borderBottom ref="item1">
+          <u--input v-model="form.title" placeholder="请输入商品名称" border="none"></u--input>
+        </u-form-item>
+        <u-form-item label="商品描述" prop="form.content" borderBottom ref="item1">
+          <u--input v-model="form.content" placeholder="请输入" border="none"></u--input>
+        </u-form-item>
+        <u-form-item label="商品图片" prop="form.name" borderBottom ref="item1">
+          <zj-upload key="cp" @getFiles="getFiles(index, $event)" :fileList="fileList" :count="1" />
+        </u-form-item>
+        <u-form-item labelPosition="left" label="商品分类" prop="form.categoryId" borderBottom ref="item1">
+          <u-radio-group v-model="form.categoryId" placement="column">
+            <u-radio
+              v-for="(v, i) in categoryList"
+              :key="i"
+              :customStyle="{ marginBottom: '8px' }"
+              :label="v.categoryName"
+              :name="v.categoryId"
+            >
+            </u-radio>
+          </u-radio-group>
+        </u-form-item>
+        <u-form-item label="所在位置" labelPosition="left" prop="form.name" borderBottom ref="item1">
+          <view @click="handleDW" class="letText">
+            <text v-if="form.address">{{ form.address }}</text>
+            <text v-if="!form.address">请选择定位</text>
+            <u-icon name="arrow-right"></u-icon>
+          </view>
+        </u-form-item>
+        <u-form-item label="商品价格(含运费) " labelPosition="left" prop="form.amount" borderBottom ref="item1">
+          <u--input v-model="form.amount" inputAlign="right" placeholder="请输入数字" border="none"></u--input>
+        </u-form-item>
+        <u-form-item label="上架数量" labelPosition="left" prop="form.num" borderBottom ref="item1">
+          <u--input v-model="form.num" inputAlign="right" placeholder="请输入" border="none"></u--input>
+        </u-form-item>
+        <u-form-item label="商品品牌" labelPosition="left" prop="form.brand" borderBottom ref="item1">
+          <u--input
+            v-model="form.brand"
+            inputAlign="right"
+            placeholder="请输入(如格力、美的)"
+            border="none"
+          ></u--input>
+        </u-form-item>
+        <u-form-item label="功率(W)" labelPosition="left" prop="form.power" borderBottom ref="item1">
+          <u--input v-model="form.power" inputAlign="right" placeholder="请输入" border="none"></u--input>
+        </u-form-item>
+        <u-form-item labelPosition="left" label="能效标识" prop="form.energy" borderBottom ref="item1">
+          <u-radio-group v-model="form.energy" placement="column">
+            <u-radio
+              v-for="(v, i) in dictList"
+              :key="i"
+              :customStyle="{ marginBottom: '8px' }"
+              :label="v.dictValue"
+              :name="v.dictValue"
+            >
+            </u-radio>
+          </u-radio-group>
+        </u-form-item>
+        <u-form-item label="制造日期" labelPosition="left" prop="form.goodsCreateTime" borderBottom ref="item1">
+          <view class="letText" @click="handleTime">
+            <text v-if="form.goodsCreateTime">{{ form.goodsCreateTime || '' }}</text>
+            <text v-if="!form.goodsCreateTime">请选择</text>
+            <u-icon name="arrow-right"></u-icon>
+          </view>
+        </u-form-item>
+      </u--form>
 
+      <view class="" style="padding: 50rpx 0">
+        <u-button @click="submin" text="发布" color="#5298ff" shape="circle"></u-button>
+      </view>
     </view>
+    <u-datetime-picker
+      @cancel="handleCancelTime"
+      @confirm="handleConfirmTime"
+      :show="showTime"
+      v-model="time"
+      mode="year-month"
+    ></u-datetime-picker>
+  </view>
 </template>
 
 <script>
+import zjUpload from '@/components/zj-upload/index.vue'
 export default {
+  components: { zjUpload },
+  data() {
+    return {
+      showTime: false,
+      show: true,
+      form: {
+        title: '',
+        content: '',
+        categoryName: '',
+        categoryId: '',
+        lng: '',
+        lat: '',
+        address: '',
+        amount: '',
+        num: '',
+        brand: '',
+        power: '',
+        energy: '',
+        goodsCreateTime: ''
+      },
+      time: Number(new Date()),
+      rules: {},
+      categoryList: [],
+      dictList: [],
+      fileList: []
+    }
+  },
+  onShow() {
+    this.getList()
+    this.getDictList()
+  },
+  methods: {
+    getFiles() {},
+    submin() {
+      this.form.categoryName = this.categoryList.find(v => v.categoryId === this.form.categoryId)?.categoryName ?? ''
+      console.log(this.form)
+    },
+    //获取商品分类数据
+    async getList() {
+      this.$api
+        .get('/goods/category/list')
+        .then(res => {
+          this.categoryList = res.data
+        })
+        .catch(() => {})
+    },
+    //获取能效数据
+    async getDictList() {
+      this.$api
+        .get('/goods/dict', {
+          dictCode: '能效'
+        })
+        .then(res => {
+          console.log(res)
+          this.dictList = res.data
+        })
+        .catch(() => {})
+    },
+    handleDW() {
+        console.log(888);
+      uni.chooseLocation({
+        success: res => {
+          this.form.lng = res.longitude
+          this.form.lat = res.latitude
+          this.form.address = res.address
+        }
+      })
+    },
+    handleConfirmTime(value) {
+      const date = new Date(value.value) // JavaScript的Date对象使用的是毫秒时间戳,因此需要将Unix时间戳乘以1000
+      const year = date.getFullYear()
+      const month = String(date.getMonth() + 1).padStart(2, '0') // getMonth()返回的月份是从0开始的,因此需要加1,然后使用padStart()添加前导零
+      const day = String(date.getDate()).padStart(2, '0')
+      const hours = String(date.getHours()).padStart(2, '0')
+      const minutes = String(date.getMinutes()).padStart(2, '0')
+      const seconds = String(date.getSeconds()).padStart(2, '0')
 
+      let res = `${year}-${month}-${day} ${hours}:${minutes}:${seconds}`
+      let res2 = `${year}-${month}`
+      this.form.goodsCreateTime = res
+      this.time = res2
+      this.showTime = false
+    },
+    handleCancelTime() {
+      this.showTime = false
+    },
+    handleTime() {
+      this.showTime = true
+    },
+    handleAgree() {
+      this.show = false
+    }
+  }
 }
 </script>
 
 <style lang="scss" scoped>
-
+.pop {
+  //   padding: 0 20rpx;
+  height: calc(100vh - 44px);
+}
+.content {
+  padding: 0 40rpx;
+  margin: 20rpx 0;
+  //   height: calc(100vh - 44px);
+  background-color: #fff;
+}
+.bottom-container {
+  position: fixed;
+  bottom: 0;
+  width: 100%;
+  background-color: #f1f1f1;
+  padding: 18px 0;
+}
+.letText {
+  width: 100%;
+  display: flex;
+  justify-content: flex-end;
+}
+::v-deep .u-radio-label--undefined {
+  justify-content: flex-end;
+}
 </style>

BIN
src/static/upload/del.png


BIN
src/static/upload/loading.png


BIN
src/static/upload/upload.png