achao 2 éve
szülő
commit
2dabe8d6f3
47 módosított fájl, 4657 hozzáadás és 400 törlés
  1. 3 0
      pinche/App.vue
  2. 164 0
      pinche/components/lyg-popup/lyg-popup.vue
  3. 2 3
      pinche/config/index.js
  4. 2 0
      pinche/main.js
  5. 9 0
      pinche/manifest.json
  6. 29 6
      pinche/pages.json
  7. 78 0
      pinche/pages/index/dh.vue
  8. 88 65
      pinche/pages/index/index.vue
  9. 45 23
      pinche/pages/index/info.vue
  10. BIN
      pinche/pages/index/location.png
  11. 24 0
      pinche/pages/index/webview.vue
  12. 108 58
      pinche/pages/info/add.vue
  13. 73 48
      pinche/pages/info/info.vue
  14. 17 10
      pinche/pages/info/lookOrder.vue
  15. 93 0
      pinche/pages/login/fw.html
  16. 125 78
      pinche/pages/login/login.vue
  17. 116 0
      pinche/pages/login/ys.html
  18. 440 0
      pinche/pages/mine/driver/driver.vue
  19. 117 42
      pinche/pages/mine/index.vue
  20. 18 12
      pinche/pages/order/order.vue
  21. BIN
      pinche/static/bg@3x.png
  22. BIN
      pinche/static/select@2x.png
  23. BIN
      pinche/static/selected2.png
  24. 40 0
      pinche/util/WXBizDataCrypt.js
  25. 32 0
      pinche/util/cryptojs-master/README.md
  26. 17 0
      pinche/util/cryptojs-master/cryptojs.js
  27. 402 0
      pinche/util/cryptojs-master/lib/AES.js
  28. 378 0
      pinche/util/cryptojs-master/lib/BlockModes.js
  29. 155 0
      pinche/util/cryptojs-master/lib/Crypto.js
  30. 37 0
      pinche/util/cryptojs-master/lib/CryptoMath.js
  31. 1003 0
      pinche/util/cryptojs-master/lib/DES.js
  32. 38 0
      pinche/util/cryptojs-master/lib/HMAC.js
  33. 117 0
      pinche/util/cryptojs-master/lib/MARC4.js
  34. 158 0
      pinche/util/cryptojs-master/lib/MD5.js
  35. 49 0
      pinche/util/cryptojs-master/lib/PBKDF2.js
  36. 88 0
      pinche/util/cryptojs-master/lib/PBKDF2Async.js
  37. 221 0
      pinche/util/cryptojs-master/lib/Rabbit.js
  38. 86 0
      pinche/util/cryptojs-master/lib/SHA1.js
  39. 130 0
      pinche/util/cryptojs-master/lib/SHA256.js
  40. 18 0
      pinche/util/cryptojs-master/package.json
  41. 25 0
      pinche/util/cryptojs-master/test/PBKDF2-test.js
  42. 13 0
      pinche/util/cryptojs-master/test/test.coffee
  43. 4 2
      unimall-admin/config/dev.env.js
  44. 2 2
      unimall-admin/config/prod.env.js
  45. 10 0
      unimall-admin/src/router/route.json
  46. 36 22
      unimall-admin/src/views/appointment/index.vue
  47. 47 29
      unimall-admin/src/views/sharing/index.vue

+ 3 - 0
pinche/App.vue

@@ -30,6 +30,9 @@
 		onHide: function() {
 		onHide: function() {
 			console.log('App Hide')
 			console.log('App Hide')
 		},
 		},
+		onError: function(err) {
+			console.log("apponError", err)
+		},
 	}
 	}
 </script>
 </script>
 
 

+ 164 - 0
pinche/components/lyg-popup/lyg-popup.vue

@@ -0,0 +1,164 @@
+<template name="protocol-popup">
+	<view @touchmove.stop.prevent="clear" v-show="showPopup">
+		<view class="popup_mask" @touchmove.stop.prevent="clear"></view>
+		<view class="popup_content">
+			<view class="title">{{title}}</view>
+			<view class="explain_text">
+				请你务必认真阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了向你提供数据、分享等服务所要获取的权限信息。
+				<view class="line">
+					你可以阅读
+					<navigator :url="protocolPath" class="path" hover-class="navigator-hover">《服务协议》</navigator>和
+					<navigator :url="policyPath" class="path" hover-class="navigator-hover">《隐私政策》</navigator>
+					了解详细信息。如您同意,请点击"同意"开始接受我们的服务。
+				</view>
+			</view>
+
+			<view class="button">
+				<view @tap="back">暂不使用</view>
+				<view @tap="confirm">同意</view>
+			</view>
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		name: "lyg-popup",
+		props: {
+			title: {
+				type: String,
+				default: "服务协议和隐私政策"
+			},
+			// 协议路径
+			protocolPath: {
+				type: String
+			},
+			// 政策路径
+			policyPath: {
+				type: String
+			},
+			policyStorageKey: {
+				type: String,
+				default: "has_read_privacy"
+			}
+		},
+		data() {
+			return {
+				showPopup: false
+			};
+
+		},
+		created: function() {
+			var that = this;
+			console.log("lyg-popup created");
+			uni.getStorage({
+				key: this.policyStorageKey,
+				success: (res) => {
+					if (res.data) {
+						that.showPopup = false;
+						uni.showTabBar({});
+					}
+				},
+				fail: function(e) {
+					that.showPopup = true;
+					uni.hideTabBar({});
+					console.log(e)
+				}
+			});
+		},
+		methods: {
+			// 禁止滚动
+			clear() {
+				return;
+			},
+			back() {
+				this.$emit('popupState', false)
+				// #ifdef APP-PLUS  
+				plus.runtime.quit();
+				// #endif
+			},
+			// 关闭弹框
+			confirm() {
+				this.showPopup = false;
+				this.$emit('popupState', true);
+
+				uni.setStorage({
+					key: this.policyStorageKey,
+					data: true
+				});
+				uni.showTabBar({});
+			}
+		}
+	};
+</script>
+
+<style lang="scss">
+	.popup_mask {
+		position: fixed;
+		bottom: 0;
+		top: 0;
+		left: 0;
+		right: 0;
+		background-color: rgba(0, 0, 0, 0.4);
+		transition-property: opacity;
+		transition-duration: 0.3s;
+		opacity: 0;
+		z-index: 98;
+
+	}
+
+	.popup_mask {
+		opacity: 1;
+	}
+
+	.popup_content {
+		overflow: hidden;
+		box-sizing: border-box;
+		padding: 40upx 20upx 0 20upx;
+		position: fixed;
+		bottom: 30%;
+		border-radius: 8px;
+		left: 50%;
+		margin-left: -40%;
+		right: 0;
+		min-height: 400upx;
+		background: #ffffff;
+		width: 80%;
+		z-index: 99;
+
+		.title {
+			text-align: center;
+			font-size: 34upx;
+			padding: 10upx 0 0 0;
+		}
+
+		.explain_text {
+			font-size: 30upx;
+			padding: 30upx 30upx 40upx 30upx;
+			line-height: 38upx;
+
+			.line {
+				display: block;
+
+				.path {
+					color: #007aff;
+					display: inline-block;
+					text-align: center;
+				}
+			}
+		}
+
+		.button {
+			display: flex;
+			padding: 20upx;
+			align-items: center;
+			font-size: 34upx;
+			justify-content: space-around;
+			border-top: 1upx solid #f2f2f2;
+
+			view {
+				text-align: center;
+			}
+		}
+	}
+</style>

+ 2 - 3
pinche/config/index.js

@@ -1,7 +1,6 @@
 const dev = {
 const dev = {
-	// baseUrlNew: 'http://121.5.163.150:8181',
-	baseUrlNew: 'http://192.168.110.82:8099',
-	// baseUrlNew: 'https://api.thesunbelt.shop',
+	baseUrlNew: 'http://192.168.110.82:8090',
+	// baseUrlNew: 'https://shiyaopinche.cspc.cn:10443',
 	h5Appid: 'wxb66b599f7f61b46f',
 	h5Appid: 'wxb66b599f7f61b46f',
 	debug: false
 	debug: false
 }
 }

+ 2 - 0
pinche/main.js

@@ -5,7 +5,9 @@ import Vue from 'vue'
 Vue.config.productionTip = false
 Vue.config.productionTip = false
 import uView from '@/uni_modules/uview-ui'
 import uView from '@/uni_modules/uview-ui'
 import request from '@/util/request.js'
 import request from '@/util/request.js'
+import WXBizDataCrypt from '@/util/WXBizDataCrypt.js'
 Vue.prototype.$request = request
 Vue.prototype.$request = request
+Vue.prototype.$WXBizDataCrypt = WXBizDataCrypt
 import store from './store'
 import store from './store'
 Vue.prototype.$store = store
 Vue.prototype.$store = store
 App.mpType = 'app'
 App.mpType = 'app'

+ 9 - 0
pinche/manifest.json

@@ -9,6 +9,15 @@
 	"app-plus": {
 	"app-plus": {
 		"usingComponents": true,
 		"usingComponents": true,
 		"nvueStyleCompiler": "uni-app",
 		"nvueStyleCompiler": "uni-app",
+		"privacy": {
+			"prompt": "template",
+			"template": {
+		 	"title": "服务协议和隐私政策",
+				"message": "  请你务必审慎阅读、充分理解“服务协议”和“隐私政策”各条款,包括但不限于:为了更好的向你提供服务,我们需要收集你的设备标识、操作日志等信息用于分析、优化应用性能。<br/>  你可阅读<a href=\"https://pinche.cspc.cn:10443/fw.html\">《服务协议》</a>和<a href=\"https://pinche.cspc.cn:10443/ys.html\">《隐私政策》</a>了解详细信息。如果你同意,请点击下面按钮开始接受我们的服务。",
+				"buttonAccept": "同意",
+				"buttonRefuse": "拒绝"
+			}
+		},
 		"compilerVersion": 3,
 		"compilerVersion": 3,
 		"splashscreen": {
 		"splashscreen": {
 			"alwaysShowBeforeRender": true,
 			"alwaysShowBeforeRender": true,

+ 29 - 6
pinche/pages.json

@@ -3,13 +3,13 @@
 		{
 		{
 			"path": "pages/index/index",
 			"path": "pages/index/index",
 			"style": {
 			"style": {
-				"navigationBarTitleText": "找拼车"
+				"navigationBarTitleText": "找通勤"
 			}
 			}
 		},
 		},
 		{
 		{
 			"path": "pages/order/order",
 			"path": "pages/order/order",
 			"style": {
 			"style": {
-				"navigationBarTitleText": "我的预订",
+				"navigationBarTitleText": "我的通勤",
 				"navigationBarBackgroundColor": "#FFFFFF"
 				"navigationBarBackgroundColor": "#FFFFFF"
 			}
 			}
 		},
 		},
@@ -49,14 +49,37 @@
 			}
 			}
 
 
 		}, {
 		}, {
-			"path": "pages/index/yuding",
+			"path": "pages/index/info",
 			"style": {
 			"style": {
-				"navigationBarTitleText": "预定",
+				"navigationBarTitleText": "信息",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/index/dh",
+			"style": {
+				"navigationBarTitleText": "导航",
+				"enablePullDownRefresh": false
+			}
+
+		}, {
+			"path": "pages/index/webview",
+			"style": {
+				"navigationBarTitleText": "",
 				"enablePullDownRefresh": false
 				"enablePullDownRefresh": false
 			}
 			}
 
 
 		}
 		}
-	],
+	    ,{
+            "path" : "pages/mine/driver/driver",
+            "style" :                                                                                    
+            {
+                "navigationBarTitleText": "司机认证",
+                "enablePullDownRefresh": false
+            }
+            
+        }
+    ],
 	"tabBar": {
 	"tabBar": {
 		"custom": false,
 		"custom": false,
 		"color": "#656765",
 		"color": "#656765",
@@ -67,7 +90,7 @@
 				"pagePath": "pages/index/index",
 				"pagePath": "pages/index/index",
 				"iconPath": "static/11.png",
 				"iconPath": "static/11.png",
 				"selectedIconPath": "static/1.png",
 				"selectedIconPath": "static/1.png",
-				"text": "找拼车"
+				"text": "找通勤"
 			},
 			},
 			{
 			{
 				"pagePath": "pages/order/order",
 				"pagePath": "pages/order/order",

+ 78 - 0
pinche/pages/index/dh.vue

@@ -0,0 +1,78 @@
+<template>
+	<view>
+		<map class="map" :latitude="latitude" :longitude="longitude" :markers="covers">
+		</map>
+		<view class="bottom">
+			司机位置:{{dataObj.startPlace}}
+		</view>
+		<view class="go">
+			去这里
+		</view>
+	</view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				dataObj: {},
+				id: 0, // 使用 marker点击事件 需要填写id
+				title: 'map',
+				latitude: '',
+				longitude: '',
+				covers: [{
+					latitude: 39.909,
+					longitude: 116.39742,
+					iconPath: '../../static/location.png'
+				}]
+			}
+		},
+		methods: {
+
+		},
+		onLoad(options) {
+			let that = this
+			uni.getLocation({
+				type: 'wgs84',
+				success: function(res) {
+					that.latitude = res.latitude
+					that.longitude = res.longitude
+					console.log('当前位置的经度:' + res.longitude);
+					console.log('当前位置的纬度:' + res.latitude);
+					that.covers = [{
+						latitude: res.latitude,
+						longitude: res.longitude,
+						iconPath: '../../static/location.png'
+					}]
+				}
+			});
+			this.dataObj = JSON.parse(options.obj)
+			console.log(this.dataObj)
+		}
+	}
+</script>
+
+<style scoped lang="scss">
+	.map {
+		width: 100%;
+		height: 80vh
+	}
+
+	.bottom {
+		margin: 20rpx;
+	}
+
+	.go {
+		width: 50%;
+		display: flex;
+		justify-content: center;
+		color: white;
+		text-align: center;
+		background: #19be6b;
+		border: 1px solid #19be6b;
+		border-radius: 10rpx;
+		padding: 15rpx 30rpx;
+		font-size: 26rpx;
+		margin: 0 auto;
+	}
+</style>

+ 88 - 65
pinche/pages/index/index.vue

@@ -7,7 +7,7 @@
 			</view>
 			</view>
 		</view>
 		</view>
 		<u-line color="#dfe2e5"></u-line>
 		<u-line color="#dfe2e5"></u-line>
-		<view class="content2">
+		<view class="content2" v-if="isLogin">
 			<u-radio-group v-model="radiovalue1" placement="row" @change="groupChange">
 			<u-radio-group v-model="radiovalue1" placement="row" @change="groupChange">
 				<u-radio activeColor="#19be6b" :customStyle="{marginRight: '30rpx'}" v-for="(item, index) in radiolist1"
 				<u-radio activeColor="#19be6b" :customStyle="{marginRight: '30rpx'}" v-for="(item, index) in radiolist1"
 					:key="index" :label="item.name" :name="item.name">
 					:key="index" :label="item.name" :name="item.name">
@@ -20,91 +20,106 @@
 				<view style="border-bottom: 1px solid #dfe2e5;
 				<view style="border-bottom: 1px solid #dfe2e5;
 			padding-bottom: 20rpx;
 			padding-bottom: 20rpx;
 			padding: 20rpx;">
 			padding: 20rpx;">
-					<view class="" style="display: flex;justify-content: space-between;">
-						<view class="">
-							<view class="title">
-								{{item.remark2}}<text
-									style="color:#19be6b;">({{item.carpoolingType=='车找人'?'车主':'乘客'}})</text>
-							</view>
+					<view class="" style="">
+						<view class="title row">
 							<view class="">
 							<view class="">
-								{{item.explain?item.explain:'无备注'}}
+								{{item.remark2}}
+								<text
+									style="color:#19be6b;margin-left: 20rpx;">({{item.carpoolingType=='车找人'?'车主':'乘客'}})</text>
 							</view>
 							</view>
-							<view class="" v-if="item.carpoolingType=='车找人'">
-								剩余座位:{{item.remark1}}
+							<view class="">
+								{{item.departureTime}}
 							</view>
 							</view>
+
 						</view>
 						</view>
-						<view class="">
-							{{item.departureTime}}
+						<!-- <view class="row">
+							时间:{{item.departureTime}}
+						</view> -->
+						<view class="row">
+							{{item.explain?item.explain:'无备注'}}
+						</view>
+						<view class="row" v-if="item.carpoolingType=='车找人'">
+							剩余座位:{{item.numberPeople}}
 						</view>
 						</view>
 					</view>
 					</view>
-					<view class="" v-if="item.carpoolingType=='人找车'">
+					<view class="row" v-if="item.carpoolingType=='人找车'">
 						人数:{{item.numberPeople}}
 						人数:{{item.numberPeople}}
 					</view>
 					</view>
-					<view class="" v-if="item.carpoolingType=='人找车'">
+					<view class="row" v-if="item.carpoolingType=='人找车'">
 						价格:{{item.remark1}}
 						价格:{{item.remark1}}
 					</view>
 					</view>
+					<view class="row">
+						出发地:{{item.startPlace}}
+					</view>
+					<view class="row">
+						到达地:{{item.endPlace}}
+					</view>
+					<!-- 	<view class="" style="display: flex;" @click="toDH(item)">
+						导航:<u-icon name="map"></u-icon>
+					</view> -->
 					<view class="btn-row">
 					<view class="btn-row">
 						<view class="btn-yd" @tap="ydOrder(item)" v-if="item.carpoolingType=='车找人'">
 						<view class="btn-yd" @tap="ydOrder(item)" v-if="item.carpoolingType=='车找人'">
-							预定
+							预定通勤
 							<!-- {{item.phone}} -->
 							<!-- {{item.phone}} -->
 						</view>
 						</view>
+						<!-- <view class="btn-yd" @tap="js(item)" v-if="item.carpoolingType=='人找车'">
+							接受
+						</view> -->
 						<view class="call" @tap="call(item)">
 						<view class="call" @tap="call(item)">
 							电话咨询
 							电话咨询
-							<!-- {{item.phone}} -->
 						</view>
 						</view>
 					</view>
 					</view>
 				</view>
 				</view>
 			</view>
 			</view>
 		</mescroll-body>
 		</mescroll-body>
-		<u-modal :show="showAlert" title="提示" content='确认预定拼车信息?' closeOnClickOverlay showCancelButton
+		<u-modal :show="showAlert" title="提示" content='确认预定通勤信息?' closeOnClickOverlay showCancelButton
 			confirmColor="#19be6b" @cancel="showAlert=false" @close="showAlert=false" @confirm="submit"></u-modal>
 			confirmColor="#19be6b" @cancel="showAlert=false" @close="showAlert=false" @confirm="submit"></u-modal>
 	</view>
 	</view>
 </template>
 </template>
 
 
 <script>
 <script>
+	import lyg_popup from '@/components/lyg-popup/lyg-popup.vue';
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	import MescrollMixin from "@/uni_modules/mescroll-uni/components/mescroll-uni/mescroll-mixins.js";
 	import {
 	import {
-		mapState
+		mapState,
+		mapMutations
 	} from 'vuex';
 	} from 'vuex';
 	export default {
 	export default {
 		mixins: [MescrollMixin], // 使用mixin
 		mixins: [MescrollMixin], // 使用mixin
 		components: {
 		components: {
-
+			lyg_popup
 		},
 		},
 		computed: {
 		computed: {
 			...mapState(['hasLogin'])
 			...mapState(['hasLogin'])
 		},
 		},
 		onShow() {
 		onShow() {
-			// if (this.hasLogin || uni.getStorageSync("userInfo").username) {
-			// 	this.userInfo = uni.getStorageSync("userInfo")
-			// } else {
-			// 	uni.navigateTo({
-			// 		url: "/pages/login/login"
-			// 	})
-			// 	// uni.({
-			// 	// 	url: '/pages/index/index'
-			// 	// })
-			// }
+			this.$nextTick(function() {
+				this.canReset && this.mescroll.resetUpScroll() // 重置列表数据为第一页  
+				this.canReset && this.mescroll.scrollTo(0, 0) // 重置列表数据为第一页时,建议把滚动条也重置到顶部,避免无法再次翻页的问题  
+				this.canReset = true // 过滤第一次的onShow事件,避免初始化界面时重复触发upCallback, 无需配置auto:false
+			});
+			if (this.hasLogin || uni.getStorageSync("userInfo").username) {
+				this.userInfo = uni.getStorageSync("userInfo")
+				this.isLogin = true
+			} else {
+				uni.navigateTo({
+					url: "/pages/login/login"
+				})
+				// uni.({
+				// 	url: '/pages/index/index'
+				// })
+			}
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {
+				isLogin: false,
+				canReset: false,
 				selectData: {},
 				selectData: {},
 				route: '',
 				route: '',
 				type: '',
 				type: '',
 				navIndex: 0,
 				navIndex: 0,
 				showAlert: false,
 				showAlert: false,
-				navList: [{
-						name: "曲阳⇋北京"
-					},
-					{
-						name: "曲阳⇋北京"
-					},
-					{
-						name: "曲阳⇋北京"
-					}, {
-						name: "曲阳⇋北京"
-					}
-				],
+				navList: [],
 				radiolist1: [{
 				radiolist1: [{
 						name: '找车主',
 						name: '找车主',
 						disabled: false
 						disabled: false
@@ -115,24 +130,7 @@
 					}
 					}
 				],
 				],
 				radiovalue1: '找车主',
 				radiovalue1: '找车主',
-				infoList: [{
-						phone: '13333333333',
-						title: '曲阳⇋北京',
-						type: '车主',
-						content: "车找人!(承揽全国包车)专跑北京、天津、原路返回 150*****070(关机加微信)"
-					},
-					{
-						phone: '13333333333',
-						title: '曲阳⇋北京',
-						type: '车主',
-						content: "车找人!(承揽全国包车)专跑北京、天津、原路返回 150*****070(关机加微信)"
-					}, {
-						phone: '13333333333',
-						title: '曲阳⇋北京',
-						type: '车主',
-						content: "车找人!(承揽全国包车)专跑北京、天津、原路返回 150*****070(关机加微信)"
-					}
-				]
+				infoList: []
 			}
 			}
 		},
 		},
 		onLoad() {
 		onLoad() {
@@ -140,6 +138,15 @@
 
 
 		},
 		},
 		methods: {
 		methods: {
+			popupState(state) {
+				console.log(state);
+
+			},
+			toDH(val) {
+				uni.navigateTo({
+					url: '/pages/index/dh?obj=' + JSON.stringify(val)
+				})
+			},
 			downCallback() {
 			downCallback() {
 				this.mescroll.resetUpScroll()
 				this.mescroll.resetUpScroll()
 			},
 			},
@@ -169,11 +176,14 @@
 						url: '/pages/index/index'
 						url: '/pages/index/index'
 					})
 					})
 				})
 				})
+			},
+			js(item) {
+
 			},
 			},
 			ydOrder(val) {
 			ydOrder(val) {
 				// this.showAlert = true
 				// this.showAlert = true
 				uni.navigateTo({
 				uni.navigateTo({
-					url: "/pages/index/yuding?id=" + val.id
+					url: "/pages/index/info?id=" + val.id
 				})
 				})
 				this.selectData = val
 				this.selectData = val
 			},
 			},
@@ -221,6 +231,7 @@
 					this.$request.baseRequest('pincheCarSharingApp', 'list', {
 					this.$request.baseRequest('pincheCarSharingApp', 'list', {
 						remark2: this.route,
 						remark2: this.route,
 						carpoolingType: this.type,
 						carpoolingType: this.type,
+						companyId: 1,
 						pageNum: page.num,
 						pageNum: page.num,
 						pageSize: page.size,
 						pageSize: page.size,
 					}, failres => {
 					}, failres => {
@@ -260,15 +271,20 @@
 	}
 	}
 </script>
 </script>
 
 
-<style lang="scss">
+<style lang="scss" scope>
 	page {
 	page {
 		background: #fff;
 		background: #fff;
 	}
 	}
 
 
 	.content1 {
 	.content1 {
-		display: flex;
+		// display: flex;
+		width: 100%;
+		// white-space: nowrap;
+		// overflow: auto;
 
 
 		.nav {
 		.nav {
+			display: inline-block;
+
 			background: #f7f7f7;
 			background: #f7f7f7;
 			border: 1px solid #dfe2e5;
 			border: 1px solid #dfe2e5;
 			margin-right: 10rpx;
 			margin-right: 10rpx;
@@ -289,7 +305,9 @@
 	}
 	}
 
 
 	.content3 {
 	.content3 {
-
+		.row {
+			margin: 15rpx
+		}
 
 
 		.item {
 		.item {
 			border-bottom: 1px solid #dfe2e5;
 			border-bottom: 1px solid #dfe2e5;
@@ -302,7 +320,7 @@
 			background: #f7f7f7;
 			background: #f7f7f7;
 			border: 1px solid #dfe2e5;
 			border: 1px solid #dfe2e5;
 			border-radius: 10rpx;
 			border-radius: 10rpx;
-			padding: 20rpx 30rpx;
+			padding: 15rpx 30rpx;
 			font-size: 26rpx;
 			font-size: 26rpx;
 			margin: 20rpx;
 			margin: 20rpx;
 		}
 		}
@@ -319,8 +337,13 @@
 			background: #19be6b;
 			background: #19be6b;
 			border: 1px solid #19be6b;
 			border: 1px solid #19be6b;
 			border-radius: 10rpx;
 			border-radius: 10rpx;
-			padding: 20rpx 30rpx;
+			padding: 15rpx 30rpx;
 			font-size: 26rpx;
 			font-size: 26rpx;
 		}
 		}
 	}
 	}
+
+	.title {
+		display: flex;
+		justify-content: space-between;
+	}
 </style>
 </style>

+ 45 - 23
pinche/pages/index/yuding.vue → pinche/pages/index/info.vue

@@ -9,9 +9,9 @@
 		</view>
 		</view>
 		<view class="content2">
 		<view class="content2">
 			<u--form labelPosition="left" :model="pincheMakeAppointment" ref="form1" labelWidth='100px'>
 			<u--form labelPosition="left" :model="pincheMakeAppointment" ref="form1" labelWidth='100px'>
-				<u-form-item label="拼车类型" prop="pincheMakeAppointment.carpoolingType" borderBottom>
+				<u-form-item label="通勤类型" prop="pincheMakeAppointment.carpoolingType" borderBottom>
 					<u--input v-model="pincheMakeAppointment.carpoolingType" border="none" disabled
 					<u--input v-model="pincheMakeAppointment.carpoolingType" border="none" disabled
-						disabledColor="#ffffff" placeholder="拼车类型"></u--input>
+						disabledColor="#ffffff" placeholder="通勤类型"></u--input>
 				</u-form-item>
 				</u-form-item>
 				<u-form-item label="预约人" prop="appointedBy" borderBottom ref="item1" v-if='showInfo!=1'>
 				<u-form-item label="预约人" prop="appointedBy" borderBottom ref="item1" v-if='showInfo!=1'>
 					<u--input v-model="pincheMakeAppointment.appointedBy" border="none" disabled disabledColor="#ffffff"
 					<u--input v-model="pincheMakeAppointment.appointedBy" border="none" disabled disabledColor="#ffffff"
@@ -23,7 +23,7 @@
 				<!-- <u-form-item label="司机号码" prop="phone" borderBottom ref="item1">
 				<!-- <u-form-item label="司机号码" prop="phone" borderBottom ref="item1">
 					<u--input v-model="pincheMakeAppointment.phone" border="none" disabled></u--input>
 					<u--input v-model="pincheMakeAppointment.phone" border="none" disabled></u--input>
 				</u-form-item> -->
 				</u-form-item> -->
-				<u-form-item label="拼车费用" prop="remark1" borderBottom ref="item1" v-if='showInfo!=1'>
+				<u-form-item label="通勤费用" prop="remark1" borderBottom ref="item1" v-if='showInfo!=1'>
 					<u--input v-model="pincheMakeAppointment.price" border="none" disabled disabledColor="#ffffff"
 					<u--input v-model="pincheMakeAppointment.price" border="none" disabled disabledColor="#ffffff"
 						placeholder="根据出发,到达地点计算价格"></u--input>
 						placeholder="根据出发,到达地点计算价格"></u--input>
 				</u-form-item>
 				</u-form-item>
@@ -56,11 +56,6 @@
 						v-model="pincheMakeAppointment.numberPeople" @change='changeNumber' min='1'>
 						v-model="pincheMakeAppointment.numberPeople" @change='changeNumber' min='1'>
 					</u-number-box>
 					</u-number-box>
 				</u-form-item>
 				</u-form-item>
-				<u-form-item>
-					<text
-						style="color: #fff;background:#19be6b;border-radius: 20rpx;padding:10rpx 20rpx;width: 140rpx;text-align: center;"
-						@click="jsPrcie()">计算价格</text>
-				</u-form-item>
 			</u--form>
 			</u--form>
 			<u-datetime-picker :show="show" v-model="value1" mode="datetime" @cancel="show=false" @confirm="confirmTime"
 			<u-datetime-picker :show="show" v-model="value1" mode="datetime" @cancel="show=false" @confirm="confirmTime"
 				:closeOnClickOverlay='true' @close="show=false" :formatter="formatter">
 				:closeOnClickOverlay='true' @close="show=false" :formatter="formatter">
@@ -69,7 +64,8 @@
 		<view class="sm">
 		<view class="sm">
 			说明
 			说明
 		</view>
 		</view>
-		<u--textarea placeholder="其他内容,可选" confirmType="done" count v-model="pincheCarSharing.explain"></u--textarea>
+		<u--textarea placeholder="其他内容,可选" confirmType="done" v-model="pincheMakeAppointment.explain">
+		</u--textarea>
 		<!-- <view class="content3">
 		<!-- <view class="content3">
 			<u-checkbox-group v-model="checkboxValue1" placement="column" @change="checkboxChange"
 			<u-checkbox-group v-model="checkboxValue1" placement="column" @change="checkboxChange"
 				activeColor="#19be6b">
 				activeColor="#19be6b">
@@ -77,14 +73,14 @@
 				</u-checkbox>
 				</u-checkbox>
 			</u-checkbox-group>
 			</u-checkbox-group>
 			<view class="">
 			<view class="">
-				《相关拼车条款》
+				《相关通勤条款》
 			</view>
 			</view>
 		</view> -->
 		</view> -->
-		<view class="content4">
+		<!-- <view class="content4">
 			被举报黑车,高价,与发布金额不符,将受到处罚或者拉黑,请勿轻易越过红线。
 			被举报黑车,高价,与发布金额不符,将受到处罚或者拉黑,请勿轻易越过红线。
-		</view>
-		<u-button text="预定拼车" type="success" class="custom-style" @click='fbClick' color="#19be6b"></u-button>
-		<u-modal :show="showAlert" title="提示" content='确认预定拼车信息?' closeOnClickOverlay showCancelButton
+		</view> -->
+		<u-button text="预定通勤" type="success" class="custom-style" @click='fbClick' color="#19be6b"></u-button>
+		<u-modal :show="showAlert" title="提示" content='确认预定通勤信息?' closeOnClickOverlay showCancelButton
 			confirmColor="#19be6b" @cancel="showAlert=false" @close="showAlert=false" @confirm="submit"></u-modal>
 			confirmColor="#19be6b" @cancel="showAlert=false" @close="showAlert=false" @confirm="submit"></u-modal>
 		<u-toast ref="uToast"></u-toast>
 		<u-toast ref="uToast"></u-toast>
 	</view>
 	</view>
@@ -145,7 +141,7 @@
 					carpoolingType: '',
 					carpoolingType: '',
 					phone: '',
 					phone: '',
 					departureTime: '',
 					departureTime: '',
-					price: '200',
+					price: '',
 					unitPrice: '',
 					unitPrice: '',
 
 
 				},
 				},
@@ -232,7 +228,7 @@
 				console.log(e)
 				console.log(e)
 				// this.onePersonPrice = this.pincheMakeAppointment.unitPrice
 				// this.onePersonPrice = this.pincheMakeAppointment.unitPrice
 				// if (this.onePersonPrice) {
 				// if (this.onePersonPrice) {
-				this.pincheMakeAppointment.price = this.onePersonPrice * e.value
+				this.pincheMakeAppointment.price = Number(this.onePersonPrice * e.value).toFixed(2)
 				// }
 				// }
 			},
 			},
 			jsPrcie() {
 			jsPrcie() {
@@ -282,7 +278,7 @@
 						console.log('详细地址:' + res.address);
 						console.log('详细地址:' + res.address);
 						console.log('纬度:' + res.latitude);
 						console.log('纬度:' + res.latitude);
 						console.log('经度:' + res.longitude);
 						console.log('经度:' + res.longitude);
-						that.pincheMakeAppointment.startPlace = res.address
+						that.pincheMakeAppointment.startPlace = res.name
 						that.placeFrom = {
 						that.placeFrom = {
 							latitude: res.latitude,
 							latitude: res.latitude,
 							longitude: res.longitude
 							longitude: res.longitude
@@ -300,7 +296,7 @@
 						console.log('详细地址:' + res.address);
 						console.log('详细地址:' + res.address);
 						console.log('纬度:' + res.latitude);
 						console.log('纬度:' + res.latitude);
 						console.log('经度:' + res.longitude);
 						console.log('经度:' + res.longitude);
-						that.pincheMakeAppointment.endPlace = res.address
+						that.pincheMakeAppointment.endPlace = res.name
 						that.placeTo = {
 						that.placeTo = {
 							latitude: res.latitude,
 							latitude: res.latitude,
 							longitude: res.longitude
 							longitude: res.longitude
@@ -318,11 +314,12 @@
 									let _km = Number(res.result.elements[0].distance * 0.001)
 									let _km = Number(res.result.elements[0].distance * 0.001)
 										.toFixed(2)
 										.toFixed(2)
 									console.log("km", _km)
 									console.log("km", _km)
-									that.pincheMakeAppointment.remark1 = Number(Number(_km * uni
-										.getStorageSync('selectRoute').remark1).toFixed(
-										2))
-									console.log("that.pincheMakeAppointment.remark1", that
-										.pincheMakeAppointment.remark1)
+									that.onePersonPrice = Number(Number(_km * that
+										.pincheMakeAppointment.unitPrice).toFixed(2))
+									console.log("单人费用", that.onePersonPrice)
+									that.pincheMakeAppointment.price = Number(that.onePersonPrice *
+										that
+										.pincheMakeAppointment.numberPeople).toFixed(2)
 								},
 								},
 								fail: function(err) {
 								fail: function(err) {
 									console.log("腾讯地图获取距离失败")
 									console.log("腾讯地图获取距离失败")
@@ -350,7 +347,32 @@
 				this.showAlert = true
 				this.showAlert = true
 			},
 			},
 			submit() {
 			submit() {
+
 				console.log(this.pincheMakeAppointment)
 				console.log(this.pincheMakeAppointment)
+				if (!this.pincheMakeAppointment.departureTime) {
+					uni.showToast({
+						mask: true,
+						title: '请请选择出发时间',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.startPlace) {
+					uni.showToast({
+						mask: true,
+						title: '请选择出发地点',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.endPlace) {
+					uni.showToast({
+						mask: true,
+						title: '请选择到达地点',
+						icon: 'none'
+					})
+					return
+				}
 				this.$request.baseRequest('pincheMakeAppointmentApp', 'add', {
 				this.$request.baseRequest('pincheMakeAppointmentApp', 'add', {
 						pincheMakeAppointment: JSON.stringify(this.pincheMakeAppointment)
 						pincheMakeAppointment: JSON.stringify(this.pincheMakeAppointment)
 					},
 					},

BIN
pinche/pages/index/location.png


+ 24 - 0
pinche/pages/index/webview.vue

@@ -0,0 +1,24 @@
+<template>
+	<web-view :src="url"></web-view>
+</template>
+
+<script>
+	export default {
+		data() {
+			return {
+				url: ""
+			}
+		},
+		onLoad: function(option) {
+			this.url = option.url;
+			console.log(this.url)
+		},
+		methods: {}
+	}
+</script>
+
+
+
+<style>
+
+</style>

+ 108 - 58
pinche/pages/info/add.vue

@@ -19,19 +19,19 @@
 		</view>
 		</view>
 		<view class="content2">
 		<view class="content2">
 			<u--form labelPosition="left" :model="pincheCarSharing" ref="form1" labelWidth='100px'>
 			<u--form labelPosition="left" :model="pincheCarSharing" ref="form1" labelWidth='100px'>
-				<u-form-item label="拼车类型" prop="pincheCarSharing.carpoolingType" borderBottom
+				<u-form-item label="通勤类型" prop="pincheCarSharing.carpoolingType" borderBottom
 					@click="showSex = true; hideKeyboard()" ref="item1">
 					@click="showSex = true; hideKeyboard()" ref="item1">
 					<u--input v-model="pincheCarSharing.carpoolingType" disabled disabledColor="#ffffff"
 					<u--input v-model="pincheCarSharing.carpoolingType" disabled disabledColor="#ffffff"
-						placeholder="请选择拼车类型" border="none"></u--input>
+						placeholder="请选择通勤类型" border="none"></u--input>
 					<u-icon slot="right" name="arrow-right"></u-icon>
 					<u-icon slot="right" name="arrow-right"></u-icon>
 				</u-form-item>
 				</u-form-item>
-				<u-form-item label="拼车费用" prop="remark1" borderBottom ref="item1" v-if='showInfo!=1'>
+				<u-form-item label="通勤费用" prop="remark1" borderBottom ref="item1" v-if='showInfo!=1'>
 					<u--input v-model="pincheCarSharing.remark1" border="none" disabled disabledColor="#ffffff"
 					<u--input v-model="pincheCarSharing.remark1" border="none" disabled disabledColor="#ffffff"
 						placeholder="根据出发,到达地点计算价格" style='width: 70%;'></u--input>
 						placeholder="根据出发,到达地点计算价格" style='width: 70%;'></u--input>
 
 
 				</u-form-item>
 				</u-form-item>
-				<u-form-item label="座位数量" prop="remark1" borderBottom ref="item1" v-if='showInfo==1'>
-					<u--input v-model="pincheCarSharing.remark1" border="none"></u--input>
+				<u-form-item label="座位数量" prop="numberPeople" borderBottom ref="item1" v-if='showInfo==1'>
+					<u--input v-model="pincheCarSharing.numberPeople" border="none"></u--input>
 				</u-form-item>
 				</u-form-item>
 				<u-form-item label="出发时间" prop="pincheCarSharing.time" borderBottom @click="show = true; hideKeyboard()"
 				<u-form-item label="出发时间" prop="pincheCarSharing.time" borderBottom @click="show = true; hideKeyboard()"
 					ref="item1">
 					ref="item1">
@@ -62,14 +62,14 @@
 						v-model="pincheCarSharing.numberPeople" @change='changeNumber' min='1'>
 						v-model="pincheCarSharing.numberPeople" @change='changeNumber' min='1'>
 					</u-number-box>
 					</u-number-box>
 				</u-form-item>
 				</u-form-item>
-				<u-form-item v-if='showInfo!=1'>
+				<!-- 		<u-form-item v-if='showInfo!=1'>
 					<text
 					<text
 						style="color: #fff;background:#19be6b;border-radius: 20rpx;padding:10rpx 20rpx;width: 120rpx;text-align: center;"
 						style="color: #fff;background:#19be6b;border-radius: 20rpx;padding:10rpx 20rpx;width: 120rpx;text-align: center;"
 						@click="jsPrcie()">计算价格</text>
 						@click="jsPrcie()">计算价格</text>
-				</u-form-item>
+				</u-form-item> -->
 
 
 			</u--form>
 			</u--form>
-			<u-action-sheet :show="showSex" :actions="actions" title="请选拼车类型" @close="showSex = false"
+			<u-action-sheet :show="showSex" :actions="actions" title="请选通勤类型" @close="showSex = false"
 				@select="sexSelect">
 				@select="sexSelect">
 			</u-action-sheet>
 			</u-action-sheet>
 			<u-datetime-picker :show="show" v-model="value1" mode="datetime" @cancel="show=false" @confirm="confirmTime"
 			<u-datetime-picker :show="show" v-model="value1" mode="datetime" @cancel="show=false" @confirm="confirmTime"
@@ -79,7 +79,7 @@
 		<view class="sm">
 		<view class="sm">
 			说明
 			说明
 		</view>
 		</view>
-		<u--textarea placeholder="其他内容,可选" confirmType="done" count v-model="pincheCarSharing.explain"></u--textarea>
+		<u--textarea placeholder="其他内容,可选" confirmType="done" v-model="pincheCarSharing.explain"></u--textarea>
 		<!-- <view class="content3">
 		<!-- <view class="content3">
 			<u-checkbox-group v-model="checkboxValue1" placement="column" @change="checkboxChange"
 			<u-checkbox-group v-model="checkboxValue1" placement="column" @change="checkboxChange"
 				activeColor="#19be6b">
 				activeColor="#19be6b">
@@ -87,14 +87,14 @@
 				</u-checkbox>
 				</u-checkbox>
 			</u-checkbox-group>
 			</u-checkbox-group>
 			<view class="">
 			<view class="">
-				《相关拼车条款》
+				《相关通勤条款》
 			</view>
 			</view>
 		</view> -->
 		</view> -->
-		<view class="content4">
+		<!-- <view class="content4">
 			被举报黑车,高价,与发布金额不符,将受到处罚或者拉黑,请勿轻易越过红线。
 			被举报黑车,高价,与发布金额不符,将受到处罚或者拉黑,请勿轻易越过红线。
-		</view>
-		<u-button text="发布拼车" type="success" class="custom-style" @click='fbClick'></u-button>
-		<u-modal :show="showAlert" title="提示" content='确认发布拼车信息?' closeOnClickOverlay showCancelButton
+		</view> -->
+		<u-button text="发布通勤" type="success" class="custom-style" @click='fbClick'></u-button>
+		<u-modal :show="showAlert" title="提示" content='确认发布通勤信息?' closeOnClickOverlay showCancelButton
 			confirmColor="#19be6b" @cancel="showAlert=false" @close="showAlert=false" @confirm="submit"></u-modal>
 			confirmColor="#19be6b" @cancel="showAlert=false" @close="showAlert=false" @confirm="submit"></u-modal>
 		<u-toast ref="uToast"></u-toast>
 		<u-toast ref="uToast"></u-toast>
 	</view>
 	</view>
@@ -147,7 +147,8 @@
 				pincheCarSharing: {
 				pincheCarSharing: {
 					startPlace: '',
 					startPlace: '',
 					endPlace: '',
 					endPlace: '',
-					numberPeople: 1
+					numberPeople: '1',
+					carpoolingType: '人找车',
 				},
 				},
 
 
 				actions: [{
 				actions: [{
@@ -195,6 +196,10 @@
 				qqmapsdk = new QQMapWX({
 				qqmapsdk = new QQMapWX({
 					key: '5HXBZ-A5UK6-5VLSP-EPCV2-4WMSQ-PLFCP'
 					key: '5HXBZ-A5UK6-5VLSP-EPCV2-4WMSQ-PLFCP'
 				});
 				});
+				this.routeIndex = 1
+				this.pincheCarSharing.route = this.startRoute + '→' + this.endRoute
+
+
 			} else {
 			} else {
 				uni.navigateTo({
 				uni.navigateTo({
 					url: '/pages/login/login'
 					url: '/pages/login/login'
@@ -205,40 +210,40 @@
 		methods: {
 		methods: {
 			changeNumber(e) {
 			changeNumber(e) {
 				console.log(e)
 				console.log(e)
-				this.onePersonPrice = 100
 				if (this.onePersonPrice) {
 				if (this.onePersonPrice) {
-					this.pincheCarSharing.remark1 = this.onePersonPrice * e.value
+					this.pincheCarSharing.remark1 = Number(this.onePersonPrice * e.value).toFixed(2)
 				}
 				}
 			},
 			},
 			jsPrcie() {
 			jsPrcie() {
+				let that = this
 				if (this.pincheCarSharing.startPlace && this.pincheCarSharing.endPlace) {
 				if (this.pincheCarSharing.startPlace && this.pincheCarSharing.endPlace) {
-					console.log('调用腾讯地图api')
-					qqmapsdk.calculateDistance({
-						mode: 'driving',
-						from: this.placeFrom,
-						to: [this.placeTo],
-						success: function(res) {
-
-							console.log("腾讯地图获取的距离")
-							console.log(res)
-							let _km = Number(res.result.elements[0].distance * 0.001)
-								.toFixed(2)
-							console.log("km", _km)
-							this.onePersonPrice = Number(Number(_km * uni
-								.getStorageSync('selectRoute').remark1).toFixed(
-								2))
-							this.pincheCarSharing.remark1 = Number(Number(_km * uni
-								.getStorageSync('selectRoute').remark1).toFixed(
-								2) * this.pincheCarSharing.numberPeople)
-							console.log("this.pincheCarSharing.remark1", this
-								.pincheCarSharing.remark1)
-						},
-						fail: function(err) {
-							console.log("腾讯地图获取距离失败")
-							console.log(err)
+					this.pincheCarSharing.remark1 = Number(this.onePersonPrice * this.pincheCarSharing.numberPeople)
+						.toFixed(2)
+					// console.log('调用腾讯地图api')
+					// qqmapsdk.calculateDistance({
+					// 	mode: 'driving',
+					// 	from: this.placeFrom,
+					// 	to: [this.placeTo],
+					// 	success: function(res) {
 
 
-						}
-					})
+					// 		console.log("腾讯地图获取的距离")
+					// 		console.log(res)
+					// 		let _km = Number(res.result.elements[0].distance * 0.001)
+					// 			.toFixed(2)
+					// 		console.log("km", _km)
+
+					// 		// that.pincheCarSharing.remark1 = Number(Number(_km * uni
+					// 		// 	.getStorageSync('selectRoute').remark1).toFixed(
+					// 		// 	2) * that.pincheCarSharing.numberPeople)
+					// 		// console.log("this.pincheCarSharing.remark1", that
+					// 		// 	.pincheCarSharing.remark1)
+					// 	},
+					// 	fail: function(err) {
+					// 		console.log("腾讯地图获取距离失败")
+					// 		console.log(err)
+
+					// 	}
+					// })
 				} else {
 				} else {
 					uni.showToast({
 					uni.showToast({
 						title: "未选择出发地或到达地",
 						title: "未选择出发地或到达地",
@@ -257,7 +262,7 @@
 						console.log('详细地址:' + res.address);
 						console.log('详细地址:' + res.address);
 						console.log('纬度:' + res.latitude);
 						console.log('纬度:' + res.latitude);
 						console.log('经度:' + res.longitude);
 						console.log('经度:' + res.longitude);
-						that.pincheCarSharing.startPlace = res.address
+						that.pincheCarSharing.startPlace = res.name
 						that.placeFrom = {
 						that.placeFrom = {
 							latitude: res.latitude,
 							latitude: res.latitude,
 							longitude: res.longitude
 							longitude: res.longitude
@@ -275,7 +280,7 @@
 						console.log('详细地址:' + res.address);
 						console.log('详细地址:' + res.address);
 						console.log('纬度:' + res.latitude);
 						console.log('纬度:' + res.latitude);
 						console.log('经度:' + res.longitude);
 						console.log('经度:' + res.longitude);
-						that.pincheCarSharing.endPlace = res.address
+						that.pincheCarSharing.endPlace = res.name
 						that.placeTo = {
 						that.placeTo = {
 							latitude: res.latitude,
 							latitude: res.latitude,
 							longitude: res.longitude
 							longitude: res.longitude
@@ -293,11 +298,17 @@
 									let _km = Number(res.result.elements[0].distance * 0.001)
 									let _km = Number(res.result.elements[0].distance * 0.001)
 										.toFixed(2)
 										.toFixed(2)
 									console.log("km", _km)
 									console.log("km", _km)
-									that.pincheCarSharing.remark1 = Number(Number(_km * uni
-										.getStorageSync('selectRoute').remark1).toFixed(
+									that.onePersonPrice = Number(Number(_km * uni
+										.getStorageSync('selectRoute').unitPrice).toFixed(
 										2))
 										2))
-									console.log("that.pincheCarSharing.remark1", that
-										.pincheCarSharing.remark1)
+									console.log("单人费用", that.onePersonPrice)
+									that.pincheCarSharing.remark1 = Number(that.onePersonPrice *
+										that.pincheCarSharing.numberPeople).toFixed(2)
+									// that.pincheCarSharing.remark1 = Number(Number(_km * uni
+									// 	.getStorageSync('selectRoute').remark1).toFixed(
+									// 	2))
+									// console.log("that.pincheCarSharing.remark1", that
+									// 	.pincheCarSharing.remark1)
 								},
 								},
 								fail: function(err) {
 								fail: function(err) {
 									console.log("腾讯地图获取距离失败")
 									console.log("腾讯地图获取距离失败")
@@ -324,7 +335,7 @@
 				console.log(1)
 				console.log(1)
 				this.showAlert = true
 				this.showAlert = true
 			},
 			},
-			submit() {
+			async submit() {
 				if (!this.pincheCarSharing.route) {
 				if (!this.pincheCarSharing.route) {
 					uni.showToast({
 					uni.showToast({
 						mask: true,
 						mask: true,
@@ -336,7 +347,7 @@
 				if (!this.pincheCarSharing.carpoolingType) {
 				if (!this.pincheCarSharing.carpoolingType) {
 					uni.showToast({
 					uni.showToast({
 						mask: true,
 						mask: true,
-						title: '请选择拼车类型',
+						title: '请选择通勤类型',
 						icon: 'none'
 						icon: 'none'
 					})
 					})
 					return
 					return
@@ -365,6 +376,42 @@
 					})
 					})
 					return
 					return
 				}
 				}
+				debugger
+				console.log("aaa")
+				console.log(this.pincheCarSharing.carpoolingType)
+
+				let _status = ""
+				if (this.pincheCarSharing.carpoolingType == "车找人") {
+					await this.$request.baseRequest('pincheVehicleFilingApp', 'list', {
+							phone: this.userInfo.phone
+						},
+						failres => {
+							console.log('res+++++', failres.errmsg)
+							this.$refs.uToast.show({
+								type: 'error',
+								message: failres.errmsg,
+							})
+							uni.hideLoading()
+						}).then(res => {
+						console.log(res)
+						if (res.data.items[0].status != "审核通过") {
+							_status = false
+						} else {
+							_status = true
+						}
+					})
+					//查询是否认证司机
+
+					if (!_status) {
+						uni.showToast({
+							mask: true,
+							title: "未认证司机,请在我的里认证司机!",
+							icon: 'none'
+						})
+						return
+					}
+				}
+
 				this.$request.baseRequest('pincheCarSharingApp', 'add', {
 				this.$request.baseRequest('pincheCarSharingApp', 'add', {
 						pincheCarSharing: JSON.stringify(this.pincheCarSharing)
 						pincheCarSharing: JSON.stringify(this.pincheCarSharing)
 					},
 					},
@@ -383,14 +430,15 @@
 					uni.switchTab({
 					uni.switchTab({
 						url: '/pages/info/info'
 						url: '/pages/info/info'
 					})
 					})
-					// console.log(res.data.items)
-					// this.typeTwoData = res.data.items
-					// this.makeData(res.data)
-					// }
-
 				})
 				})
-				// console.log(1)
-				// this.showAlert = true
+				// }
+				// else {
+				// 	this.$refs.uToast.show({
+				// 		type: 'error',
+				// 		message: "未认证司机,请在我的里认证司机!",
+				// 	})
+				// }
+
 			},
 			},
 			checkboxChange(n) {
 			checkboxChange(n) {
 				console.log('change', n);
 				console.log('change', n);
@@ -432,8 +480,10 @@
 
 
 				if (e.name == '车找人') {
 				if (e.name == '车找人') {
 					this.showInfo = 1
 					this.showInfo = 1
+					this.pincheCarSharing.numberPeople = 5
 				} else {
 				} else {
 					this.showInfo = 2
 					this.showInfo = 2
+					this.pincheCarSharing.numberPeople = 1
 				}
 				}
 			},
 			},
 			hideKeyboard() {
 			hideKeyboard() {

+ 73 - 48
pinche/pages/info/info.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
 	<view class="warp">
 	<view class="warp">
-		<view @click="setInfo" class="fbxc">发布行程</view>
-		<mescroll-body ref="mescrollRef" @up="upCallback" @down="downCallback">
+		<view @click="setInfo" class="fbxc" v-if="isLogin">发布通勤信息</view>
+		<mescroll-body ref="mescrollRef" @up="upCallback" @down="downCallback" @init="mescrollInit">
 			<view class="content3 infoList" v-for="(item,index) in infoList" :key="index">
 			<view class="content3 infoList" v-for="(item,index) in infoList" :key="index">
 				<view class="row1">
 				<view class="row1">
 					<view class="left">
 					<view class="left">
@@ -13,6 +13,9 @@
 					<view class="right" v-if="item.status=='已取消'" style="color:gray;">
 					<view class="right" v-if="item.status=='已取消'" style="color:gray;">
 						{{item.status}}
 						{{item.status}}
 					</view>
 					</view>
+					<view class="right" v-if="item.status=='已预约'" style="color:#19be6b;">
+						{{item.status}}
+					</view>
 				</view>
 				</view>
 				<view class="row2">
 				<view class="row2">
 					路线:{{item.route}}
 					路线:{{item.route}}
@@ -20,16 +23,14 @@
 				<view class="type" style="margin: 20rpx 0; color: gray;font-weight: 700;">
 				<view class="type" style="margin: 20rpx 0; color: gray;font-weight: 700;">
 					{{item.carpoolingType}}
 					{{item.carpoolingType}}
 				</view>
 				</view>
-				<view class="detail" v-if="item.carpoolingType=='人找车'">
-					<view class="left" @click="detail(item)">
-						查看详情
-					</view>
-					<view class="right" @click="cancalWay(item)" v-if="item.status=='进行中'">
-						取消行程
-					</view>
-				</view>
 				<view class="row3" v-if="item.carpoolingType=='车找人'">
 				<view class="row3" v-if="item.carpoolingType=='车找人'">
-					剩余座位:【{{item.remark1}}】
+					剩余座位:【{{item.numberPeople}}】
+				</view>
+				<view class="row">
+					出发地:{{item.startPlace}}
+				</view>
+				<view class="row">
+					到达地:{{item.endPlace}}
 				</view>
 				</view>
 				<view class="row4" v-if="item.carpoolingType=='车找人'">
 				<view class="row4" v-if="item.carpoolingType=='车找人'">
 					<view class="btn" @click="changeSit(item)">
 					<view class="btn" @click="changeSit(item)">
@@ -42,6 +43,14 @@
 						查看预定>
 						查看预定>
 					</view>
 					</view>
 				</view>
 				</view>
+				<view class="detail" v-if="item.carpoolingType=='人找车'">
+					<view class="left" @click="detail(item)">
+						查看详情
+					</view>
+					<view class="right" @click="cancalWay(item)" v-if="item.status=='进行中'">
+						取消行程
+					</view>
+				</view>
 			</view>
 			</view>
 
 
 		</mescroll-body>
 		</mescroll-body>
@@ -58,18 +67,20 @@
 			</u-cell-group>
 			</u-cell-group>
 		</u-popup>
 		</u-popup>
 		<u-popup :show="showSit" @close="close1" @open="open1" mode="center" customStyle="width:80%;padding:20rpx"
 		<u-popup :show="showSit" @close="close1" @open="open1" mode="center" customStyle="width:80%;padding:20rpx"
-			:round="10" class='sit'>
-			<view class="title">
-				调整座位
-			</view>
-			<view class="title2">
-				输入最新剩余座位数,如车满设置为0
-			</view>
-			<u--input placeholder="请输入内容" border="surround" v-model="value" @change="change"></u--input>
-			<view class="btn-list">
-				<u-button text="取消" class='btn' @click="qx"></u-button>
-				<u-button type="primary" :plain="true" text="确定" color="#19be6b" class='btn' @click="sitSubmit">
-				</u-button>
+			:round="10">
+			<view class='sit'>
+				<view class="title">
+					调整座位
+				</view>
+				<view class="title2">
+					输入最新剩余座位数,如车满设置为0
+				</view>
+				<u--input placeholder="请输入剩余座位数" border="surround" v-model="value" @change="change"></u--input>
+				<view class="btn-list">
+					<view class='btn' @click="qx">取消</view>
+					<view class='btn' @click="sitSubmit">确定</view>
+				</view>
+
 			</view>
 			</view>
 		</u-popup>
 		</u-popup>
 		<u-toast ref="uToast"></u-toast>
 		<u-toast ref="uToast"></u-toast>
@@ -115,8 +126,8 @@
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {
+				isLogin: false,
 				canReset: false,
 				canReset: false,
-				mescroll: null,
 				value: '',
 				value: '',
 				showSit: false,
 				showSit: false,
 				showAlert: false,
 				showAlert: false,
@@ -124,7 +135,8 @@
 				showDetail: false,
 				showDetail: false,
 				startRoute: '',
 				startRoute: '',
 				endRoute: '',
 				endRoute: '',
-				infoList: []
+				infoList: [],
+				mescroll: null,
 
 
 			}
 			}
 		},
 		},
@@ -132,7 +144,7 @@
 			if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
 			if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
 				this.userInfo = uni.getStorageSync("userInfo")
 				this.userInfo = uni.getStorageSync("userInfo")
 				console.log(this.userInfo)
 				console.log(this.userInfo)
-
+				this.isLogin = true
 			} else {
 			} else {
 				uni.navigateTo({
 				uni.navigateTo({
 					url: '/pages/login/login'
 					url: '/pages/login/login'
@@ -152,7 +164,7 @@
 				this.$request.baseRequest('pincheCarSharingApp', 'update', {
 				this.$request.baseRequest('pincheCarSharingApp', 'update', {
 					pincheCarSharing: JSON.stringify({
 					pincheCarSharing: JSON.stringify({
 						id: this.selectItem.id,
 						id: this.selectItem.id,
-						remark1: this.value,
+						numberPeople: this.value,
 					})
 					})
 				}, failres => {
 				}, failres => {
 					console.log('res+++++', failres.errmsg)
 					console.log('res+++++', failres.errmsg)
@@ -172,6 +184,7 @@
 				console.log('change', e);
 				console.log('change', e);
 			},
 			},
 			changeSit(val) {
 			changeSit(val) {
+				this.value = ''
 				this.showSit = true
 				this.showSit = true
 				this.selectItem = val
 				this.selectItem = val
 			},
 			},
@@ -198,12 +211,13 @@
 			},
 			},
 			submit() {
 			submit() {
 
 
-				this.$request.baseRequest('pincheCarSharingApp', 'update', {
-					pincheCarSharing: JSON.stringify({
-						id: this.selectItem.id,
-						carpoolingType: this.selectItem.carpoolingType,
-						status: '已取消'
-					})
+				this.$request.baseRequest('pincheCarSharingApp', 'delete', {
+					id: this.selectItem.id,
+					// pincheCarSharing: JSON.stringify({
+					// 	id: this.selectItem.id,
+					// 	carpoolingType: this.selectItem.carpoolingType,
+					// 	status: '已取消'
+					// })
 				}, failres => {
 				}, failres => {
 					console.log('res+++++', failres.errmsg)
 					console.log('res+++++', failres.errmsg)
 					this.$refs.uToast.show({
 					this.$refs.uToast.show({
@@ -329,6 +343,14 @@
 		padding-bottom: 40rpx;
 		padding-bottom: 40rpx;
 	}
 	}
 
 
+	.btn {
+		text-align: center;
+		background: #f7f7f7;
+		border: 1px solid #dfe2e5;
+		border-radius: 10rpx;
+		padding: 15rpx 30rpx;
+		font-size: 26rpx;
+	}
 
 
 	.content3 {
 	.content3 {
 		margin: 20rpx;
 		margin: 20rpx;
@@ -355,14 +377,7 @@
 			display: flex;
 			display: flex;
 			justify-content: space-around;
 			justify-content: space-around;
 
 
-			.btn {
-				text-align: center;
-				background: #f7f7f7;
-				border: 1px solid #dfe2e5;
-				border-radius: 10rpx;
-				padding: 20rpx 30rpx;
-				font-size: 26rpx;
-			}
+
 		}
 		}
 	}
 	}
 
 
@@ -380,10 +395,11 @@
 		display: flex;
 		display: flex;
 		justify-content: space-evenly;
 		justify-content: space-evenly;
 		align-items: center;
 		align-items: center;
+		margin-top: 20rpx;
 
 
 		.left {
 		.left {
 			background: #19be6b;
 			background: #19be6b;
-			padding: 20rpx 30rpx;
+			padding: 15rpx 30rpx;
 			color: #fff;
 			color: #fff;
 			border-radius: 20rpx;
 			border-radius: 20rpx;
 		}
 		}
@@ -393,7 +409,7 @@
 			background: #f7f7f7;
 			background: #f7f7f7;
 			border: 1px solid #dfe2e5;
 			border: 1px solid #dfe2e5;
 			border-radius: 10rpx;
 			border-radius: 10rpx;
-			padding: 20rpx 30rpx;
+			padding: 15rpx 30rpx;
 			font-size: 26rpx;
 			font-size: 26rpx;
 		}
 		}
 	}
 	}
@@ -403,11 +419,12 @@
 			display: flex;
 			display: flex;
 			justify-content: center;
 			justify-content: center;
 			font-size: 40rpx;
 			font-size: 40rpx;
-
+			margin: 0 auto;
+			font-weight: 700
 		}
 		}
 
 
 		.title2 {
 		.title2 {
-			font-size: 36rpx;
+			font-size: 28rpx;
 			margin: 20rpx 0;
 			margin: 20rpx 0;
 		}
 		}
 
 
@@ -417,10 +434,18 @@
 			width: 100%;
 			width: 100%;
 			justify-content: space-between;
 			justify-content: space-between;
 
 
-		}
+			.btn {
+				width: 35%;
+			}
 
 
-		.btn {
-			width: 50%;
+			.btn:nth-of-type(2) {
+				background: #19be6b;
+				color: #fff;
+			}
 		}
 		}
 	}
 	}
+
+	.row {
+		margin-top: 15rpx;
+	}
 </style>
 </style>

+ 17 - 10
pinche/pages/info/lookOrder.vue

@@ -18,10 +18,10 @@
 				</view>
 				</view>
 			</view>
 			</view>
 			<view class="row2">
 			<view class="row2">
-				重要提示:请确认已经和预订乘客电话确认拼车,乘客预订列表只作为车主查看记录,方便出发前联系使用,具体以电话确认拼车为准,如电话确认不拼车就取消乘客的预订即可。
+				重要提示:请确认已经和预订乘客电话确认通勤,乘客预订列表只作为车主查看记录,方便出发前联系使用,具体以电话确认通勤为准,如电话确认不通勤就取消乘客的预订即可。
 			</view>
 			</view>
 		</view>
 		</view>
-		<mescroll-body ref="mescrollRef" @up="upCallback">
+		<mescroll-body ref="mescrollRef" @up="upCallback" @down="downCallback">
 			<view class="content3 infoList" v-for="(item,index) in infoList">
 			<view class="content3 infoList" v-for="(item,index) in infoList">
 				<view class="row1">
 				<view class="row1">
 					<view class="left">
 					<view class="left">
@@ -37,25 +37,25 @@
 						{{item.status}}
 						{{item.status}}
 					</view>
 					</view>
 				</view>
 				</view>
-				<view class="row2">
+				<view class="row2 row">
 					路线:{{item.route}}
 					路线:{{item.route}}
 				</view>
 				</view>
-				<view class="row3">
+				<view class="row3 row">
 					出发地:{{item.startPlace}}
 					出发地:{{item.startPlace}}
 				</view>
 				</view>
-				<view class="row3">
+				<view class="row3 row">
 					到达地:{{item.endPlace}}
 					到达地:{{item.endPlace}}
 				</view>
 				</view>
-				<view class="">
+				<view class="row">
 					手机:{{item.phone}}
 					手机:{{item.phone}}
 				</view>
 				</view>
-				<view class="">
+				<view class="row">
 					人数:{{item.numberPeople}}
 					人数:{{item.numberPeople}}
 				</view>
 				</view>
-				<view class="">
+				<view class="row">
 					价格:{{item.price}}
 					价格:{{item.price}}
 				</view>
 				</view>
-				<view class="">
+				<view class="row">
 					<view class="">
 					<view class="">
 						说明:
 						说明:
 					</view>
 					</view>
@@ -121,6 +121,9 @@
 			console.log(this.dataObj)
 			console.log(this.dataObj)
 		},
 		},
 		methods: {
 		methods: {
+			downCallback() {
+				this.mescroll.resetUpScroll();
+			},
 			submit(type, id) {
 			submit(type, id) {
 				uni.showLoading({
 				uni.showLoading({
 					mask: true,
 					mask: true,
@@ -313,6 +316,10 @@
 		border-radius: 20rpx;
 		border-radius: 20rpx;
 		padding: 20rpx;
 		padding: 20rpx;
 
 
+		.row {
+			margin-top: 15rpx
+		}
+
 		.row1 {
 		.row1 {
 			display: flex;
 			display: flex;
 			justify-content: space-between;
 			justify-content: space-between;
@@ -337,7 +344,7 @@
 				background: #f7f7f7;
 				background: #f7f7f7;
 				border: 1px solid #dfe2e5;
 				border: 1px solid #dfe2e5;
 				border-radius: 10rpx;
 				border-radius: 10rpx;
-				padding: 20rpx 30rpx;
+				padding: 15rpx 30rpx;
 				font-size: 26rpx;
 				font-size: 26rpx;
 			}
 			}
 		}
 		}

+ 93 - 0
pinche/pages/login/fw.html

@@ -0,0 +1,93 @@
+<!DOCTYPE html>
+<!-- saved from url=(0040)https://www.juxue211.com/user-terms.html -->
+<html lang="zh-CN">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta http-equiv="pragma" content="no-cache">
+		<meta http-equiv="Cache-Control" content="no-store, must-revalidate">
+		<meta http-equiv="expires" content="Wed, 11 May 2016 18:22:27 GMT">
+		<meta http-equiv="expires" content="0">
+
+		<meta http-equiv="X-UA-Compatible" content="IE=edge">
+		<meta name="viewport" id="viewport"
+			content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
+		<title>《小程序用户服务协议》</title>
+		<link rel="icon" href="https://www.juxue211.com/images/favicon.ico" type="image/x-icon">
+		<link rel="shortcut icon" href="https://www.juxue211.com/images/favicon.ico" type="image/x-icon">
+		<link type="text/css" rel="stylesheet" href="./《小程序用户服务协议》_files/style.css">
+	</head>
+
+	<body>
+		<div class="user-item-wrap">
+			<div class="user-item-inner">
+				<!--<div class="user-item-title"><h1>《小程序用户服务协议》</h1></div>-->
+				<div class="user-item-content">
+					<p>欢迎阅读《小程序用户服务协议》(以下简称“本协议”)。本协议阐述之条款和条件适用于您(以下简称“用户”)使用小程序的各种产品和服务。</p>
+					<p><span class="pt">1. 协议生效与构成</span></p>
+					<p>1.1
+						您在首次使用本平台提供的服务前,请认真阅读本协议。请您务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款、法律适用和争议解决条款。免除或者限制责任的条款将以粗体标识,您应重点阅读。如您对协议有任何疑问,可向平台客服咨询。
+						当您点击同意本协议后,即表示您已充分阅读、理解并接受本协议的全部内容,并与平台达成一致,成为平台“用户”,本协议对您及平台均具有法律约束力。
+						平台可能根据法律法规变化的需要,修改本协议,并以提前公示、推送通知或弹窗等方式通知到您。您可以随时在本平台查阅修改后的最新版本协议。如您对已生效的变更事项不同意的,您应当于变更事项确定的生效之日起停止使用本平台服务,变更事项对您不产生效力。本协议变更事项生效后,如果您继续使用本平台服务,我们可以理解您已接受修改后的协议和已生效的变更事项。
+					</p>
+					<p><span class="pt">2. 平台服务概述</span></p>
+					<p>2.1
+						平台只为用户提供信息发布、信息检索等信息技术服务,属于企业内部信息共享服务平台。
+						当您使用平台某一具体服务时,请您在使用具体服务前,仔细阅读服务协议。
+					</p>
+					<p><span class="pt">3. 用户资格</span></p>
+					<p>3.1
+						在您使用平台服务时,您应具备中华人民共和国法律法规规定的与您行为相适应的民事行为能力。如您不具备前述与您行为相适应的民事行为能力,则您及您的监护人应依照法律规定承担因此而导致的后果。</p>
+					<p><span class="pt">4. 服务费用</span></p>
+					<p>4.1
+						本服务平台仅为企业内部员工使用,平台向您提供的服务是免费的。。</p>
+					<p><span class="pt">5. 平台服务与责任限制</span></p>
+					<p>5.1 您理解并同意:平台仅作为信息技术平台提供平台服务,您了解并同意,平台提供的服务可能存在风险和瑕疵,平台将通过依法采取相关检查监控措施尽可能保障您在平台上的良好体验。</p>
+					<p>5.2
+						您理解并同意:在使用本服务的过程中,可能会遇到不可抗力、技术风险等因素,使本服务发生中断,对于下述原因导致的合同履行障碍、履行瑕疵、履行延后或履行内容变更、数据丢失等情形,平台在法律允许的最大范围内免责:
+						a. 因自然灾害、罢工、暴乱、战争、政府行为、司法行政命令等不可抗力因素;
+						b. 您或平台的电脑软件、系统、硬件出现故障或其他原因导致您无法使用平台;
+						c.
+						因电力供应故障、通讯网络故障(包括但不限于电子通讯传达失败或延时、用于电子通讯的计算机程序对电子通讯的拦截或操纵)等公共服务因素或您自身因素(包括但不限于您操作不当、通过非平台授权的方式使用本服务)或第三人因素(包括但不限于受到计算机病毒、木马或其他恶意程序、黑客攻击的破坏、顾客的错误下单等错误操作);
+						d. 在平台已尽善意管理的情况下,因常规或紧急的设备与系统维护、设备与系统故障、缺陷、技术风险等因素;
+						e. 其他平台无法控制或合理预见的情形。</p>
+					<p><span class="pt">6. 用户承诺与保证</span></p>
+					<p>您使用平台服务的过程中,您做出如下保证和承诺:</p>
+					<p>6.1 在使用平台服务的过程中实施的所有行为均遵守国家法律法规等的规定,不违背社会公共利益或公共道德,不侵犯或试图侵犯他人的合法权益。</p>
+					<p>6.2 严格遵守本协议、用户行为规则及服务协议的约定与要求。</p>
+
+					<p>6.3
+						在平台上发送或传播的内容(包括但不限于网页、文字、图片、音频、视频、图表等)均应符合法律规定,不侵害任何第三方的合法权益,且不包含以下信息。如您违反本条约定,平台有权暂停或终止您使用本平台服务,并删除相关内容。
+						a. 违反国家法律法规禁止性规定的;
+						b. 政治宣传、封建迷信、淫秽、色情、赌博、暴力、恐怖或者教唆犯罪的;
+						c. 欺诈、虚假、不准确或存在误导性的;
+						d. 侵犯他人知识产权或涉及第三方商业秘密及其他专有权利的;
+						e. 侮辱、诽谤、恐吓、涉及他人隐私等侵害他人合法权益的;
+						f. 存在可能破坏、篡改、删除、影响平台任何系统正常运行或未经授权秘密获取平台及其他用户的数据、个人资料的病毒、木马、爬虫等恶意软件、程序代码的;
+						g. 其他违背社会公共利益或公共道德或依据相关协议、规则的规定不适合在平台上发布的。
+					</p>
+					<p>6.4 不以任何方式干扰或试图干扰平台的正常运作或任何形式侵害平台合法权益,包括但不限于使用任何装置、病毒、木马等干预平台的正常运作,采取任何将导致不合理的庞大数据负载加诸平台网络设备的行动等。
+					</p>
+					<p>6.5
+						不进行危害计算机网络安全的行为,包括但不限于:使用未经许可的数据或进入未经许可的服务器账号;未经允许不进入公众计算机网络或者他人计算机系统并删除、修改、增加存储信息;未经许可,不企图探查、扫描、测试平台系统或网络的弱点或其它实施破坏网络安全的行为;不企图干涉、破坏系统等的正常运行。
+					</p>
+					<p>6.6 尊重平台合法权利,不实施侮辱、诽谤、侵犯平台名誉权或其他侵犯平台合法权利的行为。</p>
+					<p><span class="pt">7. 个人信息收集及保护</span></p>
+					<p>7.1
+						平台非常重视保护用户个人信息。平台将按照本协议及《个人信息保护及隐私政策》的约定收集、使用、储存和共享您的个人信息。本协议对个人信息保护相关内容未作明确约定的,以《个人信息保护及隐私政策》约定为准。
+					</p>
+					<p>7.2
+						您使用平台服务的过程中,为了更好为您提供服务,平台可能会根据为您提供的具体服务之必需收集您的车牌号码、品牌车型等信息,若您拒绝平台收集此类信息,则可能无法使用平台服务或者在使用过程中受到限制。
+					</p>
+					<p><span class="pt">8. 其他条款</span></p>
+					<p>8.1
+						本协议所有条款的标题仅为阅读方便,不作为本协议涵义解释或限制的依据。</p>
+					<p>8.2 本协议任一条款被视为废止、无效或不可执行,该条应视为可分的且并不影响本协议其余条款的有效性及可执行性。</p>
+
+					<p>8.3 平台服务协议。</p>
+				</div>
+			</div>
+		</div>
+
+		<div id="mmq" style="display:none;"></div>
+	</body>
+</html>

+ 125 - 78
pinche/pages/login/login.vue

@@ -17,9 +17,21 @@
 
 
 		</view> -->
 		</view> -->
 
 
-		<view class="button-login" hover-class="button-hover" @tap="bindLogin1()">
+		<view class="button-login" hover-class="button-hover" @tap="bindLogin()">
 			<text>企业微信登录</text>
 			<text>企业微信登录</text>
 		</view>
 		</view>
+		<view style='color:#6A6A6A;margin-top:10px;text-align:center;'>
+			<image @click='consent' style='width:14px;height:14px;position:relative;top:2px;margin-right:5px;'
+				:src="consentStatus==true?'../../static/select@2x.png':'../../static/selected2.png'" alt=""></image>
+			已阅读并同意
+			<view class="" style="display: flex;justify-content: center;">
+				<navigator url="/pages/index/webview?can_share=false&url=https://pinche.cspc.cn:10443/fw.html"
+					class="path" hover-class="navigator-hover">《服务协议》</navigator>和<navigator
+					url="/pages/index/webview?can_share=false&url=https://pinche.cspc.cn:10443/ys.html" class="path"
+					hover-class="navigator-hover">《隐私政策》</navigator>
+			</view>
+
+		</view>
 		<u-toast ref="uToast"></u-toast>
 		<u-toast ref="uToast"></u-toast>
 		<!-- <view class="agreenment">
 		<!-- <view class="agreenment">
 			<navigator url="forget" open-type="navigate">忘记密码</navigator>
 			<navigator url="forget" open-type="navigate">忘记密码</navigator>
@@ -33,16 +45,33 @@
 	export default {
 	export default {
 		data() {
 		data() {
 			return {
 			return {
+				consentStatus: false,
 				userInfo: {
 				userInfo: {
-					openId: '123456',
-					phone: '15555555555',
-					name: '15555555555',
-				}
+					phone: '18698888393',
+					name: 'achao',
+				},
+				accessToken: '',
 
 
 			};
 			};
 		},
 		},
 		methods: {
 		methods: {
+			consent() {
+				this.consentStatus = !this.consentStatus
+				uni.setStorage({
+					key: 'policyStorageKey',
+					data: this.consentStatus
+				});
+			},
 			bindLogin1() {
 			bindLogin1() {
+
+				if (!this.consentStatus) {
+					uni.showToast({
+						title: '请勾选协议',
+						icon: 'none',
+						duration: 2000
+					})
+					return
+				}
 				this.$request.baseRequest('user', 'addUser', this.userInfo,
 				this.$request.baseRequest('user', 'addUser', this.userInfo,
 					failres => {
 					failres => {
 						console.log('res+++++', failres.errmsg)
 						console.log('res+++++', failres.errmsg)
@@ -61,6 +90,21 @@
 				})
 				})
 			},
 			},
 			bindLogin() {
 			bindLogin() {
+				uni.onError(function(res) {
+					uni.showToast({
+						title: res,
+						icon: 'none',
+						duration: 2000
+					})
+				})
+				if (!this.consentStatus) {
+					uni.showToast({
+						title: '请勾选协议',
+						icon: 'none',
+						duration: 2000
+					})
+					return
+				}
 				console.log(111)
 				console.log(111)
 				//#ifdef MP-WEIXIN
 				//#ifdef MP-WEIXIN
 				const sinfo = uni.getSystemInfoSync();
 				const sinfo = uni.getSystemInfoSync();
@@ -87,97 +131,100 @@
 								// if (res.errno == 200) {
 								// if (res.errno == 200) {
 								uni.hideLoading()
 								uni.hideLoading()
 								console.log(res, '系统内部的登录结果')
 								console.log(res, '系统内部的登录结果')
+								that.accessToken = res.data.data.session_key
 								//获取企业微信姓名
 								//获取企业微信姓名
 								wx.qy.getEnterpriseUserInfo({
 								wx.qy.getEnterpriseUserInfo({
 									success: function(res) {
 									success: function(res) {
-										var userInfo = res.userInfo
-										var name = userInfo.name
-										var gender = userInfo.gender //性别 0:未知、1:男、2:女
+										console.log("姓名:", res)
+										that.userInfo.name = JSON.parse(res.rawData).name
+
 										//获取手机号
 										//获取手机号
 										wx.qy.getMobile({
 										wx.qy.getMobile({
 											success: function(res) {
 											success: function(res) {
-												console.log(res.encryptedData)
-												console.log(res.iv)
+												console.log('电话', res)
 												//更新用户信息
 												//更新用户信息
+												let iv = res.iv
+												let encryptedData = res
+													.encryptedData
+												let sessionKey = that
+													.accessToken
+												let appId =
+													"wxbb0159a7c59b2c03"
+												console.log(iv)
+												console.log(encryptedData)
+												console.log(sessionKey)
+												console.log(appId)
+												let data = that.$WXBizDataCrypt
+													.prototype.decryptData(
+														encryptedData, iv,
+														appId, sessionKey)
 
 
-											}
-										})
+												console.log('解密后 data: ', data)
+												that.userInfo.phone = data
+													.mobile
+												that.getTokenAsync(data)
 
 
-									}
+											},
+											fail(err) {
+												uni.showToast({
+													title: res,
+													icon: 'none',
+													duration: 2000
+												})
+											},
+										})
+									},
+									fail(err) {
+										uni.showToast({
+											title: res,
+											icon: 'none',
+											duration: 2000
+										})
+									},
 								})
 								})
-
 							})
 							})
-							// uni.request({
-							// 	url: "",
-							// 	method: 'POST',
-							// 	header: {
-							// 		'content-type': 'application/x-www-form-urlencoded'
-							// 	},
-							// 	data: {
-							// 		code: res.code
-							// 	},
-							// 	success(res) {
-							// 		console.log(res, '系统内部的登录结果')
-							// 		// 将res.data.data作为appletToken 存入全局变量
-							// 		getApp().globalData.appletToken = res.data.data
-							// 		console.log(getApp().globalData.appletToken)
-							// 	}
-							// })
+
 						} else {
 						} else {
+							uni.showToast({
+								mask: true,
+								title: res.errMsg
+							})
 							console.log('登录失败!' + res.errMsg)
 							console.log('登录失败!' + res.errMsg)
-							that.open()
+							// that.open()
 						}
 						}
+					},
+					fail(err) {
+						uni.showToast({
+							title: res,
+							icon: 'none',
+							duration: 2000
+						})
 					}
 					}
 				});
 				});
 				// }
 				// }
 				//#endif
 				//#endif
-
-				// if (this.phone.length) {
-				// 	uni.showToast({
-				// 		icon: 'none',
-				// 		title: '用户名不正确'
-				// 	});
-				// 	return;
-				// }
-				// if (this.password.length < 6) {
-				// 	uni.showToast({
-				// 		icon: 'none',
-				// 		title: '密码不正确'
-				// 	});
-				// 	return;
-				// }
-				// {
-				// sunMemberInfo: JSON.stringify({
-				// 	name: that.userInfo.nickname,
-				// 	phone: val.phoneNumber,
-				// 	sex: '1'
-				// })
-				// }
-				// uni.showLoading({
-				// 	mask: true,
-				// 	title: "加载中"
-				// })
-				// this.$request.baseRequest('admin', 'login', this.userInfo, failres => {
-				// 	console.log('res+++++', failres.errmsg)
-				// 	this.$refs.uToast.show({
-				// 		type: 'error',
-				// 		message: failres.errmsg,
-				// 	})
-				// 	uni.hideLoading()
-				// }).then(res => {
-				// 	console.log(res)
-				// 	if (res.errno == 200) {
-				// 		uni.hideLoading()
-				// 		uni.setStorageSync('userInfo', this.userInfo)
-				// 		this.$store.commit('login', this.userInfo)
-				// 		// that.$api.setUserInfo(that.userInfo)
-				// 		uni.switchTab({
-				// 			url: '/pages/index/index'
-				// 		})
-				// 	}
-
-				// })
-			}
+			},
+			async getTokenAsync(val) {
+				console.log(this.userInfo)
+				this.$request.baseRequest('user', 'addUser', this.userInfo,
+					failres => {
+						console.log('res+++++', failres.errmsg)
+						uni.showToast({
+							mask: true,
+							title: failres.errmsg
+						})
+						uni.hideLoading()
+					}).then(res => {
+					console.log(res.data)
+					this.userInfo = res.data
+					this.userInfo.name = res.data.nickname
+					uni.setStorageSync('userInfo', res.data)
+					this.$store.commit('login', res.data)
+					uni.switchTab({
+						url: '/pages/index/index'
+					})
+				})
+			},
 		}
 		}
 	}
 	}
 </script>
 </script>

+ 116 - 0
pinche/pages/login/ys.html

@@ -0,0 +1,116 @@
+<!DOCTYPE html>
+<!-- saved from url=(0040)https://www.juxue211.com/user-terms.html -->
+<html lang="zh-CN">
+	<head>
+		<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+		<meta http-equiv="pragma" content="no-cache">
+		<meta http-equiv="Cache-Control" content="no-store, must-revalidate">
+		<meta http-equiv="expires" content="Wed, 11 May 2016 18:22:27 GMT">
+		<meta http-equiv="expires" content="0">
+
+		<meta http-equiv="X-UA-Compatible" content="IE=edge">
+		<meta name="viewport" id="viewport"
+			content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
+		<title>《小程序用户服务协议》</title>
+		<link rel="icon" href="https://www.juxue211.com/images/favicon.ico" type="image/x-icon">
+		<link rel="shortcut icon" href="https://www.juxue211.com/images/favicon.ico" type="image/x-icon">
+		<link type="text/css" rel="stylesheet" href="./《小程序用户服务协议》_files/style.css">
+	</head>
+
+	<body>
+		<div class="user-item-wrap">
+			<div class="user-item-inner">
+				<!--<div class="user-item-title"><h1>《小程序用户服务协议》</h1></div>-->
+				<div class="user-item-content">
+					<p>欢迎阅读《小程序用户服务协议》(以下简称“本协议”)。本协议阐述之条款和条件适用于您(以下简称“用户”)使用小程序的各种产品和服务。</p>
+					<p><span class="pt">1. 服务协议的确认</span></p>
+					<p>1.1
+						石药集团欧意药业有限公司及相关关联企业(以下合称“石药集团”)同意按照本协议的规定及其不时发布的操作规则提供基于互联网通勤系统小程序。
+					</p>
+					<p>1.2
+						通勤系统服务使用人(以下简称“用户”)应当基于了解本协议全部内容、在独立思考的基础上认可、同意本协议的全部条款并按照页面上的提示完成全部的注册程序,用户的注册、登录、使用等行为将视为完全接受本协议及石药集团公示的各项规则、规范。
+					</p>
+					<p>1.3 石药集团享有对通勤系统小程序、通勤系统官方网站上一切活动的监督、提示、检查、纠正等权利。</p>
+					<p><span class="pt">2. 服务内容</span></p>
+					<p>2.1
+						通勤系统服务的具体内容由石药集团根据实际情况提供,包括但不限于授权用户通过其帐号上传、搜索并向互相关联的用户推送相关信息、授权用户对其进行收录、分享等,石药集团有权对其提供的服务或产品形态进行升级或其他调整,均以小程序\网站内容更新的方式通知用户,不单独通知用户。
+					</p>
+					<p>2.2 石药集团提供的通勤系统服务中可能包括广告,用户同意在使用过程中显示通勤系统和第三方供应商、合作伙伴提供的广告。</p>
+					<p>2.3
+						石药集团仅提供与通勤系统服务相关的技术服务等,除此之外与相关网络服务有关的设备(如个人电脑、手机、及其他与接入互联网或移动网有关的装置)及所需费用(如为接入互联网而支付的电话费及上网费、为使用移动网而支付的手机费)均应由用户自行负担。
+					</p>
+					<p><span class="pt">3. 服务变更、中断或终止</span></p>
+					<p>3.1
+						鉴于网络服务的特殊性(包括但不限于不可抗力、网络稳定性、系统稳定性、技术故障、用户所在位置、用户关机、用户手机病毒或恶意的网络攻击行为及其他任何技术、互联网络、通信线路、内容侵权等原因),用户同意,石药集团有权随时中断或终止部分或全部通勤系统服务,石药集团将尽可能及时以合理方式通知用户,并尽可能在第一时间对此进行修复。但对因此导致用户不能发送和接受阅读信息、或接发错信息,石药集团不承担任何责任,用户须承担以上风险。
+					</p>
+					<p>3.2 用户理解,石药集团需要定期或不定期地对提供通勤系统服务的平台或相关设备进行检修和维护,如因此类情况而造成服务在合理期间内的中断,石药集团将尽可能事先通知,但无需为此承担任何责任。</p>
+					<p>3.3 用户提供的个人资料不真实、用户违反法律法规国家政策或本协议规定的使用规则,石药集团有权随时中断或终止向用户提供本协议项下的通勤系统服务,而无需对用户或任何第三方承担任何责任。</p>
+					<p><span class="pt">4. 使用规则</span></p>
+					<p>4.1
+						用户在申请注册通勤系统服务时,必须向石药集团提供准确的主体资料(用户为个人时,包括姓名、性别、出生年月、电话、邮箱等;用户为单位时,包括名称、注册地址、注册号等),如主体资料有任何变动,必须及时更新。因用户提供资料的真实性问题导致协议双方或第三方的任何损失均由用户承担。
+					</p>
+					<p>4.2 用户注册成功后,将获得一个通勤系统帐号及由用户设置的密码,该用户帐号和密码由用户负责保管;用户应当对该用户帐号所有行为负相关法律责任。</p>
+					<p>用户在使用通勤系统服务过程中,必须遵循以下原则:</p>
+					<p>(1) 遵守中国有关的法律和法规;</p>
+					<p>(2) 不得为任何非法目的而使用通勤系统服务;</p>
+					<p>(3) 遵守所有与网络服务有关的网络协议、规定和程序;</p>
+					<p>(4) 不得利用通勤系统服务系统进行任何可能对互联网的正常运转造成不利影响的行为;</p>
+					<p>(5) 不得利用通勤系统网络服务系统进行任何不利于石药集团的行为。</p>
+					<p>4.3 用户不得使用通勤系统服务制作、上传、发送、传播敏感信息和违反国家法律制度的信息,包括但不限于下列信息:</p>
+					<p>(1) 反对宪法所确定的基本原则的;</p>
+					<p>(2) 危害国家安全,泄露国家秘密,颠覆国家政权,破坏国家统一的;</p>
+					<p>(3) 损害国家荣誉和利益的;</p>
+					<p>(4) 煽动民族仇恨、民族歧视,破坏民族团结的;</p>
+					<p>(5) 破坏国家宗教政策,宣扬邪教和封建迷信的;</p>
+					<p>(6) 散布谣言,扰乱社会秩序,破坏社会稳定的;</p>
+					<p>(7) 散布淫秽、色情、赌博、暴力、凶杀、恐怖或者教唆犯罪的;</p>
+					<p>(8) 侮辱或者诽谤他人,侵害他人合法权益的;</p>
+					<p>(9) 含有法律、行政法规禁止的其他内容的。</p>
+					<p>4.4 用户同意在任何情况下不使用其他用户的帐号或密码。在您怀疑他人在使用您的帐号或密码时,您同意立即通知石药集团。</p>
+					<p>4.5 用户有权更改、删除在通勤系统服务中的个人资料、注册信息及传送内容等,但删除有关信息的同时也会删除任何您储存在系统中的文字和图片。用户需承担该风险。</p>
+					<p>4.6 如因用户违反本协议中的任何条款,石药集团有权依据本协议终止对违约用户通勤系统帐号提供服务。</p>
+					<p>4.7 如用户注册通勤系统帐号后长期不登录该帐号,石药集团有权回收该帐号,以免造成资源浪费,由此带来问题均由用户自行承担。</p>
+					<p><span class="pt">5. 知识产权</span></p>
+					<p>5.1 石药集团提供通勤系统服务中所包含的任何文本、图片、标识、音频、视频资料均受著作权、商标权、专利权及其他财产权法律的保护。</p>
+					<p>5.2 未经相关权利人和石药集团的同意,上述资料均不得以任何方式被展示于其他任何第三方平台或被用于其他任何商业目的;用户不得擅自复制、修改、编纂上述内容、或创造与内容有关的衍生产品。</p>
+					<p><span class="pt">6. 隐私保护</span></p>
+					<p>6.1 本协议所指的“隐私”包括《电信和互联网用户个人信息保护规定》第4条规定的用户个人信息的内容以及未来不时制定或修订的法律法规中明确规定的隐私应包括的内容。</p>
+					<p>6.2
+						保护用户隐私和个人数据是石药集团的一项基本制度,石药集团将采取各种制度、安全技术和程序等措施来保护用户隐私和个人数据不被未经授权的访问、使用或泄漏,并保证不会将单个用户的注册资料及用户在使用通勤系统服务时存储在石药集团的非公开内容向除合作单位以外的第三方公开或用于任何非法的用途,但下列情况除外:
+					</p>
+					<p>(1) 事先获得用户的明确授权;</p>
+					<p>(2) 根据有关法律法规的要求;</p>
+					<p>(3) 按照相关政府主管部门的要求;</p>
+					<p>(4) 为维护社会公众的利益;</p>
+					<p>(5) 用户侵害本协议项下石药集团的合法权益的情况下而为维护石药集团的合法权益所必须。</p>
+					<p>6.3
+						用户在注册通勤系统小程序帐号或使用通勤系统小程序服务的过程中,需要提供一些必要的信息,例如:姓名、电话、邮箱、性别、出生年月、名称、注册地址、注册号等。为向用户提供帐号注册服务或进行用户身份识别,需要用户填写手机号码;部分功能需要用户授权使用用户的相机或相册;部分功能需要用户授权访问用户的手机通讯录等。若用户不授权或提供的信息不完整,则无法使用本服务或在使用过程中受到限制。用户授权提供的信息,石药集团承诺将采取措施保护用户的个人信息安全。
+					</p>
+					<p>6.4
+						为了向用户提供更好的用户体验和提高通勤系统小程序的服务质量,石药集团将可能会收集使用或向第三方提供用户的非个人隐私信息。石药集团将对该第三方使用用户个人数据的行为进行监督和管理,尽一切可能努力保护用户个人信息的安全。
+					</p>
+					<p><span class="pt">7. 免责声明</span></p>
+					<p>7.1 用户在使用通勤系统服务的过程中应遵守国家法律法规及政策规定,对其所制作、上传、发送、传播的信息和内容承担任何法律责任,与石药集团无关。</p>
+					<p>7.2
+						通勤系统小程序在其页面上向用户显示、推送的任何信息和内容如系石药集团利用技术手段根据用户指令从互联网任何第三方网站搜索、定位、匹配后推荐给用户而非石药集团单方制作的,则该显示、推送的信息和内容并不代表石药集团及通勤系统小程序的观点,石药集团并不对上述信息的准确性和正确性负责。
+					</p>
+					<p>7.3石药集团提供通勤系统小程序服务中所包含的任何文本、图片、标识、音频、视频资料均为教学用途,不涉及任何实体物品的商业活动。</p>
+					<p>7.4通勤系统小程序在其页面上向用户显示、推送的任何信息和内容如存在侵权任何第三方知识产权的嫌疑,权利人和相关利害关系人应当向石药集团发出权利通知,石药集团经过核实后根据有关法律法规有权采取包括但不限于断开该侵权内容的链接或删除并停止传输该侵权内容,但石药集团并不对该侵权内容承担法律责任。
+					</p>
+					<p>7.5用户违反本协议的规定,导致或产生的任何第三方主张的任何索赔、要求或损失,包括合理的律师费,用户同意赔偿石药集团,使之免受损害。</p>
+					<p><span class="pt">8. 其他条款</span></p>
+					<p>8.1
+						石药集团有权随时修改本协议的任何条款,一旦本协议的内容发生变动,石药集团将会在通勤系统小程序平台中公布修改后的协议内容或通过其他适当方式向用户公布修改内容。用户不同意上述修改内容,有权选择停止使用通勤系统服务,但用户继续使用,则视为接受石药集团对本协议相关条款的修改。
+					</p>
+					<p>8.2 本《协议》所定的任何条款无论因何种原因部分或全部无效或不具有执行力,本协议的其余条款仍应有效并具备约束力。</p>
+					<p>8.3
+						本协议的订立、执行和解释及纠纷的解决均应适用中华人民共和国法律并受中华人民共和国法院管辖。如双方就本协议内容或执行发生任何纠纷或争议,首先应友好协商解决,协商不成的,任何一方均可向石药集团所在地的有管辖权的人民法院提起诉讼。
+					</p>
+					<p>8.4 本协议的版权归石药集团所有,本协议各项条款内容的最终解释权及修改权归石药集团所有。</p>
+				</div>
+			</div>
+		</div>
+
+		<div id="mmq" style="display:none;"></div>
+	</body>
+</html>

+ 440 - 0
pinche/pages/mine/driver/driver.vue

@@ -0,0 +1,440 @@
+<template>
+	<view class="content">
+		<view class="content2">
+			<u--form labelPosition="left" :model="pincheMakeAppointment" ref="form1" labelWidth='100px'>
+				<u-form-item label="部门" prop="pincheMakeAppointment.carpoolingType" borderBottom>
+					<u--input v-model="pincheMakeAppointment.dept" border="none" placeholder="请输入部门">
+					</u--input>
+				</u-form-item>
+				<u-form-item label="姓名" prop="appointedBy" borderBottom ref="item1">
+					<u--input v-model="pincheMakeAppointment.driverName" border="none" placeholder="请输入姓名"></u--input>
+				</u-form-item>
+				<u-form-item label="手机号" prop="phone" borderBottom ref="item1">
+					<u--input v-model="pincheMakeAppointment.phone" border="none" placeholder="请输入手机号" disabled>>
+					</u--input>
+				</u-form-item>
+				<u-form-item label="员工号" prop="phone" borderBottom ref="item1">
+					<u--input v-model="pincheMakeAppointment.employeeNo" border="none" placeholder="请输入员工号">></u--input>
+				</u-form-item>
+				<u-form-item label="车牌号" prop="carNo" borderBottom ref="item1">
+					<u--input v-model="pincheMakeAppointment.carNo" border="none" placeholder="请输车牌号">></u--input>
+				</u-form-item>
+				<u-form-item label="品牌" prop="phone" borderBottom ref="item1">
+					<u--input v-model="pincheMakeAppointment.pinpai" border="none" placeholder="请输入品牌">></u--input>
+				</u-form-item>
+				<u-form-item label="颜色" prop="phone" borderBottom ref="item1">
+					<u--input v-model="pincheMakeAppointment.color" border="none" placeholder="请输入颜色">></u--input>
+				</u-form-item>
+				<u-form-item label="驾驶证" prop="phone" borderBottom ref="item1">
+					<u-upload :fileList="fileList1" @afterRead="afterRead" @delete="deletePic" name="1" multiple
+						:maxCount="1"></u-upload>
+				</u-form-item>
+				<u-form-item label="行驶证" prop="phone" borderBottom ref="item1">
+					<u-upload :fileList="fileList2" @afterRead="afterRead" @delete="deletePic" name="2" multiple
+						:maxCount="1"></u-upload>
+				</u-form-item>
+
+			</u--form>
+		</view>
+		<!-- 		<view class="sm">
+			说明
+		</view>
+		<u--textarea placeholder="其他内容,可选" confirmType="done" v-model="pincheMakeAppointment.explain">
+		</u--textarea> -->
+		<u-button text="司机审核" type="success" class="custom-style" @click='shClick' color="#19be6b"></u-button>
+		<u-modal :show="showAlert" title="提示" content='确认提交信息审核?' closeOnClickOverlay showCancelButton
+			confirmColor="#19be6b" @cancel="showAlert=false" @close="showAlert=false" @confirm="submit"></u-modal>
+		<u-toast ref="uToast"></u-toast>
+	</view>
+</template>
+
+<script>
+	var qqmapsdk;
+	// import QQMapWX from '../../js_sdk/qqmap-wx-jssdk.min.js'
+	import {
+		mapState
+	} from 'vuex';
+	export default {
+		components: {
+
+		},
+		computed: {
+			...mapState(['hasLogin'])
+		},
+		onReady() {
+			//如果需要兼容微信小程序,并且校验规则中含有方法等,只能通过setRules方法设置规则。
+			// this.$refs.form1.setRules(this.rules)
+		},
+		onShow() {
+			// if (this.hasLogin || uni.getStorageSync("pincheCarSharing").username) {
+			// 	this.pincheCarSharing = uni.getStorageSync("pincheCarSharing")
+			// } else {
+			// 	uni.navigateTo({
+			// 		url: "/pages/login/login"
+			// 	})
+			// 	// uni.({
+			// 	// 	url: '/pages/index/index'
+			// 	// })
+			// }
+		},
+		data() {
+			return {
+				isEdit: false,
+				fileList2: [],
+				fileList1: [],
+				userInfo: {},
+				showAlert: false,
+				pincheMakeAppointment: {
+					dept: '',
+					driverName: '',
+					phone: '',
+					employeeNo: '',
+					carNo: '',
+					pinpai: '',
+					color: '',
+					jiashiben: '',
+					xingshiben: ''
+
+				}
+			}
+		},
+		onLoad(options) {
+			if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
+				this.userInfo = uni.getStorageSync("userInfo")
+				this.pincheMakeAppointment.phone = this.userInfo.phone
+			} else {
+				uni.navigateTo({
+					url: '/pages/login/login'
+				})
+			}
+			this.isEdit = options.rz
+			if (this.isEdit == "true") {
+
+				console.log(this.isEdit)
+				this.pincheMakeAppointment = JSON.parse(options.val)
+				this.fileList1 = [{
+					url: this.pincheMakeAppointment.xingshiben
+				}]
+				this.fileList2 = [{
+					url: this.pincheMakeAppointment.jiashiben
+				}]
+			}
+
+			// this.id = options.id
+			// if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
+			// 	this.userInfo = uni.getStorageSync("userInfo")
+			// 	// this.init()
+			// 	this.init()
+			// 	qqmapsdk = new QQMapWX({
+			// 		key: '5HXBZ-A5UK6-5VLSP-EPCV2-4WMSQ-PLFCP'
+			// 	});
+			// } else {
+			// 	uni.navigateTo({
+			// 		url: '/pages/login/login'
+			// 	})
+			// }
+		},
+		methods: {
+			shClick() {
+				this.showAlert = true
+			},
+			// 删除图片
+			deletePic(event) {
+				this[`fileList${event.name}`].splice(event.index, 1)
+			},
+			// 新增图片
+			async afterRead(event) {
+				// 当设置 multiple 为 true 时, file 为数组格式,否则为对象格式
+				let lists = [].concat(event.file)
+				let fileListLen = this[`fileList${event.name}`].length
+				lists.map((item) => {
+					this[`fileList${event.name}`].push({
+						...item,
+						status: 'uploading',
+						message: '上传中'
+					})
+				})
+				for (let i = 0; i < lists.length; i++) {
+					const result = await this.uploadFilePromise(lists[i].url, event.name)
+					let item = this[`fileList${event.name}`][fileListLen]
+					this[`fileList${event.name}`].splice(fileListLen, 1, Object.assign(item, {
+						status: 'success',
+						message: '',
+						url: result
+					}))
+					fileListLen++
+				}
+			},
+			uploadFilePromise(url, type) {
+				console.log(type)
+				let that = this
+				return new Promise((resolve, reject) => {
+					let a = uni.uploadFile({
+						url: 'https://shiyaopinche.cspc.cn:10443/upload/admin', // 仅为示例,非真实的接口地址
+						filePath: url,
+						name: 'file',
+						success: (res) => {
+							setTimeout(() => {
+								if (res.statusCode == 200) {
+									if (type == 1) {
+										console.log(res)
+										console.log(that.pincheMakeAppointment)
+										that.pincheMakeAppointment.jiashiben = res.data
+									} else if (type == 2) {
+										that.pincheMakeAppointment.xingshiben = res.data
+									}
+
+									resolve(res.data.data)
+								} else {
+									reject(res.message)
+								}
+
+							}, 1000)
+						}
+					});
+				})
+			},
+			submit() {
+
+				// console.log(this.pincheMakeAppointment)
+				if (!this.pincheMakeAppointment.dept) {
+					uni.showToast({
+						mask: true,
+						title: '部门不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.driverName) {
+					uni.showToast({
+						mask: true,
+						title: '姓名不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.employeeNo) {
+					uni.showToast({
+						mask: true,
+						title: '员工号不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.carNo) {
+					uni.showToast({
+						mask: true,
+						title: '车牌号不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.pinpai) {
+					uni.showToast({
+						mask: true,
+						title: '品牌不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.color) {
+					uni.showToast({
+						mask: true,
+						title: '颜色不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.jiashiben) {
+					uni.showToast({
+						mask: true,
+						title: '驾驶证不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				if (!this.pincheMakeAppointment.xingshiben) {
+					uni.showToast({
+						mask: true,
+						title: '行驶证不能为空!',
+						icon: 'none'
+					})
+					return
+				}
+				// if (!this.pincheMakeAppointment.startPlace) {
+				// 	uni.showToast({
+				// 		mask: true,
+				// 		title: '请选择出发地点',
+				// 		icon: 'none'
+				// 	})
+				// 	return
+				// }
+				// if (!this.pincheMakeAppointment.endPlace) {
+				// 	uni.showToast({
+				// 		mask: true,
+				// 		title: '请选择到达地点',
+				// 		icon: 'none'
+				// 	})
+				// 	return
+				// }
+				if (this.isEdit == "true") {
+					this.$request.baseRequest('pincheVehicleFilingApp', 'update', {
+							pincheVehicleFiling: JSON.stringify(this.pincheMakeAppointment)
+						},
+						failres => {
+							console.log('res+++++', failres.errmsg)
+							this.$refs.uToast.show({
+								type: 'error',
+								message: failres.errmsg,
+							})
+							uni.hideLoading()
+						}).then(res => {
+						// if (res.errno == 200) {
+						uni.showToast({
+							mask: true,
+							title: '提交成功!'
+						})
+						uni.hideLoading()
+						console.log(11)
+						this.showAlert = false
+						uni.navigateBack()
+						// uni.switchTab({
+						// 	url: '/pages/order/order'
+						// })
+						// console.log(res.data.items)
+						// this.typeTwoData = res.data.items
+						// this.makeData(res.data)
+						// }
+
+					})
+				} else {
+					this.$request.baseRequest('pincheVehicleFilingApp', 'add', {
+							pincheVehicleFiling: JSON.stringify(this.pincheMakeAppointment)
+						},
+						failres => {
+							console.log('res+++++', failres.errmsg)
+							this.$refs.uToast.show({
+								type: 'error',
+								message: failres.errmsg,
+							})
+							uni.hideLoading()
+						}).then(res => {
+						// if (res.errno == 200) {
+						uni.showToast({
+							mask: true,
+							title: '提交成功!'
+						})
+						uni.hideLoading()
+						console.log(11)
+						this.showAlert = false
+						uni.navigateBack()
+						// uni.switchTab({
+						// 	url: '/pages/order/order'
+						// })
+						// console.log(res.data.items)
+						// this.typeTwoData = res.data.items
+						// this.makeData(res.data)
+						// }
+
+					})
+				}
+			},
+			checkboxChange(n) {
+				console.log('change', n);
+			},
+			formatter(type, value) {
+				if (type === 'year') {
+					return `${value}年`
+				}
+				if (type === 'month') {
+					return `${value}月`
+				}
+				if (type === 'day') {
+					return `${value}日`
+				}
+				return value
+			},
+			result(time, mode) {
+				const timeFormat = uni.$u.timeFormat,
+					toast = uni.$u.toast
+				switch (mode) {
+					case 'datetime':
+						return timeFormat(time, 'yyyy-mm-dd hh:MM')
+
+				}
+			},
+			setInfo() {
+				this.isShow = true
+			},
+			hideKeyboard() {
+				uni.hideKeyboard()
+			},
+		}
+
+	}
+</script>
+
+<style lang="scss" scoped>
+	.content {
+		padding-bottom: 40rpx;
+		box-sizing: border-box;
+	}
+
+	.content1 {
+		.row {
+			background: #fff;
+			border-bottom: 1px solid #dfe2e5;
+			padding: 20rpx;
+			display: flex;
+			justify-content: space-between;
+		}
+	}
+
+	.content2 {
+		margin-top: 20rpx;
+		padding: 20rpx;
+		background: #fff;
+	}
+
+	.sm {
+		margin: 20rpx;
+	}
+
+	.content3 {
+		display: flex;
+		align-items: center;
+		margin: 20rpx;
+	}
+
+	.content4 {
+		color: red;
+		padding: 0 20rpx;
+	}
+
+	.custom-style {
+		width: 90%;
+		margin-top: 20rpx;
+	}
+
+	.fbxc {
+		color: #19be6b;
+		border: 1px solid #19be6b;
+		border-radius: 20rpx;
+		padding: 20rpx;
+		margin: 20rpx;
+		display: flex;
+		justify-content: center;
+	}
+
+	/deep/view,
+	/deep/scroll-view,
+	/deep/swiper-item {
+		display: flex;
+		flex-direction: column;
+		flex-shrink: 0;
+		flex-grow: 0;
+		flex-basis: auto;
+		align-items: stretch;
+		align-content: flex-start;
+	}
+</style>

+ 117 - 42
pinche/pages/mine/index.vue

@@ -1,27 +1,40 @@
 <template>
 <template>
-	<view>
-		<view class="personal">
-			<view class="personal-main">
-				<!-- <u-avatar :src="avatar" mode="square" size="60" class="u-avatar"></u-avatar> -->
-				<view class="personal-info">
-					<view class="">昵称</view>
-					<view class="">{{userInfo.phone}}</view>
+	<view class="container" style="position: relative;">
+		<image src="@/static/bg@3x.png" mode="widthFix" style="width: 100%;"></image>
+
+		<view class="" style="position: absolute;top: 0;width: 100%;">
+			<view class="personal">
+				<view class="personal-main">
+					<!-- <u-avatar :src="avatar" mode="square" size="60" class="u-avatar"></u-avatar> -->
+					<view class="personal-info">
+						<view class="">姓名:</view>
+						<view class="right">{{userInfo.name}}</view>
+					</view>
+					<view class="personal-info">
+						<view class="">电话:</view>
+						<view class="right">{{userInfo.phone}}</view>
+					</view>
+					<view class="personal-info">
+						<view class="">司机认证:</view>
+						<view class="right">{{statusWorld}}</view>
+					</view>
 				</view>
 				</view>
 			</view>
 			</view>
-		</view>
-		<view class="n-p" v-for="(item,index) in list" :key="index" hover-class="hover-class" @click="onClick(item)">
-			<view class="p-right">
-				<view class="p-right-main">
-					<view class="p-right-main-name" v-if="item.name=='退出登录'" @click="layout" style="width: 100%;">
-						{{item.name}}
+			<view class="n-p" v-for="(item,index) in list" :key="index" hover-class="hover-class"
+				@click="onClick(item)">
+				<view class="p-right">
+					<view class="p-right-main">
+						<view class="p-right-main-name" v-if="item.name=='退出登录'" @click="layout" style="width: 100%;">
+							{{item.name}}
+						</view>
+						<view class="p-right-main-name" v-else @click="driverClick(item,isRZ)">{{item.name}}</view>
 					</view>
 					</view>
-					<view class="p-right-main-name" v-else>{{item.name}}</view>
-				</view>
 
 
-				<view class="lfet-a">
-					<view style="position: relative">
+					<view class="lfet-a">
+						<view style="position: relative">
+						</view>
+						<u-icon name="arrow-right" class="p-right-icon"></u-icon>
 					</view>
 					</view>
-					<u-icon name="arrow-right" class="p-right-icon"></u-icon>
 				</view>
 				</view>
 			</view>
 			</view>
 		</view>
 		</view>
@@ -37,30 +50,35 @@
 	export default {
 	export default {
 		data() {
 		data() {
 			return {
 			return {
+				statusWorld: '未认证',
+				rzInfo: "",
+				isRZ: false,
 				userInfo: {},
 				userInfo: {},
-				list: [{
-						name: '我的发布',
-						id: 'favorites',
-						icon: 'star-fill',
-						iconBackground: '#398c0c',
-					}, {
-						name: '我的预定',
-						id: 'photoAlbum',
-						icon: 'photo-fill',
-						iconBackground: '#5e2d88',
-					},
+				list: [
+					// {
+					// 	name: '我的发布',
+					// 	id: 'favorites',
+					// 	icon: 'star-fill',
+					// 	iconBackground: '#398c0c',
+					// },
+					// {
+					// 	name: '我的预定',
+					// 	id: 'photoAlbum',
+					// 	icon: 'photo-fill',
+					// 	iconBackground: '#5e2d88',
+					// },
 					// {
 					// {
 					// 	name: '换绑手机号',
 					// 	name: '换绑手机号',
 					// 	id: 'cardPackage',
 					// 	id: 'cardPackage',
 					// 	icon: 'grid-fill',
 					// 	icon: 'grid-fill',
 					// 	iconBackground: '#33696c',
 					// 	iconBackground: '#33696c',
 					// },
 					// },
-					// {
-					// 	name: '免责声明',
-					// 	id: 'expression',
-					// 	icon: 'gift-fill',
-					// 	iconBackground: '#833456',
-					// },
+					{
+						name: '司机认证',
+						id: 'expression',
+						icon: 'gift-fill',
+						iconBackground: '#833456',
+					},
 					{
 					{
 						name: '退出登录',
 						name: '退出登录',
 					},
 					},
@@ -74,20 +92,69 @@
 		computed: {
 		computed: {
 			...mapState(['hasLogin'])
 			...mapState(['hasLogin'])
 		},
 		},
-		onLoad(options) {
-			this.price = options.price
-			this.id = options.id
-			that = this
+		async onShow() {
 			if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
 			if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
 				this.userInfo = uni.getStorageSync("userInfo")
 				this.userInfo = uni.getStorageSync("userInfo")
 				// this.init()
 				// this.init()
+				console.log(123456)
 				console.log(this.userInfo)
 				console.log(this.userInfo)
+				await this.$request.baseRequest('pincheVehicleFilingApp', 'list', {
+						// pincheCarSharing: JSON.stringify({
+						// 	phone: this.userInfo.phone
+						// })
+						phone: this.userInfo.phone
+					},
+					failres => {
+						console.log('res+++++', failres.errmsg)
+						this.$refs.uToast.show({
+							type: 'error',
+							message: failres.errmsg,
+						})
+						uni.hideLoading()
+					}).then(res => {
+					this.rzInfo = res.data.items[0]
+					if (this.rzInfo) {
+						if (this.rzInfo.status == '审核通过') {
+							this.statusWorld = "已认证"
+							this.isRZ = true
+
+						} else if (this.rzInfo.status == '待管理员审核') {
+							this.statusWorld = "审核中"
+							this.isRZ = false
+						} else {
+							this.statusWorld = "已驳回"
+							this.isRZ = false
+						}
+					}
+
+				})
 			}
 			}
 		},
 		},
+		onLoad(options) {
+			this.price = options.price
+			this.id = options.id
+			that = this
+
+		},
 		methods: {
 		methods: {
+			driverClick(item, rz) {
+				if (item.name == '司机认证' && this.statusWorld != "审核中") {
+					console.log(1)
+					uni.navigateTo({
+						url: "/pages/mine/driver/driver?rz=" + rz + "&val=" + JSON.stringify(this.rzInfo)
+					})
+				} else {
+					uni.showToast({
+						mask: true,
+						title: "审核中",
+						icon: 'none'
+					})
+				}
+			},
 			layout() {
 			layout() {
 				this.$store.commit('logout', {})
 				this.$store.commit('logout', {})
 				uni.clearStorageSync();
 				uni.clearStorageSync();
+				this.userInfo = {}
 				uni.showToast({
 				uni.showToast({
 					mask: true,
 					mask: true,
 					title: '退出成功!'
 					title: '退出成功!'
@@ -102,12 +169,13 @@
 	}
 	}
 </script>
 </script>
 
 
-<style>
+<style lang="scss">
 	page {
 	page {
 		background-color: #f7f7f7;
 		background-color: #f7f7f7;
 	}
 	}
 
 
 	.personal {
 	.personal {
+		width: 100%;
 		display: flex;
 		display: flex;
 		align-items: center;
 		align-items: center;
 		justify-content: space-between;
 		justify-content: space-between;
@@ -115,12 +183,18 @@
 	}
 	}
 
 
 	.personal-main {
 	.personal-main {
-		display: flex;
-		align-items: center;
+		/* 		display: flex;
+		align-items: center; */
 	}
 	}
 
 
 	.personal-info {
 	.personal-info {
 		display: flex;
 		display: flex;
+		margin: 20rpx;
+
+		.right {
+			margin-left: 20rpx;
+		}
+
 		/* flex-direction: column; */
 		/* flex-direction: column; */
 	}
 	}
 
 
@@ -146,6 +220,7 @@
 		background-color: #ffffff;
 		background-color: #ffffff;
 		margin-bottom: 20rpx;
 		margin-bottom: 20rpx;
 		padding-left: 20rpx;
 		padding-left: 20rpx;
+		width: 100%;
 	}
 	}
 
 
 	.p-right-icon {
 	.p-right-icon {

+ 18 - 12
pinche/pages/order/order.vue

@@ -18,7 +18,7 @@
 				</view>
 				</view>
 			</view>
 			</view>
 			<view class="row2">
 			<view class="row2">
-				重要提示:请确认已经和预订乘客电话确认拼车,乘客预订列表只作为车主查看记录,方便出发前联系使用,具体以电话确认拼车为准,如电话确认不拼车就取消乘客的预订即可,确认拼车可要求乘客在线预付定金。
+				重要提示:请确认已经和预订乘客电话确认通勤,乘客预订列表只作为车主查看记录,方便出发前联系使用,具体以电话确认通勤为准,如电话确认不通勤就取消乘客的预订即可,确认通勤可要求乘客在线预付定金。
 			</view>
 			</view>
 		</view> -->
 		</view> -->
 		<mescroll-body ref="mescrollRef" @up="upCallback" @down="downCallback">
 		<mescroll-body ref="mescrollRef" @up="upCallback" @down="downCallback">
@@ -76,6 +76,14 @@
 					<view class="right">{{item.price}}
 					<view class="right">{{item.price}}
 					</view>
 					</view>
 				</view>
 				</view>
+				<view class="row">
+					<view class="left">
+						备注:
+					</view>
+					<view class="right">{{item.explain?item.explain:'暂无备注'}}
+					</view>
+				</view>
+
 				<view class="row4">
 				<view class="row4">
 					<view class="btn" @click="cancalWay(item)">
 					<view class="btn" @click="cancalWay(item)">
 						取消预定
 						取消预定
@@ -107,16 +115,11 @@
 			// this.$refs.form1.setRules(this.rules)
 			// this.$refs.form1.setRules(this.rules)
 		},
 		},
 		onShow() {
 		onShow() {
-			// if (this.hasLogin || uni.getStorageSync("userInfo").username) {
-			// 	this.userInfo = uni.getStorageSync("userInfo")
-			// } else {
-			// 	uni.navigateTo({
-			// 		url: "/pages/login/login"
-			// 	})
-			// 	// uni.({
-			// 	// 	url: '/pages/index/index'
-			// 	// })
-			// }
+			this.$nextTick(function() {
+				this.canReset && this.mescroll.resetUpScroll() // 重置列表数据为第一页  
+				this.canReset && this.mescroll.scrollTo(0, 0) // 重置列表数据为第一页时,建议把滚动条也重置到顶部,避免无法再次翻页的问题  
+				this.canReset = true // 过滤第一次的onShow事件,避免初始化界面时重复触发upCallback, 无需配置auto:false
+			});
 		},
 		},
 		data() {
 		data() {
 			return {
 			return {
@@ -125,12 +128,14 @@
 				userInfo: {},
 				userInfo: {},
 				showAlert: false,
 				showAlert: false,
 				selectItem: {},
 				selectItem: {},
+				canReset: false
 
 
 			}
 			}
 		},
 		},
 		onLoad() {
 		onLoad() {
 			if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
 			if (this.hasLogin || uni.getStorageSync("userInfo").phone) {
 				this.userInfo = uni.getStorageSync("userInfo")
 				this.userInfo = uni.getStorageSync("userInfo")
+				console.log(123)
 				console.log(this.userInfo)
 				console.log(this.userInfo)
 
 
 			} else {
 			} else {
@@ -330,6 +335,7 @@
 
 
 		.row {
 		.row {
 			display: flex;
 			display: flex;
+			margin-top: 15rpx;
 
 
 			.left {
 			.left {
 				// width: 240rpx;
 				// width: 240rpx;
@@ -360,7 +366,7 @@
 				background: #f7f7f7;
 				background: #f7f7f7;
 				border: 1px solid #dfe2e5;
 				border: 1px solid #dfe2e5;
 				border-radius: 10rpx;
 				border-radius: 10rpx;
-				padding: 20rpx 30rpx;
+				padding: 15rpx 30rpx;
 				font-size: 26rpx;
 				font-size: 26rpx;
 			}
 			}
 		}
 		}

BIN
pinche/static/bg@3x.png


BIN
pinche/static/select@2x.png


BIN
pinche/static/selected2.png


+ 40 - 0
pinche/util/WXBizDataCrypt.js

@@ -0,0 +1,40 @@
+/**
+ * Created by rd on 2017/5/4.
+ */
+// 引入CryptoJS  路径依个人导入情况变动
+var Crypto = require('./cryptojs-master/cryptojs.js').Crypto;
+var app = getApp();
+
+function RdWXBizDataCrypt(appId, sessionKey) {
+	this.appId = appId
+	this.sessionKey = sessionKey
+}
+
+RdWXBizDataCrypt.prototype.decryptData = function(encryptedData, iv, appId, sessionKey) {
+	// base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码
+	var encryptedData = Crypto.util.base64ToBytes(encryptedData)
+	var key = Crypto.util.base64ToBytes(sessionKey);
+	var iv = Crypto.util.base64ToBytes(iv);
+
+	// 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+	var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
+
+	try {
+		// 解密
+		var bytes = Crypto.AES.decrypt(encryptedData, key, {
+			asBpytes: true,
+			iv: iv,
+			mode: mode
+		});
+
+		var decryptResult = JSON.parse(bytes);
+
+	} catch (err) {
+		console.log(err)
+	}
+
+
+	return decryptResult
+}
+
+module.exports = RdWXBizDataCrypt

+ 32 - 0
pinche/util/cryptojs-master/README.md

@@ -0,0 +1,32 @@
+cryptojs
+--------
+
+* with little modification, converted from googlecode project [crypto-js](http://code.google.com/p/crypto-js/), and keep the source code structure of the origin project on googlecode
+* source code worked in both browser engines and node scripts. see also: [https://github.com/gwjjeff/crypto-js-npm-conv](https://github.com/gwjjeff/crypto-js-npm-conv)
+* inspiration comes from [ezcrypto](https://github.com/ElmerZhang/ezcrypto), but my tests cannot pass with his version ( ECB/pkcs7 mode ), so I made it myself
+
+### install
+
+```
+npm install cryptojs
+```
+
+### usage (example with [coffee-script](http://coffeescript.org/))
+
+```coffee
+Crypto = (require 'cryptojs').Crypto
+key = '12345678'
+us = 'Hello, 世界!'
+
+mode = new Crypto.mode.ECB Crypto.pad.pkcs7
+
+ub = Crypto.charenc.UTF8.stringToBytes us
+eb = Crypto.DES.encrypt ub, key, {asBytes: true, mode: mode}
+ehs= Crypto.util.bytesToHex eb
+
+eb2= Crypto.util.hexToBytes ehs
+ub2= Crypto.DES.decrypt eb2, key, {asBytes: true, mode: mode}
+us2= Crypto.charenc.UTF8.bytesToString ub2
+# should be same as the var 'us'
+console .log us2
+```

+ 17 - 0
pinche/util/cryptojs-master/cryptojs.js

@@ -0,0 +1,17 @@
+var Crypto = exports.Crypto = require('./lib/Crypto').Crypto;
+
+[ 'CryptoMath'
+, 'BlockModes'
+, 'DES'
+, 'AES'
+, 'HMAC'
+, 'MARC4'
+, 'MD5'
+, 'PBKDF2'
+, 'PBKDF2Async'
+, 'Rabbit'
+, 'SHA1'
+, 'SHA256'
+].forEach( function (path) {
+	require('./lib/' + path);
+});

+ 402 - 0
pinche/util/cryptojs-master/lib/AES.js

@@ -0,0 +1,402 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8;
+
+// Precomputed SBOX
+var SBOX = [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
+             0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
+             0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+             0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+             0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
+             0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+             0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
+             0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+             0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+             0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
+             0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
+             0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+             0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
+             0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
+             0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+             0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
+             0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
+             0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+             0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
+             0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
+             0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+             0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
+             0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
+             0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+             0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
+             0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
+             0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+             0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
+             0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
+             0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+             0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
+             0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ];
+
+// Compute inverse SBOX lookup table
+for (var INVSBOX = [], i = 0; i < 256; i++) INVSBOX[SBOX[i]] = i;
+
+// Compute mulitplication in GF(2^8) lookup tables
+var MULT2 = [],
+    MULT3 = [],
+    MULT9 = [],
+    MULTB = [],
+    MULTD = [],
+    MULTE = [];
+
+function xtime(a, b) {
+	for (var result = 0, i = 0; i < 8; i++) {
+		if (b & 1) result ^= a;
+		var hiBitSet = a & 0x80;
+		a = (a << 1) & 0xFF;
+		if (hiBitSet) a ^= 0x1b;
+		b >>>= 1;
+	}
+	return result;
+}
+
+for (var i = 0; i < 256; i++) {
+	MULT2[i] = xtime(i,2);
+	MULT3[i] = xtime(i,3);
+	MULT9[i] = xtime(i,9);
+	MULTB[i] = xtime(i,0xB);
+	MULTD[i] = xtime(i,0xD);
+	MULTE[i] = xtime(i,0xE);
+}
+
+// Precomputed RCon lookup
+var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+// Inner state
+var state = [[], [], [], []],
+    keylength,
+    nrounds,
+    keyschedule;
+
+var AES = C.AES = {
+
+	/**
+	 * Public API
+	 */
+
+	encrypt: function (message, password, options) {
+
+		options = options || {};
+
+		// Determine mode
+		var mode = options.mode || new C.mode.OFB;
+
+		// Allow mode to override options
+		if (mode.fixOptions) mode.fixOptions(options);
+
+		var
+
+			// Convert to bytes if message is a string
+			m = (
+				message.constructor == String ?
+				UTF8.stringToBytes(message) :
+				message
+			),
+
+			// Generate random IV
+			iv = options.iv || util.randomBytes(AES._blocksize * 4),
+
+			// Generate key
+			k = (
+				password.constructor == String ?
+				// Derive key from passphrase
+				C.PBKDF2(password, iv, 32, { asBytes: true }) :
+				// else, assume byte array representing cryptographic key
+				password
+			);
+
+		// Encrypt
+		AES._init(k);
+		mode.encrypt(AES, m, iv);
+
+		// Return ciphertext
+		m = options.iv ? m : iv.concat(m);
+		return (options && options.asBytes) ? m : util.bytesToBase64(m);
+
+	},
+
+	decrypt: function (ciphertext, password, options) {
+
+		options = options || {};
+
+		// Determine mode
+		var mode = options.mode || new C.mode.OFB;
+
+		// Allow mode to override options
+		if (mode.fixOptions) mode.fixOptions(options);
+
+		var
+
+			// Convert to bytes if ciphertext is a string
+			c = (
+				ciphertext.constructor == String ?
+				util.base64ToBytes(ciphertext):
+			    ciphertext
+			),
+
+			// Separate IV and message
+			iv = options.iv || c.splice(0, AES._blocksize * 4),
+
+			// Generate key
+			k = (
+				password.constructor == String ?
+				// Derive key from passphrase
+				C.PBKDF2(password, iv, 32, { asBytes: true }) :
+				// else, assume byte array representing cryptographic key
+				password
+			);
+
+		// Decrypt
+		AES._init(k);
+		mode.decrypt(AES, c, iv);
+
+		// Return plaintext
+		return (options && options.asBytes) ? c : UTF8.bytesToString(c);
+
+	},
+
+
+	/**
+	 * Package private methods and properties
+	 */
+
+	_blocksize: 4,
+
+	_encryptblock: function (m, offset) {
+
+		// Set input
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = m[offset + col * 4 + row];
+		}
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[col][row];
+		}
+
+		for (var round = 1; round < nrounds; round++) {
+
+			// Sub bytes
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] = SBOX[state[row][col]];
+			}
+
+			// Shift rows
+			state[1].push(state[1].shift());
+			state[2].push(state[2].shift());
+			state[2].push(state[2].shift());
+			state[3].unshift(state[3].pop());
+
+			// Mix columns
+			for (var col = 0; col < 4; col++) {
+
+				var s0 = state[0][col],
+				    s1 = state[1][col],
+				    s2 = state[2][col],
+				    s3 = state[3][col];
+
+				state[0][col] = MULT2[s0] ^ MULT3[s1] ^ s2 ^ s3;
+				state[1][col] = s0 ^ MULT2[s1] ^ MULT3[s2] ^ s3;
+				state[2][col] = s0 ^ s1 ^ MULT2[s2] ^ MULT3[s3];
+				state[3][col] = MULT3[s0] ^ s1 ^ s2 ^ MULT2[s3];
+
+			}
+
+			// Add round key
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] ^= keyschedule[round * 4 + col][row];
+			}
+
+		}
+
+		// Sub bytes
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = SBOX[state[row][col]];
+		}
+
+		// Shift rows
+		state[1].push(state[1].shift());
+		state[2].push(state[2].shift());
+		state[2].push(state[2].shift());
+		state[3].unshift(state[3].pop());
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[nrounds * 4 + col][row];
+		}
+
+		// Set output
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				m[offset + col * 4 + row] = state[row][col];
+		}
+
+	},
+
+	_decryptblock: function (c, offset) {
+
+		// Set input
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = c[offset + col * 4 + row];
+		}
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[nrounds * 4 + col][row];
+		}
+
+		for (var round = 1; round < nrounds; round++) {
+
+			// Inv shift rows
+			state[1].unshift(state[1].pop());
+			state[2].push(state[2].shift());
+			state[2].push(state[2].shift());
+			state[3].push(state[3].shift());
+
+			// Inv sub bytes
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] = INVSBOX[state[row][col]];
+			}
+
+			// Add round key
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] ^= keyschedule[(nrounds - round) * 4 + col][row];
+			}
+
+			// Inv mix columns
+			for (var col = 0; col < 4; col++) {
+
+				var s0 = state[0][col],
+				    s1 = state[1][col],
+				    s2 = state[2][col],
+				    s3 = state[3][col];
+
+				state[0][col] = MULTE[s0] ^ MULTB[s1] ^ MULTD[s2] ^ MULT9[s3];
+				state[1][col] = MULT9[s0] ^ MULTE[s1] ^ MULTB[s2] ^ MULTD[s3];
+				state[2][col] = MULTD[s0] ^ MULT9[s1] ^ MULTE[s2] ^ MULTB[s3];
+				state[3][col] = MULTB[s0] ^ MULTD[s1] ^ MULT9[s2] ^ MULTE[s3];
+
+			}
+
+		}
+
+		// Inv shift rows
+		state[1].unshift(state[1].pop());
+		state[2].push(state[2].shift());
+		state[2].push(state[2].shift());
+		state[3].push(state[3].shift());
+
+		// Inv sub bytes
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = INVSBOX[state[row][col]];
+		}
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[col][row];
+		}
+
+		// Set output
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				c[offset + col * 4 + row] = state[row][col];
+		}
+
+	},
+
+
+	/**
+	 * Private methods
+	 */
+
+	_init: function (k) {
+		keylength = k.length / 4;
+		nrounds = keylength + 6;
+		AES._keyexpansion(k);
+	},
+
+	// Generate a key schedule
+	_keyexpansion: function (k) {
+
+		keyschedule = [];
+
+		for (var row = 0; row < keylength; row++) {
+			keyschedule[row] = [
+				k[row * 4],
+				k[row * 4 + 1],
+				k[row * 4 + 2],
+				k[row * 4 + 3]
+			];
+		}
+
+		for (var row = keylength; row < AES._blocksize * (nrounds + 1); row++) {
+
+			var temp = [
+				keyschedule[row - 1][0],
+				keyschedule[row - 1][1],
+				keyschedule[row - 1][2],
+				keyschedule[row - 1][3]
+			];
+
+			if (row % keylength == 0) {
+
+				// Rot word
+				temp.push(temp.shift());
+
+				// Sub word
+				temp[0] = SBOX[temp[0]];
+				temp[1] = SBOX[temp[1]];
+				temp[2] = SBOX[temp[2]];
+				temp[3] = SBOX[temp[3]];
+
+				temp[0] ^= RCON[row / keylength];
+
+			} else if (keylength > 6 && row % keylength == 4) {
+
+				// Sub word
+				temp[0] = SBOX[temp[0]];
+				temp[1] = SBOX[temp[1]];
+				temp[2] = SBOX[temp[2]];
+				temp[3] = SBOX[temp[3]];
+
+			}
+
+			keyschedule[row] = [
+				keyschedule[row - keylength][0] ^ temp[0],
+				keyschedule[row - keylength][1] ^ temp[1],
+				keyschedule[row - keylength][2] ^ temp[2],
+				keyschedule[row - keylength][3] ^ temp[3]
+			];
+
+		}
+
+	}
+
+};
+
+})();

+ 378 - 0
pinche/util/cryptojs-master/lib/BlockModes.js

@@ -0,0 +1,378 @@
+/*!
+ * Crypto-JS contribution from Simon Greatrix
+ */
+
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Create pad namespace
+var C_pad = C.pad = {};
+
+// Calculate the number of padding bytes required.
+function _requiredPadding(cipher, message) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    var reqd = blockSizeInBytes - message.length % blockSizeInBytes;
+    return reqd;
+};
+
+// Remove padding when the final byte gives the number of padding bytes.
+var _unpadLength = function (message) {
+        var pad = message.pop();
+        for (var i = 1; i < pad; i++) {
+            message.pop();
+        }
+    };
+
+// No-operation padding, used for stream ciphers
+C_pad.NoPadding = {
+        pad : function (cipher,message) {},
+        unpad : function (message) {}
+    };
+
+// Zero Padding.
+//
+// If the message is not an exact number of blocks, the final block is
+// completed with 0x00 bytes. There is no unpadding.
+C_pad.ZeroPadding = {
+    pad : function (cipher, message) {
+        var blockSizeInBytes = cipher._blocksize * 4;
+        var reqd = message.length % blockSizeInBytes;
+        if( reqd!=0 ) {
+            for(reqd = blockSizeInBytes - reqd; reqd>0; reqd--) {
+                message.push(0x00);
+            }
+        }
+    },
+
+    unpad : function (message) {}
+};
+
+// ISO/IEC 7816-4 padding.
+//
+// Pads the plain text with an 0x80 byte followed by as many 0x00
+// bytes are required to complete the block.
+C_pad.iso7816 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        message.push(0x80);
+        for (; reqd > 1; reqd--) {
+            message.push(0x00);
+        }
+    },
+
+    unpad : function (message) {
+        while (message.pop() != 0x80) {}
+    }
+};
+
+// ANSI X.923 padding
+//
+// The final block is padded with zeros except for the last byte of the
+// last block which contains the number of padding bytes.
+C_pad.ansix923 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        for (var i = 1; i < reqd; i++) {
+            message.push(0x00);
+        }
+        message.push(reqd);
+    },
+
+    unpad : _unpadLength
+};
+
+// ISO 10126
+//
+// The final block is padded with random bytes except for the last
+// byte of the last block which contains the number of padding bytes.
+C_pad.iso10126 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        for (var i = 1; i < reqd; i++) {
+            message.push(Math.floor(Math.random() * 256));
+        }
+        message.push(reqd);
+    },
+
+    unpad : _unpadLength
+};
+
+// PKCS7 padding
+//
+// PKCS7 is described in RFC 5652. Padding is in whole bytes. The
+// value of each added byte is the number of bytes that are added,
+// i.e. N bytes, each of value N are added.
+C_pad.pkcs7 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        for (var i = 0; i < reqd; i++) {
+            message.push(reqd);
+        }
+    },
+
+    unpad : _unpadLength
+};
+
+// Create mode namespace
+var C_mode = C.mode = {};
+
+/**
+ * Mode base "class".
+ */
+var Mode = C_mode.Mode = function (padding) {
+    if (padding) {
+        this._padding = padding;
+    }
+};
+
+Mode.prototype = {
+    encrypt: function (cipher, m, iv) {
+        this._padding.pad(cipher, m);
+        this._doEncrypt(cipher, m, iv);
+    },
+
+    decrypt: function (cipher, m, iv) {
+        this._doDecrypt(cipher, m, iv);
+        this._padding.unpad(m);
+    },
+
+    // Default padding
+    _padding: C_pad.iso7816
+};
+
+
+/**
+ * Electronic Code Book mode.
+ * 
+ * ECB applies the cipher directly against each block of the input.
+ * 
+ * ECB does not require an initialization vector.
+ */
+var ECB = C_mode.ECB = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var ECB_prototype = ECB.prototype = new Mode;
+
+// Concrete steps for Mode template
+ECB_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    // Encrypt each block
+    for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
+        cipher._encryptblock(m, offset);
+    }
+};
+ECB_prototype._doDecrypt = function (cipher, c, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    // Decrypt each block
+    for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
+        cipher._decryptblock(c, offset);
+    }
+};
+
+// ECB never uses an IV
+ECB_prototype.fixOptions = function (options) {
+    options.iv = [];
+};
+
+
+/**
+ * Cipher block chaining
+ * 
+ * The first block is XORed with the IV. Subsequent blocks are XOR with the
+ * previous cipher output.
+ */
+var CBC = C_mode.CBC = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var CBC_prototype = CBC.prototype = new Mode;
+
+// Concrete steps for Mode template
+CBC_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+
+    // Encrypt each block
+    for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
+        if (offset == 0) {
+            // XOR first block using IV
+            for (var i = 0; i < blockSizeInBytes; i++)
+            m[i] ^= iv[i];
+        } else {
+            // XOR this block using previous crypted block
+            for (var i = 0; i < blockSizeInBytes; i++)
+            m[offset + i] ^= m[offset + i - blockSizeInBytes];
+        }
+        // Encrypt block
+        cipher._encryptblock(m, offset);
+    }
+};
+CBC_prototype._doDecrypt = function (cipher, c, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+
+    // At the start, the previously crypted block is the IV
+    var prevCryptedBlock = iv;
+
+    // Decrypt each block
+    for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
+        // Save this crypted block
+        var thisCryptedBlock = c.slice(offset, offset + blockSizeInBytes);
+        // Decrypt block
+        cipher._decryptblock(c, offset);
+        // XOR decrypted block using previous crypted block
+        for (var i = 0; i < blockSizeInBytes; i++) {
+            c[offset + i] ^= prevCryptedBlock[i];
+        }
+        prevCryptedBlock = thisCryptedBlock;
+    }
+};
+
+
+/**
+ * Cipher feed back
+ * 
+ * The cipher output is XORed with the plain text to produce the cipher output,
+ * which is then fed back into the cipher to produce a bit pattern to XOR the
+ * next block with.
+ * 
+ * This is a stream cipher mode and does not require padding.
+ */
+var CFB = C_mode.CFB = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var CFB_prototype = CFB.prototype = new Mode;
+
+// Override padding
+CFB_prototype._padding = C_pad.NoPadding;
+
+// Concrete steps for Mode template
+CFB_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4,
+        keystream = iv.slice(0);
+
+    // Encrypt each byte
+    for (var i = 0; i < m.length; i++) {
+
+        var j = i % blockSizeInBytes;
+        if (j == 0) cipher._encryptblock(keystream, 0);
+
+        m[i] ^= keystream[j];
+        keystream[j] = m[i];
+    }
+};
+CFB_prototype._doDecrypt = function (cipher, c, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4,
+        keystream = iv.slice(0);
+
+    // Encrypt each byte
+    for (var i = 0; i < c.length; i++) {
+
+        var j = i % blockSizeInBytes;
+        if (j == 0) cipher._encryptblock(keystream, 0);
+
+        var b = c[i];
+        c[i] ^= keystream[j];
+        keystream[j] = b;
+    }
+};
+
+
+/**
+ * Output feed back
+ * 
+ * The cipher repeatedly encrypts its own output. The output is XORed with the
+ * plain text to produce the cipher text.
+ * 
+ * This is a stream cipher mode and does not require padding.
+ */
+var OFB = C_mode.OFB = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var OFB_prototype = OFB.prototype = new Mode;
+
+// Override padding
+OFB_prototype._padding = C_pad.NoPadding;
+
+// Concrete steps for Mode template
+OFB_prototype._doEncrypt = function (cipher, m, iv) {
+
+    var blockSizeInBytes = cipher._blocksize * 4,
+        keystream = iv.slice(0);
+
+    // Encrypt each byte
+    for (var i = 0; i < m.length; i++) {
+
+        // Generate keystream
+        if (i % blockSizeInBytes == 0)
+            cipher._encryptblock(keystream, 0);
+
+        // Encrypt byte
+        m[i] ^= keystream[i % blockSizeInBytes];
+
+    }
+};
+OFB_prototype._doDecrypt = OFB_prototype._doEncrypt;
+
+/**
+ * Counter
+ * @author Gergely Risko
+ *
+ * After every block the last 4 bytes of the IV is increased by one
+ * with carry and that IV is used for the next block.
+ *
+ * This is a stream cipher mode and does not require padding.
+ */
+var CTR = C_mode.CTR = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var CTR_prototype = CTR.prototype = new Mode;
+
+// Override padding
+CTR_prototype._padding = C_pad.NoPadding;
+
+CTR_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    var counter = iv.slice(0);
+
+    for (var i = 0; i < m.length;) {
+        // do not lose iv
+        var keystream = counter.slice(0);
+
+        // Generate keystream for next block
+        cipher._encryptblock(keystream, 0);
+
+        // XOR keystream with block
+        for (var j = 0; i < m.length && j < blockSizeInBytes; j++, i++) {
+            m[i] ^= keystream[j];
+        }
+
+        // Increase counter
+        if(++(counter[blockSizeInBytes-1]) == 256) {
+            counter[blockSizeInBytes-1] = 0;
+            if(++(counter[blockSizeInBytes-2]) == 256) {
+                counter[blockSizeInBytes-2] = 0;
+                if(++(counter[blockSizeInBytes-3]) == 256) {
+                    counter[blockSizeInBytes-3] = 0;
+                    ++(counter[blockSizeInBytes-4]);
+                }
+            }
+        }
+    }
+};
+CTR_prototype._doDecrypt = CTR_prototype._doEncrypt;
+
+})();

+ 155 - 0
pinche/util/cryptojs-master/lib/Crypto.js

@@ -0,0 +1,155 @@
+if (typeof Crypto == "undefined" || ! Crypto.util)
+{
+(function(){
+
+var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+// Global Crypto object
+// with browser window or with node module
+var Crypto = (typeof window === 'undefined') ? exports.Crypto = {} : window.Crypto = {}; 
+
+// Crypto utilities
+var util = Crypto.util = {
+
+	// Bit-wise rotate left
+	rotl: function (n, b) {
+		return (n << b) | (n >>> (32 - b));
+	},
+
+	// Bit-wise rotate right
+	rotr: function (n, b) {
+		return (n << (32 - b)) | (n >>> b);
+	},
+
+	// Swap big-endian to little-endian and vice versa
+	endian: function (n) {
+
+		// If number given, swap endian
+		if (n.constructor == Number) {
+			return util.rotl(n,  8) & 0x00FF00FF |
+			       util.rotl(n, 24) & 0xFF00FF00;
+		}
+
+		// Else, assume array and swap all items
+		for (var i = 0; i < n.length; i++)
+			n[i] = util.endian(n[i]);
+		return n;
+
+	},
+
+	// Generate an array of any length of random bytes
+	randomBytes: function (n) {
+		for (var bytes = []; n > 0; n--)
+			bytes.push(Math.floor(Math.random() * 256));
+		return bytes;
+	},
+
+	// Convert a byte array to big-endian 32-bit words
+	bytesToWords: function (bytes) {
+		for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
+			words[b >>> 5] |= (bytes[i] & 0xFF) << (24 - b % 32);
+		return words;
+	},
+
+	// Convert big-endian 32-bit words to a byte array
+	wordsToBytes: function (words) {
+		for (var bytes = [], b = 0; b < words.length * 32; b += 8)
+			bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
+		return bytes;
+	},
+
+	// Convert a byte array to a hex string
+	bytesToHex: function (bytes) {
+		for (var hex = [], i = 0; i < bytes.length; i++) {
+			hex.push((bytes[i] >>> 4).toString(16));
+			hex.push((bytes[i] & 0xF).toString(16));
+		}
+		return hex.join("");
+	},
+
+	// Convert a hex string to a byte array
+	hexToBytes: function (hex) {
+		for (var bytes = [], c = 0; c < hex.length; c += 2)
+			bytes.push(parseInt(hex.substr(c, 2), 16));
+		return bytes;
+	},
+
+	// Convert a byte array to a base-64 string
+	bytesToBase64: function (bytes) {
+
+		// Use browser-native function if it exists
+		if (typeof btoa == "function") return btoa(Binary.bytesToString(bytes));
+
+		for(var base64 = [], i = 0; i < bytes.length; i += 3) {
+			var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
+			for (var j = 0; j < 4; j++) {
+				if (i * 8 + j * 6 <= bytes.length * 8)
+					base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
+				else base64.push("=");
+			}
+		}
+
+		return base64.join("");
+
+	},
+
+	// Convert a base-64 string to a byte array
+	base64ToBytes: function (base64) {
+
+		// Use browser-native function if it exists
+		if (typeof atob == "function") return Binary.stringToBytes(atob(base64));
+
+		// Remove non-base-64 characters
+		base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
+
+		for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {
+			if (imod4 == 0) continue;
+			bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2)) |
+			           (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
+		}
+
+		return bytes;
+
+	}
+
+};
+
+// Crypto character encodings
+var charenc = Crypto.charenc = {};
+
+// UTF-8 encoding
+var UTF8 = charenc.UTF8 = {
+
+	// Convert a string to a byte array
+	stringToBytes: function (str) {
+		return Binary.stringToBytes(unescape(encodeURIComponent(str)));
+	},
+
+	// Convert a byte array to a string
+	bytesToString: function (bytes) {
+		return decodeURIComponent(escape(Binary.bytesToString(bytes)));
+	}
+
+};
+
+// Binary encoding
+var Binary = charenc.Binary = {
+
+	// Convert a string to a byte array
+	stringToBytes: function (str) {
+		for (var bytes = [], i = 0; i < str.length; i++)
+			bytes.push(str.charCodeAt(i) & 0xFF);
+		return bytes;
+	},
+
+	// Convert a byte array to a string
+	bytesToString: function (bytes) {
+		for (var str = [], i = 0; i < bytes.length; i++)
+			str.push(String.fromCharCode(bytes[i]));
+		return str.join("");
+	}
+
+};
+
+})();
+}

+ 37 - 0
pinche/util/cryptojs-master/lib/CryptoMath.js

@@ -0,0 +1,37 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcut
+var util = C.util;
+
+// Convert n to unsigned 32-bit integer
+util.u32 = function (n) {
+	return n >>> 0;
+};
+
+// Unsigned 32-bit addition
+util.add = function () {
+	var result = this.u32(arguments[0]);
+	for (var i = 1; i < arguments.length; i++)
+		result = this.u32(result + this.u32(arguments[i]));
+	return result;
+};
+
+// Unsigned 32-bit multiplication
+util.mult = function (m, n) {
+	return this.add((n & 0xFFFF0000) * m,
+			(n & 0x0000FFFF) * m);
+};
+
+// Unsigned 32-bit greater than (>) comparison
+util.gt = function (m, n) {
+	return this.u32(m) > this.u32(n);
+};
+
+// Unsigned 32-bit less than (<) comparison
+util.lt = function (m, n) {
+	return this.u32(m) < this.u32(n);
+};
+
+})();

+ 1003 - 0
pinche/util/cryptojs-master/lib/DES.js

@@ -0,0 +1,1003 @@
+/**
+ * Definition of Data Encryption Standard (DES) taken from:
+ * http://www.itl.nist.gov/fipspubs/fip46-2.htm
+ */
+
+(function() {
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+    // Shortcuts
+    var util = C.util, charenc = C.charenc, UTF8 = charenc.UTF8;
+
+    /***************************************************************************
+     * 
+     * DES Key Schedule.
+     * 
+     * The Key consists of 16 sub-keys of 48 bits each. As each sub-key is
+     * applied to an expanded 32-bit value where each 4 bits of input is
+     * expanded into 6 bits of output the sub-key can be broken down into 8
+     * 32-bit values which allows the key to be used without expansion.
+     * 
+     * To create the 16 sub-keys, 56 bits are selected from the input 64 bit key
+     * according to <i>PC1</i>. Each sub-key is generated by left rotating the
+     * bits a different amount and then selecting 48 bits according to <i>PC2</i>.
+     * 
+     **************************************************************************/
+
+    var KeySchedule;
+
+    /**
+     * Representation of a DES key schedule.
+     * 
+     * @param {Array
+     *            of 8 bytes} key The cipher key
+     * 
+     * @constructor
+     */
+    KeySchedule = function(key) {
+        /**
+         * The schedule of 16 keys
+         */
+        this.keys = new Array(16);
+        this._initialiseKeys(key);
+    };
+
+    /**
+     * Permuted Choice 1 (PC1) byte offsets into the key. Each of the 56 entries
+     * selects one bit of DES's 56 bit key.
+     * <p>
+     * 
+     * <pre>
+     * The PC1 is defined as:
+     * 
+     * 57,   49,    41,   33,    25,    17,    9,
+     *  1,   58,    50,   42,    34,    26,   18,
+     * 10,    2,    59,   51,    43,    35,   27,
+     * 19,   11,     3,   60,    52,    44,   36,
+     * 63,   55,    47,   39,    31,    23,   15,
+     *  7,   62,    54,   46,    38,    30,   22,
+     * 14,    6,    61,   53,    45,    37,   29,
+     * 21,   13,     5,   28,    20,    12,    4
+     * </pre>
+     * 
+     * We represent this as an offset into an 8-byte array and a bit mask upon
+     * that byte. For example 57=(7*8)+1 so is the first (MSB) of the 7th byte.
+     * 
+     * @constant
+     */
+    KeySchedule.PC1_offsets = [ 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0,
+            7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6,
+            5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 3, 2, 1, 0 ];
+
+    /**
+     * Permuted Choice 1 (PC1) bit masks. Each of the 56 entries selects one bit
+     * of DES's 56 bit key.
+     * 
+     * @constant
+     */
+    KeySchedule.PC1_masks = [ 128, 128, 128, 128, 128, 128, 128, 128, 64, 64,
+            64, 64, 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32, 16, 16, 16,
+            16, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,
+            8, 8, 8, 16, 16, 16, 16 ];
+
+    /**
+     * Permuted Choice 2 (PC2) selects the active 48 bits from the 56 bits of
+     * the key.
+     * <p>
+     * 
+     * <pre>
+     * The PC2 is defined as:
+     * 
+     * 14,   17,   11,   24,    1,    5,
+     *  3,   28,   15,    6,   21,   10,
+     * 23,   19,   12,    4,   26,    8,
+     * 16,    7,   27,   20,   13,    2,
+     * 41,   52,   31,   37,   47,   55,
+     * 30,   40,   51,   45,   33,   48,
+     * 44,   49,   39,   56,   34,   53,
+     * 46,   42,   50,   36,   29,   32
+     * </pre>
+     * 
+     * We invert the choice to specify what each bit adds to each 6-bit value of
+     * the key. For example, bit 1 is the 5th bit selected so this add 2 to the
+     * first 6-bit value.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_offsets1 = [ 0, 3, 1, 2, 0, 1, 3, 2, 0, 1, 0, 2, 3, 0, 1,
+            3, 0, 0, 2, 3, 1, 0, 2, 0, 0, 2, 3, 1 ];
+
+    /**
+     * PC2 offsets for 2nd block.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_offsets2 = [ 7, 5, 4, 7, 5, 6, 0, 7, 4, 0, 6, 5, 4, 7, 0,
+            6, 5, 7, 4, 5, 6, 7, 5, 4, 6, 0, 4, 6 ];
+
+    /**
+     * Permuted Choice 2 (PC2) masks for 1st block.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_masks1 = [ 2, 1, 32, 4, 1, 4, 16, 1, 0, 1, 8, 8, 2, 32, 8,
+            32, 16, 0, 16, 4, 2, 0, 32, 4, 0, 2, 8, 16 ];
+
+    /**
+     * PC2 masks for 2nd block.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_masks2 = [ 2, 32, 8, 1, 2, 2, 0, 4, 4, 0, 8, 16, 32, 16, 0,
+            32, 4, 32, 2, 1, 16, 8, 8, 16, 1, 0, 1, 4 ];
+
+    /**
+     * Cumulative key shifts.
+     * 
+     * @constant
+     */
+    KeySchedule.keyShifts = [ 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23,
+            25, 27, 28 ];
+
+    KeySchedule.prototype._initialiseKeys = function(key) {
+        var i;
+
+        // extract 56 key bits in order determined by PC1
+        var bits = new Array(56);
+        for (i = 0; i < 56; i++) {
+            bits[i] = (key[KeySchedule.PC1_offsets[i]] & KeySchedule.PC1_masks[i]) != 0;
+        }
+
+        // split 56 bits into two 28-bit chunks
+        var bits1 = bits.slice(0, 28);
+        var bits2 = bits.slice(28, 56);
+
+        // duplicate each half to allow for easy bit shifts
+        bits1 = bits1.concat(bits1);
+        bits2 = bits2.concat(bits2);
+
+        // assemble the 16 keys
+        for (i = 0; i < 16; i++) {
+            var k = [ 0, 0, 0, 0, 0, 0, 0, 0 ];
+
+            // select the bits of the key according to PC2
+            var s = KeySchedule.keyShifts[i];
+            for ( var j = 0; j < 28; j++) {
+                if (bits1[j + s]) {
+                    k[KeySchedule.PC2_offsets1[j]] += KeySchedule.PC2_masks1[j];
+                }
+                if (bits2[j + s]) {
+                    k[KeySchedule.PC2_offsets2[j]] += KeySchedule.PC2_masks2[j];
+                }
+            }
+
+            // Scale each of the 8 blocks to a 32-bit mask.
+            k[0] = ((k[0] & 0x1f) << 27) + ((k[0] & 0x20) >> 5);
+            for ( var j = 1; j <= 6; j++) {
+                k[j] = k[j] << (27 - 4 * j);
+            }
+            k[7] = ((k[7] & 0x3e) >> 1) + ((k[7] & 0x1) << 31);
+            this.keys[i] = k;
+        }
+    };
+
+    /**
+     * Retrieve the key for a specified round
+     * 
+     * @param i
+     *            the round
+     * @returns the key
+     */
+    KeySchedule.prototype.getKey = function(i) {
+        return this.keys[i];
+    };
+
+    /***************************************************************************
+     * 
+     * DES Engine State
+     * 
+     **************************************************************************/
+
+    var State;
+
+    /**
+     * The algorithm's state. DES operates on two sets of 32-bits, with each
+     * block of 32-bits treated as a single number.
+     * 
+     * @class
+     */
+    State = function() {
+        /** The LHS of the Feistel scheme */
+        this.lhs = 0;
+        /** The RHS of the Feistel scheme */
+        this.rhs = 0;
+    };
+
+    /**
+     * The masks that select the SBOX input. Each SBOX accepts 6 bits from the
+     * input.
+     * 
+     * @constant
+     */
+    State.SBOX_MASK = [ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+            0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f ];
+
+    /**
+     * The SBOXes. The 8 SBOXes each map 6 bit masked bit of the input to 4 bits
+     * of output. These SBOXes include the post SBOX permutation and benefit
+     * from JavaScript's sparse arrays to make specifying the input match
+     * simple.
+     * 
+     * @constant
+     */
+    State.SBOX = new Array(8);
+
+    var SBOX = State.SBOX;
+
+    SBOX[0] = new Array();
+    SBOX[0][0] = 0x808200; // 0 (0, 0) = 14
+    SBOX[0][268435456] = 0x8000; // 10000000 (0, 1) = 4
+    SBOX[0][536870912] = 0x808002; // 20000000 (0, 2) = 13
+    SBOX[0][805306368] = 0x2; // 30000000 (0, 3) = 1
+    SBOX[0][1073741824] = 0x200; // 40000000 (0, 4) = 2
+    SBOX[0][1342177280] = 0x808202; // 50000000 (0, 5) = 15
+    SBOX[0][1610612736] = 0x800202; // 60000000 (0, 6) = 11
+    SBOX[0][1879048192] = 0x800000; // 70000000 (0, 7) = 8
+    SBOX[0][-2147483648] = 0x202; // 80000000 (0, 8) = 3
+    SBOX[0][-1879048192] = 0x800200; // 90000000 (0, 9) = 10
+    SBOX[0][-1610612736] = 0x8200; // a0000000 (0, 10) = 6
+    SBOX[0][-1342177280] = 0x808000; // b0000000 (0, 11) = 12
+    SBOX[0][-1073741824] = 0x8002; // c0000000 (0, 12) = 5
+    SBOX[0][-805306368] = 0x800002; // d0000000 (0, 13) = 9
+    SBOX[0][-536870912] = 0x0; // e0000000 (0, 14) = 0
+    SBOX[0][-268435456] = 0x8202; // f0000000 (0, 15) = 7
+    SBOX[0][134217728] = 0x0; // 8000000 (1, 0) = 0
+    SBOX[0][402653184] = 0x808202; // 18000000 (1, 1) = 15
+    SBOX[0][671088640] = 0x8202; // 28000000 (1, 2) = 7
+    SBOX[0][939524096] = 0x8000; // 38000000 (1, 3) = 4
+    SBOX[0][1207959552] = 0x808200; // 48000000 (1, 4) = 14
+    SBOX[0][1476395008] = 0x200; // 58000000 (1, 5) = 2
+    SBOX[0][1744830464] = 0x808002; // 68000000 (1, 6) = 13
+    SBOX[0][2013265920] = 0x2; // 78000000 (1, 7) = 1
+    SBOX[0][-2013265920] = 0x800200; // 88000000 (1, 8) = 10
+    SBOX[0][-1744830464] = 0x8200; // 98000000 (1, 9) = 6
+    SBOX[0][-1476395008] = 0x808000; // a8000000 (1, 10) = 12
+    SBOX[0][-1207959552] = 0x800202; // b8000000 (1, 11) = 11
+    SBOX[0][-939524096] = 0x800002; // c8000000 (1, 12) = 9
+    SBOX[0][-671088640] = 0x8002; // d8000000 (1, 13) = 5
+    SBOX[0][-402653184] = 0x202; // e8000000 (1, 14) = 3
+    SBOX[0][-134217728] = 0x800000; // f8000000 (1, 15) = 8
+    SBOX[0][1] = 0x8000; // 1 (2, 0) = 4
+    SBOX[0][268435457] = 0x2; // 10000001 (2, 1) = 1
+    SBOX[0][536870913] = 0x808200; // 20000001 (2, 2) = 14
+    SBOX[0][805306369] = 0x800000; // 30000001 (2, 3) = 8
+    SBOX[0][1073741825] = 0x808002; // 40000001 (2, 4) = 13
+    SBOX[0][1342177281] = 0x8200; // 50000001 (2, 5) = 6
+    SBOX[0][1610612737] = 0x200; // 60000001 (2, 6) = 2
+    SBOX[0][1879048193] = 0x800202; // 70000001 (2, 7) = 11
+    SBOX[0][-2147483647] = 0x808202; // 80000001 (2, 8) = 15
+    SBOX[0][-1879048191] = 0x808000; // 90000001 (2, 9) = 12
+    SBOX[0][-1610612735] = 0x800002; // a0000001 (2, 10) = 9
+    SBOX[0][-1342177279] = 0x8202; // b0000001 (2, 11) = 7
+    SBOX[0][-1073741823] = 0x202; // c0000001 (2, 12) = 3
+    SBOX[0][-805306367] = 0x800200; // d0000001 (2, 13) = 10
+    SBOX[0][-536870911] = 0x8002; // e0000001 (2, 14) = 5
+    SBOX[0][-268435455] = 0x0; // f0000001 (2, 15) = 0
+    SBOX[0][134217729] = 0x808202; // 8000001 (3, 0) = 15
+    SBOX[0][402653185] = 0x808000; // 18000001 (3, 1) = 12
+    SBOX[0][671088641] = 0x800000; // 28000001 (3, 2) = 8
+    SBOX[0][939524097] = 0x200; // 38000001 (3, 3) = 2
+    SBOX[0][1207959553] = 0x8000; // 48000001 (3, 4) = 4
+    SBOX[0][1476395009] = 0x800002; // 58000001 (3, 5) = 9
+    SBOX[0][1744830465] = 0x2; // 68000001 (3, 6) = 1
+    SBOX[0][2013265921] = 0x8202; // 78000001 (3, 7) = 7
+    SBOX[0][-2013265919] = 0x8002; // 88000001 (3, 8) = 5
+    SBOX[0][-1744830463] = 0x800202; // 98000001 (3, 9) = 11
+    SBOX[0][-1476395007] = 0x202; // a8000001 (3, 10) = 3
+    SBOX[0][-1207959551] = 0x808200; // b8000001 (3, 11) = 14
+    SBOX[0][-939524095] = 0x800200; // c8000001 (3, 12) = 10
+    SBOX[0][-671088639] = 0x0; // d8000001 (3, 13) = 0
+    SBOX[0][-402653183] = 0x8200; // e8000001 (3, 14) = 6
+    SBOX[0][-134217727] = 0x808002; // f8000001 (3, 15) = 13
+
+    SBOX[1] = new Array();
+    SBOX[1][0] = 0x40084010; // 0 (0, 0) = 15
+    SBOX[1][16777216] = 0x4000; // 1000000 (0, 1) = 1
+    SBOX[1][33554432] = 0x80000; // 2000000 (0, 2) = 8
+    SBOX[1][50331648] = 0x40080010; // 3000000 (0, 3) = 14
+    SBOX[1][67108864] = 0x40000010; // 4000000 (0, 4) = 6
+    SBOX[1][83886080] = 0x40084000; // 5000000 (0, 5) = 11
+    SBOX[1][100663296] = 0x40004000; // 6000000 (0, 6) = 3
+    SBOX[1][117440512] = 0x10; // 7000000 (0, 7) = 4
+    SBOX[1][134217728] = 0x84000; // 8000000 (0, 8) = 9
+    SBOX[1][150994944] = 0x40004010; // 9000000 (0, 9) = 7
+    SBOX[1][167772160] = 0x40000000; // a000000 (0, 10) = 2
+    SBOX[1][184549376] = 0x84010; // b000000 (0, 11) = 13
+    SBOX[1][201326592] = 0x80010; // c000000 (0, 12) = 12
+    SBOX[1][218103808] = 0x0; // d000000 (0, 13) = 0
+    SBOX[1][234881024] = 0x4010; // e000000 (0, 14) = 5
+    SBOX[1][251658240] = 0x40080000; // f000000 (0, 15) = 10
+    SBOX[1][8388608] = 0x40004000; // 800000 (1, 0) = 3
+    SBOX[1][25165824] = 0x84010; // 1800000 (1, 1) = 13
+    SBOX[1][41943040] = 0x10; // 2800000 (1, 2) = 4
+    SBOX[1][58720256] = 0x40004010; // 3800000 (1, 3) = 7
+    SBOX[1][75497472] = 0x40084010; // 4800000 (1, 4) = 15
+    SBOX[1][92274688] = 0x40000000; // 5800000 (1, 5) = 2
+    SBOX[1][109051904] = 0x80000; // 6800000 (1, 6) = 8
+    SBOX[1][125829120] = 0x40080010; // 7800000 (1, 7) = 14
+    SBOX[1][142606336] = 0x80010; // 8800000 (1, 8) = 12
+    SBOX[1][159383552] = 0x0; // 9800000 (1, 9) = 0
+    SBOX[1][176160768] = 0x4000; // a800000 (1, 10) = 1
+    SBOX[1][192937984] = 0x40080000; // b800000 (1, 11) = 10
+    SBOX[1][209715200] = 0x40000010; // c800000 (1, 12) = 6
+    SBOX[1][226492416] = 0x84000; // d800000 (1, 13) = 9
+    SBOX[1][243269632] = 0x40084000; // e800000 (1, 14) = 11
+    SBOX[1][260046848] = 0x4010; // f800000 (1, 15) = 5
+    SBOX[1][268435456] = 0x0; // 10000000 (2, 0) = 0
+    SBOX[1][285212672] = 0x40080010; // 11000000 (2, 1) = 14
+    SBOX[1][301989888] = 0x40004010; // 12000000 (2, 2) = 7
+    SBOX[1][318767104] = 0x40084000; // 13000000 (2, 3) = 11
+    SBOX[1][335544320] = 0x40080000; // 14000000 (2, 4) = 10
+    SBOX[1][352321536] = 0x10; // 15000000 (2, 5) = 4
+    SBOX[1][369098752] = 0x84010; // 16000000 (2, 6) = 13
+    SBOX[1][385875968] = 0x4000; // 17000000 (2, 7) = 1
+    SBOX[1][402653184] = 0x4010; // 18000000 (2, 8) = 5
+    SBOX[1][419430400] = 0x80000; // 19000000 (2, 9) = 8
+    SBOX[1][436207616] = 0x80010; // 1a000000 (2, 10) = 12
+    SBOX[1][452984832] = 0x40000010; // 1b000000 (2, 11) = 6
+    SBOX[1][469762048] = 0x84000; // 1c000000 (2, 12) = 9
+    SBOX[1][486539264] = 0x40004000; // 1d000000 (2, 13) = 3
+    SBOX[1][503316480] = 0x40000000; // 1e000000 (2, 14) = 2
+    SBOX[1][520093696] = 0x40084010; // 1f000000 (2, 15) = 15
+    SBOX[1][276824064] = 0x84010; // 10800000 (3, 0) = 13
+    SBOX[1][293601280] = 0x80000; // 11800000 (3, 1) = 8
+    SBOX[1][310378496] = 0x40080000; // 12800000 (3, 2) = 10
+    SBOX[1][327155712] = 0x4000; // 13800000 (3, 3) = 1
+    SBOX[1][343932928] = 0x40004000; // 14800000 (3, 4) = 3
+    SBOX[1][360710144] = 0x40084010; // 15800000 (3, 5) = 15
+    SBOX[1][377487360] = 0x10; // 16800000 (3, 6) = 4
+    SBOX[1][394264576] = 0x40000000; // 17800000 (3, 7) = 2
+    SBOX[1][411041792] = 0x40084000; // 18800000 (3, 8) = 11
+    SBOX[1][427819008] = 0x40000010; // 19800000 (3, 9) = 6
+    SBOX[1][444596224] = 0x40004010; // 1a800000 (3, 10) = 7
+    SBOX[1][461373440] = 0x80010; // 1b800000 (3, 11) = 12
+    SBOX[1][478150656] = 0x0; // 1c800000 (3, 12) = 0
+    SBOX[1][494927872] = 0x4010; // 1d800000 (3, 13) = 5
+    SBOX[1][511705088] = 0x40080010; // 1e800000 (3, 14) = 14
+    SBOX[1][528482304] = 0x84000; // 1f800000 (3, 15) = 9
+
+    SBOX[2] = new Array();
+    SBOX[2][0] = 0x104; // 0 (0, 0) = 10
+    SBOX[2][1048576] = 0x0; // 100000 (0, 1) = 0
+    SBOX[2][2097152] = 0x4000100; // 200000 (0, 2) = 9
+    SBOX[2][3145728] = 0x10104; // 300000 (0, 3) = 14
+    SBOX[2][4194304] = 0x10004; // 400000 (0, 4) = 6
+    SBOX[2][5242880] = 0x4000004; // 500000 (0, 5) = 3
+    SBOX[2][6291456] = 0x4010104; // 600000 (0, 6) = 15
+    SBOX[2][7340032] = 0x4010000; // 700000 (0, 7) = 5
+    SBOX[2][8388608] = 0x4000000; // 800000 (0, 8) = 1
+    SBOX[2][9437184] = 0x4010100; // 900000 (0, 9) = 13
+    SBOX[2][10485760] = 0x10100; // a00000 (0, 10) = 12
+    SBOX[2][11534336] = 0x4010004; // b00000 (0, 11) = 7
+    SBOX[2][12582912] = 0x4000104; // c00000 (0, 12) = 11
+    SBOX[2][13631488] = 0x10000; // d00000 (0, 13) = 4
+    SBOX[2][14680064] = 0x4; // e00000 (0, 14) = 2
+    SBOX[2][15728640] = 0x100; // f00000 (0, 15) = 8
+    SBOX[2][524288] = 0x4010100; // 80000 (1, 0) = 13
+    SBOX[2][1572864] = 0x4010004; // 180000 (1, 1) = 7
+    SBOX[2][2621440] = 0x0; // 280000 (1, 2) = 0
+    SBOX[2][3670016] = 0x4000100; // 380000 (1, 3) = 9
+    SBOX[2][4718592] = 0x4000004; // 480000 (1, 4) = 3
+    SBOX[2][5767168] = 0x10000; // 580000 (1, 5) = 4
+    SBOX[2][6815744] = 0x10004; // 680000 (1, 6) = 6
+    SBOX[2][7864320] = 0x104; // 780000 (1, 7) = 10
+    SBOX[2][8912896] = 0x4; // 880000 (1, 8) = 2
+    SBOX[2][9961472] = 0x100; // 980000 (1, 9) = 8
+    SBOX[2][11010048] = 0x4010000; // a80000 (1, 10) = 5
+    SBOX[2][12058624] = 0x10104; // b80000 (1, 11) = 14
+    SBOX[2][13107200] = 0x10100; // c80000 (1, 12) = 12
+    SBOX[2][14155776] = 0x4000104; // d80000 (1, 13) = 11
+    SBOX[2][15204352] = 0x4010104; // e80000 (1, 14) = 15
+    SBOX[2][16252928] = 0x4000000; // f80000 (1, 15) = 1
+    SBOX[2][16777216] = 0x4010100; // 1000000 (2, 0) = 13
+    SBOX[2][17825792] = 0x10004; // 1100000 (2, 1) = 6
+    SBOX[2][18874368] = 0x10000; // 1200000 (2, 2) = 4
+    SBOX[2][19922944] = 0x4000100; // 1300000 (2, 3) = 9
+    SBOX[2][20971520] = 0x100; // 1400000 (2, 4) = 8
+    SBOX[2][22020096] = 0x4010104; // 1500000 (2, 5) = 15
+    SBOX[2][23068672] = 0x4000004; // 1600000 (2, 6) = 3
+    SBOX[2][24117248] = 0x0; // 1700000 (2, 7) = 0
+    SBOX[2][25165824] = 0x4000104; // 1800000 (2, 8) = 11
+    SBOX[2][26214400] = 0x4000000; // 1900000 (2, 9) = 1
+    SBOX[2][27262976] = 0x4; // 1a00000 (2, 10) = 2
+    SBOX[2][28311552] = 0x10100; // 1b00000 (2, 11) = 12
+    SBOX[2][29360128] = 0x4010000; // 1c00000 (2, 12) = 5
+    SBOX[2][30408704] = 0x104; // 1d00000 (2, 13) = 10
+    SBOX[2][31457280] = 0x10104; // 1e00000 (2, 14) = 14
+    SBOX[2][32505856] = 0x4010004; // 1f00000 (2, 15) = 7
+    SBOX[2][17301504] = 0x4000000; // 1080000 (3, 0) = 1
+    SBOX[2][18350080] = 0x104; // 1180000 (3, 1) = 10
+    SBOX[2][19398656] = 0x4010100; // 1280000 (3, 2) = 13
+    SBOX[2][20447232] = 0x0; // 1380000 (3, 3) = 0
+    SBOX[2][21495808] = 0x10004; // 1480000 (3, 4) = 6
+    SBOX[2][22544384] = 0x4000100; // 1580000 (3, 5) = 9
+    SBOX[2][23592960] = 0x100; // 1680000 (3, 6) = 8
+    SBOX[2][24641536] = 0x4010004; // 1780000 (3, 7) = 7
+    SBOX[2][25690112] = 0x10000; // 1880000 (3, 8) = 4
+    SBOX[2][26738688] = 0x4010104; // 1980000 (3, 9) = 15
+    SBOX[2][27787264] = 0x10104; // 1a80000 (3, 10) = 14
+    SBOX[2][28835840] = 0x4000004; // 1b80000 (3, 11) = 3
+    SBOX[2][29884416] = 0x4000104; // 1c80000 (3, 12) = 11
+    SBOX[2][30932992] = 0x4010000; // 1d80000 (3, 13) = 5
+    SBOX[2][31981568] = 0x4; // 1e80000 (3, 14) = 2
+    SBOX[2][33030144] = 0x10100; // 1f80000 (3, 15) = 12
+
+    SBOX[3] = new Array();
+    SBOX[3][0] = 0x80401000; // 0 (0, 0) = 7
+    SBOX[3][65536] = 0x80001040; // 10000 (0, 1) = 13
+    SBOX[3][131072] = 0x401040; // 20000 (0, 2) = 14
+    SBOX[3][196608] = 0x80400000; // 30000 (0, 3) = 3
+    SBOX[3][262144] = 0x0; // 40000 (0, 4) = 0
+    SBOX[3][327680] = 0x401000; // 50000 (0, 5) = 6
+    SBOX[3][393216] = 0x80000040; // 60000 (0, 6) = 9
+    SBOX[3][458752] = 0x400040; // 70000 (0, 7) = 10
+    SBOX[3][524288] = 0x80000000; // 80000 (0, 8) = 1
+    SBOX[3][589824] = 0x400000; // 90000 (0, 9) = 2
+    SBOX[3][655360] = 0x40; // a0000 (0, 10) = 8
+    SBOX[3][720896] = 0x80001000; // b0000 (0, 11) = 5
+    SBOX[3][786432] = 0x80400040; // c0000 (0, 12) = 11
+    SBOX[3][851968] = 0x1040; // d0000 (0, 13) = 12
+    SBOX[3][917504] = 0x1000; // e0000 (0, 14) = 4
+    SBOX[3][983040] = 0x80401040; // f0000 (0, 15) = 15
+    SBOX[3][32768] = 0x80001040; // 8000 (1, 0) = 13
+    SBOX[3][98304] = 0x40; // 18000 (1, 1) = 8
+    SBOX[3][163840] = 0x80400040; // 28000 (1, 2) = 11
+    SBOX[3][229376] = 0x80001000; // 38000 (1, 3) = 5
+    SBOX[3][294912] = 0x401000; // 48000 (1, 4) = 6
+    SBOX[3][360448] = 0x80401040; // 58000 (1, 5) = 15
+    SBOX[3][425984] = 0x0; // 68000 (1, 6) = 0
+    SBOX[3][491520] = 0x80400000; // 78000 (1, 7) = 3
+    SBOX[3][557056] = 0x1000; // 88000 (1, 8) = 4
+    SBOX[3][622592] = 0x80401000; // 98000 (1, 9) = 7
+    SBOX[3][688128] = 0x400000; // a8000 (1, 10) = 2
+    SBOX[3][753664] = 0x1040; // b8000 (1, 11) = 12
+    SBOX[3][819200] = 0x80000000; // c8000 (1, 12) = 1
+    SBOX[3][884736] = 0x400040; // d8000 (1, 13) = 10
+    SBOX[3][950272] = 0x401040; // e8000 (1, 14) = 14
+    SBOX[3][1015808] = 0x80000040; // f8000 (1, 15) = 9
+    SBOX[3][1048576] = 0x400040; // 100000 (2, 0) = 10
+    SBOX[3][1114112] = 0x401000; // 110000 (2, 1) = 6
+    SBOX[3][1179648] = 0x80000040; // 120000 (2, 2) = 9
+    SBOX[3][1245184] = 0x0; // 130000 (2, 3) = 0
+    SBOX[3][1310720] = 0x1040; // 140000 (2, 4) = 12
+    SBOX[3][1376256] = 0x80400040; // 150000 (2, 5) = 11
+    SBOX[3][1441792] = 0x80401000; // 160000 (2, 6) = 7
+    SBOX[3][1507328] = 0x80001040; // 170000 (2, 7) = 13
+    SBOX[3][1572864] = 0x80401040; // 180000 (2, 8) = 15
+    SBOX[3][1638400] = 0x80000000; // 190000 (2, 9) = 1
+    SBOX[3][1703936] = 0x80400000; // 1a0000 (2, 10) = 3
+    SBOX[3][1769472] = 0x401040; // 1b0000 (2, 11) = 14
+    SBOX[3][1835008] = 0x80001000; // 1c0000 (2, 12) = 5
+    SBOX[3][1900544] = 0x400000; // 1d0000 (2, 13) = 2
+    SBOX[3][1966080] = 0x40; // 1e0000 (2, 14) = 8
+    SBOX[3][2031616] = 0x1000; // 1f0000 (2, 15) = 4
+    SBOX[3][1081344] = 0x80400000; // 108000 (3, 0) = 3
+    SBOX[3][1146880] = 0x80401040; // 118000 (3, 1) = 15
+    SBOX[3][1212416] = 0x0; // 128000 (3, 2) = 0
+    SBOX[3][1277952] = 0x401000; // 138000 (3, 3) = 6
+    SBOX[3][1343488] = 0x400040; // 148000 (3, 4) = 10
+    SBOX[3][1409024] = 0x80000000; // 158000 (3, 5) = 1
+    SBOX[3][1474560] = 0x80001040; // 168000 (3, 6) = 13
+    SBOX[3][1540096] = 0x40; // 178000 (3, 7) = 8
+    SBOX[3][1605632] = 0x80000040; // 188000 (3, 8) = 9
+    SBOX[3][1671168] = 0x1000; // 198000 (3, 9) = 4
+    SBOX[3][1736704] = 0x80001000; // 1a8000 (3, 10) = 5
+    SBOX[3][1802240] = 0x80400040; // 1b8000 (3, 11) = 11
+    SBOX[3][1867776] = 0x1040; // 1c8000 (3, 12) = 12
+    SBOX[3][1933312] = 0x80401000; // 1d8000 (3, 13) = 7
+    SBOX[3][1998848] = 0x400000; // 1e8000 (3, 14) = 2
+    SBOX[3][2064384] = 0x401040; // 1f8000 (3, 15) = 14
+
+    SBOX[4] = new Array();
+    SBOX[4][0] = 0x80; // 0 (0, 0) = 2
+    SBOX[4][4096] = 0x1040000; // 1000 (0, 1) = 12
+    SBOX[4][8192] = 0x40000; // 2000 (0, 2) = 4
+    SBOX[4][12288] = 0x20000000; // 3000 (0, 3) = 1
+    SBOX[4][16384] = 0x20040080; // 4000 (0, 4) = 7
+    SBOX[4][20480] = 0x1000080; // 5000 (0, 5) = 10
+    SBOX[4][24576] = 0x21000080; // 6000 (0, 6) = 11
+    SBOX[4][28672] = 0x40080; // 7000 (0, 7) = 6
+    SBOX[4][32768] = 0x1000000; // 8000 (0, 8) = 8
+    SBOX[4][36864] = 0x20040000; // 9000 (0, 9) = 5
+    SBOX[4][40960] = 0x20000080; // a000 (0, 10) = 3
+    SBOX[4][45056] = 0x21040080; // b000 (0, 11) = 15
+    SBOX[4][49152] = 0x21040000; // c000 (0, 12) = 13
+    SBOX[4][53248] = 0x0; // d000 (0, 13) = 0
+    SBOX[4][57344] = 0x1040080; // e000 (0, 14) = 14
+    SBOX[4][61440] = 0x21000000; // f000 (0, 15) = 9
+    SBOX[4][2048] = 0x1040080; // 800 (1, 0) = 14
+    SBOX[4][6144] = 0x21000080; // 1800 (1, 1) = 11
+    SBOX[4][10240] = 0x80; // 2800 (1, 2) = 2
+    SBOX[4][14336] = 0x1040000; // 3800 (1, 3) = 12
+    SBOX[4][18432] = 0x40000; // 4800 (1, 4) = 4
+    SBOX[4][22528] = 0x20040080; // 5800 (1, 5) = 7
+    SBOX[4][26624] = 0x21040000; // 6800 (1, 6) = 13
+    SBOX[4][30720] = 0x20000000; // 7800 (1, 7) = 1
+    SBOX[4][34816] = 0x20040000; // 8800 (1, 8) = 5
+    SBOX[4][38912] = 0x0; // 9800 (1, 9) = 0
+    SBOX[4][43008] = 0x21040080; // a800 (1, 10) = 15
+    SBOX[4][47104] = 0x1000080; // b800 (1, 11) = 10
+    SBOX[4][51200] = 0x20000080; // c800 (1, 12) = 3
+    SBOX[4][55296] = 0x21000000; // d800 (1, 13) = 9
+    SBOX[4][59392] = 0x1000000; // e800 (1, 14) = 8
+    SBOX[4][63488] = 0x40080; // f800 (1, 15) = 6
+    SBOX[4][65536] = 0x40000; // 10000 (2, 0) = 4
+    SBOX[4][69632] = 0x80; // 11000 (2, 1) = 2
+    SBOX[4][73728] = 0x20000000; // 12000 (2, 2) = 1
+    SBOX[4][77824] = 0x21000080; // 13000 (2, 3) = 11
+    SBOX[4][81920] = 0x1000080; // 14000 (2, 4) = 10
+    SBOX[4][86016] = 0x21040000; // 15000 (2, 5) = 13
+    SBOX[4][90112] = 0x20040080; // 16000 (2, 6) = 7
+    SBOX[4][94208] = 0x1000000; // 17000 (2, 7) = 8
+    SBOX[4][98304] = 0x21040080; // 18000 (2, 8) = 15
+    SBOX[4][102400] = 0x21000000; // 19000 (2, 9) = 9
+    SBOX[4][106496] = 0x1040000; // 1a000 (2, 10) = 12
+    SBOX[4][110592] = 0x20040000; // 1b000 (2, 11) = 5
+    SBOX[4][114688] = 0x40080; // 1c000 (2, 12) = 6
+    SBOX[4][118784] = 0x20000080; // 1d000 (2, 13) = 3
+    SBOX[4][122880] = 0x0; // 1e000 (2, 14) = 0
+    SBOX[4][126976] = 0x1040080; // 1f000 (2, 15) = 14
+    SBOX[4][67584] = 0x21000080; // 10800 (3, 0) = 11
+    SBOX[4][71680] = 0x1000000; // 11800 (3, 1) = 8
+    SBOX[4][75776] = 0x1040000; // 12800 (3, 2) = 12
+    SBOX[4][79872] = 0x20040080; // 13800 (3, 3) = 7
+    SBOX[4][83968] = 0x20000000; // 14800 (3, 4) = 1
+    SBOX[4][88064] = 0x1040080; // 15800 (3, 5) = 14
+    SBOX[4][92160] = 0x80; // 16800 (3, 6) = 2
+    SBOX[4][96256] = 0x21040000; // 17800 (3, 7) = 13
+    SBOX[4][100352] = 0x40080; // 18800 (3, 8) = 6
+    SBOX[4][104448] = 0x21040080; // 19800 (3, 9) = 15
+    SBOX[4][108544] = 0x0; // 1a800 (3, 10) = 0
+    SBOX[4][112640] = 0x21000000; // 1b800 (3, 11) = 9
+    SBOX[4][116736] = 0x1000080; // 1c800 (3, 12) = 10
+    SBOX[4][120832] = 0x40000; // 1d800 (3, 13) = 4
+    SBOX[4][124928] = 0x20040000; // 1e800 (3, 14) = 5
+    SBOX[4][129024] = 0x20000080; // 1f800 (3, 15) = 3
+
+    SBOX[5] = new Array();
+    SBOX[5][0] = 0x10000008; // 0 (0, 0) = 12
+    SBOX[5][256] = 0x2000; // 100 (0, 1) = 1
+    SBOX[5][512] = 0x10200000; // 200 (0, 2) = 10
+    SBOX[5][768] = 0x10202008; // 300 (0, 3) = 15
+    SBOX[5][1024] = 0x10002000; // 400 (0, 4) = 9
+    SBOX[5][1280] = 0x200000; // 500 (0, 5) = 2
+    SBOX[5][1536] = 0x200008; // 600 (0, 6) = 6
+    SBOX[5][1792] = 0x10000000; // 700 (0, 7) = 8
+    SBOX[5][2048] = 0x0; // 800 (0, 8) = 0
+    SBOX[5][2304] = 0x10002008; // 900 (0, 9) = 13
+    SBOX[5][2560] = 0x202000; // a00 (0, 10) = 3
+    SBOX[5][2816] = 0x8; // b00 (0, 11) = 4
+    SBOX[5][3072] = 0x10200008; // c00 (0, 12) = 14
+    SBOX[5][3328] = 0x202008; // d00 (0, 13) = 7
+    SBOX[5][3584] = 0x2008; // e00 (0, 14) = 5
+    SBOX[5][3840] = 0x10202000; // f00 (0, 15) = 11
+    SBOX[5][128] = 0x10200000; // 80 (1, 0) = 10
+    SBOX[5][384] = 0x10202008; // 180 (1, 1) = 15
+    SBOX[5][640] = 0x8; // 280 (1, 2) = 4
+    SBOX[5][896] = 0x200000; // 380 (1, 3) = 2
+    SBOX[5][1152] = 0x202008; // 480 (1, 4) = 7
+    SBOX[5][1408] = 0x10000008; // 580 (1, 5) = 12
+    SBOX[5][1664] = 0x10002000; // 680 (1, 6) = 9
+    SBOX[5][1920] = 0x2008; // 780 (1, 7) = 5
+    SBOX[5][2176] = 0x200008; // 880 (1, 8) = 6
+    SBOX[5][2432] = 0x2000; // 980 (1, 9) = 1
+    SBOX[5][2688] = 0x10002008; // a80 (1, 10) = 13
+    SBOX[5][2944] = 0x10200008; // b80 (1, 11) = 14
+    SBOX[5][3200] = 0x0; // c80 (1, 12) = 0
+    SBOX[5][3456] = 0x10202000; // d80 (1, 13) = 11
+    SBOX[5][3712] = 0x202000; // e80 (1, 14) = 3
+    SBOX[5][3968] = 0x10000000; // f80 (1, 15) = 8
+    SBOX[5][4096] = 0x10002000; // 1000 (2, 0) = 9
+    SBOX[5][4352] = 0x10200008; // 1100 (2, 1) = 14
+    SBOX[5][4608] = 0x10202008; // 1200 (2, 2) = 15
+    SBOX[5][4864] = 0x2008; // 1300 (2, 3) = 5
+    SBOX[5][5120] = 0x200000; // 1400 (2, 4) = 2
+    SBOX[5][5376] = 0x10000000; // 1500 (2, 5) = 8
+    SBOX[5][5632] = 0x10000008; // 1600 (2, 6) = 12
+    SBOX[5][5888] = 0x202000; // 1700 (2, 7) = 3
+    SBOX[5][6144] = 0x202008; // 1800 (2, 8) = 7
+    SBOX[5][6400] = 0x0; // 1900 (2, 9) = 0
+    SBOX[5][6656] = 0x8; // 1a00 (2, 10) = 4
+    SBOX[5][6912] = 0x10200000; // 1b00 (2, 11) = 10
+    SBOX[5][7168] = 0x2000; // 1c00 (2, 12) = 1
+    SBOX[5][7424] = 0x10002008; // 1d00 (2, 13) = 13
+    SBOX[5][7680] = 0x10202000; // 1e00 (2, 14) = 11
+    SBOX[5][7936] = 0x200008; // 1f00 (2, 15) = 6
+    SBOX[5][4224] = 0x8; // 1080 (3, 0) = 4
+    SBOX[5][4480] = 0x202000; // 1180 (3, 1) = 3
+    SBOX[5][4736] = 0x200000; // 1280 (3, 2) = 2
+    SBOX[5][4992] = 0x10000008; // 1380 (3, 3) = 12
+    SBOX[5][5248] = 0x10002000; // 1480 (3, 4) = 9
+    SBOX[5][5504] = 0x2008; // 1580 (3, 5) = 5
+    SBOX[5][5760] = 0x10202008; // 1680 (3, 6) = 15
+    SBOX[5][6016] = 0x10200000; // 1780 (3, 7) = 10
+    SBOX[5][6272] = 0x10202000; // 1880 (3, 8) = 11
+    SBOX[5][6528] = 0x10200008; // 1980 (3, 9) = 14
+    SBOX[5][6784] = 0x2000; // 1a80 (3, 10) = 1
+    SBOX[5][7040] = 0x202008; // 1b80 (3, 11) = 7
+    SBOX[5][7296] = 0x200008; // 1c80 (3, 12) = 6
+    SBOX[5][7552] = 0x0; // 1d80 (3, 13) = 0
+    SBOX[5][7808] = 0x10000000; // 1e80 (3, 14) = 8
+    SBOX[5][8064] = 0x10002008; // 1f80 (3, 15) = 13
+
+    SBOX[6] = new Array();
+    SBOX[6][0] = 0x100000; // 0 (0, 0) = 4
+    SBOX[6][16] = 0x2000401; // 10 (0, 1) = 11
+    SBOX[6][32] = 0x400; // 20 (0, 2) = 2
+    SBOX[6][48] = 0x100401; // 30 (0, 3) = 14
+    SBOX[6][64] = 0x2100401; // 40 (0, 4) = 15
+    SBOX[6][80] = 0x0; // 50 (0, 5) = 0
+    SBOX[6][96] = 0x1; // 60 (0, 6) = 8
+    SBOX[6][112] = 0x2100001; // 70 (0, 7) = 13
+    SBOX[6][128] = 0x2000400; // 80 (0, 8) = 3
+    SBOX[6][144] = 0x100001; // 90 (0, 9) = 12
+    SBOX[6][160] = 0x2000001; // a0 (0, 10) = 9
+    SBOX[6][176] = 0x2100400; // b0 (0, 11) = 7
+    SBOX[6][192] = 0x2100000; // c0 (0, 12) = 5
+    SBOX[6][208] = 0x401; // d0 (0, 13) = 10
+    SBOX[6][224] = 0x100400; // e0 (0, 14) = 6
+    SBOX[6][240] = 0x2000000; // f0 (0, 15) = 1
+    SBOX[6][8] = 0x2100001; // 8 (1, 0) = 13
+    SBOX[6][24] = 0x0; // 18 (1, 1) = 0
+    SBOX[6][40] = 0x2000401; // 28 (1, 2) = 11
+    SBOX[6][56] = 0x2100400; // 38 (1, 3) = 7
+    SBOX[6][72] = 0x100000; // 48 (1, 4) = 4
+    SBOX[6][88] = 0x2000001; // 58 (1, 5) = 9
+    SBOX[6][104] = 0x2000000; // 68 (1, 6) = 1
+    SBOX[6][120] = 0x401; // 78 (1, 7) = 10
+    SBOX[6][136] = 0x100401; // 88 (1, 8) = 14
+    SBOX[6][152] = 0x2000400; // 98 (1, 9) = 3
+    SBOX[6][168] = 0x2100000; // a8 (1, 10) = 5
+    SBOX[6][184] = 0x100001; // b8 (1, 11) = 12
+    SBOX[6][200] = 0x400; // c8 (1, 12) = 2
+    SBOX[6][216] = 0x2100401; // d8 (1, 13) = 15
+    SBOX[6][232] = 0x1; // e8 (1, 14) = 8
+    SBOX[6][248] = 0x100400; // f8 (1, 15) = 6
+    SBOX[6][256] = 0x2000000; // 100 (2, 0) = 1
+    SBOX[6][272] = 0x100000; // 110 (2, 1) = 4
+    SBOX[6][288] = 0x2000401; // 120 (2, 2) = 11
+    SBOX[6][304] = 0x2100001; // 130 (2, 3) = 13
+    SBOX[6][320] = 0x100001; // 140 (2, 4) = 12
+    SBOX[6][336] = 0x2000400; // 150 (2, 5) = 3
+    SBOX[6][352] = 0x2100400; // 160 (2, 6) = 7
+    SBOX[6][368] = 0x100401; // 170 (2, 7) = 14
+    SBOX[6][384] = 0x401; // 180 (2, 8) = 10
+    SBOX[6][400] = 0x2100401; // 190 (2, 9) = 15
+    SBOX[6][416] = 0x100400; // 1a0 (2, 10) = 6
+    SBOX[6][432] = 0x1; // 1b0 (2, 11) = 8
+    SBOX[6][448] = 0x0; // 1c0 (2, 12) = 0
+    SBOX[6][464] = 0x2100000; // 1d0 (2, 13) = 5
+    SBOX[6][480] = 0x2000001; // 1e0 (2, 14) = 9
+    SBOX[6][496] = 0x400; // 1f0 (2, 15) = 2
+    SBOX[6][264] = 0x100400; // 108 (3, 0) = 6
+    SBOX[6][280] = 0x2000401; // 118 (3, 1) = 11
+    SBOX[6][296] = 0x2100001; // 128 (3, 2) = 13
+    SBOX[6][312] = 0x1; // 138 (3, 3) = 8
+    SBOX[6][328] = 0x2000000; // 148 (3, 4) = 1
+    SBOX[6][344] = 0x100000; // 158 (3, 5) = 4
+    SBOX[6][360] = 0x401; // 168 (3, 6) = 10
+    SBOX[6][376] = 0x2100400; // 178 (3, 7) = 7
+    SBOX[6][392] = 0x2000001; // 188 (3, 8) = 9
+    SBOX[6][408] = 0x2100000; // 198 (3, 9) = 5
+    SBOX[6][424] = 0x0; // 1a8 (3, 10) = 0
+    SBOX[6][440] = 0x2100401; // 1b8 (3, 11) = 15
+    SBOX[6][456] = 0x100401; // 1c8 (3, 12) = 14
+    SBOX[6][472] = 0x400; // 1d8 (3, 13) = 2
+    SBOX[6][488] = 0x2000400; // 1e8 (3, 14) = 3
+    SBOX[6][504] = 0x100001; // 1f8 (3, 15) = 12
+
+    SBOX[7] = new Array();
+    SBOX[7][0] = 0x8000820; // 0 (0, 0) = 13
+    SBOX[7][1] = 0x20000; // 1 (0, 1) = 2
+    SBOX[7][2] = 0x8000000; // 2 (0, 2) = 8
+    SBOX[7][3] = 0x20; // 3 (0, 3) = 4
+    SBOX[7][4] = 0x20020; // 4 (0, 4) = 6
+    SBOX[7][5] = 0x8020820; // 5 (0, 5) = 15
+    SBOX[7][6] = 0x8020800; // 6 (0, 6) = 11
+    SBOX[7][7] = 0x800; // 7 (0, 7) = 1
+    SBOX[7][8] = 0x8020000; // 8 (0, 8) = 10
+    SBOX[7][9] = 0x8000800; // 9 (0, 9) = 9
+    SBOX[7][10] = 0x20800; // a (0, 10) = 3
+    SBOX[7][11] = 0x8020020; // b (0, 11) = 14
+    SBOX[7][12] = 0x820; // c (0, 12) = 5
+    SBOX[7][13] = 0x0; // d (0, 13) = 0
+    SBOX[7][14] = 0x8000020; // e (0, 14) = 12
+    SBOX[7][15] = 0x20820; // f (0, 15) = 7
+    SBOX[7][-2147483648] = 0x800; // 80000000 (1, 0) = 1
+    SBOX[7][-2147483647] = 0x8020820; // 80000001 (1, 1) = 15
+    SBOX[7][-2147483646] = 0x8000820; // 80000002 (1, 2) = 13
+    SBOX[7][-2147483645] = 0x8000000; // 80000003 (1, 3) = 8
+    SBOX[7][-2147483644] = 0x8020000; // 80000004 (1, 4) = 10
+    SBOX[7][-2147483643] = 0x20800; // 80000005 (1, 5) = 3
+    SBOX[7][-2147483642] = 0x20820; // 80000006 (1, 6) = 7
+    SBOX[7][-2147483641] = 0x20; // 80000007 (1, 7) = 4
+    SBOX[7][-2147483640] = 0x8000020; // 80000008 (1, 8) = 12
+    SBOX[7][-2147483639] = 0x820; // 80000009 (1, 9) = 5
+    SBOX[7][-2147483638] = 0x20020; // 8000000a (1, 10) = 6
+    SBOX[7][-2147483637] = 0x8020800; // 8000000b (1, 11) = 11
+    SBOX[7][-2147483636] = 0x0; // 8000000c (1, 12) = 0
+    SBOX[7][-2147483635] = 0x8020020; // 8000000d (1, 13) = 14
+    SBOX[7][-2147483634] = 0x8000800; // 8000000e (1, 14) = 9
+    SBOX[7][-2147483633] = 0x20000; // 8000000f (1, 15) = 2
+    SBOX[7][16] = 0x20820; // 10 (2, 0) = 7
+    SBOX[7][17] = 0x8020800; // 11 (2, 1) = 11
+    SBOX[7][18] = 0x20; // 12 (2, 2) = 4
+    SBOX[7][19] = 0x800; // 13 (2, 3) = 1
+    SBOX[7][20] = 0x8000800; // 14 (2, 4) = 9
+    SBOX[7][21] = 0x8000020; // 15 (2, 5) = 12
+    SBOX[7][22] = 0x8020020; // 16 (2, 6) = 14
+    SBOX[7][23] = 0x20000; // 17 (2, 7) = 2
+    SBOX[7][24] = 0x0; // 18 (2, 8) = 0
+    SBOX[7][25] = 0x20020; // 19 (2, 9) = 6
+    SBOX[7][26] = 0x8020000; // 1a (2, 10) = 10
+    SBOX[7][27] = 0x8000820; // 1b (2, 11) = 13
+    SBOX[7][28] = 0x8020820; // 1c (2, 12) = 15
+    SBOX[7][29] = 0x20800; // 1d (2, 13) = 3
+    SBOX[7][30] = 0x820; // 1e (2, 14) = 5
+    SBOX[7][31] = 0x8000000; // 1f (2, 15) = 8
+    SBOX[7][-2147483632] = 0x20000; // 80000010 (3, 0) = 2
+    SBOX[7][-2147483631] = 0x800; // 80000011 (3, 1) = 1
+    SBOX[7][-2147483630] = 0x8020020; // 80000012 (3, 2) = 14
+    SBOX[7][-2147483629] = 0x20820; // 80000013 (3, 3) = 7
+    SBOX[7][-2147483628] = 0x20; // 80000014 (3, 4) = 4
+    SBOX[7][-2147483627] = 0x8020000; // 80000015 (3, 5) = 10
+    SBOX[7][-2147483626] = 0x8000000; // 80000016 (3, 6) = 8
+    SBOX[7][-2147483625] = 0x8000820; // 80000017 (3, 7) = 13
+    SBOX[7][-2147483624] = 0x8020820; // 80000018 (3, 8) = 15
+    SBOX[7][-2147483623] = 0x8000020; // 80000019 (3, 9) = 12
+    SBOX[7][-2147483622] = 0x8000800; // 8000001a (3, 10) = 9
+    SBOX[7][-2147483621] = 0x0; // 8000001b (3, 11) = 0
+    SBOX[7][-2147483620] = 0x20800; // 8000001c (3, 12) = 3
+    SBOX[7][-2147483619] = 0x820; // 8000001d (3, 13) = 5
+    SBOX[7][-2147483618] = 0x20020; // 8000001e (3, 14) = 6
+    SBOX[7][-2147483617] = 0x8020800; // 8000001f (3, 15) = 11
+
+    State.prototype._exchangeLR = function(v, m) {
+        var t = ((this.lhs >> v) ^ this.rhs) & m;
+        this.rhs ^= t;
+        this.lhs ^= (t << v);
+    };
+
+    State.prototype._exchangeRL = function(v, m) {
+        var t = ((this.rhs >> v) ^ this.lhs) & m;
+        this.lhs ^= t;
+        this.rhs ^= (t << v);
+    };
+
+    /**
+     * Perform the initial permutation of the input to create the starting state
+     * of the algorithm. The initial permutation maps each consecutive bit of
+     * the input into a different byte of the state.
+     * 
+     * <pre>
+     * The initial permutation is defined to be:
+     * 
+     *      58    50   42    34    26   18    10    2  
+     *      60    52   44    36    28   20    12    4
+     *      62    54   46    38    30   22    14    6
+     *      64    56   48    40    32   24    16    8
+     *      57    49   41    33    25   17     9    1
+     *      59    51   43    35    27   19    11    3
+     *      61    53   45    37    29   21    13    5
+     *      63    55   47    39    31   23    15    7
+     * </pre>
+     * 
+     * 
+     * @param message
+     *            The message as an array of unsigned bytes.
+     * @param offset
+     *            The offset into the message that the current 64-bit block
+     *            begins.
+     * @returns the initial engine state
+     */
+    State.prototype.initialPerm = function(message, offset) {
+        var input = message.slice(offset, offset + 8);
+
+        this.lhs = (input[0] << 24) + (input[1] << 16) + (input[2] << 8)
+                + input[3];
+        this.rhs = (input[4] << 24) + (input[5] << 16) + (input[6] << 8)
+                + input[7];
+
+        this._exchangeLR(4, 0x0f0f0f0f);
+        this._exchangeLR(16, 0x0000ffff);
+        this._exchangeRL(2, 0x33333333);
+        this._exchangeRL(8, 0x00ff00ff);
+        this._exchangeLR(1, 0x55555555);
+    };
+
+    /**
+     * Perform one round of the DES algorithm using the given key. A round is
+     * defined as:
+     * 
+     * <pre>
+     * L&amp;rsquo = R
+     * R&amp;rsquo = L &circ; f(R, k)
+     * </pre>
+     * 
+     * where f consists of expanding, XORing with the key and contracting back
+     * with the SBOXes.
+     * 
+     * Note that the final round is defined slightly differently as:
+     * 
+     * <pre>
+     * L&amp;rsquo = L &circ; f(R, k)
+     * R&amp;rsquo = R
+     * </pre>
+     * 
+     * Therefore in the final round this function produces LHS and RHS the wrong
+     * way around.
+     * 
+     * @param k
+     *            the key
+     */
+    State.prototype.round = function(k) {
+        var r = this.rhs, l = this.lhs;
+        var f = 0;
+        for ( var i = 0; i < 8; i++) {
+            var v = (r ^ k[i]) & State.SBOX_MASK[i];
+            f += State.SBOX[i][v];
+        }
+
+        this.lhs = r;
+        this.rhs = l ^ f;
+    };
+
+    /**
+     * Apply the inverse of the initial permutation.
+     * 
+     * <pre>
+     * The inverse is defined to be:
+     * 
+     *      40     8   48    16    56   24    64   32
+     *      39     7   47    15    55   23    63   31
+     *      38     6   46    14    54   22    62   30
+     *      37     5   45    13    53   21    61   29
+     *      36     4   44    12    52   20    60   28
+     *      35     3   43    11    51   19    59   27
+     *      34     2   42    10    50   18    58   26
+     *      33     1   41     9    49   17    57   25
+     * </pre>
+     * 
+     * @param cipherText
+     * @param offset
+     */
+    State.prototype.finalPerm = function(cipherText, offset) {
+        var t = this.lhs;
+        this.lhs = this.rhs;
+        this.rhs = t;
+
+        this._exchangeLR(1, 0x55555555);
+        this._exchangeRL(8, 0x00ff00ff);
+        this._exchangeRL(2, 0x33333333);
+        this._exchangeLR(16, 0x0000ffff);
+        this._exchangeLR(4, 0x0f0f0f0f);
+
+        cipherText[offset] = (this.lhs >> 24) & 0xff;
+        cipherText[offset + 1] = (this.lhs >> 16) & 0xff;
+        cipherText[offset + 2] = (this.lhs >> 8) & 0xff;
+        cipherText[offset + 3] = (this.lhs) & 0xff;
+        cipherText[offset + 4] = (this.rhs >> 24) & 0xff;
+        cipherText[offset + 5] = (this.rhs >> 16) & 0xff;
+        cipherText[offset + 6] = (this.rhs >> 8) & 0xff;
+        cipherText[offset + 7] = (this.rhs) & 0xff;
+    };
+
+    /**
+     * DES cipher
+     */
+    var DES = C.DES = {
+        _blocksize : 2,
+
+        _keyschedule : null,
+
+        _state : new State(),
+
+        _init : function(k) {
+            this._keyschedule = new KeySchedule(k);
+        },
+
+        encrypt : function(message, password, options) {
+
+            options = options || {};
+
+            // Determine mode
+            var mode = options.mode || new C.mode.OFB;
+
+            // Allow mode to override options
+            if (mode.fixOptions)
+                mode.fixOptions(options);
+
+            var
+            // Convert to bytes if message is a string
+            m = (message.constructor == String ? UTF8.stringToBytes(message)
+                    : message),
+
+            // Generate random IV
+            iv = options.iv || util.randomBytes(8),
+
+            // Generate key
+            k = (password.constructor == String ?
+            // Derive key from passphrase
+            C.PBKDF2(password, iv, 8, {
+                asBytes : true
+            }) :
+            // else, assume byte array representing cryptographic key
+            password);
+
+            // Create key schedule
+            this._keyschedule = new KeySchedule(k);
+
+            // Encrypt
+            mode.encrypt(DES, m, iv);
+
+            // Return ciphertext
+            m = options.iv ? m : iv.concat(m);
+            return (options && options.asBytes) ? m : util.bytesToBase64(m);
+        },
+
+        _encryptblock : function(message, offset) {
+            this._state.initialPerm(message, offset);
+            for ( var i = 0; i <= 15; i++) {
+                this._state.round(this._keyschedule.getKey(i));
+            }
+            this._state.finalPerm(message, offset);
+        },
+
+        decrypt : function(ciphertext, password, options) {
+            options = options || {};
+
+            // Determine mode
+            var mode = options.mode || new C.mode.OFB;
+
+            // Allow mode to override options
+            if (mode.fixOptions)
+                mode.fixOptions(options);
+
+            var
+
+            // Convert to bytes if ciphertext is a string
+            c = (ciphertext.constructor == String ? util
+                    .base64ToBytes(ciphertext) : ciphertext),
+
+            // Separate IV and message
+            iv = options.iv || c.splice(0, 8),
+
+            // Generate key
+            k = (password.constructor == String ?
+            // Derive key from passphrase
+            C.PBKDF2(password, iv, 32, {
+                asBytes : true
+            }) :
+            // else, assume byte array representing cryptographic key
+            password);
+
+            // Create key schedule
+            this._keyschedule = new KeySchedule(k);
+
+            mode.decrypt(DES, c, iv);
+
+            // Return plaintext
+            return (options && options.asBytes) ? c : UTF8.bytesToString(c);
+        },
+
+        _decryptblock : function(message, offset) {
+            this._state.initialPerm(message, offset);
+            for ( var i = 15; i >= 0; i--) {
+                this._state.round(this._keyschedule.getKey(i));
+            }
+            this._state.finalPerm(message, offset);
+        }
+
+    };
+})();

+ 38 - 0
pinche/util/cryptojs-master/lib/HMAC.js

@@ -0,0 +1,38 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+C.HMAC = function (hasher, message, key, options) {
+
+	// Convert to byte arrays
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	if (key.constructor == String) key = UTF8.stringToBytes(key);
+	/* else, assume byte arrays already */
+
+	// Allow arbitrary length keys
+	if (key.length > hasher._blocksize * 4)
+		key = hasher(key, { asBytes: true });
+
+	// XOR keys with pad constants
+	var okey = key.slice(0),
+	    ikey = key.slice(0);
+	for (var i = 0; i < hasher._blocksize * 4; i++) {
+		okey[i] ^= 0x5C;
+		ikey[i] ^= 0x36;
+	}
+
+	var hmacbytes = hasher(okey.concat(hasher(ikey.concat(message), { asBytes: true })), { asBytes: true });
+
+	return options && options.asBytes ? hmacbytes :
+	       options && options.asString ? Binary.bytesToString(hmacbytes) :
+	       util.bytesToHex(hmacbytes);
+
+};
+
+})();

+ 117 - 0
pinche/util/cryptojs-master/lib/MARC4.js

@@ -0,0 +1,117 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+var MARC4 = C.MARC4 = {
+
+	/**
+	 * Public API
+	 */
+
+	encrypt: function (message, password) {
+
+		var
+
+		    // Convert to bytes
+		    m = UTF8.stringToBytes(message),
+
+		    // Generate random IV
+		    iv = util.randomBytes(16),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Encrypt
+		MARC4._marc4(m, k, 1536);
+
+		// Return ciphertext
+		return util.bytesToBase64(iv.concat(m));
+
+	},
+
+	decrypt: function (ciphertext, password) {
+
+		var
+
+		    // Convert to bytes
+		    c = util.base64ToBytes(ciphertext),
+
+		    // Separate IV and message
+		    iv = c.splice(0, 16),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Decrypt
+		MARC4._marc4(c, k, 1536);
+
+		// Return plaintext
+		return UTF8.bytesToString(c);
+
+	},
+
+
+	/**
+	 * Internal methods
+	 */
+
+	// The core
+	_marc4: function (m, k, drop) {
+
+		// State variables
+		var i, j, s, temp;
+
+		// Key setup
+		for (i = 0, s = []; i < 256; i++) s[i] = i;
+		for (i = 0, j = 0;  i < 256; i++) {
+
+			j = (j + s[i] + k[i % k.length]) % 256;
+
+			// Swap
+			temp = s[i];
+			s[i] = s[j];
+			s[j] = temp;
+
+		}
+
+		// Clear counters
+		i = j = 0;
+
+		// Encryption
+		for (var k = -drop; k < m.length; k++) {
+
+			i = (i + 1) % 256;
+			j = (j + s[i]) % 256;
+
+			// Swap
+			temp = s[i];
+			s[i] = s[j];
+			s[j] = temp;
+
+			// Stop here if we're still dropping keystream
+			if (k < 0) continue;
+
+			// Encrypt
+			m[k] ^= s[(s[i] + s[j]) % 256];
+
+		}
+
+	}
+
+};
+
+})();

+ 158 - 0
pinche/util/cryptojs-master/lib/MD5.js

@@ -0,0 +1,158 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Public API
+var MD5 = C.MD5 = function (message, options) {
+	var digestbytes = util.wordsToBytes(MD5._md5(message));
+	return options && options.asBytes ? digestbytes :
+	       options && options.asString ? Binary.bytesToString(digestbytes) :
+	       util.bytesToHex(digestbytes);
+};
+
+// The core
+MD5._md5 = function (message) {
+
+	// Convert to byte array
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	/* else, assume byte array already */
+
+	var m = util.bytesToWords(message),
+	    l = message.length * 8,
+	    a =  1732584193,
+	    b = -271733879,
+	    c = -1732584194,
+	    d =  271733878;
+
+	// Swap endian
+	for (var i = 0; i < m.length; i++) {
+		m[i] = ((m[i] <<  8) | (m[i] >>> 24)) & 0x00FF00FF |
+		       ((m[i] << 24) | (m[i] >>>  8)) & 0xFF00FF00;
+	}
+
+	// Padding
+	m[l >>> 5] |= 0x80 << (l % 32);
+	m[(((l + 64) >>> 9) << 4) + 14] = l;
+
+	// Method shortcuts
+	var FF = MD5._ff,
+	    GG = MD5._gg,
+	    HH = MD5._hh,
+	    II = MD5._ii;
+
+	for (var i = 0; i < m.length; i += 16) {
+
+		var aa = a,
+		    bb = b,
+		    cc = c,
+		    dd = d;
+
+		a = FF(a, b, c, d, m[i+ 0],  7, -680876936);
+		d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
+		c = FF(c, d, a, b, m[i+ 2], 17,  606105819);
+		b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
+		a = FF(a, b, c, d, m[i+ 4],  7, -176418897);
+		d = FF(d, a, b, c, m[i+ 5], 12,  1200080426);
+		c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
+		b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
+		a = FF(a, b, c, d, m[i+ 8],  7,  1770035416);
+		d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
+		c = FF(c, d, a, b, m[i+10], 17, -42063);
+		b = FF(b, c, d, a, m[i+11], 22, -1990404162);
+		a = FF(a, b, c, d, m[i+12],  7,  1804603682);
+		d = FF(d, a, b, c, m[i+13], 12, -40341101);
+		c = FF(c, d, a, b, m[i+14], 17, -1502002290);
+		b = FF(b, c, d, a, m[i+15], 22,  1236535329);
+
+		a = GG(a, b, c, d, m[i+ 1],  5, -165796510);
+		d = GG(d, a, b, c, m[i+ 6],  9, -1069501632);
+		c = GG(c, d, a, b, m[i+11], 14,  643717713);
+		b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
+		a = GG(a, b, c, d, m[i+ 5],  5, -701558691);
+		d = GG(d, a, b, c, m[i+10],  9,  38016083);
+		c = GG(c, d, a, b, m[i+15], 14, -660478335);
+		b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
+		a = GG(a, b, c, d, m[i+ 9],  5,  568446438);
+		d = GG(d, a, b, c, m[i+14],  9, -1019803690);
+		c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
+		b = GG(b, c, d, a, m[i+ 8], 20,  1163531501);
+		a = GG(a, b, c, d, m[i+13],  5, -1444681467);
+		d = GG(d, a, b, c, m[i+ 2],  9, -51403784);
+		c = GG(c, d, a, b, m[i+ 7], 14,  1735328473);
+		b = GG(b, c, d, a, m[i+12], 20, -1926607734);
+
+		a = HH(a, b, c, d, m[i+ 5],  4, -378558);
+		d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
+		c = HH(c, d, a, b, m[i+11], 16,  1839030562);
+		b = HH(b, c, d, a, m[i+14], 23, -35309556);
+		a = HH(a, b, c, d, m[i+ 1],  4, -1530992060);
+		d = HH(d, a, b, c, m[i+ 4], 11,  1272893353);
+		c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
+		b = HH(b, c, d, a, m[i+10], 23, -1094730640);
+		a = HH(a, b, c, d, m[i+13],  4,  681279174);
+		d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
+		c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
+		b = HH(b, c, d, a, m[i+ 6], 23,  76029189);
+		a = HH(a, b, c, d, m[i+ 9],  4, -640364487);
+		d = HH(d, a, b, c, m[i+12], 11, -421815835);
+		c = HH(c, d, a, b, m[i+15], 16,  530742520);
+		b = HH(b, c, d, a, m[i+ 2], 23, -995338651);
+
+		a = II(a, b, c, d, m[i+ 0],  6, -198630844);
+		d = II(d, a, b, c, m[i+ 7], 10,  1126891415);
+		c = II(c, d, a, b, m[i+14], 15, -1416354905);
+		b = II(b, c, d, a, m[i+ 5], 21, -57434055);
+		a = II(a, b, c, d, m[i+12],  6,  1700485571);
+		d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
+		c = II(c, d, a, b, m[i+10], 15, -1051523);
+		b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
+		a = II(a, b, c, d, m[i+ 8],  6,  1873313359);
+		d = II(d, a, b, c, m[i+15], 10, -30611744);
+		c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
+		b = II(b, c, d, a, m[i+13], 21,  1309151649);
+		a = II(a, b, c, d, m[i+ 4],  6, -145523070);
+		d = II(d, a, b, c, m[i+11], 10, -1120210379);
+		c = II(c, d, a, b, m[i+ 2], 15,  718787259);
+		b = II(b, c, d, a, m[i+ 9], 21, -343485551);
+
+		a = (a + aa) >>> 0;
+		b = (b + bb) >>> 0;
+		c = (c + cc) >>> 0;
+		d = (d + dd) >>> 0;
+
+	}
+
+	return util.endian([a, b, c, d]);
+
+};
+
+// Auxiliary functions
+MD5._ff  = function (a, b, c, d, x, s, t) {
+	var n = a + (b & c | ~b & d) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+MD5._gg  = function (a, b, c, d, x, s, t) {
+	var n = a + (b & d | c & ~d) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+MD5._hh  = function (a, b, c, d, x, s, t) {
+	var n = a + (b ^ c ^ d) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+MD5._ii  = function (a, b, c, d, x, s, t) {
+	var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+
+// Package private blocksize
+MD5._blocksize = 16;
+
+MD5._digestsize = 16;
+
+})();

+ 49 - 0
pinche/util/cryptojs-master/lib/PBKDF2.js

@@ -0,0 +1,49 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+C.PBKDF2 = function (password, salt, keylen, options) {
+
+	// Convert to byte arrays
+	if (password.constructor == String) password = UTF8.stringToBytes(password);
+	if (salt.constructor == String) salt = UTF8.stringToBytes(salt);
+	/* else, assume byte arrays already */
+
+	// Defaults
+	var hasher = options && options.hasher || C.SHA1,
+	    iterations = options && options.iterations || 1;
+
+	// Pseudo-random function
+	function PRF(password, salt) {
+		return C.HMAC(hasher, salt, password, { asBytes: true });
+	}
+
+	// Generate key
+	var derivedKeyBytes = [],
+	    blockindex = 1;
+	while (derivedKeyBytes.length < keylen) {
+		var block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));
+		for (var u = block, i = 1; i < iterations; i++) {
+			u = PRF(password, u);
+			for (var j = 0; j < block.length; j++) block[j] ^= u[j];
+		}
+		derivedKeyBytes = derivedKeyBytes.concat(block);
+		blockindex++;
+	}
+
+	// Truncate excess bytes
+	derivedKeyBytes.length = keylen;
+
+	return options && options.asBytes ? derivedKeyBytes :
+	       options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
+	       util.bytesToHex(derivedKeyBytes);
+
+};
+
+})();

+ 88 - 0
pinche/util/cryptojs-master/lib/PBKDF2Async.js

@@ -0,0 +1,88 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+if (!C.nextTick) {
+    // node.js has setTime out but prefer process.nextTick
+    if (typeof process != 'undefined' && typeof process.nextTick !== 'undefined') {
+        C.nextTick = process.nextTick;
+    } else if (typeof setTimeout !== 'undefined') {
+        C.nextTick = function (callback) {
+            setTimeout(callback, 0);
+        };
+    }
+}
+
+C.PBKDF2Async = function (password, salt, keylen, callback, options) {
+
+    // Convert to byte arrays
+    if (password.constructor == String) password = UTF8.stringToBytes(password);
+    if (salt.constructor == String) salt = UTF8.stringToBytes(salt);
+    /* else, assume byte arrays already */
+
+    // Defaults
+    var hasher = options && options.hasher || C.SHA1,
+        iterations = options && options.iterations || 1;
+
+    // Progress callback option
+    var progressChangeHandler = options && options.onProgressChange;
+    var totalIterations = Math.ceil(keylen / hasher._digestsize) * iterations;
+    function fireProgressChange(currentIteration) {
+        if (progressChangeHandler) {
+            var iterationsSoFar = derivedKeyBytes.length / hasher._digestsize * iterations + currentIteration;
+            setTimeout(function () {
+                progressChangeHandler(Math.round(iterationsSoFar / totalIterations * 100));
+            }, 0);
+        }
+    }
+
+    // Pseudo-random function
+    function PRF(password, salt) {
+        return C.HMAC(hasher, salt, password, { asBytes: true });
+    }
+
+    var nextTick = C.nextTick;
+
+    // Generate key
+    var derivedKeyBytes = [],
+        blockindex = 1;
+
+    var outer, inner;
+    nextTick(outer = function () {
+        if (derivedKeyBytes.length < keylen) {
+            var block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));
+            fireProgressChange(1);
+
+            var u = block, i = 1;
+            nextTick(inner = function () {
+                if (i < iterations) {
+                    u = PRF(password, u);
+                    for (var j = 0; j < block.length; j++) block[j] ^= u[j];
+                    i++;
+                    fireProgressChange(i);
+
+                    nextTick(inner);
+                } else {
+                    derivedKeyBytes = derivedKeyBytes.concat(block);
+                    blockindex++;
+                    nextTick(outer);
+                }
+            });
+        } else {
+            // Truncate excess bytes
+            derivedKeyBytes.length = keylen;
+            callback(
+                    options && options.asBytes ? derivedKeyBytes :
+                    options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
+                    util.bytesToHex(derivedKeyBytes));
+        }
+    });
+};
+
+})();

+ 221 - 0
pinche/util/cryptojs-master/lib/Rabbit.js

@@ -0,0 +1,221 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Inner state
+var x = [],
+    c = [],
+    b;
+
+var Rabbit = C.Rabbit = {
+
+	/**
+	 * Public API
+	 */
+
+	encrypt: function (message, password) {
+
+		var
+
+		    // Convert to bytes
+		    m = UTF8.stringToBytes(message),
+
+		    // Generate random IV
+		    iv = util.randomBytes(8),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Encrypt
+		Rabbit._rabbit(m, k, util.bytesToWords(iv));
+
+		// Return ciphertext
+		return util.bytesToBase64(iv.concat(m));
+
+	},
+
+	decrypt: function (ciphertext, password) {
+
+		var
+
+		    // Convert to bytes
+		    c = util.base64ToBytes(ciphertext),
+
+		    // Separate IV and message
+		    iv = c.splice(0, 8),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Decrypt
+		Rabbit._rabbit(c, k, util.bytesToWords(iv));
+
+		// Return plaintext
+		return UTF8.bytesToString(c);
+
+	},
+
+
+	/**
+	 * Internal methods
+	 */
+
+	// Encryption/decryption scheme
+	_rabbit: function (m, k, iv) {
+
+		Rabbit._keysetup(k);
+		if (iv) Rabbit._ivsetup(iv);
+
+		for (var s = [], i = 0; i < m.length; i++) {
+
+			if (i % 16 == 0) {
+
+				// Iterate the system
+				Rabbit._nextstate();
+
+				// Generate 16 bytes of pseudo-random data
+				s[0] = x[0] ^ (x[5] >>> 16) ^ (x[3] << 16);
+				s[1] = x[2] ^ (x[7] >>> 16) ^ (x[5] << 16);
+				s[2] = x[4] ^ (x[1] >>> 16) ^ (x[7] << 16);
+				s[3] = x[6] ^ (x[3] >>> 16) ^ (x[1] << 16);
+
+				// Swap endian
+				for (var j = 0; j < 4; j++) {
+					s[j] = ((s[j] <<  8) | (s[j] >>> 24)) & 0x00FF00FF |
+					       ((s[j] << 24) | (s[j] >>>  8)) & 0xFF00FF00;
+				}
+
+				// Convert words to bytes
+				for (var b = 120; b >= 0; b -= 8)
+					s[b / 8] = (s[b >>> 5] >>> (24 - b % 32)) & 0xFF;
+
+			}
+
+			m[i] ^= s[i % 16];
+
+		}
+
+	},
+
+	// Key setup scheme
+	_keysetup: function (k) {
+
+		// Generate initial state values
+		x[0] = k[0];
+		x[2] = k[1];
+		x[4] = k[2];
+		x[6] = k[3];
+		x[1] = (k[3] << 16) | (k[2] >>> 16);
+		x[3] = (k[0] << 16) | (k[3] >>> 16);
+		x[5] = (k[1] << 16) | (k[0] >>> 16);
+		x[7] = (k[2] << 16) | (k[1] >>> 16);
+
+		// Generate initial counter values
+		c[0] = util.rotl(k[2], 16);
+		c[2] = util.rotl(k[3], 16);
+		c[4] = util.rotl(k[0], 16);
+		c[6] = util.rotl(k[1], 16);
+		c[1] = (k[0] & 0xFFFF0000) | (k[1] & 0xFFFF);
+		c[3] = (k[1] & 0xFFFF0000) | (k[2] & 0xFFFF);
+		c[5] = (k[2] & 0xFFFF0000) | (k[3] & 0xFFFF);
+		c[7] = (k[3] & 0xFFFF0000) | (k[0] & 0xFFFF);
+
+		// Clear carry bit
+		b = 0;
+
+		// Iterate the system four times
+		for (var i = 0; i < 4; i++) Rabbit._nextstate();
+
+		// Modify the counters
+		for (var i = 0; i < 8; i++) c[i] ^= x[(i + 4) & 7];
+
+	},
+
+	// IV setup scheme
+	_ivsetup: function (iv) {
+
+		// Generate four subvectors
+		var i0 = util.endian(iv[0]),
+		    i2 = util.endian(iv[1]),
+		    i1 = (i0 >>> 16) | (i2 & 0xFFFF0000),
+		    i3 = (i2 <<  16) | (i0 & 0x0000FFFF);
+
+		// Modify counter values
+		c[0] ^= i0;
+		c[1] ^= i1;
+		c[2] ^= i2;
+		c[3] ^= i3;
+		c[4] ^= i0;
+		c[5] ^= i1;
+		c[6] ^= i2;
+		c[7] ^= i3;
+
+		// Iterate the system four times
+		for (var i = 0; i < 4; i++) Rabbit._nextstate();
+
+	},
+
+	// Next-state function
+	_nextstate: function () {
+
+		// Save old counter values
+		for (var c_old = [], i = 0; i < 8; i++) c_old[i] = c[i];
+
+		// Calculate new counter values
+		c[0] = (c[0] + 0x4D34D34D + b) >>> 0;
+		c[1] = (c[1] + 0xD34D34D3 + ((c[0] >>> 0) < (c_old[0] >>> 0) ? 1 : 0)) >>> 0;
+		c[2] = (c[2] + 0x34D34D34 + ((c[1] >>> 0) < (c_old[1] >>> 0) ? 1 : 0)) >>> 0;
+		c[3] = (c[3] + 0x4D34D34D + ((c[2] >>> 0) < (c_old[2] >>> 0) ? 1 : 0)) >>> 0;
+		c[4] = (c[4] + 0xD34D34D3 + ((c[3] >>> 0) < (c_old[3] >>> 0) ? 1 : 0)) >>> 0;
+		c[5] = (c[5] + 0x34D34D34 + ((c[4] >>> 0) < (c_old[4] >>> 0) ? 1 : 0)) >>> 0;
+		c[6] = (c[6] + 0x4D34D34D + ((c[5] >>> 0) < (c_old[5] >>> 0) ? 1 : 0)) >>> 0;
+		c[7] = (c[7] + 0xD34D34D3 + ((c[6] >>> 0) < (c_old[6] >>> 0) ? 1 : 0)) >>> 0;
+		b = (c[7] >>> 0) < (c_old[7] >>> 0) ? 1 : 0;
+
+		// Calculate the g-values
+		for (var g = [], i = 0; i < 8; i++) {
+
+			var gx = (x[i] + c[i]) >>> 0;
+
+			// Construct high and low argument for squaring
+			var ga = gx & 0xFFFF,
+			    gb = gx >>> 16;
+
+			// Calculate high and low result of squaring
+			var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb,
+			    gl = (((gx & 0xFFFF0000) * gx) >>> 0) + (((gx & 0x0000FFFF) * gx) >>> 0) >>> 0;
+
+			// High XOR low
+			g[i] = gh ^ gl;
+
+		}
+
+		// Calculate new state values
+		x[0] = g[0] + ((g[7] << 16) | (g[7] >>> 16)) + ((g[6] << 16) | (g[6] >>> 16));
+		x[1] = g[1] + ((g[0] <<  8) | (g[0] >>> 24)) + g[7];
+		x[2] = g[2] + ((g[1] << 16) | (g[1] >>> 16)) + ((g[0] << 16) | (g[0] >>> 16));
+		x[3] = g[3] + ((g[2] <<  8) | (g[2] >>> 24)) + g[1];
+		x[4] = g[4] + ((g[3] << 16) | (g[3] >>> 16)) + ((g[2] << 16) | (g[2] >>> 16));
+		x[5] = g[5] + ((g[4] <<  8) | (g[4] >>> 24)) + g[3];
+		x[6] = g[6] + ((g[5] << 16) | (g[5] >>> 16)) + ((g[4] << 16) | (g[4] >>> 16));
+		x[7] = g[7] + ((g[6] <<  8) | (g[6] >>> 24)) + g[5];
+
+	}
+
+};
+
+})();

+ 86 - 0
pinche/util/cryptojs-master/lib/SHA1.js

@@ -0,0 +1,86 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Public API
+var SHA1 = C.SHA1 = function (message, options) {
+	var digestbytes = util.wordsToBytes(SHA1._sha1(message));
+	return options && options.asBytes ? digestbytes :
+	       options && options.asString ? Binary.bytesToString(digestbytes) :
+	       util.bytesToHex(digestbytes);
+};
+
+// The core
+SHA1._sha1 = function (message) {
+
+	// Convert to byte array
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	/* else, assume byte array already */
+
+	var m  = util.bytesToWords(message),
+	    l  = message.length * 8,
+	    w  =  [],
+	    H0 =  1732584193,
+	    H1 = -271733879,
+	    H2 = -1732584194,
+	    H3 =  271733878,
+	    H4 = -1009589776;
+
+	// Padding
+	m[l >> 5] |= 0x80 << (24 - l % 32);
+	m[((l + 64 >>> 9) << 4) + 15] = l;
+
+	for (var i = 0; i < m.length; i += 16) {
+
+		var a = H0,
+		    b = H1,
+		    c = H2,
+		    d = H3,
+		    e = H4;
+
+		for (var j = 0; j < 80; j++) {
+
+			if (j < 16) w[j] = m[i + j];
+			else {
+				var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];
+				w[j] = (n << 1) | (n >>> 31);
+			}
+
+			var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (
+			         j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :
+			         j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :
+			         j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :
+			                  (H1 ^ H2 ^ H3) - 899497514);
+
+			H4 =  H3;
+			H3 =  H2;
+			H2 = (H1 << 30) | (H1 >>> 2);
+			H1 =  H0;
+			H0 =  t;
+
+		}
+
+		H0 += a;
+		H1 += b;
+		H2 += c;
+		H3 += d;
+		H4 += e;
+
+	}
+
+	return [H0, H1, H2, H3, H4];
+
+};
+
+// Package private blocksize
+SHA1._blocksize = 16;
+
+SHA1._digestsize = 20;
+
+})();

+ 130 - 0
pinche/util/cryptojs-master/lib/SHA256.js

@@ -0,0 +1,130 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Constants
+var K = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
+          0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
+          0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
+          0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
+          0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
+          0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
+          0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
+          0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
+          0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
+          0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
+          0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
+          0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
+          0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
+          0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
+          0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
+          0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 ];
+
+// Public API
+var SHA256 = C.SHA256 = function (message, options) {
+	var digestbytes = util.wordsToBytes(SHA256._sha256(message));
+	return options && options.asBytes ? digestbytes :
+	       options && options.asString ? Binary.bytesToString(digestbytes) :
+	       util.bytesToHex(digestbytes);
+};
+
+// The core
+SHA256._sha256 = function (message) {
+
+	// Convert to byte array
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	/* else, assume byte array already */
+
+	var m = util.bytesToWords(message),
+	    l = message.length * 8,
+	    H = [ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
+	          0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 ],
+	    w = [],
+	    a, b, c, d, e, f, g, h, i, j,
+	    t1, t2;
+
+	// Padding
+	m[l >> 5] |= 0x80 << (24 - l % 32);
+	m[((l + 64 >> 9) << 4) + 15] = l;
+
+	for (var i = 0; i < m.length; i += 16) {
+
+		a = H[0];
+		b = H[1];
+		c = H[2];
+		d = H[3];
+		e = H[4];
+		f = H[5];
+		g = H[6];
+		h = H[7];
+
+		for (var j = 0; j < 64; j++) {
+
+			if (j < 16) w[j] = m[j + i];
+			else {
+
+				var gamma0x = w[j - 15],
+				    gamma1x = w[j - 2],
+				    gamma0  = ((gamma0x << 25) | (gamma0x >>>  7)) ^
+				              ((gamma0x << 14) | (gamma0x >>> 18)) ^
+				               (gamma0x >>> 3),
+				    gamma1  = ((gamma1x <<  15) | (gamma1x >>> 17)) ^
+				              ((gamma1x <<  13) | (gamma1x >>> 19)) ^
+				               (gamma1x >>> 10);
+
+				w[j] = gamma0 + (w[j - 7] >>> 0) +
+				       gamma1 + (w[j - 16] >>> 0);
+
+			}
+
+			var ch  = e & f ^ ~e & g,
+			    maj = a & b ^ a & c ^ b & c,
+			    sigma0 = ((a << 30) | (a >>>  2)) ^
+			             ((a << 19) | (a >>> 13)) ^
+			             ((a << 10) | (a >>> 22)),
+			    sigma1 = ((e << 26) | (e >>>  6)) ^
+			             ((e << 21) | (e >>> 11)) ^
+			             ((e <<  7) | (e >>> 25));
+
+
+			t1 = (h >>> 0) + sigma1 + ch + (K[j]) + (w[j] >>> 0);
+			t2 = sigma0 + maj;
+
+			h = g;
+			g = f;
+			f = e;
+			e = (d + t1) >>> 0;
+			d = c;
+			c = b;
+			b = a;
+			a = (t1 + t2) >>> 0;
+
+		}
+
+		H[0] += a;
+		H[1] += b;
+		H[2] += c;
+		H[3] += d;
+		H[4] += e;
+		H[5] += f;
+		H[6] += g;
+		H[7] += h;
+
+	}
+
+	return H;
+
+};
+
+// Package private blocksize
+SHA256._blocksize = 16;
+
+SHA256._digestsize = 32;
+
+})();

+ 18 - 0
pinche/util/cryptojs-master/package.json

@@ -0,0 +1,18 @@
+{
+  "author": "Jeff Guo <gwjjeff@gmail.com>",
+  "name": "cryptojs",
+  "tags": ["Hash", "MD5", "SHA1", "SHA-1", "SHA256", "SHA-256", "RC4", "Rabbit", "AES", "DES", "PBKDF2", "HMAC", "OFB", "CFB", "CTR", "CBC", "Base64"],
+  "description": "Following googlecode project crypto-js, provide standard and secure cryptographic algorithms for NodeJS. Support MD5, SHA-1, SHA-256, RC4, Rabbit, AES, DES, PBKDF2, HMAC, OFB, CFB, CTR, CBC, Base64",
+  "version": "2.5.3",
+  "homepage": "https://github.com/gwjjeff/cryptojs",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/gwjjeff/cryptojs.git"
+  },
+  "main": "cryptojs.js",
+  "engines": {
+    "node": "*"
+  },
+  "dependencies": {},
+  "devDependencies": {}
+}

+ 25 - 0
pinche/util/cryptojs-master/test/PBKDF2-test.js

@@ -0,0 +1,25 @@
+var assert = require('assert');
+var Crypto = require('../cryptojs').Crypto; 
+
+(function test_PBKDF2() {
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 128 / 8), "cdedb5281bb2f801565a1122b2563515");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 256 / 8), "cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 128 / 8, { iterations : 2	}), "01dbee7f4a9e243e988b62c73cda935d");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 256 / 8, { iterations : 2 }), "01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 128 / 8, { iterations : 1200}), "5c08eb61fdf71e4e4ec3cf6ba1f5512b");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 256 / 8, { iterations : 1200}), "5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13");
+	assert.strictEqual(Crypto.PBKDF2("password", "\x12\x34\x56\x78\x78\x56\x34\x12", 128 / 8, {	iterations : 5 }), "d1daa78615f287e6a1c8b120d7062a49");
+	assert.strictEqual(Crypto.PBKDF2("password", "\x12\x34\x56\x78\x78\x56\x34\x12", 256 / 8, {	iterations : 5 }), "d1daa78615f287e6a1c8b120d7062a493f98d203e6be49a6adf4fa574b6e64ee");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", 128 / 8, { iterations : 1200 }), "139c30c0966bc32ba55fdbf212530ac9");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", 256 / 8, { iterations : 1200 }), "139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 128 / 8, { iterations : 1200 }), "9ccad6d468770cd51b10e6a68721be61");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 256 / 8, { iterations : 1200 }), "9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a");
+	assert.strictEqual(Crypto.PBKDF2([0xf0, 0x9d, 0x84, 0x9e], "EXAMPLE.COMpianist", 128 / 8, { iterations : 50 }), "6b9cf26d45455a43a5b8bb276a403b39");
+	assert.strictEqual(Crypto.PBKDF2([0xf0, 0x9d, 0x84, 0x9e], "EXAMPLE.COMpianist", 256 / 8, { iterations : 50 }), "6b9cf26d45455a43a5b8bb276a403b39e7fe37a0c41e02c281ff3069e1e94f52");
+})(); 
+
+(function test_PBKSD2Async() {
+	Crypto.PBKDF2Async("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 256 / 8, function(result) {
+		assert.strictEqual(result, "9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a");
+	}, { iterations : 1200 });
+})();

+ 13 - 0
pinche/util/cryptojs-master/test/test.coffee

@@ -0,0 +1,13 @@
+Crypto = (require '../cryptojs').Crypto
+key = '12345678'
+us = 'Hello, 世界!'
+
+mode = new Crypto.mode.ECB Crypto.pad.pkcs7
+
+console.log "ub = #{ub = Crypto.charenc.UTF8.stringToBytes us}"
+console.log "eb = #{eb = Crypto.DES.encrypt ub, key, {asBytes: true, mode: mode}}"
+console.log "ehs= #{ehs= Crypto.util.bytesToHex eb}"
+
+console.log "eb2= #{eb2= Crypto.util.hexToBytes ehs}"
+console.log "ub2= #{ub2= Crypto.DES.decrypt eb2, key, {asBytes: true, mode: mode}}"
+console.log "us2= #{us2= Crypto.charenc.UTF8.bytesToString ub2}"

+ 4 - 2
unimall-admin/config/dev.env.js

@@ -1,6 +1,8 @@
 module.exports = {
 module.exports = {
     NODE_ENV: '"development"',
     NODE_ENV: '"development"',
     ENV_CONFIG: '"dev"',
     ENV_CONFIG: '"dev"',
-    HOST: '"http://localhost:8090"',
-    BASE_API: '"http://localhost:8090/m.api"'
+    // HOST: '"http://192.168.110.82:8090"',
+    // BASE_API: '"http://192.168.110.82:8090/m.api"'
+    HOST: '"http://172.16.5.244:8090"',
+    BASE_API: '"http://172.16.5.244:8090/m.api"'
 }
 }

+ 2 - 2
unimall-admin/config/prod.env.js

@@ -1,6 +1,6 @@
 module.exports = {
 module.exports = {
     NODE_ENV: '"production"',
     NODE_ENV: '"production"',
     ENV_CONFIG: '"prod"',
     ENV_CONFIG: '"prod"',
-    HOST: '"https://shiyaopinche.cspc.cn"',
-    BASE_API: '"https://shiyaopinche.cspc.cn/m.api"'
+    HOST: '"https://shiyaopinche.cspc.cn:10443"',
+    BASE_API: '"https://shiyaopinche.cspc.cn:10443/m.api"'
 }
 }

+ 10 - 0
unimall-admin/src/router/route.json

@@ -36,6 +36,16 @@
                     "icon": "logininfor",
                     "icon": "logininfor",
                     "noCache": true
                     "noCache": true
                 }
                 }
+            },
+            {
+                "path": "filing",
+                "name": "filing",
+                "page": "/filing/index",
+                "meta": {
+                    "title": "司机审核",
+                    "icon": "logininfor",
+                    "noCache": true
+                }
             }
             }
         ]
         ]
     },
     },

+ 36 - 22
unimall-admin/src/views/appointment/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="app-container">
   <div class="app-container">
-    <!-- <el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
-      <el-form-item label="" prop="companyId">
+    <el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
+      <!-- <el-form-item label="" prop="companyId">
         <el-input
         <el-input
           v-model="queryParams.companyId"
           v-model="queryParams.companyId"
           placeholder="请输入"
           placeholder="请输入"
@@ -9,7 +9,7 @@
           size="small"
           size="small"
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="预约人" prop="appointedBy">
       <el-form-item label="预约人" prop="appointedBy">
         <el-input
         <el-input
           v-model="queryParams.appointedBy"
           v-model="queryParams.appointedBy"
@@ -19,11 +19,11 @@
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="拼车类型" prop="carpoolingType">
+      <!-- <el-form-item label="拼车类型" prop="carpoolingType">
         <el-select v-model="queryParams.carpoolingType" placeholder="请选择拼车类型" clearable size="small">
         <el-select v-model="queryParams.carpoolingType" placeholder="请选择拼车类型" clearable size="small">
           <el-option label="请选择字典生成" value="" />
           <el-option label="请选择字典生成" value="" />
         </el-select>
         </el-select>
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="路线" prop="route">
       <el-form-item label="路线" prop="route">
         <el-input
         <el-input
           v-model="queryParams.route"
           v-model="queryParams.route"
@@ -42,7 +42,7 @@
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="出发地点" prop="startPlace">
+      <!-- <el-form-item label="出发地点" prop="startPlace">
         <el-input
         <el-input
           v-model="queryParams.startPlace"
           v-model="queryParams.startPlace"
           placeholder="请输入出发地点"
           placeholder="请输入出发地点"
@@ -114,13 +114,17 @@
           size="small"
           size="small"
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="状态" prop="status">
       <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
+        <el-input
+          v-model="queryParams.status"
+          placeholder="请输入状态"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="0:否" prop="deleteFlag">
+      <!-- <el-form-item label="0:否" prop="deleteFlag">
         <el-input
         <el-input
           v-model="queryParams.deleteFlag"
           v-model="queryParams.deleteFlag"
           placeholder="请输入0:否"
           placeholder="请输入0:否"
@@ -166,14 +170,14 @@
           size="small"
           size="small"
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
       </el-form-item>
-    </el-form> -->
+    </el-form>
 
 
-    <el-row :gutter="10" class="mb8">
+    <!-- <el-row :gutter="10" class="mb8">
       <el-col :span="1.5">
       <el-col :span="1.5">
         <el-button
         <el-button
           v-permission="['unimall:appointment:add']"
           v-permission="['unimall:appointment:add']"
@@ -203,7 +207,7 @@
           @click="handleDelete"
           @click="handleDelete"
         >删除</el-button>
         >删除</el-button>
       </el-col>
       </el-col>
-      <!-- <el-col :span="1.5">
+      <el-col :span="1.5">
         <el-button
         <el-button
           v-permission="['unimall:appointment:export']"
           v-permission="['unimall:appointment:export']"
           type="warning"
           type="warning"
@@ -211,8 +215,8 @@
           size="mini"
           size="mini"
           @click="handleExport"
           @click="handleExport"
         >导出</el-button>
         >导出</el-button>
-      </el-col> -->
-    </el-row>
+      </el-col>
+    </el-row> -->
 
 
     <el-table v-loading="loading" :data="appointmentList" @selection-change="handleSelectionChange">
     <el-table v-loading="loading" :data="appointmentList" @selection-change="handleSelectionChange">
       <!-- <el-table-column type="selection" width="55" align="center" /> -->
       <!-- <el-table-column type="selection" width="55" align="center" /> -->
@@ -290,8 +294,12 @@
           <el-input v-model="form.appointedBy" placeholder="请输入预约人" />
           <el-input v-model="form.appointedBy" placeholder="请输入预约人" />
         </el-form-item>
         </el-form-item>
         <el-form-item label="拼车类型">
         <el-form-item label="拼车类型">
-          <el-select v-model="form.carpoolingType" placeholder="请选择拼车类型">
-            <el-option label="请选择字典生成" value="" />
+          <el-select v-model="form.carpoolingType" placeholder="请选择拼车类型" style="width:100%">
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"/>
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
         <el-form-item label="路线" prop="route">
         <el-form-item label="路线" prop="route">
@@ -315,11 +323,10 @@
         <el-form-item label="出发时间" prop="departureTime">
         <el-form-item label="出发时间" prop="departureTime">
           <el-date-picker
           <el-date-picker
             v-model="form.departureTime"
             v-model="form.departureTime"
+            style="width:100%"
             clearable
             clearable
             size="small"
             size="small"
-            style="width: 200px"
-            type="date"
-            value-format="yyyy-MM-dd"
+            type="datetime"
             placeholder="选择出发时间"/>
             placeholder="选择出发时间"/>
         </el-form-item>
         </el-form-item>
         <el-form-item label="人数" prop="numberPeople">
         <el-form-item label="人数" prop="numberPeople">
@@ -392,6 +399,13 @@ import { listAppointment, getAppointment, delAppointment, addAppointment, update
 export default {
 export default {
   data() {
   data() {
     return {
     return {
+      options: [{
+        value: '人找车',
+        label: '人找车'
+      }, {
+        value: '车找人',
+        label: '车找人'
+      }],
       // 遮罩层
       // 遮罩层
       loading: true,
       loading: true,
       // 选中数组
       // 选中数组

+ 47 - 29
unimall-admin/src/views/sharing/index.vue

@@ -1,7 +1,7 @@
 <template>
 <template>
   <div class="app-container">
   <div class="app-container">
-    <!-- <el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
-      <el-form-item label="" prop="companyId">
+    <el-form ref="queryForm" :model="queryParams" :inline="true" label-width="68px">
+      <!-- <el-form-item label="" prop="companyId">
         <el-input
         <el-input
           v-model="queryParams.companyId"
           v-model="queryParams.companyId"
           placeholder="请输入"
           placeholder="请输入"
@@ -9,11 +9,15 @@
           size="small"
           size="small"
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="拼车类型" prop="carpoolingType">
       <el-form-item label="拼车类型" prop="carpoolingType">
-        <el-select v-model="queryParams.carpoolingType" placeholder="请选择拼车类型" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
+        <el-input
+          v-model="queryParams.carpoolingType"
+          placeholder="请输入拼车类型"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
       </el-form-item>
       <el-form-item label="路线" prop="route">
       <el-form-item label="路线" prop="route">
         <el-input
         <el-input
@@ -33,7 +37,7 @@
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="出发地点" prop="startPlace">
+      <!-- <el-form-item label="出发地点" prop="startPlace">
         <el-input
         <el-input
           v-model="queryParams.startPlace"
           v-model="queryParams.startPlace"
           placeholder="请输入出发地点"
           placeholder="请输入出发地点"
@@ -105,13 +109,17 @@
           size="small"
           size="small"
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item label="状态" prop="status">
       <el-form-item label="状态" prop="status">
-        <el-select v-model="queryParams.status" placeholder="请选择状态" clearable size="small">
-          <el-option label="请选择字典生成" value="" />
-        </el-select>
+        <el-input
+          v-model="queryParams.status"
+          placeholder="请输入状态"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
       </el-form-item>
       </el-form-item>
-      <el-form-item label="0:否" prop="deleteFlag">
+      <!-- <el-form-item label="0:否" prop="deleteFlag">
         <el-input
         <el-input
           v-model="queryParams.deleteFlag"
           v-model="queryParams.deleteFlag"
           placeholder="请输入0:否"
           placeholder="请输入0:否"
@@ -157,15 +165,15 @@
           size="small"
           size="small"
           @keyup.enter.native="handleQuery"
           @keyup.enter.native="handleQuery"
         />
         />
-      </el-form-item>
+      </el-form-item> -->
       <el-form-item>
       <el-form-item>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
       </el-form-item>
-    </el-form> -->
+    </el-form>
 
 
     <el-row :gutter="10" class="mb8">
     <el-row :gutter="10" class="mb8">
-      <el-col :span="1.5">
+      <!-- <el-col :span="1.5">
         <el-button
         <el-button
           v-permission="['unimall:sharing:add']"
           v-permission="['unimall:sharing:add']"
           type="primary"
           type="primary"
@@ -193,7 +201,7 @@
           size="mini"
           size="mini"
           @click="handleDelete"
           @click="handleDelete"
         >删除</el-button>
         >删除</el-button>
-      </el-col>
+      </el-col> -->
       <!-- <el-col :span="1.5">
       <!-- <el-col :span="1.5">
         <el-button
         <el-button
           v-permission="['unimall:sharing:export']"
           v-permission="['unimall:sharing:export']"
@@ -265,8 +273,8 @@
     <pagination
     <pagination
       v-show="total>0"
       v-show="total>0"
       :total="total"
       :total="total"
-      :page.sync="queryParams.pageNum"
-      :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.page"
+      :limit.sync="queryParams.limit"
       @pagination="getList"
       @pagination="getList"
     />
     />
 
 
@@ -277,15 +285,19 @@
           <el-input v-model="form.companyId" placeholder="请输入" />
           <el-input v-model="form.companyId" placeholder="请输入" />
         </el-form-item> -->
         </el-form-item> -->
         <el-form-item label="拼车类型">
         <el-form-item label="拼车类型">
-          <el-select v-model="form.carpoolingType" placeholder="请选择拼车类型">
-            <el-option label="请选择字典生成" value="" />
+          <el-select v-model="form.carpoolingType" placeholder="请选择拼车类型" style="width:100%" disabled>
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"/>
           </el-select>
           </el-select>
         </el-form-item>
         </el-form-item>
         <el-form-item label="路线" prop="route">
         <el-form-item label="路线" prop="route">
-          <el-input v-model="form.route" placeholder="请输入路线" />
+          <el-input v-model="form.route" placeholder="请输入路线" disabled/>
         </el-form-item>
         </el-form-item>
         <el-form-item label="手机号" prop="phone">
         <el-form-item label="手机号" prop="phone">
-          <el-input v-model="form.phone" placeholder="请输入手机号" />
+          <el-input v-model="form.phone" placeholder="请输入手机号" disabled/>
         </el-form-item>
         </el-form-item>
         <el-form-item label="出发地点" prop="startPlace">
         <el-form-item label="出发地点" prop="startPlace">
           <el-input v-model="form.startPlace" placeholder="请输入出发地点" />
           <el-input v-model="form.startPlace" placeholder="请输入出发地点" />
@@ -302,11 +314,10 @@
         <el-form-item label="出发时间" prop="departureTime">
         <el-form-item label="出发时间" prop="departureTime">
           <el-date-picker
           <el-date-picker
             v-model="form.departureTime"
             v-model="form.departureTime"
+            style="width:100%"
             clearable
             clearable
             size="small"
             size="small"
-            style="width: 200px"
-            type="date"
-            value-format="yyyy-MM-dd"
+            type="datetime"
             placeholder="选择出发时间"/>
             placeholder="选择出发时间"/>
         </el-form-item>
         </el-form-item>
         <el-form-item label="人数" prop="numberPeople">
         <el-form-item label="人数" prop="numberPeople">
@@ -315,7 +326,7 @@
         <el-form-item label="说明" prop="explain">
         <el-form-item label="说明" prop="explain">
           <el-input v-model="form.explain" type="textarea" placeholder="请输入内容" />
           <el-input v-model="form.explain" type="textarea" placeholder="请输入内容" />
         </el-form-item>
         </el-form-item>
-        <el-form-item label="单价" prop="unitPrice">
+        <el-form-item label="单价(每公里)" prop="unitPrice">
           <el-input v-model="form.unitPrice" placeholder="请输入单价" />
           <el-input v-model="form.unitPrice" placeholder="请输入单价" />
         </el-form-item>
         </el-form-item>
         <el-form-item label="总价" prop="price">
         <el-form-item label="总价" prop="price">
@@ -379,6 +390,13 @@ import { listSharing, getSharing, delSharing, addSharing, updateSharing, exportS
 export default {
 export default {
   data() {
   data() {
     return {
     return {
+      options: [{
+        value: '人找车',
+        label: '人找车'
+      }, {
+        value: '车找人',
+        label: '车找人'
+      }],
       // 遮罩层
       // 遮罩层
       loading: true,
       loading: true,
       // 选中数组
       // 选中数组
@@ -397,8 +415,8 @@ export default {
       open: false,
       open: false,
       // 查询参数
       // 查询参数
       queryParams: {
       queryParams: {
-        pageNum: 1,
-        pageSize: 10,
+        page: 1,
+        limit: 10,
         companyId: undefined,
         companyId: undefined,
         carpoolingType: undefined,
         carpoolingType: undefined,
         route: undefined,
         route: undefined,
@@ -480,7 +498,7 @@ export default {
     },
     },
     /** 搜索按钮操作 */
     /** 搜索按钮操作 */
     handleQuery() {
     handleQuery() {
-      this.queryParams.pageNum = 1
+      this.queryParams.page = 1
       this.getList()
       this.getList()
     },
     },
     /** 重置按钮操作 */
     /** 重置按钮操作 */