提交 18969e08 编写于 作者: huangwensu's avatar huangwensu

导入代码

上级
###### 使用说明
> 由于H5 登录成功后调用后台接口判断是否签署协议,如果签署了就不再弹出协议签署框,如果没有则弹出协议弹窗,同意协议则跳转相应页面,不同意则返回上个页面
###### 1. 使用
```javascript
import PicaH5Agreement from 'pica-h5-agreement';
// if for global use
Vue.use(PicaH5Agreement);
```
```html
// template
<pica-h5-login
:close="true"
:base-url="baseUrl"
@login-call="loginCall"
@close-call="closeCall"
/>
// template need popup
<van-popup v-model="show">
<pica-h5-login
:close="true"
:base-url="baseUrl"
@login-call="loginCall"
@close-call="closeCall"
/>
</van-popup>
```
```javascript
// 代码
export default {
data() {
return {
show: false
}
},
methods: {
loginCall(token) {
// 登录成功回调返回值就是token
this.closeCall();
},
closeCall() {
this.show = false;
}
}
}
```
```javascript
vue.config.js 新增配置
transpileDependencies: ['pica-h5-login']
```
###### 2. options
| 参数 | 说明 | 类型 | 默认值 |
| --------- | ---------------------- | -------- | -------- |
| baseUrl | 登录域名 | string | 空 |
| close | 是否显示 close 符号 | boolean | false |
| loginCall | 登录成功回调函数 | function | (token) => {} |
| closeCall | 关闭登录窗口的回调函数 | function | () => {} |
> baseUrl:
> dev : http://dev-sc.yunqueyi.com
> test1: http://test1-sc.yunqueyi.com
> uat: http://uat-sc.yunqueyi.com
{
"_args": [
[
"pica-h5-agreement@2.0.1",
"D:\\wsp\\积木-ssr\\pica-toy-brick"
]
],
"_from": "pica-h5-agreement@2.0.1",
"_id": "pica-h5-agreement@2.0.1",
"_inBundle": false,
"_integrity": "sha512-IlXHRdJZ3bfQ41Ofw8rQiaZIdDJ+9czOs59mqmHSdZwLf41sxcAUnGrKSgNxUQCyZl3OAoPCnGlZlN5+l5SgJQ==",
"_location": "/pica-h5-agreement",
"_phantomChildren": {
"@babel/runtime": "7.5.5",
"@vant/icons": "1.1.7",
"@vue/babel-helper-vue-jsx-merge-props": "1.0.0"
},
"_requested": {
"type": "version",
"registry": true,
"raw": "pica-h5-agreement@2.0.1",
"name": "pica-h5-agreement",
"escapedName": "pica-h5-agreement",
"rawSpec": "2.0.1",
"saveSpec": null,
"fetchSpec": "2.0.1"
},
"_requiredBy": [
"/",
"/pica-topic-comment",
"/pica-topic-stencil"
],
"_resolved": "http://192.168.110.93:4873/pica-h5-login/-/pica-h5-login-2.0.1.tgz",
"_spec": "2.0.1",
"_where": "D:\\wsp\\积木-ssr\\pica-toy-brick",
"author": {
"name": "souse"
},
"dependencies": {
"axios": "^0.18.0",
"jsencrypt": "^3.0.0-rc.1",
"vant": "^1.4.2"
},
"description": "h5 login component",
"devDependencies": {
"@babel/core": "^7.4.4",
"@babel/preset-env": "^7.4.4",
"autoprefixer": "^9.5.1",
"less": "^3.9.0",
"postcss-pxtorem": "^4.0.1",
"postcss-url": "^8.0.0",
"rollup": "^1.0.2",
"rollup-plugin-babel": "^4.3.2",
"rollup-plugin-commonjs": "^10.0.0",
"rollup-plugin-node-resolve": "^5.0.0",
"rollup-plugin-postcss": "^2.0.3",
"rollup-plugin-terser": "^4.0.1",
"rollup-plugin-vue": "^5.0.0",
"vue": "^2.5.17",
"vue-template-compiler": "^2.6.10"
},
"engines": {
"node": ">= 8.0.0",
"npm": ">= 4.0.0"
},
"files": [
"lib",
"src"
],
"keywords": [
"rollup",
"components"
],
"license": "MIT",
"main": "lib/index.js",
"name": "pica-h5-agreement",
"peerDependencies": {
"vue": "^2.5.17"
},
"private": false,
"repository": {
"type": "git",
"url": ""
},
"scripts": {
"prod": "rollup -c"
},
"version": "2.0.1"
}
<template>
<div class="lux-cell lux-field">
<div v-if="leftIcon" class="lux-field__left-icon">
<i class="lux-icon left-icon" :class="leftIcon"></i>
</div>
<div v-if="label" class="lux-field__label">
<span>{{ label }}</span>
</div>
<div class="lux-field__value">
<div class="lux-field__body">
<input
class="lux-field__control"
ref="input"
:type="type"
:value="value"
:placeholder="$attrs.placeholder"
:maxlength="$attrs.maxlength || maxlength"
v-on="listeners"
>
<i v-if="showClear" class="lux-icon lux-icon-clear" @click="onClear"></i>
<div v-if="rightIcon" class="lux-field__right-icon">
<i class="lux-icon right-icon" :class="rightIcon" @click="onClickRightIcon"></i>
</div>
<slot name="button" />
<slot name="img" />
</div>
</div>
</div>
</template>
<script>
import { isDef, preventDefault, isIOS, getRootScrollTop } from './util';
export default {
name: 'Field',
props: {
label: {
type: String,
default: null
},
type: {
type: String,
default: 'text'
},
value: {
type: [String, Number],
default: ''
},
clearable: {
type: Boolean,
default: false
},
leftIcon: {
type: String,
default: null
},
rightIcon: {
type: String,
default: null
}
},
data() {
return {
focused: false,
maxlength: 1000
}
},
computed: {
showClear() {
return this.clearable && this.focused && this.value !== '' && isDef(this.value);
},
listeners() {
return {
...this.$listeners,
input: this.onInput,
// keypress: this.onKeypress,
focus: this.onFocus,
blur: this.onBlur
}
}
},
methods: {
slots(name = 'default', props) {
const { $slots, $scopedSlots } = this;
if ($scopedSlots[name]) {
return $scopedSlots[name](props);
}
return $slots[name];
},
focus() {
this.$refs.input && this.$refs.input.focus();
},
blur() {
this.$refs.input && this.$refs.input.blur();
},
format(target = this.$refs.input) {
let { value } = target;
const { maxlength } = this.$attrs;
if (this.type === 'number' && isDef(maxlength) && value.length > maxlength) {
value = value.slice(0, maxlength);
target.value = value;
}
return value;
},
onInput(event) {
this.$emit('input', this.format(event.target));
},
onFocus(event) {
this.focused = true;
this.$emit('focus', event);
},
onBlur(event) {
setTimeout(() => {
this.focused = false;
this.$emit('blur', event);
if (isIOS()) {
window.scrollTo(0, getRootScrollTop());
}
}, 0);
},
onClear(event) {
preventDefault(event);
this.$emit('input', '');
this.$emit('clear');
},
onClickRightIcon(event) {
this.$emit('click-right-icon');
}
}
}
</script>
<style lang="less">
.lux-field {
position: relative;
display: flex;
width: 100%;
overflow: hidden;
box-sizing: border-box;
color: #373839;
font-size: 16px;
line-height: 12px;
background-color: #F8F9FA;
border-radius: 50px;
padding: 12px 15px;
padding-right: 0;
.lux-icon {
display: block;
background-size: contain;
background-repeat: no-repeat;
margin-right: 15px;
}
.lux-field__left-icon,
.lux-field__right-icon {
.lux-icon {
width: 20px;
height: 20px;
}
}
.lux-field__left-icon {
margin-right: 12.5px;
.lux-icon-phone {
background-image: url(./images/lux-icon-phone.png);
}
.lux-icon-pwd {
background-image: url(./images/lux-icon-pwd.png);
}
.lux-icon-otp {
background-image: url(./images/lux-icon-otp.png);
}
.lux-icon-sms {
background-image: url(./images/lux-icon-sms.png);
}
}
.lux-field__right-icon {
.lux-icon-spwd {
background-image: url(./images/lux-icon-spwd.png);
}
.lux-icon-hpwd {
background-image: url(./images/lux-icon-hpwd.png);
}
}
.lux-field__value {
flex: 1;
color: #373839;
overflow: hidden;
text-align: right;
position: relative;
vertical-align: middle;
}
.lux-field__body {
display: flex;
align-items: center;
.lux-icon-clear {
flex-shrink: 0;
width: 16px;
height: 16px;
background-image: url(./images/lux-icon-clear.png);
}
}
.lux-field__control {
border: 0;
margin: 0;
padding: 0;
width: 100%;
resize: none;
display: block;
color: #373839;
box-sizing: border-box;
background-color: transparent;
font-size: 16px;
height: 19px;
line-height: 19px;
&::placeholder {
color: #C7C8C9;
}
}
input:-webkit-autofill {
background-color: #fff;
background-image: none;
}
input:-webkit-autofill {
-webkit-box-shadow: 0 0 0px 1000px #fff inset !important;
}
.lux-field__button {
flex-shrink: 0;
margin-right: 15px;
}
}
</style>
\ No newline at end of file
import PicaH5Login from './login.vue';
PicaH5Login.install = function(Vue) {
Vue.component(PicaH5Login.name, PicaH5Login);
};
export default PicaH5Login;
\ No newline at end of file
.pica-h5-login-container {
display: fixed;
top: 167px;
left: 15px;
right: 15px;
}
\ No newline at end of file
此差异已折叠。
String.prototype.MD5 = function(bit) {
var sMessage = this;
function RotateLeft(lValue, iShiftBits) {
return (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits));
}
function AddUnsigned(lX, lY) {
var lX4, lY4, lX8, lY8, lResult;
lX8 = (lX & 0x80000000);
lY8 = (lY & 0x80000000);
lX4 = (lX & 0x40000000);
lY4 = (lY & 0x40000000);
lResult = (lX & 0x3FFFFFFF) + (lY & 0x3FFFFFFF);
if (lX4 & lY4) return (lResult ^ 0x80000000 ^ lX8 ^ lY8);
if (lX4 | lY4) {
if (lResult & 0x40000000) return (lResult ^ 0xC0000000 ^ lX8 ^ lY8);
else return (lResult ^ 0x40000000 ^ lX8 ^ lY8);
} else return (lResult ^ lX8 ^ lY8);
}
function F(x, y, z) {
return (x & y) | ((~x) & z);
}
function G(x, y, z) {
return (x & z) | (y & (~z));
}
function H(x, y, z) {
return (x ^ y ^ z);
}
function I(x, y, z) {
return (y ^ (x | (~z)));
}
function FF(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(F(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function GG(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(G(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function HH(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(H(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function II(a, b, c, d, x, s, ac) {
a = AddUnsigned(a, AddUnsigned(AddUnsigned(I(b, c, d), x), ac));
return AddUnsigned(RotateLeft(a, s), b);
}
function ConvertToWordArray(sMessage) {
var lWordCount;
var lMessageLength = sMessage.length;
var lNumberOfWords_temp1 = lMessageLength + 8;
var lNumberOfWords_temp2 = (lNumberOfWords_temp1 - (lNumberOfWords_temp1 % 64)) / 64;
var lNumberOfWords = (lNumberOfWords_temp2 + 1) * 16;
var lWordArray = Array(lNumberOfWords - 1);
var lBytePosition = 0;
var lByteCount = 0;
while (lByteCount < lMessageLength) {
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = (lWordArray[lWordCount] | (sMessage.charCodeAt(lByteCount) << lBytePosition));
lByteCount++;
}
lWordCount = (lByteCount - (lByteCount % 4)) / 4;
lBytePosition = (lByteCount % 4) * 8;
lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition);
lWordArray[lNumberOfWords - 2] = lMessageLength << 3;
lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29;
return lWordArray;
}
function WordToHex(lValue) {
var WordToHexValue = "",
WordToHexValue_temp = "",
lByte, lCount;
for (lCount = 0; lCount <= 3; lCount++) {
lByte = (lValue >>> (lCount * 8)) & 255;
WordToHexValue_temp = "0" + lByte.toString(16);
WordToHexValue = WordToHexValue + WordToHexValue_temp.substr(WordToHexValue_temp.length - 2, 2);
}
return WordToHexValue;
}
var x = Array();
var k, AA, BB, CC, DD, a, b, c, d
var S11 = 7,
S12 = 12,
S13 = 17,
S14 = 22;
var S21 = 5,
S22 = 9,
S23 = 14,
S24 = 20;
var S31 = 4,
S32 = 11,
S33 = 16,
S34 = 23;
var S41 = 6,
S42 = 10,
S43 = 15,
S44 = 21;
// Steps 1 and 2. Append padding bits and length and convert to words
x = ConvertToWordArray(sMessage);
// Step 3. Initialise
a = 0x67452301;
b = 0xEFCDAB89;
c = 0x98BADCFE;
d = 0x10325476;
// Step 4. Process the message in 16-word blocks
for (k = 0; k < x.length; k += 16) {
AA = a;
BB = b;
CC = c;
DD = d;
a = FF(a, b, c, d, x[k + 0], S11, 0xD76AA478);
d = FF(d, a, b, c, x[k + 1], S12, 0xE8C7B756);
c = FF(c, d, a, b, x[k + 2], S13, 0x242070DB);
b = FF(b, c, d, a, x[k + 3], S14, 0xC1BDCEEE);
a = FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF);
d = FF(d, a, b, c, x[k + 5], S12, 0x4787C62A);
c = FF(c, d, a, b, x[k + 6], S13, 0xA8304613);
b = FF(b, c, d, a, x[k + 7], S14, 0xFD469501);
a = FF(a, b, c, d, x[k + 8], S11, 0x698098D8);
d = FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF);
c = FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1);
b = FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE);
a = FF(a, b, c, d, x[k + 12], S11, 0x6B901122);
d = FF(d, a, b, c, x[k + 13], S12, 0xFD987193);
c = FF(c, d, a, b, x[k + 14], S13, 0xA679438E);
b = FF(b, c, d, a, x[k + 15], S14, 0x49B40821);
a = GG(a, b, c, d, x[k + 1], S21, 0xF61E2562);
d = GG(d, a, b, c, x[k + 6], S22, 0xC040B340);
c = GG(c, d, a, b, x[k + 11], S23, 0x265E5A51);
b = GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA);
a = GG(a, b, c, d, x[k + 5], S21, 0xD62F105D);
d = GG(d, a, b, c, x[k + 10], S22, 0x2441453);
c = GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681);
b = GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8);
a = GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6);
d = GG(d, a, b, c, x[k + 14], S22, 0xC33707D6);
c = GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87);
b = GG(b, c, d, a, x[k + 8], S24, 0x455A14ED);
a = GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905);
d = GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8);
c = GG(c, d, a, b, x[k + 7], S23, 0x676F02D9);
b = GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A);
a = HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942);
d = HH(d, a, b, c, x[k + 8], S32, 0x8771F681);
c = HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122);
b = HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C);
a = HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44);
d = HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9);
c = HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60);
b = HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70);
a = HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6);
d = HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA);
c = HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085);
b = HH(b, c, d, a, x[k + 6], S34, 0x4881D05);
a = HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039);
d = HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5);
c = HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8);
b = HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665);
a = II(a, b, c, d, x[k + 0], S41, 0xF4292244);
d = II(d, a, b, c, x[k + 7], S42, 0x432AFF97);
c = II(c, d, a, b, x[k + 14], S43, 0xAB9423A7);
b = II(b, c, d, a, x[k + 5], S44, 0xFC93A039);
a = II(a, b, c, d, x[k + 12], S41, 0x655B59C3);
d = II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92);
c = II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D);
b = II(b, c, d, a, x[k + 1], S44, 0x85845DD1);
a = II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F);
d = II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0);
c = II(c, d, a, b, x[k + 6], S43, 0xA3014314);
b = II(b, c, d, a, x[k + 13], S44, 0x4E0811A1);
a = II(a, b, c, d, x[k + 4], S41, 0xF7537E82);
d = II(d, a, b, c, x[k + 11], S42, 0xBD3AF235);
c = II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB);
b = II(b, c, d, a, x[k + 9], S44, 0xEB86D391);
a = AddUnsigned(a, AA);
b = AddUnsigned(b, BB);
c = AddUnsigned(c, CC);
d = AddUnsigned(d, DD);
}
if (bit == 32) {
return WordToHex(a) + WordToHex(b) + WordToHex(c) + WordToHex(d);
} else {
return WordToHex(b) + WordToHex(c);
}
}
\ No newline at end of file
import { isObj } from './util';
const defaultOptions = {
message: '',
duration: 1500
};
const parseOptions = message => (isObj(message) ? message : { message });
/**
* [Toast description]
* @param {Object} options [description]
*/
export function Toast(options = {}) {
const opts = Object.assign(defaultOptions, parseOptions(options));
const toast = ToastFn.createInstance(opts);
}
function ToastFn(options) {}
ToastFn.prototype.createInstance = function(options) {}
ToastFn.prototype.clear = function() {}
/* eslint-disable */
/**
* [isDef description]
* @param {[type]} value [description]
* @return {Boolean} [description]
*/
export function isDef(value) {
return value !== undefined && value !== null;
}
/**
* [preventDefault description]
* @param {[type]} event [description]
* @return {[type]} [description]
*/
export function preventDefault(event) {
if (typeof event.cancelable !== 'boolean' || event.cancelable) {
event.preventDefault();
}
// event.stopPropagation();
}
/**
* [isObj description]
* @param {[type]} x [description]
* @return {Boolean} [description]
*/
export function isObj(x) {
const type = typeof x;
return x !== null && (type === 'object' || type === 'function');
}
/**
* [isAndroid description]
* @return {Boolean} [description]
*/
export function isAndroid() {
return /android/.test(navigator.userAgent.toLowerCase());
}
/**
* [isIOS description]
* @return {Boolean} [description]
*/
export function isIOS() {
return /ios|iphone|ipad|ipod/.test(navigator.userAgent.toLowerCase());
}
/**
* [getRootScrollTop description]
* @return {[type]} [description]
*/
export function getRootScrollTop() {
return window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
}
\ No newline at end of file
此差异已折叠。
import axios from 'axios';
import { Toast } from 'vant';
import { CryptoJS } from './aes'
import 'jsencrypt'
let pubKey = "";
// generate key
function getAesKey(len) {
len = len || 16;
var aesKey = "";
var strList = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var strLen = strList.length;
for(var i=0; i<len; i++){
aesKey += strList.charAt( Math.floor( Math.random()*strLen ) );
};
return aesKey;
}
// 加密传参,发送请求
function sendEncryptRequest(content, cb, config){
content = JSON.stringify(content); // 后端要求转 string
// debugger;
if(pubKey){ // pubKey获取过就不用再获取了
let params = formatContent(content, pubKey);
cb && cb(params);
}else{
handleGetPubKey(content, cb, config);
}
}
// 获取 RSA public key
function getPubKey(config) {
return axios({ ...config, url: '/account/cipher/key' });
};
// get public key
function handleGetPubKey(content, cb, config){
// debugger;
getPubKey(config).then(res => {
// console.log('>>>>>>>>>>>>>>>>>>>> publicKey: ', res);
if(res.status && res.status === 200) {
res = res.data;
}
// debugger;
if(res.code == '000000'){
pubKey = res.data;
if(cb){
let params = formatContent(content, pubKey);
cb && cb(params);
}
}else{
Toast({
message: (res && res.message) || '接口出错',
duration: 1500
});
}
})
}
// format account params
function formatContent(content, pubKey) { // obj为具体的json传参
let aesKey = getAesKey(16);
let params = {
key: '',
content: ''
};
// 开发阶段后端接口还没处理加密,先传 原始json数据 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 后端加密OK后 再用下面的注释代码
// params.content = content;
params.content = AesEncrypt(content, aesKey);
params.key = RsaEncrypt(aesKey, pubKey);
return params;
}
// AES encrypt
function AesEncrypt(content, aesKey) {
let sKey = CryptoJS.enc.Utf8.parse(aesKey);
let sContent = CryptoJS.enc.Utf8.parse(content);
let encrypted = CryptoJS.AES.encrypt(sContent, sKey, {mode:CryptoJS.mode.ECB,padding: CryptoJS.pad.Pkcs7});
return encrypted.toString();
}
// RSA encrypt
function RsaEncrypt(aesKey, pubKey){
let _encrypt = new JSEncrypt();
let boss_public_key = pubKey;
_encrypt.setPublicKey(boss_public_key);
let encrypted = _encrypt.encrypt(aesKey);
return encrypted;
}
export {
getAesKey,
sendEncryptRequest,
handleGetPubKey,
formatContent,
AesEncrypt,
RsaEncrypt,
}
\ No newline at end of file
// 获取用户终端信息
function getTerminalType() {
let brow = "unknown";
// alert(navigator.userAgent);
if (navigator.userAgent.indexOf('iPad') > -1) {
// alert("iPad");
return brow = "iPad";
}
if (navigator.userAgent.indexOf('Android') > -1
|| navigator.userAgent.indexOf('Linux') > -1) {
// alert("Android");
return brow = "android";
}
if (navigator.userAgent.indexOf('iPhone') > -1
// || navigator.userAgent.indexOf('Mac') > -1
) {
// alert("iPhone");
return brow = "iPhone";
}
if (navigator.userAgent.indexOf('Trident') > -1) {
// alert("Trident");
return brow = "PC";
}
if (navigator.userAgent.indexOf('Presto') > -1) {
// alert("Presto");
return brow = "PC";
}
if (navigator.userAgent.indexOf('Chrome') > -1) {
// alert("Chrome");
return brow = "PC";
}
if (navigator.userAgent.indexOf('AppleWebKit') > -1) {
// alert("AppleWebKit");
return brow = "iPad";
}
if (navigator.userAgent.indexOf('Gecko') > -1
&& navigator.userAgent.indexOf('KHTML') == -1) {
// alert("Gecko");
return brow = "PC";
}
if (navigator.userAgent.indexOf("Mac OS X") > -1) {
// alert("ios");
return brow = "ios";
}
if (navigator.userAgent.indexOf('Safari') == -1) {
// alert("Safari");
return brow = "PC";
}
return brow;
};
// 获取用户系统信息start
function detectOS() {
let sUserAgent = navigator.userAgent;
let isWin = (navigator.platform == "Win32")
|| (navigator.platform == "Windows");
let isMac = (navigator.platform == "Mac68K")
|| (navigator.platform == "MacPPC")
|| (navigator.platform == "Macintosh")
|| (navigator.platform == "MacIntel");
if (isMac)
return "Mac";
let isUnix = (navigator.platform == "X11") && !isWin && !isMac;
if (isUnix)
return "Unix";
let isLinux = (String(navigator.platform).indexOf("Linux") > -1);
if (isLinux)
return "Linux";
let isIos = (sUserAgent.indexOf("Mac OS X") > -1);
if (isIos)
return "Mac";
if (isWin) {
let isWinXP = sUserAgent.indexOf("Windows NT 5.1") > -1
|| sUserAgent.indexOf("Windows XP") > -1;
if (isWinXP)
return "WinXP";
let isWinVista = sUserAgent.indexOf("Windows NT 6.0") > -1
|| sUserAgent.indexOf("Windows Vista") > -1;
if (isWinVista)
return "WinVista";
let isWin7 = sUserAgent.indexOf("Windows NT 6.1") > -1
|| sUserAgent.indexOf("Windows 7") > -1;
if (isWin7)
return "Win7";
let isWin8_1 = sUserAgent.indexOf("Windows NT 6.2") > -1
|| sUserAgent.indexOf("Windows 8") > -1;
let isWin8_2 = sUserAgent.indexOf("Windows NT 6.3") > -1
|| sUserAgent.indexOf("Windows 8.1") > -1;
if (isWin8_1 || isWin8_2)
return "Win8";
let isWin10_1 = sUserAgent.indexOf("Windows NT 6.4") > -1
|| sUserAgent.indexOf("Windows 10") > -1;
let isWin10_2 = sUserAgent.indexOf("Windows NT 10.0") > -1
|| sUserAgent.indexOf("Windows 10") > -1;
if (isWin10_1 || isWin10_2)
return "Win10";
}
return "other";
};
export {
getTerminalType,
detectOS,
}
\ No newline at end of file
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册