50 | * ```
51 | */
52 | exports.default = {
53 | bind: function bind(el, binding, vnode) {
54 | nodeList.push(el);
55 | var id = seed++;
56 | el[ctx] = {
57 | id: id,
58 | documentHandler: createDocumentHandler(el, binding, vnode),
59 | methodName: binding.expression,
60 | bindingFn: binding.value
61 | };
62 | },
63 | update: function update(el, binding, vnode) {
64 | el[ctx].documentHandler = createDocumentHandler(el, binding, vnode);
65 | el[ctx].methodName = binding.expression;
66 | el[ctx].bindingFn = binding.value;
67 | },
68 | unbind: function unbind(el) {
69 | var len = nodeList.length;
70 |
71 | for (var i = 0; i < len; i++) {
72 | if (nodeList[i][ctx].id === el[ctx].id) {
73 | nodeList.splice(i, 1);
74 | break;
75 | }
76 | }
77 | delete el[ctx];
78 | }
79 | };
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/menu/aria-menubar.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 |
5 | var _ariaMenuitem = require('./aria-menuitem');
6 |
7 | var _ariaMenuitem2 = _interopRequireDefault(_ariaMenuitem);
8 |
9 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10 |
11 | var Menu = function Menu(domNode) {
12 | this.domNode = domNode;
13 | this.init();
14 | };
15 |
16 | Menu.prototype.init = function () {
17 | var menuChildren = this.domNode.childNodes;
18 | [].filter.call(menuChildren, function (child) {
19 | return child.nodeType === 1;
20 | }).forEach(function (child) {
21 | new _ariaMenuitem2.default(child); // eslint-disable-line
22 | });
23 | };
24 | exports.default = Menu;
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/menu/aria-menuitem.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 |
5 | var _ariaUtils = require('../aria-utils');
6 |
7 | var _ariaUtils2 = _interopRequireDefault(_ariaUtils);
8 |
9 | var _ariaSubmenu = require('./aria-submenu');
10 |
11 | var _ariaSubmenu2 = _interopRequireDefault(_ariaSubmenu);
12 |
13 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
14 |
15 | var MenuItem = function MenuItem(domNode) {
16 | this.domNode = domNode;
17 | this.submenu = null;
18 | this.init();
19 | };
20 |
21 | MenuItem.prototype.init = function () {
22 | this.domNode.setAttribute('tabindex', '0');
23 | var menuChild = this.domNode.querySelector('.el-menu');
24 | if (menuChild) {
25 | this.submenu = new _ariaSubmenu2.default(this, menuChild);
26 | }
27 | this.addListeners();
28 | };
29 |
30 | MenuItem.prototype.addListeners = function () {
31 | var _this = this;
32 |
33 | var keys = _ariaUtils2.default.keys;
34 | this.domNode.addEventListener('keydown', function (event) {
35 | var prevDef = false;
36 | switch (event.keyCode) {
37 | case keys.down:
38 | _ariaUtils2.default.triggerEvent(event.currentTarget, 'mouseenter');
39 | _this.submenu && _this.submenu.gotoSubIndex(0);
40 | prevDef = true;
41 | break;
42 | case keys.up:
43 | _ariaUtils2.default.triggerEvent(event.currentTarget, 'mouseenter');
44 | _this.submenu && _this.submenu.gotoSubIndex(_this.submenu.subMenuItems.length - 1);
45 | prevDef = true;
46 | break;
47 | case keys.tab:
48 | _ariaUtils2.default.triggerEvent(event.currentTarget, 'mouseleave');
49 | break;
50 | case keys.enter:
51 | case keys.space:
52 | prevDef = true;
53 | event.currentTarget.click();
54 | break;
55 | }
56 | if (prevDef) {
57 | event.preventDefault();
58 | }
59 | });
60 | };
61 |
62 | exports.default = MenuItem;
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/menu/aria-submenu.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 |
5 | var _ariaUtils = require('../aria-utils');
6 |
7 | var _ariaUtils2 = _interopRequireDefault(_ariaUtils);
8 |
9 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
10 |
11 | var SubMenu = function SubMenu(parent, domNode) {
12 | this.domNode = domNode;
13 | this.parent = parent;
14 | this.subMenuItems = [];
15 | this.subIndex = 0;
16 | this.init();
17 | };
18 |
19 | SubMenu.prototype.init = function () {
20 | this.subMenuItems = this.domNode.querySelectorAll('li');
21 | this.addListeners();
22 | };
23 |
24 | SubMenu.prototype.gotoSubIndex = function (idx) {
25 | if (idx === this.subMenuItems.length) {
26 | idx = 0;
27 | } else if (idx < 0) {
28 | idx = this.subMenuItems.length - 1;
29 | }
30 | this.subMenuItems[idx].focus();
31 | this.subIndex = idx;
32 | };
33 |
34 | SubMenu.prototype.addListeners = function () {
35 | var _this = this;
36 |
37 | var keys = _ariaUtils2.default.keys;
38 | var parentNode = this.parent.domNode;
39 | Array.prototype.forEach.call(this.subMenuItems, function (el) {
40 | el.addEventListener('keydown', function (event) {
41 | var prevDef = false;
42 | switch (event.keyCode) {
43 | case keys.down:
44 | _this.gotoSubIndex(_this.subIndex + 1);
45 | prevDef = true;
46 | break;
47 | case keys.up:
48 | _this.gotoSubIndex(_this.subIndex - 1);
49 | prevDef = true;
50 | break;
51 | case keys.tab:
52 | _ariaUtils2.default.triggerEvent(parentNode, 'mouseleave');
53 | break;
54 | case keys.enter:
55 | case keys.space:
56 | prevDef = true;
57 | event.currentTarget.click();
58 | break;
59 | }
60 | if (prevDef) {
61 | event.preventDefault();
62 | event.stopPropagation();
63 | }
64 | return false;
65 | });
66 | });
67 | };
68 |
69 | exports.default = SubMenu;
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/merge.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | exports.__esModule = true;
4 |
5 | exports.default = function (target) {
6 | for (var i = 1, j = arguments.length; i < j; i++) {
7 | var source = arguments[i] || {};
8 | for (var prop in source) {
9 | if (source.hasOwnProperty(prop)) {
10 | var value = source[prop];
11 | if (value !== undefined) {
12 | target[prop] = value;
13 | }
14 | }
15 | }
16 | }
17 |
18 | return target;
19 | };
20 |
21 | ;
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/resize-event.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 | exports.removeResizeListener = exports.addResizeListener = undefined;
5 |
6 | var _resizeObserverPolyfill = require('resize-observer-polyfill');
7 |
8 | var _resizeObserverPolyfill2 = _interopRequireDefault(_resizeObserverPolyfill);
9 |
10 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11 |
12 | var isServer = typeof window === 'undefined';
13 |
14 | /* istanbul ignore next */
15 | var resizeHandler = function resizeHandler(entries) {
16 | for (var _iterator = entries, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
17 | var _ref;
18 |
19 | if (_isArray) {
20 | if (_i >= _iterator.length) break;
21 | _ref = _iterator[_i++];
22 | } else {
23 | _i = _iterator.next();
24 | if (_i.done) break;
25 | _ref = _i.value;
26 | }
27 |
28 | var entry = _ref;
29 |
30 | var listeners = entry.target.__resizeListeners__ || [];
31 | if (listeners.length) {
32 | listeners.forEach(function (fn) {
33 | fn();
34 | });
35 | }
36 | }
37 | };
38 |
39 | /* istanbul ignore next */
40 | var addResizeListener = exports.addResizeListener = function addResizeListener(element, fn) {
41 | if (isServer) return;
42 | if (!element.__resizeListeners__) {
43 | element.__resizeListeners__ = [];
44 | element.__ro__ = new _resizeObserverPolyfill2.default(resizeHandler);
45 | element.__ro__.observe(element);
46 | }
47 | element.__resizeListeners__.push(fn);
48 | };
49 |
50 | /* istanbul ignore next */
51 | var removeResizeListener = exports.removeResizeListener = function removeResizeListener(element, fn) {
52 | if (!element || !element.__resizeListeners__) return;
53 | element.__resizeListeners__.splice(element.__resizeListeners__.indexOf(fn), 1);
54 | if (!element.__resizeListeners__.length) {
55 | element.__ro__.disconnect();
56 | }
57 | };
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/scroll-into-view.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 | exports.default = scrollIntoView;
5 |
6 | var _vue = require('vue');
7 |
8 | var _vue2 = _interopRequireDefault(_vue);
9 |
10 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
11 |
12 | function scrollIntoView(container, selected) {
13 | if (_vue2.default.prototype.$isServer) return;
14 |
15 | if (!selected) {
16 | container.scrollTop = 0;
17 | return;
18 | }
19 |
20 | var offsetParents = [];
21 | var pointer = selected.offsetParent;
22 | while (pointer && container !== pointer && container.contains(pointer)) {
23 | offsetParents.push(pointer);
24 | pointer = pointer.offsetParent;
25 | }
26 | var top = selected.offsetTop + offsetParents.reduce(function (prev, curr) {
27 | return prev + curr.offsetTop;
28 | }, 0);
29 | var bottom = top + selected.offsetHeight;
30 | var viewRectTop = container.scrollTop;
31 | var viewRectBottom = viewRectTop + container.clientHeight;
32 |
33 | if (top < viewRectTop) {
34 | container.scrollTop = top;
35 | } else if (bottom > viewRectBottom) {
36 | container.scrollTop = bottom - container.clientHeight;
37 | }
38 | }
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/scrollbar-width.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 |
5 | exports.default = function () {
6 | if (_vue2.default.prototype.$isServer) return 0;
7 | if (scrollBarWidth !== undefined) return scrollBarWidth;
8 |
9 | var outer = document.createElement('div');
10 | outer.className = 'el-scrollbar__wrap';
11 | outer.style.visibility = 'hidden';
12 | outer.style.width = '100px';
13 | outer.style.position = 'absolute';
14 | outer.style.top = '-9999px';
15 | document.body.appendChild(outer);
16 |
17 | var widthNoScroll = outer.offsetWidth;
18 | outer.style.overflow = 'scroll';
19 |
20 | var inner = document.createElement('div');
21 | inner.style.width = '100%';
22 | outer.appendChild(inner);
23 |
24 | var widthWithScroll = inner.offsetWidth;
25 | outer.parentNode.removeChild(outer);
26 | scrollBarWidth = widthNoScroll - widthWithScroll;
27 |
28 | return scrollBarWidth;
29 | };
30 |
31 | var _vue = require('vue');
32 |
33 | var _vue2 = _interopRequireDefault(_vue);
34 |
35 | function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
36 |
37 | var scrollBarWidth = void 0;
38 |
39 | ;
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/shared.js:
--------------------------------------------------------------------------------
1 | "use strict";
2 |
3 | exports.__esModule = true;
4 | exports.isDef = isDef;
5 | exports.isKorean = isKorean;
6 | function isDef(val) {
7 | return val !== undefined && val !== null;
8 | }
9 | function isKorean(text) {
10 | var reg = /([(\uAC00-\uD7AF)|(\u3130-\u318F)])+/gi;
11 | return reg.test(text);
12 | }
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/util.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 | exports.noop = noop;
5 | exports.hasOwn = hasOwn;
6 | exports.toObject = toObject;
7 | exports.getPropByPath = getPropByPath;
8 | var hasOwnProperty = Object.prototype.hasOwnProperty;
9 |
10 | function noop() {};
11 |
12 | function hasOwn(obj, key) {
13 | return hasOwnProperty.call(obj, key);
14 | };
15 |
16 | function extend(to, _from) {
17 | for (var key in _from) {
18 | to[key] = _from[key];
19 | }
20 | return to;
21 | };
22 |
23 | function toObject(arr) {
24 | var res = {};
25 | for (var i = 0; i < arr.length; i++) {
26 | if (arr[i]) {
27 | extend(res, arr[i]);
28 | }
29 | }
30 | return res;
31 | };
32 |
33 | var getValueByPath = exports.getValueByPath = function getValueByPath(object, prop) {
34 | prop = prop || '';
35 | var paths = prop.split('.');
36 | var current = object;
37 | var result = null;
38 | for (var i = 0, j = paths.length; i < j; i++) {
39 | var path = paths[i];
40 | if (!current) break;
41 |
42 | if (i === j - 1) {
43 | result = current[path];
44 | break;
45 | }
46 | current = current[path];
47 | }
48 | return result;
49 | };
50 |
51 | function getPropByPath(obj, path, strict) {
52 | var tempObj = obj;
53 | path = path.replace(/\[(\w+)\]/g, '.$1');
54 | path = path.replace(/^\./, '');
55 |
56 | var keyArr = path.split('.');
57 | var i = 0;
58 | for (var len = keyArr.length; i < len - 1; ++i) {
59 | if (!tempObj && !strict) break;
60 | var key = keyArr[i];
61 | if (key in tempObj) {
62 | tempObj = tempObj[key];
63 | } else {
64 | if (strict) {
65 | throw new Error('please transfer a valid prop path to form item!');
66 | }
67 | break;
68 | }
69 | }
70 | return {
71 | o: tempObj,
72 | k: keyArr[i],
73 | v: tempObj ? tempObj[keyArr[i]] : null
74 | };
75 | };
76 |
77 | var generateId = exports.generateId = function generateId() {
78 | return Math.floor(Math.random() * 10000);
79 | };
80 |
81 | var valueEquals = exports.valueEquals = function valueEquals(a, b) {
82 | // see: https://stackoverflow.com/questions/3115982/how-to-check-if-two-arrays-are-equal-with-javascript
83 | if (a === b) return true;
84 | if (!(a instanceof Array)) return false;
85 | if (!(b instanceof Array)) return false;
86 | if (a.length !== b.length) return false;
87 | for (var i = 0; i !== a.length; ++i) {
88 | if (a[i] !== b[i]) return false;
89 | }
90 | return true;
91 | };
92 |
93 | var escapeRegexpString = exports.escapeRegexpString = function escapeRegexpString() {
94 | var value = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
95 | return String(value).replace(/[|\\{}()[\]^$+*?.]/g, '\\$&');
96 | };
--------------------------------------------------------------------------------
/src/main/resources/static/res/element-ui/utils/vdom.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | exports.__esModule = true;
4 |
5 | var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
6 |
7 | exports.isVNode = isVNode;
8 | exports.getFirstComponentChild = getFirstComponentChild;
9 |
10 | var _util = require('element-ui/lib/utils/util');
11 |
12 | function isVNode(node) {
13 | return node !== null && (typeof node === 'undefined' ? 'undefined' : _typeof(node)) === 'object' && (0, _util.hasOwn)(node, 'componentOptions');
14 | };
15 |
16 | function getFirstComponentChild(children) {
17 | return children && children.filter(function (c) {
18 | return c && c.tag;
19 | })[0];
20 | };
--------------------------------------------------------------------------------
/src/main/resources/static/res/icon/iconfont.css:
--------------------------------------------------------------------------------
1 | @font-face {font-family: "iconfont";
2 | src: url('iconfont.eot?t=1549864874778'); /* IE9 */
3 | src: url('iconfont.eot?t=1549864874778#iefix') format('embedded-opentype'), /* IE6-IE8 */
4 | url('data:application/x-font-woff2;charset=utf-8;base64,d09GMgABAAAAAAKMAAsAAAAABjAAAAJAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHEIGVgCCcAo8VgE2AiQDCAsGAAQgBYRtBy4begURBQTJvsC2YY+CMmcGQp7J7LoBAxBy4LeDM1AAAAAAQDx8jdHe391TTarJNZkkR3w6iVAhdaZDiSSiZyrH88t7/wrSoUU2oBFsa86BY2EjVEnu/OpHlvMFTjMkZ1gJEBLPT+iBQ24ehhhLFvFBqPQjlP3j3ulfAQUyH1COcy7qAoy3BrQ3RpEVUMgN08sXNJCPCdTqMSV29w8ujEKvCsS71y8fTM6lKCxaLVTWHCzikwrV6ac7Pobfj7+mo5qkItN5Jy/2ntkfmLj06rGufYSbgI5XIGMKhbioDR0pwchZ7ek2gKIIfvA/1oi9KgX763RmPeiC4eAH7ogACRQw2oCWUQYKjst14r1VNCc8web/F14sfF8EZZ8ZHx4sbM1f84/5jZWRW83i6r9qNfg25RBWFBmqVzcHv4Hds6UIrpamDbKQOWnIOCRgVi0eaVur72NlHeeMhWodZ7ZU6U4hqzaEFtIUVKgzC5WqmRtQa5J+vE4bkhZdgwl7AKHZFZJGXyBr9kAL6QkVOv2gUnPSUOsqvrDOSKxMCNuMPeiMweoGvrBazkTZFTT6bpuy3JDSQIotL6iSUozq6CPNsSUeGBqzAEGBB2XwHLpuACEFNnZZMpnDkiyLujdJ3cBLZOwgqI2hHtAxBixdAZ/wO7NM6fMVyNDnaqOWppy5AZGYNT5QSZQeqC7yezXdyyuxAYOGMQEIJOABZTAPuVwBENbPs6EuJjFHBEIlsmkn+oqk9SXe1+2CWlqeYoqz8tDvJxIAAA==') format('woff2'),
5 | url('iconfont.woff?t=1549864874778') format('woff'),
6 | url('iconfont.ttf?t=1549864874778') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+ */
7 | url('iconfont.svg?t=1549864874778#iconfont') format('svg'); /* iOS 4.1- */
8 | }
9 |
10 | .iconfont {
11 | font-family: "iconfont" !important;
12 | font-size: 16px;
13 | font-style: normal;
14 | -webkit-font-smoothing: antialiased;
15 | -moz-osx-font-smoothing: grayscale;
16 | }
17 |
18 | .icon-menu:before {
19 | content: "\e6a9";
20 | }
21 |
22 |
--------------------------------------------------------------------------------
/src/main/resources/static/res/icon/iconfont.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yuyeah/sprov-ui/64d06d4eb11a74420411eaa369becfec4750002d/src/main/resources/static/res/icon/iconfont.eot
--------------------------------------------------------------------------------
/src/main/resources/static/res/icon/iconfont.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
6 |
30 |
--------------------------------------------------------------------------------
/src/main/resources/static/res/icon/iconfont.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yuyeah/sprov-ui/64d06d4eb11a74420411eaa369becfec4750002d/src/main/resources/static/res/icon/iconfont.ttf
--------------------------------------------------------------------------------
/src/main/resources/static/res/icon/iconfont.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/yuyeah/sprov-ui/64d06d4eb11a74420411eaa369becfec4750002d/src/main/resources/static/res/icon/iconfont.woff
--------------------------------------------------------------------------------
/src/main/resources/static/res/js/axios-init.js:
--------------------------------------------------------------------------------
1 | axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded; charset=UTF-8';
2 | axios.defaults.headers.common['X-Requested-With'] = 'XMLHttpRequest';
3 |
4 | axios.interceptors.request.use(
5 | config => {
6 | config.data = Qs.stringify(config.data, {
7 | arrayFormat: 'repeat'
8 | });
9 | return config;
10 | },
11 | error => Promise.reject(error)
12 | );
13 |
14 | function commonSuccess(response, callback) {
15 | let data = response.data;
16 | // if (data && typeof data === 'object') {
17 | // if (data.success === true) {
18 | // Vue.prototype.$message({
19 | // message: data.msg,
20 | // type: 'success'
21 | // });
22 | // } else if (data.success === false) {
23 | // Vue.prototype.$message({
24 | // message: data.msg,
25 | // type: 'error'
26 | // });
27 | // }
28 | // }
29 | execute(callback, data, response);
30 | }
31 |
32 | function commonError(e, callback) {
33 | console.log(e);
34 | execute(callback, e);
35 | }
36 |
37 | /**
38 | * POST 请求
39 | */
40 | window.post = options => {
41 | axios.post(options.url, options.data)
42 | .then(response => commonSuccess(response, options.success))
43 | .catch(e => commonError(e, options.error));
44 | };
45 |
46 | /**
47 | * GET 请求
48 | */
49 | window.get = options => {
50 | axios.get(options.url, options.data)
51 | .then(response => commonSuccess(response, options.success))
52 | .catch(e => commonError(e, options.error));
53 | };
--------------------------------------------------------------------------------
/src/main/resources/static/res/js/login.js:
--------------------------------------------------------------------------------
1 | let app = new Vue({
2 | el: '#app',
3 | data: {
4 | buttonLoading: false,
5 | user: {}
6 | },
7 | methods: {
8 | login: function () {
9 | this.buttonLoading = true;
10 | post({
11 | url: '/login',
12 | data: this.user,
13 | success: data => {
14 | this.buttonLoading = false;
15 | if (data.success) {
16 | location.href = basePath + "/v2ray/";
17 | } else {
18 | this.error(data.msg);
19 | }
20 | },
21 | error: () => {
22 | this.buttonLoading = false;
23 | this.error('发生网络错误,请检查网络连接');
24 | }
25 | });
26 | }
27 | }
28 | });
--------------------------------------------------------------------------------
/src/main/resources/static/res/js/vue-init.js:
--------------------------------------------------------------------------------
1 | Vue.prototype.loading = function (msg) {
2 | return this.$loading({
3 | lock: true,
4 | text: msg ? msg : '操作中...',
5 | spinner: 'el-icon-loading',
6 | background: 'rgba(0, 0, 0, 0.7)'
7 | });
8 | };
9 |
10 | function addProperty(obj) {
11 | if (obj === undefined) {
12 | obj = { center: true };
13 | } else if (typeof obj === 'object') {
14 | obj.center = true;
15 | }
16 | return obj;
17 | }
18 |
19 | Vue.prototype.alert = function (message, title, options) {
20 | title = addProperty(title);
21 | options = addProperty(options);
22 | return this.$alert(message, title, options);
23 | };
24 |
25 | Vue.prototype.confirm = function (message, title, options) {
26 | title = addProperty(title);
27 | options = addProperty(options);
28 | options.type = isEmpty(options.type) ? 'warning' : options.type;
29 | return this.$confirm(message, title, options);
30 | };
31 |
32 | Vue.prototype.prompt = function (message, title, options) {
33 | title = addProperty(title);
34 | options = addProperty(options);
35 | return this.$prompt(message, title, options);
36 | };
37 |
38 | Vue.prototype.validate = function (form, func) {
39 | this.$refs[form].validate(valid => {
40 | if (valid) {
41 | execute(func);
42 | }
43 | })
44 | };
45 |
46 | Vue.prototype.resetFields = function (form) {
47 | this.$refs[form] && this.$refs[form].resetFields();
48 | };
49 |
50 | Vue.prototype.sizeFormat = window.sizeFormat;
51 |
52 | Vue.prototype.loading = function () {
53 | this.fullscreenLoading = true;
54 | };
55 |
56 | Vue.prototype.closeLoading = function () {
57 | this.fullscreenLoading = false;
58 | };
59 |
60 | Vue.prototype.message = Vue.prototype.$message;
61 | Vue.prototype.success = Vue.prototype.$message.success;
62 | Vue.prototype.error = Vue.prototype.$message.error;
63 | Vue.prototype.info = Vue.prototype.$message.info;
--------------------------------------------------------------------------------
/src/main/resources/templates/common/common_head.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/src/main/resources/templates/common/common_js.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/src/main/resources/templates/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | {{ buttonLoading ? '登录中...' : '登录' }}
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/src/main/resources/templates/v2ray/clients.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | v2rayW(Windows):
13 | Github
14 |
15 |
16 | V2RayN(Windows):
17 | Github
18 |
19 | v2rayX(macOS):
20 | Github
21 |
22 |
23 | V2RayU(macOS):
24 | Github
25 |
26 |
27 | Shadowrocket(iOS):
28 | itunes
29 |
30 |
31 | i2Ray(iOS):
32 | itunes
33 |
34 |
35 | Quantumult(iOS):
36 | itunes
37 |
38 |
39 | BifrostV(Android):
40 | Play商店 |
41 | ApkPure
42 |
43 |
44 | V2RayNG(Android):
45 | Play商店 |
46 | Github
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
61 |
62 |
63 |
--------------------------------------------------------------------------------
/src/main/resources/templates/v2ray/footer.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/src/main/resources/templates/v2ray/header.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 | location = index">
14 | 运行状态
15 | 账号列表
16 | 客户端
17 | 退出
18 |
19 | location.href = command"
21 | style="margin-top: 20px; color: white;">
22 |
23 | 菜单
24 |
25 |
26 | 运行状态
27 | 账号列表
28 | 客户端
29 | 退出
30 |
31 |
32 |
33 |
34 |
35 |
--------------------------------------------------------------------------------
/src/main/resources/templates/v2ray/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 | 重启面板
27 | 一键升级
28 |
29 |
30 |
31 |
32 |
33 |
34 | {{ props.row.value }}
35 |
36 |
37 |
38 |
39 |
40 | {{ props.row.value }}
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
--------------------------------------------------------------------------------