Browse Source

版本初始化

plg 9 months ago
commit
321e3c961d
100 changed files with 2958 additions and 0 deletions
  1. 2 0
      .browserslistrc
  2. 2 0
      .env
  3. 4 0
      .env.production
  4. 4 0
      .env.test
  5. 26 0
      .eslintrc.js
  6. 29 0
      .gitignore
  7. 54 0
      README.md
  8. 28 0
      babel.config.js
  9. 58 0
      package.json
  10. BIN
      public/favicon.ico
  11. BIN
      public/favicon1.png
  12. 25 0
      public/index.html
  13. 74 0
      public/static/Barrett.js
  14. 627 0
      public/static/BigInt.js
  15. 93 0
      public/static/RSA.js
  16. 129 0
      public/static/css/main-oumulong.css
  17. 144 0
      public/static/css/main.css
  18. 14 0
      public/static/css/swiper.min.css
  19. 0 0
      public/static/css/weui.min.css
  20. 118 0
      public/static/flexible.js
  21. 1 0
      public/static/js/jquery.min.js
  22. 14 0
      public/static/js/swiper.jquery.min.js
  23. 5 0
      public/static/js/weui.min.js
  24. 684 0
      public/static/myrsa.js
  25. 424 0
      public/static/sm4.js
  26. 78 0
      src/App.vue
  27. 2 0
      src/api/home-api.js
  28. 0 0
      src/api/login-api.js
  29. 185 0
      src/assets/css/reset.css
  30. 7 0
      src/assets/css/theme.less
  31. BIN
      src/assets/img/commons/beian.png
  32. BIN
      src/assets/img/commons/logo.png
  33. BIN
      src/assets/img/commons/logo1.png
  34. BIN
      src/assets/img/index/10040_imagetop.png
  35. BIN
      src/assets/img/index/10046_imagetop.png
  36. BIN
      src/assets/img/index/10047_imagetop.png
  37. BIN
      src/assets/img/index/10048_imagetop_1647074461.png
  38. BIN
      src/assets/img/index/10049_imagetop_1646403558.png
  39. BIN
      src/assets/img/index/10094_imagetop.jpg
  40. BIN
      src/assets/img/index/10095_imagetop.jpg
  41. BIN
      src/assets/img/index/10096_imagetop.jpg
  42. BIN
      src/assets/img/index/10097_imagetop.jpg
  43. BIN
      src/assets/img/index/10154_imagetop.png
  44. BIN
      src/assets/img/index/10155_imagetop_1631858459.png
  45. BIN
      src/assets/img/index/10156_imagetop.png
  46. BIN
      src/assets/img/index/10157_imagetop_1647076830.png
  47. BIN
      src/assets/img/index/10158_imagetop_1631858428.png
  48. BIN
      src/assets/img/index/10159_imagetop.png
  49. BIN
      src/assets/img/index/10160_imagetop.png
  50. BIN
      src/assets/img/index/10161_imagetop_1631858478.png
  51. BIN
      src/assets/img/index/10162_imagetop.png
  52. BIN
      src/assets/img/index/10163_imagetop.png
  53. BIN
      src/assets/img/index/19.png
  54. BIN
      src/assets/img/index/btn_quit.png
  55. BIN
      src/assets/img/index/day1.png
  56. BIN
      src/assets/img/index/day2.png
  57. BIN
      src/assets/img/index/day3.png
  58. BIN
      src/assets/img/index/day4.png
  59. BIN
      src/assets/img/index/day5.png
  60. BIN
      src/assets/img/index/day6.png
  61. BIN
      src/assets/img/index/day7.png
  62. BIN
      src/assets/img/index/fruit.png
  63. BIN
      src/assets/img/index/star_.png
  64. BIN
      src/assets/img/index/sys_name.png
  65. BIN
      src/assets/img/index/sys_name_manage.png
  66. BIN
      src/assets/img/index/top_list.png
  67. BIN
      src/assets/img/index/top_list_manage.png
  68. BIN
      src/assets/img/index/top_record.png
  69. BIN
      src/assets/img/index/top_record.zip
  70. BIN
      src/assets/img/index/top_record_manage.png
  71. BIN
      src/assets/img/index/top_usr.png
  72. BIN
      src/assets/img/index/worm.png
  73. BIN
      src/assets/img/login/35.png
  74. BIN
      src/assets/img/login/36.png
  75. BIN
      src/assets/img/login/37.png
  76. BIN
      src/assets/img/login/38.png
  77. BIN
      src/assets/img/login/39.png
  78. BIN
      src/assets/img/login/40.png
  79. BIN
      src/assets/img/login/41.png
  80. BIN
      src/assets/img/login/42.png
  81. BIN
      src/assets/img/login/43.png
  82. BIN
      src/assets/img/login/44.png
  83. BIN
      src/assets/img/login/45.png
  84. BIN
      src/assets/img/login/46.png
  85. BIN
      src/assets/img/login/47.png
  86. BIN
      src/assets/img/login/48.png
  87. BIN
      src/assets/img/login/49.png
  88. BIN
      src/assets/img/login/50.png
  89. BIN
      src/assets/img/login/51.png
  90. BIN
      src/assets/img/login/52.png
  91. BIN
      src/assets/img/login/53.png
  92. BIN
      src/assets/img/login/54.png
  93. BIN
      src/assets/img/login/55.png
  94. BIN
      src/assets/img/login/56.png
  95. BIN
      src/assets/img/login/57.png
  96. BIN
      src/assets/img/login/58.png
  97. BIN
      src/assets/img/login/59.png
  98. BIN
      src/assets/img/login/login_bg.png
  99. BIN
      src/assets/img/login/login_title.png
  100. 127 0
      src/assets/js/utils/ajax.js

+ 2 - 0
.browserslistrc

@@ -0,0 +1,2 @@
+> 1%
+last 2 versions

+ 2 - 0
.env

@@ -0,0 +1,2 @@
+NODE_ENV=development
+VUE_APP_TARGET='http://120.55.54.207:8088'

+ 4 - 0
.env.production

@@ -0,0 +1,4 @@
+NODE_ENV=production
+##BASE_URL= ./
+BASE_URL= /h5
+VUE_APP_TARGET='http://120.55.54.207:8088'

+ 4 - 0
.env.test

@@ -0,0 +1,4 @@
+NODE_ENV=test
+##BASE_URL= ./
+BASE_URL= /h5
+VUE_APP_TARGET='http://120.55.54.207:8088'

+ 26 - 0
.eslintrc.js

@@ -0,0 +1,26 @@
+module.exports = {
+  root: true,
+  env: {
+    node: true
+  },
+  'extends': [
+    'plugin:vue/essential',
+    'eslint:recommended'
+  ],
+  rules: {
+    'no-console': 'off',
+    'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off',
+    "semi": "off",
+    'no-unused-vars':"off",
+    'no-empty-pattern':"off",
+    'array-callback-return':'off',
+    // 禁止混用空格和缩进
+    'no-mixed-spaces-and-tabs': 'error',
+    // 禁止对使用 const 定义的常量重新赋值
+    'no-const-assign': 'error',
+    'no-undef':'off'
+  },
+  parserOptions: {
+    parser: 'babel-eslint'
+  }
+}

+ 29 - 0
.gitignore

@@ -0,0 +1,29 @@
+.DS_Store
+node_modules
+/h5
+/child
+public/config/global.js
+h5.zip
+
+
+# local env files
+.env.local
+.env.*.local
+# .env.* 
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+package-lock.json
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+# .env.development

+ 54 - 0
README.md

@@ -0,0 +1,54 @@
+# SensoryComprehensiveTrainv2_pc
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).
+
+//set NODE_OPTIONS=--openssl-legacy-provider &
+
+/src/assets/img/dev 目录存放开发时的测试图片/icon   其他图片/icon放到对应的模块
+/src/assets/img/commons  目录存放公共图片/icon
+
+每个模块的api store router 放到对应模块的文件或文件夹内
+
+```
+打包时候从package.json 中根据不同环境打包 
+举例:npm run pro-build
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "lint": "vue-cli-service lint --fix",
+    "pro-build": "vue-cli-service build --modern --mode production",
+    "test-build": "vue-cli-service build --modern --mode test"
+  }
+
+``
+
+```
+关于环境:
+
+
+

+ 28 - 0
babel.config.js

@@ -0,0 +1,28 @@
+const prodPlugin = []
+if (process.env.NODE_ENV === 'production') {
+  // plugin.push('transform-remove-console')
+  prodPlugin.push([
+    'transform-remove-console',
+    {
+      // 保留 console.error 与 console.warn
+      exclude: ['error', 'warn']
+    }
+  ])
+}
+// module.exports = {
+//   presets: [
+//     '@vue/cli-plugin-babel/preset'
+//   ],
+//   plugins: [
+//     ['component', {
+//       libraryName: 'element-ui',
+//       libraryDirectory: 'theme-chalk',
+//     }],
+//     ...plugin
+//   ]
+// }
+module.exports = {
+  plugins: [
+    ...prodPlugin
+  ]
+}

+ 58 - 0
package.json

@@ -0,0 +1,58 @@
+{
+  "name": "psychological-test-app",
+  "version": "1.0.0",
+  "private": true,
+  "scripts": {
+    "serve": " vue-cli-service serve",
+    "lint": "vue-cli-service lint --fix",
+    "pro-build": "vue-cli-service build --modern --mode production",
+    "test-build": "vue-cli-service build --modern --mode test"
+  },
+  "dependencies": {
+    "@vant/touch-emulator": "^1.4.0",
+    "axios": "^0.19.0",
+    "core-js": "^2.6.5",
+    "crypto-js": "^4.1.1",
+    "echarts": "^5.4.2",
+    "element-ui": "^2.15.12",
+    "exif-js": "^2.3.0",
+    "js-base64": "^2.5.2",
+    "jsencrypt": "^3.0.0-rc.1",
+    "md5": "^2.3.0",
+    "vant": "^2.8.4",
+    "vue": "^2.6.10",
+    "vue-qr": "^4.0.9",
+    "vue-router": "^3.0.3",
+    "vuex": "^3.0.1"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.11.0",
+    "@vue/cli-plugin-eslint": "^3.11.0",
+    "@vue/cli-service": "^3.11.0",
+    "babel-cli": "^6.26.0",
+    "babel-eslint": "^10.0.1",
+    "babel-plugin-import": "^1.12.2",
+    "babel-plugin-transform-remove-console": "^6.9.4",
+    "eslint": "^5.16.0",
+    "eslint-plugin-vue": "^5.0.0",
+    "husky": "^4.2.5",
+    "less": "^3.8.1",
+    "less-loader": "^5.0.0",
+    "lint-staged": "^10.2.0",
+    "postcss-pxtorem": "^4.0.1",
+    "vue-awesome-swiper": "^3.1.3",
+    "vue-loader": "^14.2.3",
+    "vue-template-compiler": "^2.6.10"
+  },
+  "husky": {
+    "hooks": {
+      "pre-commit": "lint-staged"
+    }
+  },
+  "lint-staged": {
+    "src/**/*.{js,vue}": [
+      "npm run lint",
+      "git add ."
+    ]
+  }
+}

BIN
public/favicon.ico


BIN
public/favicon1.png


File diff suppressed because it is too large
+ 25 - 0
public/index.html


+ 74 - 0
public/static/Barrett.js

@@ -0,0 +1,74 @@
+// BarrettMu, a class for performing Barrett modular reduction computations in
+// JavaScript.
+//
+// Requires BigInt.js.
+//
+// Copyright 2004-2005 David Shapiro.
+//
+// You may use, re-use, abuse, copy, and modify this code to your liking, but
+// please keep this header.
+//
+// Thanks!
+// 
+// Dave Shapiro
+// dave@ohdave.com 
+
+function BarrettMu(m)
+{
+	this.modulus = biCopy(m);
+	this.k = biHighIndex(this.modulus) + 1;
+	var b2k = new BigInt();
+	b2k.digits[2 * this.k] = 1; // b2k = b^(2k)
+	this.mu = biDivide(b2k, this.modulus);
+	this.bkplus1 = new BigInt();
+	this.bkplus1.digits[this.k + 1] = 1; // bkplus1 = b^(k+1)
+	this.modulo = BarrettMu_modulo;
+	this.multiplyMod = BarrettMu_multiplyMod;
+	this.powMod = BarrettMu_powMod;
+}
+
+function BarrettMu_modulo(x)
+{
+	var q1 = biDivideByRadixPower(x, this.k - 1);
+	var q2 = biMultiply(q1, this.mu);
+	var q3 = biDivideByRadixPower(q2, this.k + 1);
+	var r1 = biModuloByRadixPower(x, this.k + 1);
+	var r2term = biMultiply(q3, this.modulus);
+	var r2 = biModuloByRadixPower(r2term, this.k + 1);
+	var r = biSubtract(r1, r2);
+	if (r.isNeg) {
+		r = biAdd(r, this.bkplus1);
+	}
+	var rgtem = biCompare(r, this.modulus) >= 0;
+	while (rgtem) {
+		r = biSubtract(r, this.modulus);
+		rgtem = biCompare(r, this.modulus) >= 0;
+	}
+	return r;
+}
+
+function BarrettMu_multiplyMod(x, y)
+{
+	/*
+	x = this.modulo(x);
+	y = this.modulo(y);
+	*/
+	var xy = biMultiply(x, y);
+	return this.modulo(xy);
+}
+
+function BarrettMu_powMod(x, y)
+{
+	var result = new BigInt();
+	result.digits[0] = 1;
+	var a = x;
+	var k = y;
+	while (true) {
+		if ((k.digits[0] & 1) != 0) result = this.multiplyMod(result, a);
+		k = biShiftRight(k, 1);
+		if (k.digits[0] == 0 && biHighIndex(k) == 0) break;
+		a = this.multiplyMod(a, a);
+	}
+	return result;
+}
+

+ 627 - 0
public/static/BigInt.js

@@ -0,0 +1,627 @@
+// BigInt, a suite of routines for performing multiple-precision arithmetic in
+// JavaScript.
+//
+// Copyright 1998-2005 David Shapiro.
+//
+// You may use, re-use, abuse,
+// copy, and modify this code to your liking, but please keep this header.
+// Thanks!
+//
+// Dave Shapiro
+// dave@ohdave.com
+
+// IMPORTANT THING: Be sure to set maxDigits according to your precision
+// needs. Use the setMaxDigits() function to do this. See comments below.
+//
+// Tweaked by Ian Bunning
+// Alterations:
+// Fix bug in function biFromHex(s) to allow
+// parsing of strings of length != 0 (mod 4)
+
+// Changes made by Dave Shapiro as of 12/30/2004:
+//
+// The BigInt() constructor doesn't take a string anymore. If you want to
+// create a BigInt from a string, use biFromDecimal() for base-10
+// representations, biFromHex() for base-16 representations, or
+// biFromString() for base-2-to-36 representations.
+//
+// biFromArray() has been removed. Use biCopy() instead, passing a BigInt
+// instead of an array.
+//
+// The BigInt() constructor now only constructs a zeroed-out array.
+// Alternatively, if you pass <true>, it won't construct any array. See the
+// biCopy() method for an example of this.
+//
+// Be sure to set maxDigits depending on your precision needs. The default
+// zeroed-out array ZERO_ARRAY is constructed inside the setMaxDigits()
+// function. So use this function to set the variable. DON'T JUST SET THE
+// VALUE. USE THE FUNCTION.
+//
+// ZERO_ARRAY exists to hopefully speed up construction of BigInts(). By
+// precalculating the zero array, we can just use slice(0) to make copies of
+// it. Presumably this calls faster native code, as opposed to setting the
+// elements one at a time. I have not done any timing tests to verify this
+// claim.
+
+// Max number = 10^16 - 2 = 9999999999999998;
+//               2^53     = 9007199254740992;
+
+var biRadixBase = 2;
+var biRadixBits = 16;
+var bitsPerDigit = biRadixBits;
+var biRadix = 1 << 16; // = 2^16 = 65536
+var biHalfRadix = biRadix >>> 1;
+var biRadixSquared = biRadix * biRadix;
+var maxDigitVal = biRadix - 1;
+var maxInteger = 9999999999999998; 
+
+// maxDigits:
+// Change this to accommodate your largest number size. Use setMaxDigits()
+// to change it!
+//
+// In general, if you're working with numbers of size N bits, you'll need 2*N
+// bits of storage. Each digit holds 16 bits. So, a 1024-bit key will need
+//
+// 1024 * 2 / 16 = 128 digits of storage.
+//
+
+var maxDigits;
+var ZERO_ARRAY;
+var bigZero, bigOne;
+
+function setMaxDigits(value)
+{
+	maxDigits = value;
+	ZERO_ARRAY = new Array(maxDigits);
+	for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0;
+	bigZero = new BigInt();
+	bigOne = new BigInt();
+	bigOne.digits[0] = 1;
+}
+
+setMaxDigits(20);
+
+// The maximum number of digits in base 10 you can convert to an
+// integer without JavaScript throwing up on you.
+var dpl10 = 15;
+// lr10 = 10 ^ dpl10
+var lr10 = biFromNumber(1000000000000000);
+
+function BigInt(flag)
+{
+	if (typeof flag == "boolean" && flag == true) {
+		this.digits = null;
+	}
+	else {
+		this.digits = ZERO_ARRAY.slice(0);
+	}
+	this.isNeg = false;
+}
+
+function biFromDecimal(s)
+{
+	var isNeg = s.charAt(0) == '-';
+	var i = isNeg ? 1 : 0;
+	var result;
+	// Skip leading zeros.
+	while (i < s.length && s.charAt(i) == '0') ++i;
+	if (i == s.length) {
+		result = new BigInt();
+	}
+	else {
+		var digitCount = s.length - i;
+		var fgl = digitCount % dpl10;
+		if (fgl == 0) fgl = dpl10;
+		result = biFromNumber(Number(s.substr(i, fgl)));
+		i += fgl;
+		while (i < s.length) {
+			result = biAdd(biMultiply(result, lr10),
+			               biFromNumber(Number(s.substr(i, dpl10))));
+			i += dpl10;
+		}
+		result.isNeg = isNeg;
+	}
+	return result;
+}
+
+function biCopy(bi)
+{
+	var result = new BigInt(true);
+	result.digits = bi.digits.slice(0);
+	result.isNeg = bi.isNeg;
+	return result;
+}
+
+function biFromNumber(i)
+{
+	var result = new BigInt();
+	result.isNeg = i < 0;
+	i = Math.abs(i);
+	var j = 0;
+	while (i > 0) {
+		result.digits[j++] = i & maxDigitVal;
+		i = Math.floor(i / biRadix);
+	}
+	return result;
+}
+
+function reverseStr(s)
+{
+	var result = "";
+	for (var i = s.length - 1; i > -1; --i) {
+		result += s.charAt(i);
+	}
+	return result;
+}
+
+var hexatrigesimalToChar = new Array(
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+ 'u', 'v', 'w', 'x', 'y', 'z'
+);
+
+function biToString(x, radix)
+	// 2 <= radix <= 36
+{
+	var b = new BigInt();
+	b.digits[0] = radix;
+	var qr = biDivideModulo(x, b);
+	var result = hexatrigesimalToChar[qr[1].digits[0]];
+	while (biCompare(qr[0], bigZero) == 1) {
+		qr = biDivideModulo(qr[0], b);
+		digit = qr[1].digits[0];
+		result += hexatrigesimalToChar[qr[1].digits[0]];
+	}
+	return (x.isNeg ? "-" : "") + reverseStr(result);
+}
+
+function biToDecimal(x)
+{
+	var b = new BigInt();
+	b.digits[0] = 10;
+	var qr = biDivideModulo(x, b);
+	var result = String(qr[1].digits[0]);
+	while (biCompare(qr[0], bigZero) == 1) {
+		qr = biDivideModulo(qr[0], b);
+		result += String(qr[1].digits[0]);
+	}
+	return (x.isNeg ? "-" : "") + reverseStr(result);
+}
+
+var hexToChar = new Array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+                          'a', 'b', 'c', 'd', 'e', 'f');
+
+function digitToHex(n)
+{
+	var mask = 0xf;
+	var result = "";
+	for (i = 0; i < 4; ++i) {
+		result += hexToChar[n & mask];
+		n >>>= 4;
+	}
+	return reverseStr(result);
+}
+
+function biToHex(x)
+{
+	var result = "";
+	var n = biHighIndex(x);
+	for (var i = biHighIndex(x); i > -1; --i) {
+		result += digitToHex(x.digits[i]);
+	}
+	return result;
+}
+
+function charToHex(c)
+{
+	var ZERO = 48;
+	var NINE = ZERO + 9;
+	var littleA = 97;
+	var littleZ = littleA + 25;
+	var bigA = 65;
+	var bigZ = 65 + 25;
+	var result;
+
+	if (c >= ZERO && c <= NINE) {
+		result = c - ZERO;
+	} else if (c >= bigA && c <= bigZ) {
+		result = 10 + c - bigA;
+	} else if (c >= littleA && c <= littleZ) {
+		result = 10 + c - littleA;
+	} else {
+		result = 0;
+	}
+	return result;
+}
+
+function hexToDigit(s)
+{
+	var result = 0;
+	var sl = Math.min(s.length, 4);
+	for (var i = 0; i < sl; ++i) {
+		result <<= 4;
+		result |= charToHex(s.charCodeAt(i))
+	}
+	return result;
+}
+
+function biFromHex(s)
+{
+	var result = new BigInt();
+	var sl = s.length;
+	for (var i = sl, j = 0; i > 0; i -= 4, ++j) {
+		result.digits[j] = hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4)));
+	}
+	return result;
+}
+
+function biFromString(s, radix)
+{
+	var isNeg = s.charAt(0) == '-';
+	var istop = isNeg ? 1 : 0;
+	var result = new BigInt();
+	var place = new BigInt();
+	place.digits[0] = 1; // radix^0
+	for (var i = s.length - 1; i >= istop; i--) {
+		var c = s.charCodeAt(i);
+		var digit = charToHex(c);
+		var biDigit = biMultiplyDigit(place, digit);
+		result = biAdd(result, biDigit);
+		place = biMultiplyDigit(place, radix);
+	}
+	result.isNeg = isNeg;
+	return result;
+}
+
+function biDump(b)
+{
+	return (b.isNeg ? "-" : "") + b.digits.join(" ");
+}
+
+function biAdd(x, y)
+{
+	var result;
+
+	if (x.isNeg != y.isNeg) {
+		y.isNeg = !y.isNeg;
+		result = biSubtract(x, y);
+		y.isNeg = !y.isNeg;
+	}
+	else {
+		result = new BigInt();
+		var c = 0;
+		var n;
+		for (var i = 0; i < x.digits.length; ++i) {
+			n = x.digits[i] + y.digits[i] + c;
+			result.digits[i] = n % biRadix;
+			c = Number(n >= biRadix);
+		}
+		result.isNeg = x.isNeg;
+	}
+	return result;
+}
+
+function biSubtract(x, y)
+{
+	var result;
+	if (x.isNeg != y.isNeg) {
+		y.isNeg = !y.isNeg;
+		result = biAdd(x, y);
+		y.isNeg = !y.isNeg;
+	} else {
+		result = new BigInt();
+		var n, c;
+		c = 0;
+		for (var i = 0; i < x.digits.length; ++i) {
+			n = x.digits[i] - y.digits[i] + c;
+			result.digits[i] = n % biRadix;
+			// Stupid non-conforming modulus operation.
+			if (result.digits[i] < 0) result.digits[i] += biRadix;
+			c = 0 - Number(n < 0);
+		}
+		// Fix up the negative sign, if any.
+		if (c == -1) {
+			c = 0;
+			for (var i = 0; i < x.digits.length; ++i) {
+				n = 0 - result.digits[i] + c;
+				result.digits[i] = n % biRadix;
+				// Stupid non-conforming modulus operation.
+				if (result.digits[i] < 0) result.digits[i] += biRadix;
+				c = 0 - Number(n < 0);
+			}
+			// Result is opposite sign of arguments.
+			result.isNeg = !x.isNeg;
+		} else {
+			// Result is same sign.
+			result.isNeg = x.isNeg;
+		}
+	}
+	return result;
+}
+
+
+function biHighIndex(x)
+{
+	var result = x.digits.length - 1;
+	while (result > 0 && x.digits[result] == 0) --result;
+	return result;
+}
+
+function biNumBits(x)
+{
+	var n = biHighIndex(x);
+	var d = x.digits[n];
+	var m = (n + 1) * bitsPerDigit;
+	var result;
+	for (result = m; result > m - bitsPerDigit; --result) {
+		if ((d & 0x8000) != 0) break;
+		d <<= 1;
+	}
+	return result;
+}
+
+function biMultiply(x, y)
+{
+	var result = new BigInt();
+	var c;
+	var n = biHighIndex(x);
+	var t = biHighIndex(y);
+	var u, uv, k;
+
+	for (var i = 0; i <= t; ++i) {
+		c = 0;
+		k = i;
+		for (j = 0; j <= n; ++j, ++k) {
+			uv = result.digits[k] + x.digits[j] * y.digits[i] + c;
+			result.digits[k] = uv & maxDigitVal;
+			c = uv >>> biRadixBits;
+			//c = Math.floor(uv / biRadix);
+		}
+		result.digits[i + n + 1] = c;
+	}
+	// Someone give me a logical xor, please.
+	result.isNeg = x.isNeg != y.isNeg;
+	return result;
+}
+
+function biMultiplyDigit(x, y)
+{
+	var n, c, uv;
+
+	result = new BigInt();
+	n = biHighIndex(x);
+	c = 0;
+	for (var j = 0; j <= n; ++j) {
+		uv = result.digits[j] + x.digits[j] * y + c;
+		result.digits[j] = uv & maxDigitVal;
+		c = uv >>> biRadixBits;
+		//c = Math.floor(uv / biRadix);
+	}
+	result.digits[1 + n] = c;
+	return result;
+}
+
+function arrayCopy(src, srcStart, dest, destStart, n)
+{
+	var m = Math.min(srcStart + n, src.length);
+	for (var i = srcStart, j = destStart; i < m; ++i, ++j) {
+		dest[j] = src[i];
+	}
+}
+
+var highBitMasks = new Array(0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800,
+                             0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0,
+                             0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF);
+
+function biShiftLeft(x, n)
+{
+	var digitCount = Math.floor(n / bitsPerDigit);
+	var result = new BigInt();
+	arrayCopy(x.digits, 0, result.digits, digitCount,
+	          result.digits.length - digitCount);
+	var bits = n % bitsPerDigit;
+	var rightBits = bitsPerDigit - bits;
+	for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) {
+		result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) |
+		                   ((result.digits[i1] & highBitMasks[bits]) >>>
+		                    (rightBits));
+	}
+	result.digits[0] = ((result.digits[i] << bits) & maxDigitVal);
+	result.isNeg = x.isNeg;
+	return result;
+}
+
+var lowBitMasks = new Array(0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F,
+                            0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF,
+                            0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF);
+
+function biShiftRight(x, n)
+{
+	var digitCount = Math.floor(n / bitsPerDigit);
+	var result = new BigInt();
+	arrayCopy(x.digits, digitCount, result.digits, 0,
+	          x.digits.length - digitCount);
+	var bits = n % bitsPerDigit;
+	var leftBits = bitsPerDigit - bits;
+	for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) {
+		result.digits[i] = (result.digits[i] >>> bits) |
+		                   ((result.digits[i1] & lowBitMasks[bits]) << leftBits);
+	}
+	result.digits[result.digits.length - 1] >>>= bits;
+	result.isNeg = x.isNeg;
+	return result;
+}
+
+function biMultiplyByRadixPower(x, n)
+{
+	var result = new BigInt();
+	arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n);
+	return result;
+}
+
+function biDivideByRadixPower(x, n)
+{
+	var result = new BigInt();
+	arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n);
+	return result;
+}
+
+function biModuloByRadixPower(x, n)
+{
+	var result = new BigInt();
+	arrayCopy(x.digits, 0, result.digits, 0, n);
+	return result;
+}
+
+function biCompare(x, y)
+{
+	if (x.isNeg != y.isNeg) {
+		return 1 - 2 * Number(x.isNeg);
+	}
+	for (var i = x.digits.length - 1; i >= 0; --i) {
+		if (x.digits[i] != y.digits[i]) {
+			if (x.isNeg) {
+				return 1 - 2 * Number(x.digits[i] > y.digits[i]);
+			} else {
+				return 1 - 2 * Number(x.digits[i] < y.digits[i]);
+			}
+		}
+	}
+	return 0;
+}
+
+function biDivideModulo(x, y)
+{
+	var nb = biNumBits(x);
+	var tb = biNumBits(y);
+	var origYIsNeg = y.isNeg;
+	var q, r;
+	if (nb < tb) {
+		// |x| < |y|
+		if (x.isNeg) {
+			q = biCopy(bigOne);
+			q.isNeg = !y.isNeg;
+			x.isNeg = false;
+			y.isNeg = false;
+			r = biSubtract(y, x);
+			// Restore signs, 'cause they're references.
+			x.isNeg = true;
+			y.isNeg = origYIsNeg;
+		} else {
+			q = new BigInt();
+			r = biCopy(x);
+		}
+		return new Array(q, r);
+	}
+
+	q = new BigInt();
+	r = x;
+
+	// Normalize Y.
+	var t = Math.ceil(tb / bitsPerDigit) - 1;
+	var lambda = 0;
+	while (y.digits[t] < biHalfRadix) {
+		y = biShiftLeft(y, 1);
+		++lambda;
+		++tb;
+		t = Math.ceil(tb / bitsPerDigit) - 1;
+	}
+	// Shift r over to keep the quotient constant. We'll shift the
+	// remainder back at the end.
+	r = biShiftLeft(r, lambda);
+	nb += lambda; // Update the bit count for x.
+	var n = Math.ceil(nb / bitsPerDigit) - 1;
+
+	var b = biMultiplyByRadixPower(y, n - t);
+	while (biCompare(r, b) != -1) {
+		++q.digits[n - t];
+		r = biSubtract(r, b);
+	}
+	for (var i = n; i > t; --i) {
+    var ri = (i >= r.digits.length) ? 0 : r.digits[i];
+    var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1];
+    var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2];
+    var yt = (t >= y.digits.length) ? 0 : y.digits[t];
+    var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1];
+		if (ri == yt) {
+			q.digits[i - t - 1] = maxDigitVal;
+		} else {
+			q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt);
+		}
+
+		var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1);
+		var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2);
+		while (c1 > c2) {
+			--q.digits[i - t - 1];
+			c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1);
+			c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2);
+		}
+
+		b = biMultiplyByRadixPower(y, i - t - 1);
+		r = biSubtract(r, biMultiplyDigit(b, q.digits[i - t - 1]));
+		if (r.isNeg) {
+			r = biAdd(r, b);
+			--q.digits[i - t - 1];
+		}
+	}
+	r = biShiftRight(r, lambda);
+	// Fiddle with the signs and stuff to make sure that 0 <= r < y.
+	q.isNeg = x.isNeg != origYIsNeg;
+	if (x.isNeg) {
+		if (origYIsNeg) {
+			q = biAdd(q, bigOne);
+		} else {
+			q = biSubtract(q, bigOne);
+		}
+		y = biShiftRight(y, lambda);
+		r = biSubtract(y, r);
+	}
+	// Check for the unbelievably stupid degenerate case of r == -0.
+	if (r.digits[0] == 0 && biHighIndex(r) == 0) r.isNeg = false;
+
+	return new Array(q, r);
+}
+
+function biDivide(x, y)
+{
+	return biDivideModulo(x, y)[0];
+}
+
+function biModulo(x, y)
+{
+	return biDivideModulo(x, y)[1];
+}
+
+function biMultiplyMod(x, y, m)
+{
+	return biModulo(biMultiply(x, y), m);
+}
+
+function biPow(x, y)
+{
+	var result = bigOne;
+	var a = x;
+	while (true) {
+		if ((y & 1) != 0) result = biMultiply(result, a);
+		y >>= 1;
+		if (y == 0) break;
+		a = biMultiply(a, a);
+	}
+	return result;
+}
+
+function biPowMod(x, y, m)
+{
+	var result = bigOne;
+	var a = x;
+	var k = y;
+	while (true) {
+		if ((k.digits[0] & 1) != 0) result = biMultiplyMod(result, a, m);
+		k = biShiftRight(k, 1);
+		if (k.digits[0] == 0 && biHighIndex(k) == 0) break;
+		a = biMultiplyMod(a, a, m);
+	}
+	return result;
+}
+

+ 93 - 0
public/static/RSA.js

@@ -0,0 +1,93 @@
+// RSA, a suite of routines for performing RSA public-key computations in
+// JavaScript.
+//
+// Requires BigInt.js and Barrett.js.
+//
+// Copyright 1998-2005 David Shapiro.
+//
+// You may use, re-use, abuse, copy, and modify this code to your liking, but
+// please keep this header.
+//
+// Thanks!
+// 
+// Dave Shapiro
+// dave@ohdave.com 
+
+function RSAKeyPair(encryptionExponent, decryptionExponent, modulus)
+{
+	this.e = biFromHex(encryptionExponent);
+	this.d = biFromHex(decryptionExponent);
+	this.m = biFromHex(modulus);
+	// We can do two bytes per digit, so
+	// chunkSize = 2 * (number of digits in modulus - 1).
+	// Since biHighIndex returns the high index, not the number of digits, 1 has
+	// already been subtracted.
+	this.chunkSize = 2 * biHighIndex(this.m);
+	this.radix = 16;
+	this.barrett = new BarrettMu(this.m);
+}
+
+function twoDigit(n)
+{
+	return (n < 10 ? "0" : "") + String(n);
+}
+
+function encryptedString(key, s)
+	// Altered by Rob Saunders (rob@robsaunders.net). New routine pads the
+	// string after it has been converted to an array. This fixes an
+	// incompatibility with Flash MX's ActionScript.
+{
+	var a = new Array();
+	var sl = s.length;
+	var i = 0;
+	while (i < sl) {
+		a[i] = s.charCodeAt(i);
+		i++;
+	}
+
+	while (a.length % key.chunkSize != 0) {
+		a[i++] = 0;
+	}
+
+	var al = a.length;
+	var result = "";
+	var j, k, block;
+	for (i = 0; i < al; i += key.chunkSize) {
+		block = new BigInt();
+		j = 0;
+		for (k = i; k < i + key.chunkSize; ++j) {
+			block.digits[j] = a[k++];
+			block.digits[j] += a[k++] << 8;
+		}
+		var crypt = key.barrett.powMod(block, key.e);
+		var text = key.radix == 16 ? biToHex(crypt) : biToString(crypt, key.radix);
+		result += text + " ";
+	}
+	return result.substring(0, result.length - 1); // Remove last space.
+}
+
+function decryptedString(key, s)
+{
+	var blocks = s.split(" ");
+	var result = "";
+	var i, j, block;
+	for (i = 0; i < blocks.length; ++i) {
+		var bi;
+		if (key.radix == 16) {
+			bi = biFromHex(blocks[i]);
+		}
+		else {
+			bi = biFromString(blocks[i], key.radix);
+		}
+		block = key.barrett.powMod(bi, key.d);
+		for (j = 0; j <= biHighIndex(block); ++j) {
+			result += String.fromCharCode(block.digits[j] & 255,
+			                              block.digits[j] >> 8);
+		}
+	}
+	// Remove trailing null, if any.
+	if (result.charCodeAt(result.length - 1) == 0) {
+		result = result.substring(0, result.length - 1);
+	}
+	return result;
+}

+ 129 - 0
public/static/css/main-oumulong.css

@@ -0,0 +1,129 @@
+a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video,dl,dt,dd,dt+dd{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline;word-wrap:break-word;}
+body{background-color:#fff;}
+a{text-decoration:none;color:#666;}
+a:focus,a:hover{color:inherit}
+img{display:block;}
+input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;}
+img{width:100%;display:block;}
+.bg_blue{background-color:#298dfe}
+.as_page{padding:30px 15px 0;padding-bottom:100px;}
+input{-webkit-appearance:none;outline:none;font-size:inherit;border:0;}
+.chose_box label{display:block;margin-top:20px;position:relative;}
+.chose_box label span{display:block;font-size:15px;background:#f0f0f0;color:#333;padding:15px 20px;-webkit-border-radius:4px;border-radius:4px;overflow:hidden;text-align:center;}
+.chose_box label input{position:absolute;top:0;left:0;opacity:0;}
+.chose_box label .checked{background:#298dfe;color:#fff}
+.f12{font-size:12px;}
+.f13{font-size:13px;}
+.f14{font-size:14px;}
+.f15{font-size:15px;}
+.f16{font-size:16px;}
+.f18{font-size:18px;}
+.f19{font-size:19px;}
+.f20{font-size:20px;}
+.f21{font-size:21px;}
+.f22{font-size:22px;}
+.txt-center{text-align:center;}
+.clear{clear:both;overflow:hidden}
+.txt-gray{color:#333}
+.flex{display:-webkit-flex;display:flex}
+.flex1{-webkit-flex:1;flex:1;}
+.tit{padding-top:30px;padding-bottom:5px;}
+.sub_tit{font-size:10px;color:#fff;background-color:#298dfe;padding:0 10px;-webkit-border-radius:30px;border-radius:30px;}
+.last_step,.next_step{font-size:16px;padding:4px 16px;-webkit-border-radius:4px;border-radius:4px;overflow:hidden;border:1px solid #298dfe;background:#298dfe;color:#fff}
+.no_step{border-color:#ccc;color:#999;background:#fff}
+.flex_spaceb{-webkit-justify-content:space-between;justify-content:space-between;background-color:#fff;margin-top:20px;position:fixed;left:0;right:0;bottom:0;padding:20px 20px 30px;}
+.index_tit{background:#298dfe;color:#fff;font-size:22px;text-align:center;line-height:60px;padding-top:10px;position:relative;z-index:9;}
+.box_shadow{-webkit-box-shadow:0 0 10px rgba(0,0,0,.1);box-shadow:0 0 10px rgba(0,0,0,.1);-webkit-border-radius:10px;border-radius:10px;}
+.lb_index .flex1{max-width:33.33%;min-width:33.33%;width:33.33%;padding:5px;-webkit-box-sizing:border-box;box-sizing:border-box;}
+.lb_index .flex1 .txt{font-size:14px;color:#555;font-weight:normal;line-height:30px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
+.flex_wrap{flex-wrap:wrap;}
+button{border:0;background:transparent;}
+.lb_index{padding:10px 7px;}
+.main_tit{padding:18px 18px 0;}
+.flex_align{-webkit-align-items:center;align-items:center;}
+.flex_center{-webkit-justify-content:center;justify-content:center;}
+.flex_between{-webkit-justify-content:space-between;justify-content:space-between;}
+.main_tit h2{font-size:18px;color:#333;float:left;line-height:24px}
+.main_tit a{float:right;border:1px solid #ccc;color:#999;-webkit-border-radius:30px;border-radius:30px;display:block;line-height:22px;padding:0 8px;font-size:12px;}
+.news .flex .img,.news .flex img{width:60px;height:60px}
+.news .flex{border-bottom:1px solid #eee;padding-bottom:10px;padding-top:10px;}
+.news h3{font-size:16px;color:#333;line-height:1.2;height:2.4em;text-overflow:-o-ellipsis-lastline;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;}
+.news .txt{margin-left:10px;}
+.news .txt span{color:#999;font-size:12px;}
+.main_con{padding-left:18px;padding-right:18px}
+.main_con_index{margin-left:15px;margin-right:15px}
+.my_edit label span{display:block;color:#333;line-height:3;font-size:18px;}
+.my_edit label{border-bottom:1px solid #eee;display:block;padding:5px 18px 15px 0;margin-left:18px;}
+.my_edit input{display:block;border:none;color:#666;font-size:14px;}
+.txt-light{color:#777}
+.txt-blue{color:#298dfe}
+.margin_t10{margin-top:10px;}
+.margin_t20{margin-top:20px;}
+.btn_main{background:#eee;color:#999;display:block;width:100%;font-size:18px;padding:10px 0;-webkit-border-radius:30px;border-radius:30px;}
+.txt-left{text-align:left;}
+.txt-right{text-align:right;}
+.agree_box{position:relative;}
+.check{-webkit-border-radius:50%;border-radius:50%;width:20px;height:20px;border:1px solid #999;-webkit-box-sizing:border-box;box-sizing:border-box;margin-right:5px;}
+.check::before{content:'';color:#999;position:absolute;margin-left:4px;margin-top:4px;width:8px;height:5px;border-bottom:solid 1px currentColor;border-left:solid 1px currentColor;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);}
+.check.active{background:#298dfe;border-color:#298dfe}
+.check.active::before{color:#fff}
+.login_box .line{border-bottom:1px solid #eee;padding:18px 0 8px;}
+.login_box .sm{padding-right:10px;margin-right:10px;position:relative;}
+.login_box .sm::before{content:'';position:absolute;top:50%;right:0;width:1px;background:#eee;height:14px;margin-top:-7px;}
+.login_box span,.login_box input{padding-top:10px;padding-bottom:10px;}
+.no_lists{background-color:#ccc;height:4px;margin:0 3px;}
+.progress{width:60%;margin:0 auto;padding-top:15px;}
+.progress .active{background-color:#298dfe}
+.mt-line{margin-top:15px;}
+.swiper-slide>.flex,.swiper-slide-list{padding:10px 7px 28px;position:relative;}
+.swiper-slide .img,.swiper-slide-list .img{padding:0 5px;min-width:33.33%;max-width:33.33%;-webkit-box-sizing:border-box;box-sizing:border-box;}
+.swiper-slide .img img,.swiper-slide-list .img img{width:100%}
+.swiper-slide .tit_banner,.swiper-slide-list .tit_banner{width:5em;text-align:justify;text-align-last:justify;}
+.swiper-slide .con,.swiper-slide-list .con{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
+.swiper-slide .txt,.swiper-slide-list .txt{min-width:0;margin-left:5px;}
+.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:5px!important;}
+.main_con_index:last-child{margin-bottom:15px;}
+.swiper-slide-list{padding-bottom:10px;}
+.swiper-slide .txt .hover,.swiper-slide-list .txt .hover{position:absolute;bottom:30px;right:10px;background-color:#298dfe;color:#fff;display:block;line-height:24px;padding:0 10px;-webkit-border-radius:30px;border-radius:30px;}
+.swiper-slide-list .txt .hover{bottom:10px;}
+.serarh_box .flex1{text-align:center;padding:20px 0 5px;}
+.weui-picker__indicator:after,.weui-picker__indicator:before{display:none;}
+.triangle2{display:inline-block;position:relative;top:5px;}
+.triangle2 .content{width:0px;height:4px;border:4px solid;border-color:#aaa transparent transparent transparent;}
+.serarh_box .s_tit{display:inline-block;}
+.weui-btn_primary{background-color:#298dfe;}
+.main_but,.sub_but{display:block;text-align:center;padding:12px;-webkit-border-radius:4px;border-radius:4px;}
+.main_but{background-color:#298dfe;color:#fff;border:1px solid #298dfe;}
+.sub_but{color:#333;border:1px solid #ccc;color:#666;}
+.h1{font-size:30px;font-weight:bold;color:#298dfe;padding:20px 0;position:relative;}
+.h1::after{content:'';position:absolute;width:2.5em;height:3px;background-color:#298dfe;left:0;bottom:0;}
+.info_box .txt_con{padding:40px 0 50px;line-height:2;}
+.info_box .img{width:20%;margin-top:50px}
+.swiper-pagination1{text-align:center;margin-top:-20px;z-index:9999;position:relative;}
+.reault_box{border:1px solid #eee;padding:30px 20px;margin-top:30px;}
+.txt-light-y{color:#ff9800}
+.f24{font-size:24px}
+.sub_info{line-height:30px}
+.flex_column{-webkit-flex-direction:column;flex-direction:column}
+.main_but_mini{font-size:14px;padding:5px 0;}
+.page_top_blue .top{height:104px;position:relative;z-index:999;}
+.page_top_blue::before{content:'';display:block;width:200%;height:400px;background:#298dfe;-webkit-border-radius:100%;position:absolute;top:-290px;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);}
+.tpic .img{width:56px;margin-right:12px;}
+.tpic .txt{color:#fff;font-size:14px;}
+.tpic{margin:15px;}
+.lb_index .flex1:nth-of-type(n+4){display:none}
+.lb_index .flex1 img,.swiper-slide-list .img img{height:75px}
+.lb_index .flex1 .img{-webkit-border-radius:4px;border-radius:4px;overflow:hidden;}
+.bot_column .h{height:60px}
+.bot_nav{position:fixed;left:0;right:0;bottom:0;background-color:#fff;border:1px solid #eee;padding:4px 0 1px;}
+.bot_nav .img{margin:0 auto;width:20px;margin-bottom:3px}
+.bot_nav .active .f12{color:#298dfe}
+.bot-btn{height: 46px;background:#298dfe;color:#fff;line-height: 46px;text-align: center;position: fixed;bottom:0;left:0;right:0;}
+.showable-btn{border: 1px solid #298dfe;
+    color: #298dfe;
+    -webkit-border-radius: 30px;
+    border-radius: 30px;
+    display: inline-block;
+    line-height: 22px;
+    padding: 0 8px;
+    font-size: 12px;margin:20px auto;}

+ 144 - 0
public/static/css/main.css

@@ -0,0 +1,144 @@
+a,abbr,acronym,address,applet,article,aside,audio,b,big,blockquote,body,canvas,caption,center,cite,code,dd,del,details,dfn,div,dl,dt,em,embed,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,html,i,iframe,img,ins,kbd,label,legend,li,mark,menu,nav,object,ol,output,p,pre,q,ruby,s,samp,section,small,span,strike,strong,sub,summary,sup,table,tbody,td,tfoot,th,thead,time,tr,tt,u,ul,var,video,dl,dt,dd,dt+dd{margin:0;padding:0;border:0;font:inherit;vertical-align:baseline;word-wrap:break-word;}
+body{background-color:#fff;}
+a{text-decoration:none;color:#666;}
+a:focus,a:hover{color:inherit}
+img{display:block;}
+input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#aaa;}
+img{width:100%;display:block;}
+.bg_blue{background-color:#298dfe}
+.as_page{padding:30px 15px 0;padding-bottom:100px;}
+input{-webkit-appearance:none;outline:none;font-size:inherit;border:0;}
+.chose_box label{display:block;margin-top:20px;position:relative;}
+.chose_box label span{display:block;font-size:15px;background:#f0f0f0;color:#333;padding:15px 20px;-webkit-border-radius:4px;border-radius:4px;overflow:hidden;text-align:center;}
+.chose_box label input{position:absolute;top:0;left:0;opacity:0;}
+.chose_box label .checked{background:#298dfe;color:#fff}
+.f12{font-size:12px;}
+.f13{font-size:13px;}
+.f14{font-size:14px;}
+.f15{font-size:15px;}
+.f16{font-size:16px;}
+.f18{font-size:18px;}
+.f19{font-size:19px;}
+.f20{font-size:20px;}
+.f21{font-size:21px;}
+.f22{font-size:22px;}
+.txt-center{text-align:center;}
+.clear{clear:both;overflow:hidden}
+.txt-gray{color:#333}
+.flex{display:-webkit-flex;display:flex}
+.flex1{-webkit-flex:1;flex:1;}
+.tit{padding-top:30px;padding-bottom:5px;}
+.sub_tit{font-size:10px;color:#fff;background-color:#298dfe;padding:0 10px;-webkit-border-radius:30px;border-radius:30px;}
+.last_step,.next_step{font-size:16px;padding:4px 16px;-webkit-border-radius:4px;border-radius:4px;overflow:hidden;border:1px solid #298dfe;background:#298dfe;color:#fff}
+.no_step{border-color:#ccc;color:#999;background:#fff}
+.flex_spaceb{-webkit-justify-content:space-between;justify-content:space-between;background-color:#fff;margin-top:20px;position:fixed;left:0;right:0;bottom:0;padding:20px 20px 30px;}
+.index_tit{background:#298dfe;color:#fff;font-size:22px;text-align:center;line-height:60px;padding-top:10px;position:relative;z-index:9;}
+.box_shadow{-webkit-box-shadow:0 0 10px rgba(0,0,0,.1);box-shadow:0 0 10px rgba(0,0,0,.1);-webkit-border-radius:10px;border-radius:10px;}
+.lb_index .flex1{max-width:33.33%;min-width:33.33%;width:33.33%;padding:5px;-webkit-box-sizing:border-box;box-sizing:border-box;}
+.lb_index .flex1 .txt{font-size:14px;color:#555;font-weight:normal;line-height:30px;text-align:center;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
+.flex_wrap{flex-wrap:wrap;}
+button{border:0;background:transparent;}
+.lb_index{padding:10px 7px;}
+.main_tit{padding:18px 18px 0;}
+.flex_align{-webkit-align-items:center;align-items:center;}
+.flex_center{-webkit-justify-content:center;justify-content:center;}
+.flex_between{-webkit-justify-content:space-between;justify-content:space-between;}
+.main_tit h2{font-size:18px;color:#333;float:left;line-height:24px}
+.main_tit a{float:right;border:1px solid #ccc;color:#999;-webkit-border-radius:30px;border-radius:30px;display:block;line-height:22px;padding:0 8px;font-size:12px;}
+.news .flex .img,.news .flex img{width:60px;height:60px}
+.news .flex{border-bottom:1px solid #eee;padding-bottom:10px;padding-top:10px;}
+.news h3{font-size:16px;color:#333;line-height:1.2;height:2.4em;text-overflow:-o-ellipsis-lastline;overflow:hidden;text-overflow:ellipsis;display:-webkit-box;-webkit-line-clamp:2;-webkit-box-orient:vertical;}
+.news .txt{margin-left:10px;}
+.news .txt span{color:#999;font-size:12px;}
+.main_con{padding-left:18px;padding-right:18px}
+.main_con_index{margin-left:15px;margin-right:15px;min-height:50px;}
+.my_edit label span{display:block;color:#333;line-height:3;font-size:18px;}
+.my_edit label{border-bottom:1px solid #eee;display:block;padding:5px 18px 15px 0;margin-left:18px;}
+.my_edit input{display:block;border:none;color:#666;font-size:14px;}
+.txt-light{color:#777}
+.txt-blue{color:#298dfe}
+.margin_t10{margin-top:10px;}
+.margin_t20{margin-top:20px;}
+.btn_main{background:#eee;color:#888;display:block;width:100%;font-size:18px;padding:10px 0;-webkit-border-radius:30px;border-radius:30px;}
+.btn_main.active{background:#298dfe;color:#fff;}
+.txt-left{text-align:left;}
+.txt-right{text-align:right;}
+.agree_box{position:relative;}
+.check{-webkit-border-radius:50%;border-radius:50%;width:20px;height:20px;border:1px solid #999;-webkit-box-sizing:border-box;box-sizing:border-box;margin-right:5px;}
+.check::before{content:'';color:#999;position:absolute;margin-left:4px;margin-top:4px;width:8px;height:5px;border-bottom:solid 1px currentColor;border-left:solid 1px currentColor;-webkit-transform:rotate(-45deg);transform:rotate(-45deg);}
+.check.active{background:#298dfe;border-color:#298dfe}
+.check.active::before{color:#fff}
+.login_box .line{border-bottom:1px solid #eee;padding:18px 0 8px;height: 41px}
+.login_box .sm{padding-right:10px;margin-right:10px;position:relative;}
+.login_box .sm::before{content:'';position:absolute;top:50%;right:0;width:1px;background:#eee;height:14px;margin-top:-7px;}
+.login_box span,.login_box input{padding-top:10px;padding-bottom:10px;}
+.no_lists{background-color:#ccc;height:4px;margin:0 3px;}
+.progress{width:60%;margin:0 auto;padding-top:15px;}
+.progress .active{background-color:#298dfe}
+.mt-line{margin-top:15px;}
+.swiper-slide>.flex,.swiper-slide-list{padding:10px 7px 28px;position:relative;}
+.swiper-slide .img,.swiper-slide-list .img{padding:0 5px;min-width:33.33%;max-width:33.33%;-webkit-box-sizing:border-box;box-sizing:border-box;}
+.swiper-slide .img img,.swiper-slide-list .img img{width:100%}
+.swiper-slide .tit_banner,.swiper-slide-list .tit_banner{width:5em;text-align:justify;text-align-last:justify;}
+.swiper-slide .con,.swiper-slide-list .con{white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
+.swiper-slide .txt,.swiper-slide-list .txt{min-width:0;margin-left:5px;}
+.swiper-container-horizontal>.swiper-pagination-bullets,.swiper-pagination-custom,.swiper-pagination-fraction{bottom:5px!important;}
+.main_con_index:last-child{margin-bottom:15px;}
+.swiper-slide-list{padding-bottom:10px;}
+.swiper-slide .txt .hover,.swiper-slide-list .txt .hover{position:absolute;bottom:30px;right:10px;background-color:#298dfe;color:#fff;display:block;line-height:24px;padding:0 10px;-webkit-border-radius:30px;border-radius:30px;}
+.swiper-slide-list .txt .hover{bottom:10px;}
+.serarh_box .flex1{text-align:center;padding:20px 0 5px;}
+.weui-picker__indicator:after,.weui-picker__indicator:before{display:none;}
+.triangle2{display:inline-block;position:relative;top:5px;}
+.triangle2 .content{width:0px;height:4px;border:4px solid;border-color:#aaa transparent transparent transparent;}
+.serarh_box .s_tit{display:inline-block;}
+.weui-btn_primary{background-color:#298dfe;}
+.main_but,.sub_but{display:block;text-align:center;padding:12px;-webkit-border-radius:4px;border-radius:4px;}
+.main_but{background-color:#298dfe;color:#fff;border:1px solid #298dfe;}
+.sub_but{color:#333;border:1px solid #ccc;color:#666;}
+.h1{font-size:30px;font-weight:bold;color:#298dfe;padding:20px 0;position:relative;}
+.h1::after{content:'';position:absolute;width:2.5em;height:3px;background-color:#298dfe;left:0;bottom:0;}
+.info_box .txt_con{padding:40px 0 50px;line-height:2;}
+.info_box .img{width:20%;margin-top:50px}
+.swiper-pagination1{text-align:center;margin-top:-20px;z-index:9999;position:relative;}
+.reault_box{border:1px solid #eee;padding:30px 20px;margin-top:30px;}
+.txt-light-y{color:#ff9800}
+.f24{font-size:24px}
+.sub_info{line-height:30px}
+.flex_column{-webkit-flex-direction:column;flex-direction:column}
+.main_but_mini{font-size:14px;padding:5px 0;}
+.page_top_blue .top{height:104px;position:relative;z-index:999;}
+.page_top_blue::before{content:'';display:block;width:200%;height:400px;background:#298dfe;-webkit-border-radius:100%;position:absolute;top:-290px;left:50%;-webkit-transform:translateX(-50%);transform:translateX(-50%);}
+.tpic .img{width:56px;margin-right:12px;}
+.tpic .txt{color:#fff;font-size:14px;}
+.tpic{margin:15px;}
+.lb_index .flex1:nth-of-type(n+4){display:none}
+.lb_index .flex1 img,.swiper-slide-list .img img{height:75px}
+.lb_index .flex1 .img{-webkit-border-radius:4px;border-radius:4px;overflow:hidden;}
+.bot_column .h{height:60px}
+.bot_nav{position:fixed;left:0;right:0;bottom:0;background-color:#fff;border:1px solid #eee;padding:4px 0 1px;}
+.bot_nav .img{margin:0 auto;width:20px;margin-bottom:3px}
+.bot_nav .active .f12{color:#298dfe}
+.bot-btn{height: 46px;background:#298dfe;color:#fff;line-height: 46px;text-align: center;position: fixed;bottom:0;left:0;right:0;}
+.bot-btn1{height: 46px;background:#fff;color:#fff;text-align: center;position: fixed;bottom:0;left:0;right:0;}
+.bot-btn1 a{display: inline-block;border :1px solid #eee;color:#298dfe;padding:0px 22px;line-height:34px;-webkit-border-radius:20px;border-radius:20px;font-size:14px;}
+.showable-btn{border: 1px solid #298dfe;
+    color: #298dfe;
+    -webkit-border-radius: 30px;
+    border-radius: 30px;
+    display: inline-block;
+    line-height: 22px;
+    padding: 0 8px;
+    font-size: 12px;margin:20px auto;}
+    .btn_sm{border:1px solid #298dfe;-webkit-border-radius:20px;border-radius:20px;padding:4px 10px !important;font-size:12px}
+
+.bot_fixed{position: fixed;bottom:15px;left:0;right:0;}
+.swiper-slide-list .txt{line-height: 20px}
+.login_box .sm{white-space: nowrap;}
+/* @media screen and (min-width: 750px){
+	.top_back{display:none !important}
+	body{max-width:750px;width:750px;margin: 0 auto !important;background-color:#eee !important;}
+} */
+.top_back{height: 44px;background-color: #fff;border-bottom:1px solid #f4f4f4;}
+.top_back_con{padding-left: 15px;line-height: 44px;height: 44px}
+.back_img{width: 10px;height: 19px;margin-right:10px}

File diff suppressed because it is too large
+ 14 - 0
public/static/css/swiper.min.css


File diff suppressed because it is too large
+ 0 - 0
public/static/css/weui.min.css


+ 118 - 0
public/static/flexible.js

@@ -0,0 +1,118 @@
+
+(function(win, lib) {
+    var doc = win.document;
+    var docEl = doc.documentElement;
+    var metaEl = doc.querySelector('meta[name="viewport"]');
+    var flexibleEl = doc.querySelector('meta[name="flexible"]');
+    var dpr = 0;
+    var scale = 0;
+    var tid;
+    var flexible = lib.flexible || (lib.flexible = {});
+
+    if (metaEl) {
+        console.warn('将根据已有的meta标签来设置缩放比例');
+        var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
+        if (match) {
+            scale = parseFloat(match[1]);
+            dpr = parseInt(1 / scale);
+        }
+    } else if (flexibleEl) {
+        var content = flexibleEl.getAttribute('content');
+        if (content) {
+            var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
+            var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
+            if (initialDpr) {
+                dpr = parseFloat(initialDpr[1]);
+                scale = parseFloat((1 / dpr).toFixed(2));
+            }
+            if (maximumDpr) {
+                dpr = parseFloat(maximumDpr[1]);
+                scale = parseFloat((1 / dpr).toFixed(2));
+            }
+        }
+    }
+
+    if (!dpr && !scale) {
+        var isAndroid = win.navigator.appVersion.match(/android/gi);
+        var isIPhone = win.navigator.appVersion.match(/iphone/gi);
+        var devicePixelRatio = win.devicePixelRatio;
+        if (isIPhone) {
+            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
+            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
+                dpr = 3;
+            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
+                dpr = 2;
+            } else {
+                dpr = 1;
+            }
+        } else {
+            // 其他设备下,仍旧使用1倍的方案
+            dpr = 1;
+        }
+        scale = 1 / dpr;
+    }
+
+    docEl.setAttribute('data-dpr', dpr);
+    if (!metaEl) {
+        metaEl = doc.createElement('meta');
+        metaEl.setAttribute('name', 'viewport');
+        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no,viewport-fit=cover');
+        if (docEl.firstElementChild) {
+            docEl.firstElementChild.appendChild(metaEl);
+        } else {
+            var wrap = doc.createElement('div');
+            wrap.appendChild(metaEl);
+            doc.write(wrap.innerHTML);
+        }
+    }
+
+    function refreshRem(){
+        var width = docEl.getBoundingClientRect().width;
+        if (width / dpr > 540) {
+            width = 540 * dpr;
+        }
+        var rem = width / 10;
+        docEl.style.fontSize = rem + 'px';
+        flexible.rem = win.rem = rem;
+    }
+
+    win.addEventListener('resize', function() {
+        clearTimeout(tid);
+        tid = setTimeout(refreshRem, 300);
+    }, false);
+    win.addEventListener('pageshow', function(e) {
+        if (e.persisted) {
+            clearTimeout(tid);
+            tid = setTimeout(refreshRem, 300);
+        }
+    }, false);
+
+    if (doc.readyState === 'complete') {
+        doc.body.style.fontSize = 12 * dpr + 'px';
+    } else {
+        doc.addEventListener('DOMContentLoaded', function(e) {
+            doc.body.style.fontSize = 12 * dpr + 'px';
+        }, false);
+    }
+
+
+    refreshRem();
+
+    flexible.dpr = win.dpr = dpr;
+    flexible.refreshRem = refreshRem;
+    flexible.rem2px = function(d) {
+        var val = parseFloat(d) * this.rem;
+        if (typeof d === 'string' && d.match(/rem$/)) {
+            val += 'px';
+        }
+        return val;
+    }
+    flexible.px2rem = function(d) {
+        var val = parseFloat(d) / this.rem;
+        if (typeof d === 'string' && d.match(/px$/)) {
+            val += 'rem';
+        }
+        return val;
+    }
+
+})(window, window['lib'] || (window['lib'] = {}));

File diff suppressed because it is too large
+ 1 - 0
public/static/js/jquery.min.js


File diff suppressed because it is too large
+ 14 - 0
public/static/js/swiper.jquery.min.js


File diff suppressed because it is too large
+ 5 - 0
public/static/js/weui.min.js


+ 684 - 0
public/static/myrsa.js

@@ -0,0 +1,684 @@
+
+(function($w) {
+if(typeof $w.RSAUtils === 'undefined')
+var RSAUtils = $w.RSAUtils = {};
+var biRadixBase = 2;
+var biRadixBits = 16;
+var bitsPerDigit = biRadixBits;
+var biRadix = 1 << 16; // = 2^16 = 65536
+var biHalfRadix = biRadix >>> 1;
+var biRadixSquared = biRadix * biRadix;
+var maxDigitVal = biRadix - 1;
+var maxInteger = 9999999999999998;
+
+//maxDigits:
+//Change this to accommodate your largest number size. Use setMaxDigits()
+//to change it!
+//
+//In general, if you're working with numbers of size N bits, you'll need 2*N
+//bits of storage. Each digit holds 16 bits. So, a 1024-bit key will need
+//
+//1024 * 2 / 16 = 128 digits of storage.
+//
+var maxDigits;
+var ZERO_ARRAY;
+var bigZero, bigOne;
+
+var BigInt = $w.BigInt = function(flag) {
+ if (typeof flag == "boolean" && flag == true) {
+  this.digits = null;
+ } else {
+  this.digits = ZERO_ARRAY.slice(0);
+ }
+ this.isNeg = false;
+};
+
+RSAUtils.setMaxDigits = function(value) {
+ maxDigits = value;
+ ZERO_ARRAY = new Array(maxDigits);
+ for (var iza = 0; iza < ZERO_ARRAY.length; iza++) ZERO_ARRAY[iza] = 0;
+ bigZero = new BigInt();
+ bigOne = new BigInt();
+ bigOne.digits[0] = 1;
+};
+RSAUtils.setMaxDigits(20);
+
+//The maximum number of digits in base 10 you can convert to an
+//integer without JavaScript throwing up on you.
+var dpl10 = 15;
+
+RSAUtils.biFromNumber = function(i) {
+ var result = new BigInt();
+ result.isNeg = i < 0;
+ i = Math.abs(i);
+ var j = 0;
+ while (i > 0) {
+  result.digits[j++] = i & maxDigitVal;
+  i = Math.floor(i / biRadix);
+ }
+ return result;
+};
+
+//lr10 = 10 ^ dpl10
+var lr10 = RSAUtils.biFromNumber(1000000000000000);
+
+RSAUtils.biFromDecimal = function(s) {
+ var isNeg = s.charAt(0) == '-';
+ var i = isNeg ? 1 : 0;
+ var result;
+ // Skip leading zeros.
+ while (i < s.length && s.charAt(i) == '0') ++i;
+ if (i == s.length) {
+  result = new BigInt();
+ }
+ else {
+  var digitCount = s.length - i;
+  var fgl = digitCount % dpl10;
+  if (fgl == 0) fgl = dpl10;
+  result = RSAUtils.biFromNumber(Number(s.substr(i, fgl)));
+  i += fgl;
+  while (i < s.length) {
+   result = RSAUtils.biAdd(RSAUtils.biMultiply(result, lr10),
+     RSAUtils.biFromNumber(Number(s.substr(i, dpl10))));
+   i += dpl10;
+  }
+  result.isNeg = isNeg;
+ }
+ return result;
+};
+
+RSAUtils.biCopy = function(bi) {
+ var result = new BigInt(true);
+ result.digits = bi.digits.slice(0);
+ result.isNeg = bi.isNeg;
+ return result;
+};
+
+RSAUtils.reverseStr = function(s) {
+ var result = "";
+ for (var i = s.length - 1; i > -1; --i) {
+  result += s.charAt(i);
+ }
+ return result;
+};
+
+var hexatrigesimalToChar = [
+ '0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j',
+ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't',
+ 'u', 'v', 'w', 'x', 'y', 'z'
+];
+
+RSAUtils.biToString = function(x, radix) { // 2 <= radix <= 36
+ var b = new BigInt();
+ b.digits[0] = radix;
+ var qr = RSAUtils.biDivideModulo(x, b);
+ var result = hexatrigesimalToChar[qr[1].digits[0]];
+ while (RSAUtils.biCompare(qr[0], bigZero) == 1) {
+  qr = RSAUtils.biDivideModulo(qr[0], b);
+  digit = qr[1].digits[0];
+  result += hexatrigesimalToChar[qr[1].digits[0]];
+ }
+ return (x.isNeg ? "-" : "") + RSAUtils.reverseStr(result);
+};
+
+RSAUtils.biToDecimal = function(x) {
+ var b = new BigInt();
+ b.digits[0] = 10;
+ var qr = RSAUtils.biDivideModulo(x, b);
+ var result = String(qr[1].digits[0]);
+ while (RSAUtils.biCompare(qr[0], bigZero) == 1) {
+  qr = RSAUtils.biDivideModulo(qr[0], b);
+  result += String(qr[1].digits[0]);
+ }
+ return (x.isNeg ? "-" : "") + RSAUtils.reverseStr(result);
+};
+
+var hexToChar = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
+        'a', 'b', 'c', 'd', 'e', 'f'];
+
+RSAUtils.digitToHex = function(n) {
+ var mask = 0xf;
+ var result = "";
+ for (i = 0; i < 4; ++i) {
+  result += hexToChar[n & mask];
+  n >>>= 4;
+ }
+ return RSAUtils.reverseStr(result);
+};
+
+RSAUtils.biToHex = function(x) {
+ var result = "";
+ var n = RSAUtils.biHighIndex(x);
+ for (var i = RSAUtils.biHighIndex(x); i > -1; --i) {
+  result += RSAUtils.digitToHex(x.digits[i]);
+ }
+ return result;
+};
+
+RSAUtils.charToHex = function(c) {
+ var ZERO = 48;
+ var NINE = ZERO + 9;
+ var littleA = 97;
+ var littleZ = littleA + 25;
+ var bigA = 65;
+ var bigZ = 65 + 25;
+ var result;
+
+ if (c >= ZERO && c <= NINE) {
+  result = c - ZERO;
+ } else if (c >= bigA && c <= bigZ) {
+  result = 10 + c - bigA;
+ } else if (c >= littleA && c <= littleZ) {
+  result = 10 + c - littleA;
+ } else {
+  result = 0;
+ }
+ return result;
+};
+
+RSAUtils.hexToDigit = function(s) {
+ var result = 0;
+ var sl = Math.min(s.length, 4);
+ for (var i = 0; i < sl; ++i) {
+  result <<= 4;
+  result |= RSAUtils.charToHex(s.charCodeAt(i));
+ }
+ return result;
+};
+
+RSAUtils.biFromHex = function(s) {
+ var result = new BigInt();
+ var sl = s.length;
+ for (var i = sl, j = 0; i > 0; i -= 4, ++j) {
+  result.digits[j] = RSAUtils.hexToDigit(s.substr(Math.max(i - 4, 0), Math.min(i, 4)));
+ }
+ return result;
+};
+
+RSAUtils.biFromString = function(s, radix) {
+ var isNeg = s.charAt(0) == '-';
+ var istop = isNeg ? 1 : 0;
+ var result = new BigInt();
+ var place = new BigInt();
+ place.digits[0] = 1; // radix^0
+ for (var i = s.length - 1; i >= istop; i--) {
+  var c = s.charCodeAt(i);
+  var digit = RSAUtils.charToHex(c);
+  var biDigit = RSAUtils.biMultiplyDigit(place, digit);
+  result = RSAUtils.biAdd(result, biDigit);
+  place = RSAUtils.biMultiplyDigit(place, radix);
+ }
+ result.isNeg = isNeg;
+ return result;
+};
+
+RSAUtils.biDump = function(b) {
+ return (b.isNeg ? "-" : "") + b.digits.join(" ");
+};
+
+RSAUtils.biAdd = function(x, y) {
+ var result;
+
+ if (x.isNeg != y.isNeg) {
+  y.isNeg = !y.isNeg;
+  result = RSAUtils.biSubtract(x, y);
+  y.isNeg = !y.isNeg;
+ }
+ else {
+  result = new BigInt();
+  var c = 0;
+  var n;
+  for (var i = 0; i < x.digits.length; ++i) {
+   n = x.digits[i] + y.digits[i] + c;
+   result.digits[i] = n % biRadix;
+   c = Number(n >= biRadix);
+  }
+  result.isNeg = x.isNeg;
+ }
+ return result;
+};
+
+RSAUtils.biSubtract = function(x, y) {
+ var result;
+ if (x.isNeg != y.isNeg) {
+  y.isNeg = !y.isNeg;
+  result = RSAUtils.biAdd(x, y);
+  y.isNeg = !y.isNeg;
+ } else {
+  result = new BigInt();
+  var n, c;
+  c = 0;
+  for (var i = 0; i < x.digits.length; ++i) {
+   n = x.digits[i] - y.digits[i] + c;
+   result.digits[i] = n % biRadix;
+   // Stupid non-conforming modulus operation.
+   if (result.digits[i] < 0) result.digits[i] += biRadix;
+   c = 0 - Number(n < 0);
+  }
+  // Fix up the negative sign, if any.
+  if (c == -1) {
+   c = 0;
+   for (var i = 0; i < x.digits.length; ++i) {
+    n = 0 - result.digits[i] + c;
+    result.digits[i] = n % biRadix;
+    // Stupid non-conforming modulus operation.
+    if (result.digits[i] < 0) result.digits[i] += biRadix;
+    c = 0 - Number(n < 0);
+   }
+   // Result is opposite sign of arguments.
+   result.isNeg = !x.isNeg;
+  } else {
+   // Result is same sign.
+   result.isNeg = x.isNeg;
+  }
+ }
+ return result;
+};
+
+RSAUtils.biHighIndex = function(x) {
+ var result = x.digits.length - 1;
+ while (result > 0 && x.digits[result] == 0) --result;
+ return result;
+};
+
+RSAUtils.biNumBits = function(x) {
+ var n = RSAUtils.biHighIndex(x);
+ var d = x.digits[n];
+ var m = (n + 1) * bitsPerDigit;
+ var result;
+ for (result = m; result > m - bitsPerDigit; --result) {
+  if ((d & 0x8000) != 0) break;
+  d <<= 1;
+ }
+ return result;
+};
+
+RSAUtils.biMultiply = function(x, y) {
+ var result = new BigInt();
+ var c;
+ var n = RSAUtils.biHighIndex(x);
+ var t = RSAUtils.biHighIndex(y);
+ var u, uv, k;
+
+ for (var i = 0; i <= t; ++i) {
+  c = 0;
+  k = i;
+  for (j = 0; j <= n; ++j, ++k) {
+   uv = result.digits[k] + x.digits[j] * y.digits[i] + c;
+   result.digits[k] = uv & maxDigitVal;
+   c = uv >>> biRadixBits;
+   //c = Math.floor(uv / biRadix);
+  }
+  result.digits[i + n + 1] = c;
+ }
+ // Someone give me a logical xor, please.
+ result.isNeg = x.isNeg != y.isNeg;
+ return result;
+};
+
+RSAUtils.biMultiplyDigit = function(x, y) {
+ var n, c, uv;
+
+ result = new BigInt();
+ n = RSAUtils.biHighIndex(x);
+ c = 0;
+ for (var j = 0; j <= n; ++j) {
+  uv = result.digits[j] + x.digits[j] * y + c;
+  result.digits[j] = uv & maxDigitVal;
+  c = uv >>> biRadixBits;
+  //c = Math.floor(uv / biRadix);
+ }
+ result.digits[1 + n] = c;
+ return result;
+};
+
+RSAUtils.arrayCopy = function(src, srcStart, dest, destStart, n) {
+ var m = Math.min(srcStart + n, src.length);
+ for (var i = srcStart, j = destStart; i < m; ++i, ++j) {
+  dest[j] = src[i];
+ }
+};
+
+var highBitMasks = [0x0000, 0x8000, 0xC000, 0xE000, 0xF000, 0xF800,
+        0xFC00, 0xFE00, 0xFF00, 0xFF80, 0xFFC0, 0xFFE0,
+        0xFFF0, 0xFFF8, 0xFFFC, 0xFFFE, 0xFFFF];
+
+RSAUtils.biShiftLeft = function(x, n) {
+ var digitCount = Math.floor(n / bitsPerDigit);
+ var result = new BigInt();
+ RSAUtils.arrayCopy(x.digits, 0, result.digits, digitCount,
+           result.digits.length - digitCount);
+ var bits = n % bitsPerDigit;
+ var rightBits = bitsPerDigit - bits;
+ for (var i = result.digits.length - 1, i1 = i - 1; i > 0; --i, --i1) {
+  result.digits[i] = ((result.digits[i] << bits) & maxDigitVal) |
+                     ((result.digits[i1] & highBitMasks[bits]) >>>
+                      (rightBits));
+ }
+ result.digits[0] = ((result.digits[i] << bits) & maxDigitVal);
+ result.isNeg = x.isNeg;
+ return result;
+};
+
+var lowBitMasks = [0x0000, 0x0001, 0x0003, 0x0007, 0x000F, 0x001F,
+        0x003F, 0x007F, 0x00FF, 0x01FF, 0x03FF, 0x07FF,
+        0x0FFF, 0x1FFF, 0x3FFF, 0x7FFF, 0xFFFF];
+
+RSAUtils.biShiftRight = function(x, n) {
+ var digitCount = Math.floor(n / bitsPerDigit);
+ var result = new BigInt();
+ RSAUtils.arrayCopy(x.digits, digitCount, result.digits, 0,
+           x.digits.length - digitCount);
+ var bits = n % bitsPerDigit;
+ var leftBits = bitsPerDigit - bits;
+ for (var i = 0, i1 = i + 1; i < result.digits.length - 1; ++i, ++i1) {
+  result.digits[i] = (result.digits[i] >>> bits) |
+                     ((result.digits[i1] & lowBitMasks[bits]) << leftBits);
+ }
+ result.digits[result.digits.length - 1] >>>= bits;
+ result.isNeg = x.isNeg;
+ return result;
+};
+
+RSAUtils.biMultiplyByRadixPower = function(x, n) {
+ var result = new BigInt();
+ RSAUtils.arrayCopy(x.digits, 0, result.digits, n, result.digits.length - n);
+ return result;
+};
+
+RSAUtils.biDivideByRadixPower = function(x, n) {
+ var result = new BigInt();
+ RSAUtils.arrayCopy(x.digits, n, result.digits, 0, result.digits.length - n);
+ return result;
+};
+
+RSAUtils.biModuloByRadixPower = function(x, n) {
+ var result = new BigInt();
+ RSAUtils.arrayCopy(x.digits, 0, result.digits, 0, n);
+ return result;
+};
+
+RSAUtils.biCompare = function(x, y) {
+ if (x.isNeg != y.isNeg) {
+  return 1 - 2 * Number(x.isNeg);
+ }
+ for (var i = x.digits.length - 1; i >= 0; --i) {
+  if (x.digits[i] != y.digits[i]) {
+   if (x.isNeg) {
+    return 1 - 2 * Number(x.digits[i] > y.digits[i]);
+   } else {
+    return 1 - 2 * Number(x.digits[i] < y.digits[i]);
+   }
+  }
+ }
+ return 0;
+};
+
+RSAUtils.biDivideModulo = function(x, y) {
+ var nb = RSAUtils.biNumBits(x);
+ var tb = RSAUtils.biNumBits(y);
+ var origYIsNeg = y.isNeg;
+ var q, r;
+ if (nb < tb) {
+  // |x| < |y|
+  if (x.isNeg) {
+   q = RSAUtils.biCopy(bigOne);
+   q.isNeg = !y.isNeg;
+   x.isNeg = false;
+   y.isNeg = false;
+   r = biSubtract(y, x);
+   // Restore signs, 'cause they're references.
+   x.isNeg = true;
+   y.isNeg = origYIsNeg;
+  } else {
+   q = new BigInt();
+   r = RSAUtils.biCopy(x);
+  }
+  return [q, r];
+ }
+
+ q = new BigInt();
+ r = x;
+
+ // Normalize Y.
+ var t = Math.ceil(tb / bitsPerDigit) - 1;
+ var lambda = 0;
+ while (y.digits[t] < biHalfRadix) {
+  y = RSAUtils.biShiftLeft(y, 1);
+  ++lambda;
+  ++tb;
+  t = Math.ceil(tb / bitsPerDigit) - 1;
+ }
+ // Shift r over to keep the quotient constant. We'll shift the
+ // remainder back at the end.
+ r = RSAUtils.biShiftLeft(r, lambda);
+ nb += lambda; // Update the bit count for x.
+ var n = Math.ceil(nb / bitsPerDigit) - 1;
+
+ var b = RSAUtils.biMultiplyByRadixPower(y, n - t);
+ while (RSAUtils.biCompare(r, b) != -1) {
+  ++q.digits[n - t];
+  r = RSAUtils.biSubtract(r, b);
+ }
+ for (var i = n; i > t; --i) {
+    var ri = (i >= r.digits.length) ? 0 : r.digits[i];
+    var ri1 = (i - 1 >= r.digits.length) ? 0 : r.digits[i - 1];
+    var ri2 = (i - 2 >= r.digits.length) ? 0 : r.digits[i - 2];
+    var yt = (t >= y.digits.length) ? 0 : y.digits[t];
+    var yt1 = (t - 1 >= y.digits.length) ? 0 : y.digits[t - 1];
+  if (ri == yt) {
+   q.digits[i - t - 1] = maxDigitVal;
+  } else {
+   q.digits[i - t - 1] = Math.floor((ri * biRadix + ri1) / yt);
+  }
+
+  var c1 = q.digits[i - t - 1] * ((yt * biRadix) + yt1);
+  var c2 = (ri * biRadixSquared) + ((ri1 * biRadix) + ri2);
+  while (c1 > c2) {
+   --q.digits[i - t - 1];
+   c1 = q.digits[i - t - 1] * ((yt * biRadix) | yt1);
+   c2 = (ri * biRadix * biRadix) + ((ri1 * biRadix) + ri2);
+  }
+
+  b = RSAUtils.biMultiplyByRadixPower(y, i - t - 1);
+  r = RSAUtils.biSubtract(r, RSAUtils.biMultiplyDigit(b, q.digits[i - t - 1]));
+  if (r.isNeg) {
+   r = RSAUtils.biAdd(r, b);
+   --q.digits[i - t - 1];
+  }
+ }
+ r = RSAUtils.biShiftRight(r, lambda);
+ // Fiddle with the signs and stuff to make sure that 0 <= r < y.
+ q.isNeg = x.isNeg != origYIsNeg;
+ if (x.isNeg) {
+  if (origYIsNeg) {
+   q = RSAUtils.biAdd(q, bigOne);
+  } else {
+   q = RSAUtils.biSubtract(q, bigOne);
+  }
+  y = RSAUtils.biShiftRight(y, lambda);
+  r = RSAUtils.biSubtract(y, r);
+ }
+ // Check for the unbelievably stupid degenerate case of r == -0.
+ if (r.digits[0] == 0 && RSAUtils.biHighIndex(r) == 0) r.isNeg = false;
+
+ return [q, r];
+};
+
+RSAUtils.biDivide = function(x, y) {
+ return RSAUtils.biDivideModulo(x, y)[0];
+};
+
+RSAUtils.biModulo = function(x, y) {
+ return RSAUtils.biDivideModulo(x, y)[1];
+};
+
+RSAUtils.biMultiplyMod = function(x, y, m) {
+ return RSAUtils.biModulo(RSAUtils.biMultiply(x, y), m);
+};
+
+RSAUtils.biPow = function(x, y) {
+ var result = bigOne;
+ var a = x;
+ while (true) {
+  if ((y & 1) != 0) result = RSAUtils.biMultiply(result, a);
+  y >>= 1;
+  if (y == 0) break;
+  a = RSAUtils.biMultiply(a, a);
+ }
+ return result;
+};
+
+RSAUtils.biPowMod = function(x, y, m) {
+ var result = bigOne;
+ var a = x;
+ var k = y;
+ while (true) {
+  if ((k.digits[0] & 1) != 0) result = RSAUtils.biMultiplyMod(result, a, m);
+  k = RSAUtils.biShiftRight(k, 1);
+  if (k.digits[0] == 0 && RSAUtils.biHighIndex(k) == 0) break;
+  a = RSAUtils.biMultiplyMod(a, a, m);
+ }
+ return result;
+};
+
+
+$w.BarrettMu = function(m) {
+ this.modulus = RSAUtils.biCopy(m);
+ this.k = RSAUtils.biHighIndex(this.modulus) + 1;
+ var b2k = new BigInt();
+ b2k.digits[2 * this.k] = 1; // b2k = b^(2k)
+ this.mu = RSAUtils.biDivide(b2k, this.modulus);
+ this.bkplus1 = new BigInt();
+ this.bkplus1.digits[this.k + 1] = 1; // bkplus1 = b^(k+1)
+ this.modulo = BarrettMu_modulo;
+ this.multiplyMod = BarrettMu_multiplyMod;
+ this.powMod = BarrettMu_powMod;
+};
+
+function BarrettMu_modulo(x) {
+ var $dmath = RSAUtils;
+ var q1 = $dmath.biDivideByRadixPower(x, this.k - 1);
+ var q2 = $dmath.biMultiply(q1, this.mu);
+ var q3 = $dmath.biDivideByRadixPower(q2, this.k + 1);
+ var r1 = $dmath.biModuloByRadixPower(x, this.k + 1);
+ var r2term = $dmath.biMultiply(q3, this.modulus);
+ var r2 = $dmath.biModuloByRadixPower(r2term, this.k + 1);
+ var r = $dmath.biSubtract(r1, r2);
+ if (r.isNeg) {
+  r = $dmath.biAdd(r, this.bkplus1);
+ }
+ var rgtem = $dmath.biCompare(r, this.modulus) >= 0;
+ while (rgtem) {
+  r = $dmath.biSubtract(r, this.modulus);
+  rgtem = $dmath.biCompare(r, this.modulus) >= 0;
+ }
+ return r;
+}
+
+function BarrettMu_multiplyMod(x, y) {
+ 
+ var xy = RSAUtils.biMultiply(x, y);
+ return this.modulo(xy);
+}
+
+function BarrettMu_powMod(x, y) {
+ var result = new BigInt();
+ result.digits[0] = 1;
+ var a = x;
+ var k = y;
+ while (true) {
+  if ((k.digits[0] & 1) != 0) result = this.multiplyMod(result, a);
+  k = RSAUtils.biShiftRight(k, 1);
+  if (k.digits[0] == 0 && RSAUtils.biHighIndex(k) == 0) break;
+  a = this.multiplyMod(a, a);
+ }
+ return result;
+}
+
+var RSAKeyPair = function(encryptionExponent, decryptionExponent, modulus) {
+ var $dmath = RSAUtils;
+ this.e = $dmath.biFromHex(encryptionExponent);
+ this.d = $dmath.biFromHex(decryptionExponent);
+ this.m = $dmath.biFromHex(modulus);
+ // We can do two bytes per digit, so
+ // chunkSize = 2 * (number of digits in modulus - 1).
+ // Since biHighIndex returns the high index, not the number of digits, 1 has
+ // already been subtracted.
+ this.chunkSize = 2 * $dmath.biHighIndex(this.m);
+ this.radix = 16;
+ this.barrett = new $w.BarrettMu(this.m);
+};
+
+RSAUtils.getKeyPair = function(encryptionExponent, decryptionExponent, modulus) {
+ return new RSAKeyPair(encryptionExponent, decryptionExponent, modulus);
+};
+
+if(typeof $w.twoDigit === 'undefined') {
+ $w.twoDigit = function(n) {
+  return (n < 10 ? "0" : "") + String(n);
+ };
+}
+
+// Altered by Rob Saunders (rob@robsaunders.net). New routine pads the
+// string after it has been converted to an array. This fixes an
+// incompatibility with Flash MX's ActionScript.
+RSAUtils.encryptedString = function(key, s) {
+ var a = [];
+ var sl = s.length;
+ var i = 0;
+ while (i < sl) {
+  a[i] = s.charCodeAt(i);
+  i++;
+ }
+
+ while (a.length % key.chunkSize != 0) {
+  a[i++] = 0;
+ }
+
+ var al = a.length;
+ var result = "";
+ var j, k, block;
+ for (i = 0; i < al; i += key.chunkSize) {
+  block = new BigInt();
+  j = 0;
+  for (k = i; k < i + key.chunkSize; ++j) {
+   block.digits[j] = a[k++];
+   block.digits[j] += a[k++] << 8;
+  }
+  var crypt = key.barrett.powMod(block, key.e);
+  var text = key.radix == 16 ? RSAUtils.biToHex(crypt) : RSAUtils.biToString(crypt, key.radix);
+  result += text + " ";
+ }
+ return result.substring(0, result.length - 1); // Remove last space.
+};
+
+RSAUtils.decryptedString = function(key, s) {
+ var blocks = s.split(" ");
+ var result = "";
+ var i, j, block;
+ for (i = 0; i < blocks.length; ++i) {
+  var bi;
+  if (key.radix == 16) {
+   bi = RSAUtils.biFromHex(blocks[i]);
+  }
+  else {
+   bi = RSAUtils.biFromString(blocks[i], key.radix);
+  }
+  block = key.barrett.powMod(bi, key.d);
+  for (j = 0; j <= RSAUtils.biHighIndex(block); ++j) {
+   result += String.fromCharCode(block.digits[j] & 255,
+                                 block.digits[j] >> 8);
+  }
+ }
+ // Remove trailing null, if any.
+ if (result.charCodeAt(result.length - 1) == 0) {
+  result = result.substring(0, result.length - 1);
+ }
+ return result;
+};
+
+RSAUtils.setMaxDigits(130);
+
+})(window);

+ 424 - 0
public/static/sm4.js

@@ -0,0 +1,424 @@
+(function(r) {
+  var e;
+  if (typeof window !== "undefined") {
+    e = window;
+  } else if (typeof global !== "undefined") {
+    e = global;
+  } else if (typeof self !== "undefined") {
+    e = self;
+  } else {
+    e = this;
+  }
+  e.base64js = r();
+})(function() {
+  var r, e, t;
+  return (function r(e, t, n) {
+    function o(i, a) {
+      if (!t[i]) {
+        if (!e[i]) {
+          var u = typeof require == "function" && require;
+          if (!a && u) return u(i, !0);
+          if (f) return f(i, !0);
+          var d = new Error("Cannot find module '" + i + "'");
+          throw ((d.code = "MODULE_NOT_FOUND"), d);
+        }
+        var c = (t[i] = { exports: {} });
+        e[i][0].call(
+          c.exports,
+          function(r) {
+            var t = e[i][1][r];
+            return o(t ? t : r);
+          },
+          c,
+          c.exports,
+          r,
+          e,
+          t,
+          n
+        );
+      }
+      return t[i].exports;
+    }
+    var f = typeof require == "function" && require;
+    for (var i = 0; i < n.length; i++) o(n[i]);
+    return o;
+  })(
+    {
+      "/": [
+        function(r, e, t) {
+          "use strict";
+          t.byteLength = c;
+          t.toByteArray = v;
+          t.fromByteArray = s;
+          var n = [];
+          var o = [];
+          var f = typeof Uint8Array !== "undefined" ? Uint8Array : Array;
+          var i =
+            "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+          for (var a = 0, u = i.length; a < u; ++a) {
+            n[a] = i[a];
+            o[i.charCodeAt(a)] = a;
+          }
+          o["-".charCodeAt(0)] = 62;
+          o["_".charCodeAt(0)] = 63;
+          function d(r) {
+            var e = r.length;
+            if (e % 4 > 0) {
+              throw new Error("Invalid string. Length must be a multiple of 4");
+            }
+            return r[e - 2] === "=" ? 2 : r[e - 1] === "=" ? 1 : 0;
+          }
+          function c(r) {
+            return (r.length * 3) / 4 - d(r);
+          }
+          function v(r) {
+            var e, t, n, i, a;
+            var u = r.length;
+            i = d(r);
+            a = new f((u * 3) / 4 - i);
+            t = i > 0 ? u - 4 : u;
+            var c = 0;
+            for (e = 0; e < t; e += 4) {
+              n =
+                (o[r.charCodeAt(e)] << 18) |
+                (o[r.charCodeAt(e + 1)] << 12) |
+                (o[r.charCodeAt(e + 2)] << 6) |
+                o[r.charCodeAt(e + 3)];
+              a[c++] = (n >> 16) & 255;
+              a[c++] = (n >> 8) & 255;
+              a[c++] = n & 255;
+            }
+            if (i === 2) {
+              n = (o[r.charCodeAt(e)] << 2) | (o[r.charCodeAt(e + 1)] >> 4);
+              a[c++] = n & 255;
+            } else if (i === 1) {
+              n =
+                (o[r.charCodeAt(e)] << 10) |
+                (o[r.charCodeAt(e + 1)] << 4) |
+                (o[r.charCodeAt(e + 2)] >> 2);
+              a[c++] = (n >> 8) & 255;
+              a[c++] = n & 255;
+            }
+            return a;
+          }
+          function l(r) {
+            return (
+              n[(r >> 18) & 63] +
+              n[(r >> 12) & 63] +
+              n[(r >> 6) & 63] +
+              n[r & 63]
+            );
+          }
+          function h(r, e, t) {
+            var n;
+            var o = [];
+            for (var f = e; f < t; f += 3) {
+              n = (r[f] << 16) + (r[f + 1] << 8) + r[f + 2];
+              o.push(l(n));
+            }
+            return o.join("");
+          }
+          function s(r) {
+            var e;
+            var t = r.length;
+            var o = t % 3;
+            var f = "";
+            var i = [];
+            var a = 16383;
+            for (var u = 0, d = t - o; u < d; u += a) {
+              i.push(h(r, u, u + a > d ? d : u + a));
+            }
+            if (o === 1) {
+              e = r[t - 1];
+              f += n[e >> 2];
+              f += n[(e << 4) & 63];
+              f += "==";
+            } else if (o === 2) {
+              e = (r[t - 2] << 8) + r[t - 1];
+              f += n[e >> 10];
+              f += n[(e >> 4) & 63];
+              f += n[(e << 2) & 63];
+              f += "=";
+            }
+            i.push(f);
+            return i.join("");
+          }
+        },
+        {}
+      ]
+    },
+    {},
+    []
+  )("/");
+});
+/**
+ * 国密SM4加密算法
+ * @author Mr.Xiao
+ * @email 97041437@qq.com
+ * @company GDT-ZWZX-DEV-PT
+ * @date 2017-08
+ */
+
+    var sm4 = {}
+    window.mobileKey = "JeF8U9wHFOMfs2Y8";
+    const encrypt=1;
+	const decrypt=0;
+	const round=32;
+	const block=16;
+
+    var sbox = [0xd6,0x90,0xe9,0xfe,0xcc,0xe1,0x3d,0xb7,0x16,0xb6,0x14,0xc2,0x28,0xfb,0x2c,0x05,
+                0x2b,0x67,0x9a,0x76,0x2a,0xbe,0x04,0xc3,0xaa,0x44,0x13,0x26,0x49,0x86,0x06,0x99,
+                0x9c,0x42,0x50,0xf4,0x91,0xef,0x98,0x7a,0x33,0x54,0x0b,0x43,0xed,0xcf,0xac,0x62,
+                0xe4,0xb3,0x1c,0xa9,0xc9,0x08,0xe8,0x95,0x80,0xdf,0x94,0xfa,0x75,0x8f,0x3f,0xa6,
+                0x47,0x07,0xa7,0xfc,0xf3,0x73,0x17,0xba,0x83,0x59,0x3c,0x19,0xe6,0x85,0x4f,0xa8,
+                0x68,0x6b,0x81,0xb2,0x71,0x64,0xda,0x8b,0xf8,0xeb,0x0f,0x4b,0x70,0x56,0x9d,0x35,
+                0x1e,0x24,0x0e,0x5e,0x63,0x58,0xd1,0xa2,0x25,0x22,0x7c,0x3b,0x01,0x21,0x78,0x87,
+                0xd4,0x00,0x46,0x57,0x9f,0xd3,0x27,0x52,0x4c,0x36,0x02,0xe7,0xa0,0xc4,0xc8,0x9e,
+                0xea,0xbf,0x8a,0xd2,0x40,0xc7,0x38,0xb5,0xa3,0xf7,0xf2,0xce,0xf9,0x61,0x15,0xa1,
+                0xe0,0xae,0x5d,0xa4,0x9b,0x34,0x1a,0x55,0xad,0x93,0x32,0x30,0xf5,0x8c,0xb1,0xe3,
+                0x1d,0xf6,0xe2,0x2e,0x82,0x66,0xca,0x60,0xc0,0x29,0x23,0xab,0x0d,0x53,0x4e,0x6f,
+                0xd5,0xdb,0x37,0x45,0xde,0xfd,0x8e,0x2f,0x03,0xff,0x6a,0x72,0x6d,0x6c,0x5b,0x51,
+                0x8d,0x1b,0xaf,0x92,0xbb,0xdd,0xbc,0x7f,0x11,0xd9,0x5c,0x41,0x1f,0x10,0x5a,0xd8,
+                0x0a,0xc1,0x31,0x88,0xa5,0xcd,0x7b,0xbd,0x2d,0x74,0xd0,0x12,0xb8,0xe5,0xb4,0xb0,
+                0x89,0x69,0x97,0x4a,0x0c,0x96,0x77,0x7e,0x65,0xb9,0xf1,0x09,0xc5,0x6e,0xc6,0x84,
+                0x18,0xf0,0x7d,0xec,0x3a,0xdc,0x4d,0x20,0x79,0xee,0x5f,0x3e,0xd7,0xcb,0x39,0x48];
+
+    var ck = [
+        0x00070e15, 0x1c232a31, 0x383f464d, 0x545b6269,
+        0x70777e85, 0x8c939aa1, 0xa8afb6bd, 0xc4cbd2d9,
+        0xe0e7eef5, 0xfc030a11, 0x181f262d, 0x343b4249,
+        0x50575e65, 0x6c737a81, 0x888f969d, 0xa4abb2b9,
+        0xc0c7ced5, 0xdce3eaf1, 0xf8ff060d, 0x141b2229,
+        0x30373e45, 0x4c535a61, 0x686f767d, 0x848b9299,
+        0xa0a7aeb5, 0xbcc3cad1, 0xd8dfe6ed, 0xf4fb0209,
+        0x10171e25, 0x2c333a41, 0x484f565d, 0x646b7279];
+
+    var rotl = function(x,y){
+        return x<<y|x>>>(32-y);
+    }
+
+    var byteSub = function(a){
+        return (sbox[a>>>24&0xFF]&0xFF)<<24|(sbox[a>>>16&0xFF]&0xFF)<<16|(sbox[a>>>8&0xFF]&0xFF)<<8|(sbox[a&0xFF]&0xFF);
+    }
+
+    var l1 = function(b){
+        return b^rotl(b,2)^rotl(b,10)^rotl(b,18)^rotl(b,24);
+    }
+
+    var l2 = function(b){
+        return b^rotl(b,13)^rotl(b,23);
+    }
+
+    var sms4Crypt = function(input,output,rk){
+        var r,mid,x0,x1,x2,x3;
+        var x = new Array(4);
+        var tmp = new Array(4);
+        for(var i=0;i<4;i++)
+        {
+            tmp[0]=input[0+4*i]&0xff;
+            tmp[1]=input[1+4*i]&0xff;
+            tmp[2]=input[2+4*i]&0xff;
+            tmp[3]=input[3+4*i]&0xff;
+            x[i]=tmp[0]<<24|tmp[1]<<16|tmp[2]<<8|tmp[3];
+        }
+        for (r = 0; r < 32; r += 4) {
+            mid = x[1] ^ x[2] ^ x[3] ^ rk[r + 0];
+            mid = byteSub(mid);
+            x[0] = x[0] ^ l1(mid);
+
+            mid = x[2] ^ x[3] ^ x[0] ^ rk[r + 1];
+            mid = byteSub(mid);
+            x[1] = x[1] ^ l1(mid);
+
+            mid = x[3] ^ x[0] ^ x[1] ^ rk[r + 2];
+            mid = byteSub(mid);
+            x[2] = x[2] ^ l1(mid);
+
+            mid = x[0] ^ x[1] ^ x[2] ^ rk[r + 3];
+            mid = byteSub(mid);
+            x[3] = x[3] ^ l1(mid);
+        }
+
+        for (var j = 0; j < 16; j += 4) {
+            output[j] = (x[3 - j / 4] >>> 24 & 0xFF);
+            output[j + 1] = (x[3 - j / 4] >>> 16 & 0xFF);
+            output[j + 2] = (x[3 - j / 4] >>> 8 & 0xFF);
+            output[j + 3] = (x[3 - j / 4] & 0xFF);
+        }
+    }
+
+    var sms4KeyExt = function(key,rk,flag){
+        var r,mid;
+		var x= new Array();
+		var tmp =new Array(4);
+		for(var i=0;i<4;i++)
+		{
+			tmp[0] = key[0+4*i]&0xFF;
+			tmp[1] = key[1+4*i]&0xff;
+			tmp[2] = key[2+4*i]&0xff;
+			tmp[3] = key[3+4*i]&0xff;
+			x[i]=tmp[0]<<24|tmp[1]<<16|tmp[2]<<8|tmp[3];
+		}
+		x[0]^=0xa3b1bac6;
+		x[1]^=0x56aa3350;
+		x[2]^=0x677d9197;
+		x[3]^=0xb27022dc;
+		for(r=0;r<32;r+=4)
+		{
+			mid=x[1]^x[2]^x[3]^ck[r+0];
+			mid=byteSub(mid);
+			rk[r+0]=x[0]^=l2(mid);
+
+			mid=x[2]^x[3]^x[0]^ck[r+1];
+			mid=byteSub(mid);
+			rk[r+1]=x[1]^=l2(mid);
+
+			mid=x[3]^x[0]^x[1]^ck[r+2];
+			mid=byteSub(mid);
+			rk[r+2]=x[2]^=l2(mid);
+
+			mid=x[0]^x[1]^x[2]^ck[r+3];
+			mid=byteSub(mid);
+			rk[r+3]=x[3]^=l2(mid);
+		}
+
+		if(flag === decrypt)
+		{
+			for(r=0;r<16;r++)
+			{
+				mid=rk[r];
+				rk[r]=rk[31-r];
+				rk[31-r]=mid;
+			}
+		}
+    }
+
+    var _gencode =function(d,flag){
+        var point=0;
+		var inLen = 16;
+		var round_key=new Array(round);
+
+		sms4KeyExt(d.key,round_key,flag);
+		var input = new Array(16);
+		var output = new Array(16);
+		var out = [];
+		while(inLen >= block)
+		{
+			input=d.source.slice(point,point+16);
+			sms4Crypt(input,output,round_key);
+			out = out.concat(output);
+			inLen-=block;
+			point+=block;
+		}
+		return out;
+    };
+
+    sm4._gencode = _gencode;
+
+function stringToByte(str) {
+    var bytes = new Array();
+    var len, c;
+    len = str.length;
+    for(var i = 0; i < len; i++) {
+        c = str.charCodeAt(i);
+        if(c >= 0x010000 && c <= 0x10FFFF) {
+            bytes.push(((c >> 18) & 0x07) | 0xF0);
+            bytes.push(((c >> 12) & 0x3F) | 0x80);
+            bytes.push(((c >> 6) & 0x3F) | 0x80);
+            bytes.push((c & 0x3F) | 0x80);
+        } else if(c >= 0x000800 && c <= 0x00FFFF) {
+            bytes.push(((c >> 12) & 0x0F) | 0xE0);
+            bytes.push(((c >> 6) & 0x3F) | 0x80);
+            bytes.push((c & 0x3F) | 0x80);
+        } else if(c >= 0x000080 && c <= 0x0007FF) {
+            bytes.push(((c >> 6) & 0x1F) | 0xC0);
+            bytes.push((c & 0x3F) | 0x80);
+        } else {
+            bytes.push(c & 0xFF);
+        }
+    }
+    return bytes;
+
+
+}
+
+
+ function byteToString(arr) {
+    if(typeof arr === 'string') {
+        return arr;
+    }
+    var str = '',
+        _arr = arr;
+    for(var i = 0; i < _arr.length; i++) {
+        var one = _arr[i].toString(2),
+            v = one.match(/^1+?(?=0)/);
+        if(v && one.length == 8) {
+            var bytesLength = v[0].length;
+            var store = _arr[i].toString(2).slice(7 - bytesLength);
+            for(var st = 1; st < bytesLength; st++) {
+                store += _arr[st + i].toString(2).slice(2);
+            }
+            str += String.fromCharCode(parseInt(store, 2));
+            i += bytesLength - 1;
+        } else {
+            str += String.fromCharCode(_arr[i]);
+        }
+    }
+    return str;
+}
+    sm4.encodeNoKey = function(d){
+
+        var input = stringToByte(d);
+        var key =stringToByte(mobileKey);
+        var c = [];
+        for(var i=0;i<input.length;i+=16){
+            c = c.concat(_gencode({
+                source : input.slice(i,i+16),
+                key : key
+            },encrypt));
+        }
+        return base64js.fromByteArray(c);
+    }
+	sm4.encode = function(d){
+
+		var input = stringToByte(d.input);
+		var key = stringToByte(d.key);
+		var c = [];
+		for(var i=0;i<input.length;i+=16){
+			c = c.concat(_gencode({
+					source : input.slice(i,i+16),
+					key : key
+				},encrypt));
+		}
+		return base64js.fromByteArray(c);
+	}
+
+	sm4.decode = function(d){
+		var input = base64js.toByteArray(d.input);
+		var key = stringToByte(d.key);
+		var c = [];
+		for(var i=0;i<input.length;i+=16){
+			c = c.concat(_gencode({
+					source : input.slice(i,i+16),
+					key : key
+				},decrypt));
+		}
+
+		return byteToString(c).replace(/(\s*$)/g, "");
+	}
+
+    sm4.decodeNoKey = function(d){
+        var input = base64js.toByteArray(d);
+        var key = stringToByte(mobileKey);
+        var c = [];
+        for(var i=0;i<input.length;i+=16){
+            c = c.concat(_gencode({
+                source : input.slice(i,i+16),
+                key : key
+            },decrypt));
+        }
+
+        return byteToString(c).replace(/(\s*$)/g, "");
+    }
+
+    export default sm4

+ 78 - 0
src/App.vue

@@ -0,0 +1,78 @@
+<template>
+  <div id="app">
+    <div id="content">
+      <keep-alive :max="10">
+        <transition name="fade">
+          <router-view v-if="!$route.meta.unKeepAlive" />
+        </transition>
+      </keep-alive>
+      <transition name="fade">
+        <router-view v-if="$route.meta.unKeepAlive" />
+      </transition>
+      <!-- <transition name="fade">
+        <router-view  />
+      </transition> -->
+    </div>
+  </div>
+</template>
+<script>
+import { mapGetters } from "vuex";
+
+export default {
+  data() {
+    return {};
+  },
+  methods: {
+    init() {
+
+    },
+
+
+  },
+  mounted() {
+
+  },
+  create() {},
+  activated() {},
+  computed: {
+
+  },
+  watch: {},
+};
+</script>
+<style lang="less">
+@import "./styles/theme.less";
+
+html,body,#app {
+  /*用于 获取 屏幕的可视宽高*/
+  width: 100%;
+  height: 100%;
+  
+  position: relative;
+}
+
+#app {
+  font-family: "Avenir", Helvetica, Arial, sans-serif;
+  -webkit-font-smoothing: antialiased;
+  -moz-osx-font-smoothing: grayscale;
+  // text-align: center;
+  color: #2c3e50;
+
+  #content {
+    width: 100%;
+    height: 100%;
+   
+    box-sizing: border-box;
+
+  }
+}
+
+.fade-enter-active,
+.fade-leave-active {
+  transition: opacity 0.2s;
+}
+.fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
+  opacity: 0;
+}
+</style>
+

+ 2 - 0
src/api/home-api.js

@@ -0,0 +1,2 @@
+//获取首页分类列表
+export const GET_HOME_LIST = ``;

+ 0 - 0
src/api/login-api.js


+ 185 - 0
src/assets/css/reset.css

@@ -0,0 +1,185 @@
+@charset "utf-8";
+
+/* 禁用iPhone中Safari的字号自动调整 */
+html {
+  -webkit-text-size-adjust: 100%;
+  -ms-text-size-adjust: 100%;
+  /* 解决IOS默认滑动很卡的情况 */
+  -webkit-overflow-scrolling: touch;
+}
+
+/* 禁止缩放表单 */
+input[type="submit"], input[type="reset"], input[type="button"], input {
+  resize: none;
+  border: none;
+}
+
+/* 取消链接高亮  */
+body, div, ul, li, ol, h1, h2, h3, h4, h5, h6, input, textarea, select, p, dl, dt, dd, a, img, button, form, table, th, tr, td, tbody, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+}
+
+/* 设置HTML5元素为块 */
+article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
+  display: block;
+}
+
+/* 图片自适应 */
+img {
+  width: 100%;
+  height: auto;
+  width: auto \9; /* ie8 */
+  display: block;
+  -ms-interpolation-mode: bicubic; /*为了照顾ie图片缩放失真*/
+}
+
+/* 初始化 */
+body, div, ul, li, ol, h1, h2, h3, h4, h5, h6, input, textarea, select, p, dl, dt, dd, a, img, button, form, table, th, tr, td, tbody, article, aside, details, figcaption, figure, footer, header, hgroup, menu, nav, section {
+  margin: 0;
+  padding: 0;
+}
+body{
+  font-size: 0.37rem;
+  color: #333;
+  background-color: #f5f5f5;
+}
+
+em, i {
+  font-style: normal;
+}
+
+ul, li {
+  list-style-type: none;
+}
+
+strong {
+  font-weight: normal;
+}
+
+.clearfix:after {
+  content: "";
+  display: block;
+  visibility: hidden;
+  height: 0;
+  clear: both;
+}
+
+.clearfix {
+  zoom: 1;
+}
+
+a {
+  text-decoration: none;
+  color: #969696;
+  font-family: 'Microsoft YaHei', Tahoma, Arial, sans-serif;
+}
+
+a:hover {
+  text-decoration: none;
+}
+
+ul, ol {
+  list-style: none;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-size: 100%;
+  font-family: 'Microsoft YaHei';
+}
+
+img {
+  border: none;
+}
+
+input {
+  font-family: 'Microsoft YaHei';
+}
+
+/*单行溢出*/
+.one-txt-cut {
+  overflow: hidden;
+  white-space: nowrap;
+  text-overflow: ellipsis;
+}
+
+/*多行溢出 手机端使用*/
+.txt-cut {
+  overflow: hidden;
+  text-overflow: ellipsis;
+  display: -webkit-box;
+  /* -webkit-line-clamp: 2; */
+  -webkit-box-orient: vertical;
+}
+
+/* 移动端点击a链接出现蓝色背景问题解决 */
+a:link, a:active, a:visited, a:hover {
+  background: none;
+  -webkit-tap-highlight-color: rgba(0, 0, 0, 0);
+  -webkit-tap-highlight-color: transparent;
+}
+input::-webkit-input-placeholder {
+  color: #999;
+}
+input::-moz-input-placeholder {
+  color: #999;
+}
+input::-ms-input-placeholder {
+  color: #999;
+}
+
+.w50 {
+  width: 50%;
+}
+
+.w25 {
+  width: 25%;
+}
+
+.w20 {
+  width: 20%;
+}
+
+.w33 {
+  width: 33.333333%;
+}
+
+.fl {
+  float: left;
+}
+
+.fr {
+  float: right;
+}
+
+.db {
+  display: block !important;
+}
+
+.dn {
+  display: none;
+}
+
+.tal{
+  text-align: left;
+}
+.tar{
+  text-align: right;
+}
+/*页面边距*/
+.marginBoth {
+  margin-left: 0.4rem;
+  margin-right: 0.4rem;
+}
+
+/*圆角类*/
+.br27{
+  border-radius: 0.27rem;
+}
+.br24{
+  border-radius: 0.24rem;
+}
+.br13{
+  border-radius: 0.13rem;
+}
+
+

+ 7 - 0
src/assets/css/theme.less

@@ -0,0 +1,7 @@
+body{
+  font-size: 0.37rem;
+  color: #333;
+  background-color: #f5f5f5;
+}
+//主题色
+@themeColor:#00b5a9;

BIN
src/assets/img/commons/beian.png


BIN
src/assets/img/commons/logo.png


BIN
src/assets/img/commons/logo1.png


BIN
src/assets/img/index/10040_imagetop.png


BIN
src/assets/img/index/10046_imagetop.png


BIN
src/assets/img/index/10047_imagetop.png


BIN
src/assets/img/index/10048_imagetop_1647074461.png


BIN
src/assets/img/index/10049_imagetop_1646403558.png


BIN
src/assets/img/index/10094_imagetop.jpg


BIN
src/assets/img/index/10095_imagetop.jpg


BIN
src/assets/img/index/10096_imagetop.jpg


BIN
src/assets/img/index/10097_imagetop.jpg


BIN
src/assets/img/index/10154_imagetop.png


BIN
src/assets/img/index/10155_imagetop_1631858459.png


BIN
src/assets/img/index/10156_imagetop.png


BIN
src/assets/img/index/10157_imagetop_1647076830.png


BIN
src/assets/img/index/10158_imagetop_1631858428.png


BIN
src/assets/img/index/10159_imagetop.png


BIN
src/assets/img/index/10160_imagetop.png


BIN
src/assets/img/index/10161_imagetop_1631858478.png


BIN
src/assets/img/index/10162_imagetop.png


BIN
src/assets/img/index/10163_imagetop.png


BIN
src/assets/img/index/19.png


BIN
src/assets/img/index/btn_quit.png


BIN
src/assets/img/index/day1.png


BIN
src/assets/img/index/day2.png


BIN
src/assets/img/index/day3.png


BIN
src/assets/img/index/day4.png


BIN
src/assets/img/index/day5.png


BIN
src/assets/img/index/day6.png


BIN
src/assets/img/index/day7.png


BIN
src/assets/img/index/fruit.png


BIN
src/assets/img/index/star_.png


BIN
src/assets/img/index/sys_name.png


BIN
src/assets/img/index/sys_name_manage.png


BIN
src/assets/img/index/top_list.png


BIN
src/assets/img/index/top_list_manage.png


BIN
src/assets/img/index/top_record.png


BIN
src/assets/img/index/top_record.zip


BIN
src/assets/img/index/top_record_manage.png


BIN
src/assets/img/index/top_usr.png


BIN
src/assets/img/index/worm.png


BIN
src/assets/img/login/35.png


BIN
src/assets/img/login/36.png


BIN
src/assets/img/login/37.png


BIN
src/assets/img/login/38.png


BIN
src/assets/img/login/39.png


BIN
src/assets/img/login/40.png


BIN
src/assets/img/login/41.png


BIN
src/assets/img/login/42.png


BIN
src/assets/img/login/43.png


BIN
src/assets/img/login/44.png


BIN
src/assets/img/login/45.png


BIN
src/assets/img/login/46.png


BIN
src/assets/img/login/47.png


BIN
src/assets/img/login/48.png


BIN
src/assets/img/login/49.png


BIN
src/assets/img/login/50.png


BIN
src/assets/img/login/51.png


BIN
src/assets/img/login/52.png


BIN
src/assets/img/login/53.png


BIN
src/assets/img/login/54.png


BIN
src/assets/img/login/55.png


BIN
src/assets/img/login/56.png


BIN
src/assets/img/login/57.png


BIN
src/assets/img/login/58.png


BIN
src/assets/img/login/59.png


BIN
src/assets/img/login/login_bg.png


BIN
src/assets/img/login/login_title.png


+ 127 - 0
src/assets/js/utils/ajax.js

@@ -0,0 +1,127 @@
+import axios from 'axios'
+import {lStorage} from './storage'
+import {Toast} from 'vant'
+
+console.log(process.env.NODE_ENV)
+console.log(process.env.VUE_APP_TARGET)
+
+let serverBaseUrl = ""
+if( process.env.NODE_ENV == "development"){
+    serverBaseUrl = location.protocol + "//" + location.host
+}else{
+    serverBaseUrl = process.env.VUE_APP_TARGET
+}
+console.log(serverBaseUrl)
+const BaseURl = serverBaseUrl
+
+// loading框设置局部刷新,且所有请求完成后关闭loading框
+let loading
+let needLoadingRequestCount = 0 // 声明一个对象用于存储请求个数
+function startLoading() {
+    loading = Toast.loading({
+        mask: true,
+        duration:0,
+        message: '加载中...'
+    })
+}
+
+function endLoading() {
+    loading.close()
+}
+
+function showFullScreenLoading() {
+    if (needLoadingRequestCount === 0) {
+        startLoading()
+    }
+    needLoadingRequestCount++
+}
+
+function hideFullScreenLoading() {
+    if (needLoadingRequestCount <= 0) return
+    needLoadingRequestCount--
+    if (needLoadingRequestCount === 0) {
+        endLoading()
+    }
+}
+
+
+axios.defaults.timeout = 200000 // 超时时间 20s
+// http请求拦截器
+axios.interceptors.request.use(config => {
+    // if (config.isLoading !== false) { // 如果配置了isLoading: false,则不显示loading
+    //     showFullScreenLoading()
+    // }
+    config.headers.post['token'] = lStorage.getItem("token") || ''
+    return config
+}, error => {
+    hideFullScreenLoading()
+    return Promise.reject(error.response)
+})
+// http响应拦截器
+axios.interceptors.response.use(data => {
+    hideFullScreenLoading() // 响应成功关闭loading
+    return data
+}, error => {
+    hideFullScreenLoading()
+    let _status = error.response && error.response.status
+    if (_status === 504 || _status === 404) {
+        Toast.fail('网络错误 请稍后再试')
+        return
+    }
+    if (_status === 500) {
+        Toast.fail('服务器错误 请稍后再试')
+        return
+    }
+    if(error.code == 'ECONNABORTED' && error.message.indexOf('timeout')!=-1){
+        Toast.fail('请求超时 请重试')
+        return
+    }
+    return Promise.reject(error)
+})
+
+
+function apiPost(path, data, config = {showLoading: true}) {
+
+    return new Promise((resolve) => {
+
+            axios.post(BaseURl+path ,{ data: data },{...config,headers: {'Content-type': "application/json"}}).then((res) => {
+            // console.log(res)
+            if (res) {
+                // if(res.data.code == "-1001"){
+                //     window.location.hash = "#/login";
+                //     return
+                // }
+                resolve(res)
+            }
+
+        }).catch(() => {
+            Toast.fail('出错了 请稍后再试')
+        })
+
+    })
+}
+
+function apiGet(path, data = {}, config = {showLoading: false}) {
+
+    return new Promise((resolve) => {
+
+        axios.get(BaseURl+path ,{ params: data },{...config,headers: {'Content-type': "application/json"}}).then((res) => {
+            // console.log(res)
+            if (res) {
+                // if(res.data.code == "-1001"){
+                //     window.location.hash = "#/login";
+                //     return
+                // }
+                resolve(res)
+            }
+
+        }).catch(() => {
+            Toast.fail('出错了 请稍后再试')
+        })
+
+    })
+}
+
+export {apiPost,apiGet,BaseURl}
+
+

Some files were not shown because too many files changed in this diff