youncao 4 år sedan
incheckning
ef5029d9b3

+ 5 - 0
.gitignore

@@ -0,0 +1,5 @@
+/.hbuilderx
+/node_modules
+/unpackage
+/proto/bundle.js
+/.vscode

+ 8 - 0
API/Constant.js

@@ -0,0 +1,8 @@
+
+// URL
+export let BASEURL = '';
+if(process.env.NODE_ENV === 'development'){ // 开发环境
+  BASEURL = 'https://test.ohplay.radio1964.net/Ohplay/Web/HttpToTcp';
+}else{ // 生产
+  BASEURL = 'https://ohplay.radio1964.net/Ohplay/Web/HttpToTcp';
+};

+ 10 - 0
API/ProtoConfig.js

@@ -0,0 +1,10 @@
+import {
+	user
+} from './../proto/bundle.js';
+
+const ProtoConfig = {
+	1001: user.wx_mini_program_login_req, // 登录请求
+	1002: user.wx_mini_program_login_rsp, // 登录返回
+};
+
+module.exports = ProtoConfig;

+ 23 - 0
App.vue

@@ -0,0 +1,23 @@
+
+<script>
+	export default {
+		components: {},
+		data: () => ({}),
+		computed: {},
+		methods: {},
+		watch: {},
+		onLaunch: function() {
+			console.log('App Launch')
+		},
+		onShow: function() {
+			console.log('App Show')
+		},
+		onHide: function() {
+			console.log('App Hide')
+		}
+	}
+</script>
+
+<style>
+	/*每个页面公共css */
+</style>

+ 0 - 0
Comments/Modal.vue


+ 12 - 0
Lib/Mqtt.js

@@ -0,0 +1,12 @@
+exports.install = function(Vue, options) {
+    Vue.prototype.$back = back;
+    Vue.prototype.$pushH = function() { //全局函数2
+        console.log("$pushH")
+    };
+    Vue.prototype.$pushHN = function() { //全局函数3
+        console.log("$pushHN")
+    };
+};
+function back() {
+	return "back"
+}

+ 62 - 0
Lib/ProtoMap.js

@@ -0,0 +1,62 @@
+import {
+	common,
+} from './../proto/bundle';
+
+import ProtoConfig from './../API/ProtoConfig';
+
+
+function getMsgWebsocket(version, server, servant, buffer) {
+	return common.MsgWebsocket.create({
+		version: version,
+		app: 1,
+		server: server,
+		servant: servant,
+		data: buffer,
+	});
+};
+
+function getRequestBuffer(request, buffer) {
+	const requestMessage = getMsgWebsocket(request.version ? request.version : 1, request.server, request.servant, buffer);
+	const requestBuffer = common.MsgWebsocket.encode(requestMessage).finish();
+	return new Uint8Array([...requestBuffer]).buffer;
+};
+
+function getResponseDataBuf(response) {
+	const resBuf = Buffer.from(response.data);
+	const resMessage = common.MsgWebsocket.decode(resBuf);
+	return resMessage.data;
+};
+
+
+function requestEncode(request) { //请求的编码
+	const RequestMessage = ProtoConfig[request.servant];
+	const requestMsgObj = RequestMessage.create(request.data);
+	const buffer = RequestMessage.encode(requestMsgObj).finish();
+	//返回请求的ArrayBuffer
+	return getRequestBuffer(request, buffer);
+};
+
+function responseDecode(response) { //响应的解码
+	const resBuf = Buffer.from(response);
+	const resMessage = common.MsgWebsocket.decode(resBuf);
+	console.log(resMessage)
+	const rspBuf = resMessage.data;
+
+	const ResponseMessage = ProtoConfig[resMessage.servant];
+
+	const rspMsgObj = ResponseMessage.decode(rspBuf);
+
+	const obj = ResponseMessage.toObject(rspMsgObj, {
+		longs: String,
+		enums: String,
+	});
+	return obj
+
+};
+
+
+
+module.exports = {
+	requestEncode,
+	responseDecode,
+}

+ 149 - 0
Lib/Request.js

@@ -0,0 +1,149 @@
+
+import {
+	requestEncode,
+	responseDecode
+} from "./ProtoMap";
+
+import { BASEURL } from "../API/Constant";
+
+let token = "";
+
+// 登录
+function login() {
+
+	uni.login({
+		provider: 'weixin',
+		success: function (loginRes) {
+			const data = {
+				server: 2,
+				servant: 1001,
+				version: 3,
+				data: {
+					// phone:Buffer.from('3246541321'),
+					phone: '17688768233',
+					code: loginRes.code,
+					verifyCode: 'asdasd',
+					nickname: "4",
+					head_url: "6",
+					system_type: 1,
+				}
+			}
+			request(data).then((res) => {
+				console.log(res);
+
+				res.token = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyaWQiOjY1MDYzMywibmFtZSI6IjE4MTI2NDQ3MDE1IiwiZXhwIjoxNjIyODg0NTA1fQ.f7jIm0856-VnynA99MBoA2Dl1pePxI0HT_ECsUp5QHA';
+
+				token = res.token;
+				// 缓存token
+				uni.setStorage({
+					key: 'token',
+					data: res.token,
+				});
+
+			});
+		}
+	});
+	// return res
+};
+
+// 获取token
+function getToken() {
+	try {
+		const value = uni.getStorageSync('token');
+		if (value) {
+			token = value;
+		} else {
+			login();
+		}
+	} catch (e) {
+		login();
+	}
+}
+
+// getToken();
+login();
+
+
+const defaultHeader = {
+	"X-Requested-With": "XMLHttpRequest",
+	"Content-Type": "application/x-protobuf",
+	'Token': 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJVc2VyaWQiOjY1MDYzMywibmFtZSI6IjE4MTI2NDQ3MDE1IiwiZXhwIjoxNjIyODg0NTA1fQ.f7jIm0856-VnynA99MBoA2Dl1pePxI0HT_ECsUp5QHA'
+}
+
+/**
+ * POST请求
+ * @param {*} request 
+ * @returns 
+ */
+function request(data, type = "POST", header = defaultHeader) {
+	return new Promise((resolve, reject) => {
+		uni.request({
+			url: BASEURL,
+			header: header,
+			method: type,
+			timeout: 15000,
+			dataType: 'protobuf',
+			responseType: 'arraybuffer',
+			data: requestEncode(data)
+		}).then((res) => {
+			res.map((response) => {
+				if (response && response.statusCode === 200) {
+					try {
+						let enc = new TextDecoder('utf-8')
+						let resJson = JSON.parse(enc.decode(new Uint8Array(response.data))) //转化成json对象
+						if (resJson.code === 0) {
+
+							let arrayBuffer = uni.base64ToArrayBuffer(resJson.data)
+
+							let data = responseDecode(arrayBuffer);
+							let code = 0;
+							let msg = "success";
+							if (typeof data.errInfo !== 'undefined') {
+								console.log(data.errInfo)
+								code = data.errInfo.errorMessage
+								if (typeof data.errInfo.errorMessage === 'string') {
+									msg = data.errInfo.errorMessage
+								} else {
+									msg = Buffer.from(data.errInfo.errorMessage).toString()
+								}
+								if (typeof code === 'undefined' && msg === 'ok') {
+									code = 0
+								}
+							};
+							resolve({
+								data,
+								code,
+								msg
+							});
+						} else {
+							resolve({
+								code: resJson.code,
+								msg: resJson.info
+							});
+						}
+
+					} catch (e) {
+						resolve({
+							code: -1,
+							msg: e.toString(),
+
+						});
+					}
+					return;
+				};
+				// 没有数据或者返回错误
+				// resolve({
+				// 	code: 1006,
+				// 	msg: "数据错误",
+				// });
+			})
+
+		}).catch((error) => {
+			let [err, res] = error;
+			reject(err);
+		})
+	})
+
+}
+
+module.exports = request;

+ 21 - 0
main.js

@@ -0,0 +1,21 @@
+import Vue from 'vue'
+import App from './App'
+
+import all from './Lib/Mqtt';
+import request from './Lib/Request';
+
+Vue.use(all);//将全局函数当做插件来进行注册
+
+Vue.prototype.$request = request;
+
+Vue.config.productionTip = false
+
+Vue.config.showtasot = "565656"
+
+App.mpType = 'app'
+
+
+const app = new Vue({
+    ...App
+})
+app.$mount()

+ 71 - 0
manifest.json

@@ -0,0 +1,71 @@
+{
+    "name" : "OhPlay",
+    "appid" : "",
+    "description" : "",
+    "versionName" : "1.0.0",
+    "versionCode" : "100",
+    "transformPx" : false,
+    /* 5+App特有相关 */
+    "app-plus" : {
+        "usingComponents" : true,
+		"nvueStyleCompiler" : "uni-app",
+        "compilerVersion" : 3,
+        "splashscreen" : {
+            "alwaysShowBeforeRender" : true,
+            "waiting" : true,
+            "autoclose" : true,
+            "delay" : 0
+        },
+        /* 模块配置 */
+        "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.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.ACCESS_NETWORK_STATE\"/>",
+                    "<uses-permission android:name=\"android.permission.CAMERA\"/>",
+                    "<uses-permission android:name=\"android.permission.GET_ACCOUNTS\"/>",
+                    "<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.FLASHLIGHT\"/>",
+                    "<uses-feature android:name=\"android.hardware.camera\"/>",
+                    "<uses-permission android:name=\"android.permission.WRITE_SETTINGS\"/>"
+                ]
+            },
+            /* ios打包配置 */
+            "ios" : {},
+            /* SDK配置 */
+            "sdkConfigs" : {}
+        }
+    },
+    /* 快应用特有相关 */
+    "quickapp" : {},
+    /* 小程序特有相关 */
+    "mp-weixin" : {
+        "appid" : "",
+        "setting" : {
+            "urlCheck" : false
+        },
+        "usingComponents" : true
+    },
+    "mp-alipay" : {
+        "usingComponents" : true
+    },
+    "mp-baidu" : {
+        "usingComponents" : true
+    },
+    "mp-toutiao" : {
+        "usingComponents" : true
+    },
+    "uniStatistics": {  
+        "enable": false
+    }
+}

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1630 - 0
package-lock.json


+ 20 - 0
package.json

@@ -0,0 +1,20 @@
+{
+  "name": "ohplay",
+  "version": "1.0.0",
+  "description": "",
+  "main": "main.js",
+  "scripts": {
+    "test": "echo \"Error: no test specified\" && exit 1"
+  },
+  "author": "",
+  "license": "ISC",
+  "dependencies": {
+    "@dcloudio/uni-helper-json": "^1.0.13",
+    "ali-oss": "^6.15.2",
+    "mqtt": "^4.1.0",
+    "protobufjs": "^6.11.2"
+  },
+  "devDependencies": {
+    "@types/ali-oss": "^6.0.8"
+  }
+}

+ 39 - 0
pages.json

@@ -0,0 +1,39 @@
+{
+	"pages": [
+		{
+			"path": "pages/index/index",
+			"style": {
+				"navigationBarTitleText": "OhPlay"
+			}
+		},
+		{
+			"path": "pages/mine/mine",
+			"style": {
+				"navigationBarTitleText": "OhPlay"
+			}
+		}
+	],
+	"globalStyle": {
+		"navigationBarTextStyle": "black",
+		"navigationBarTitleText": "uni-app",
+		"navigationBarBackgroundColor": "#F8F8F8",
+		"backgroundColor": "#F8F8F8"
+	},
+	"tabBar": {
+    "color": "#7A7E83",
+    "selectedColor": "#3cc51f",
+    "borderStyle": "black",
+    "backgroundColor": "#ffffff",
+    "list": [{
+        "pagePath": "pages/index/index",
+        "iconPath": "static/image/iot.png",
+        "selectedIconPath": "static/image/iot_org.png",
+        "text": "首页"
+    }, {
+        "pagePath": "pages/mine/mine",
+        "iconPath": "static/image/mine.png",
+        "selectedIconPath": "static/image/mine_pressed.png",
+        "text": "我的"
+    }]
+}
+}

+ 69 - 0
pages/index/index.vue

@@ -0,0 +1,69 @@
+<template>
+	<view class="content">
+		<button type="default" open-type="getPhoneNumber" @getphonenumber="decryptPhoneNumber">微信授权一键登录</button>
+		<button @click="wxHttpTest" style="margin-top: 10rps;">miniprogram http请求</button>
+		</view>
+</template>
+
+<script>
+
+	
+	export default {
+		data() {
+			return {
+
+			}
+		},
+		methods: {
+			decryptPhoneNumber(e) {
+				console.log(e.detail.errMsg)
+				console.log(e.detail.iv)
+				console.log(e.detail.encryptedData)
+			},
+		  wxHttpTest() {
+				//try{
+				this.$request({
+					server:2,
+					servant:1005,
+					data:{
+						// phone:Buffer.from('3246541321'),
+						phone:'3246541321',
+						type:1,
+						//verifyInfo:Buffer.from('asdasd')
+						verifyInfo:'asdasd',
+						data:{
+							
+						}
+					}
+				})
+				.then((res) =>{
+					console.log(res);
+					/* res的结构
+					  {
+						  code:0,错误码 number类型
+						  msg:"",错误消息 string类型
+						  data:对应loginRsp的js对象
+					  }
+					 */
+					if(res.code === 0){//成功
+						
+					}else{
+						//失败
+					}
+				}, (err) => {//出现异常
+					console.log(err);
+				})
+			}
+		}
+	}
+</script>
+
+<style>
+	.content {
+		display: flex;
+		flex-direction: column;
+		align-items: center;
+		justify-content: center;
+		margin: 20rpx;
+	}
+</style>

+ 37 - 0
pages/mine/mine.vue

@@ -0,0 +1,37 @@
+<template>
+  <div class="mine">mine</div>
+</template>
+
+<script>
+
+export default {
+  components: {},
+  data: () => ({}),
+  computed: {},
+  methods: {},
+  watch: {},
+
+  // 页面周期函数--监听页面加载
+  onLoad() {},
+  // 页面周期函数--监听页面初次渲染完成
+  onReady() {},
+  // 页面周期函数--监听页面显示(not-nvue)
+  onShow() {},
+  // 页面周期函数--监听页面隐藏
+  onHide() {},
+  // 页面周期函数--监听页面卸载
+  onUnload() {},
+  // 页面处理函数--监听用户下拉动作
+  onPullDownRefresh() {
+    uni.stopPullDownRefresh();
+  },
+  // 页面处理函数--监听用户上拉触底
+  onReachBottom() {},
+  // 页面处理函数--监听页面滚动(not-nvue)
+  /* onPageScroll(event) {}, */
+  // 页面处理函数--用户点击右上角分享
+  /* onShareAppMessage(options) {}, */
+};
+</script>
+
+<style></style>

+ 21 - 0
proto/Common.proto

@@ -0,0 +1,21 @@
+syntax = "proto3";
+
+package common;
+
+message ErrorInfo {
+    fixed32 errorCode = 1; //错误码
+    string errorMessage = 2; //错误描述信息
+}
+
+message MsgWebsocket {
+    fixed32 version     = 1;               ///< 协议版本号
+    fixed32 app         = 2;               ///<应用名称
+    fixed32 server      = 3;               ///<应用内具体业务模块
+    fixed32 servant     = 4;               ///<业务模块内部具体接
+    fixed32 seq         = 5;               ///< 序列号
+    fixed32 route_id    = 6;              ///<负载均衡路由字段
+    fixed32 encrypt     = 7;              ///<加密方式,0:oaep(rsa v2),1:pkcs1(rsa v1.5)
+    fixed32 cache_is    = 8;              ///<1用缓存,2不用缓存
+    bytes data          = 9;
+}
+

+ 25 - 0
proto/User.proto

@@ -0,0 +1,25 @@
+syntax = "proto3";
+
+package user;
+
+import "common";
+
+//登录请求
+message wx_mini_program_login_req {
+    string phone             = 1; //
+    string code              = 2;
+    string verifyCode    	 = 3; //
+    string nickname          = 4;
+    string headUrl          = 5;
+    uint32 systemType       = 6;
+}
+
+message wx_mini_program_login_rsp {
+    ErrorInfo errInfo   = 1; // 错误码信息
+    string token         = 2; // 访问令牌
+}
+
+
+
+
+

BIN
static/image/device.png


BIN
static/image/device_red.png


BIN
static/image/iot.png


BIN
static/image/iot_org.png


BIN
static/image/mine.png


BIN
static/image/mine_pressed.png


Filskillnaden har hållts tillbaka eftersom den är för stor
+ 1 - 0
static/loading.svg


BIN
static/logo.png


+ 76 - 0
uni.scss

@@ -0,0 +1,76 @@
+/**
+ * 这里是uni-app内置的常用样式变量
+ *
+ * uni-app 官方扩展插件及插件市场(https://ext.dcloud.net.cn)上很多三方插件均使用了这些样式变量
+ * 如果你是插件开发者,建议你使用scss预处理,并在插件代码中直接使用这些变量(无需 import 这个文件),方便用户通过搭积木的方式开发整体风格一致的App
+ *
+ */
+
+/**
+ * 如果你是App开发者(插件使用者),你可以通过修改这些变量来定制自己的插件主题,实现自定义主题功能
+ *
+ * 如果你的项目同样使用了scss预处理,你也可以直接在你的 scss 代码中使用如下变量,同时无需 import 这个文件
+ */
+
+/* 颜色变量 */
+
+/* 行为相关颜色 */
+$uni-color-primary: #007aff;
+$uni-color-success: #4cd964;
+$uni-color-warning: #f0ad4e;
+$uni-color-error: #dd524d;
+
+/* 文字基本颜色 */
+$uni-text-color:#333;//基本色
+$uni-text-color-inverse:#fff;//反色
+$uni-text-color-grey:#999;//辅助灰色,如加载更多的提示信息
+$uni-text-color-placeholder: #808080;
+$uni-text-color-disable:#c0c0c0;
+
+/* 背景颜色 */
+$uni-bg-color:#ffffff;
+$uni-bg-color-grey:#f8f8f8;
+$uni-bg-color-hover:#f1f1f1;//点击状态颜色
+$uni-bg-color-mask:rgba(0, 0, 0, 0.4);//遮罩颜色
+
+/* 边框颜色 */
+$uni-border-color:#c8c7cc;
+
+/* 尺寸变量 */
+
+/* 文字尺寸 */
+$uni-font-size-sm:24rpx;
+$uni-font-size-base:28rpx;
+$uni-font-size-lg:32rpx;
+
+/* 图片尺寸 */
+$uni-img-size-sm:40rpx;
+$uni-img-size-base:52rpx;
+$uni-img-size-lg:80rpx;
+
+/* Border Radius */
+$uni-border-radius-sm: 4rpx;
+$uni-border-radius-base: 6rpx;
+$uni-border-radius-lg: 12rpx;
+$uni-border-radius-circle: 50%;
+
+/* 水平间距 */
+$uni-spacing-row-sm: 10px;
+$uni-spacing-row-base: 20rpx;
+$uni-spacing-row-lg: 30rpx;
+
+/* 垂直间距 */
+$uni-spacing-col-sm: 8rpx;
+$uni-spacing-col-base: 16rpx;
+$uni-spacing-col-lg: 24rpx;
+
+/* 透明度 */
+$uni-opacity-disabled: 0.3; // 组件禁用态的透明度
+
+/* 文章场景相关 */
+$uni-color-title: #2C405A; // 文章标题颜色
+$uni-font-size-title:40rpx;
+$uni-color-subtitle: #555555; // 二级标题颜色
+$uni-font-size-subtitle:36rpx;
+$uni-color-paragraph: #3F536E; // 文章段落颜色
+$uni-font-size-paragraph:30rpx;