From e00cf26e79ea6c36a64331f793c7c8db70cd0a62 Mon Sep 17 00:00:00 2001
From: zpzgiser <45806316+zpzgiser@users.noreply.github.com>
Date: Sun, 18 Jul 2021 00:20:27 +0800
Subject: [PATCH] Merge branch 'master' of http://s16s652780.51mypc.cn:49896/r/zhba_regulatory
---
/dev/null | 260 -----------------------
src/permission.js | 76 ++++++
src/store/modules/user.js | 59 ++--
vue.config.js | 4
src/components/iframe/main.vue | 225 ++++++++++----------
src/router/axios.js | 10
6 files changed, 220 insertions(+), 414 deletions(-)
diff --git a/src/components/iframe/main.vue b/src/components/iframe/main.vue
index 4d421bc..e158add 100644
--- a/src/components/iframe/main.vue
+++ b/src/components/iframe/main.vue
@@ -1,129 +1,130 @@
<template>
<basic-container>
- <iframe :src="src"
- class="iframe"
- ref="iframe"></iframe>
+ <iframe :src="src" class="iframe" ref="iframe"></iframe>
</basic-container>
</template>
<script>
- import {mapGetters} from "vuex";
- import NProgress from "nprogress"; // progress bar
- import "nprogress/nprogress.css"; // progress bar style
- export default {
- name: "AvueIframe",
- data() {
- return {
- urlPath: this.getUrlPath() //iframe src 路径
+import { mapGetters } from "vuex";
+import NProgress from "nprogress"; // progress bar
+import "nprogress/nprogress.css"; // progress bar style
+export default {
+ name: "AvueIframe",
+ data() {
+ return {
+ urlPath: this.getUrlPath(), //iframe src 路径
+ };
+ },
+ created() {
+ NProgress.configure({ showSpinner: false });
+ },
+ mounted() {
+ this.load();
+ this.resize();
+ },
+ props: ["routerPath"],
+ watch: {
+ $route: function () {
+ this.load();
+ },
+ routerPath: function () {
+ // 监听routerPath变化,改变src路径
+ this.urlPath = this.getUrlPath();
+ },
+ },
+ computed: {
+ ...mapGetters(["screen"]),
+ src() {
+ return this.$route.query.src
+ ? this.$route.query.src.replace("$", "#")
+ : this.urlPath;
+ },
+ },
+ methods: {
+ // 显示等待框
+ show() {
+ NProgress.start();
+ },
+ // 隐藏等待狂
+ hide() {
+ NProgress.done();
+ },
+ // 加载浏览器窗口变化自适应
+ resize() {
+ window.onresize = () => {
+ this.iframeInit();
};
},
- created() {
- NProgress.configure({showSpinner: false});
- },
- mounted() {
- this.load();
- this.resize();
- },
- props: ["routerPath"],
- watch: {
- $route: function () {
- this.load();
- },
- routerPath: function () {
- // 监听routerPath变化,改变src路径
- this.urlPath = this.getUrlPath();
+ // 加载组件
+ load() {
+ this.show();
+ var flag = true; //URL是否包含问号
+ if (
+ this.$route.query.src !== undefined &&
+ this.$route.query.src.indexOf("?") === -1
+ ) {
+ flag = false;
}
- },
- computed: {
- ...mapGetters(["screen"]),
- src() {
- return this.$route.query.src
- ? this.$route.query.src.replace("$", "#")
- : this.urlPath;
+ var list = [];
+ for (var key in this.$route.query) {
+ if (key !== "src" && key !== "name" && key !== "i18n") {
+ list.push(`${key}= this.$route.query[key]`);
+ }
}
+ list = list.join("&").toString();
+ if (flag) {
+ this.$route.query.src = `${this.$route.query.src}${
+ list.length > 0 ? `&list` : ""
+ }`;
+ } else {
+ this.$route.query.src = `${this.$route.query.src}${
+ list.length > 0 ? `?list` : ""
+ }`;
+ }
+ //超时3s自动隐藏等待狂,加强用户体验
+ let time = 3;
+ const timeFunc = setInterval(() => {
+ time--;
+ if (time === 0) {
+ this.hide();
+ clearInterval(timeFunc);
+ }
+ }, 1000);
+ this.iframeInit();
},
- methods: {
- // 显示等待框
- show() {
- NProgress.start();
- },
- // 隐藏等待狂
- hide() {
- NProgress.done();
- },
- // 加载浏览器窗口变化自适应
- resize() {
- window.onresize = () => {
- this.iframeInit();
+ //iframe窗口初始化
+ iframeInit() {
+ const iframe = this.$refs.iframe;
+ const clientHeight =
+ document.documentElement.clientHeight - (screen > 1 ? 200 : 130);
+ if (!iframe) return;
+ iframe.style.height = `${clientHeight}px`;
+ if (iframe.attachEvent) {
+ iframe.attachEvent("onload", () => {
+ this.hide();
+ });
+ } else {
+ iframe.onload = () => {
+ this.hide();
};
- },
- // 加载组件
- load() {
- this.show();
- var flag = true; //URL是否包含问号
- if (this.$route.query.src !== undefined && this.$route.query.src.indexOf("?") === -1) {
- flag = false;
- }
- var list = [];
- for (var key in this.$route.query) {
- if (key !== "src" && key !== "name" && key !== "i18n") {
- list.push(`${key}= this.$route.query[key]`);
- }
- }
- list = list.join("&").toString();
- if (flag) {
- this.$route.query.src = `${this.$route.query.src}${
- list.length > 0 ? `&list` : ""
- }`;
- } else {
- this.$route.query.src = `${this.$route.query.src}${
- list.length > 0 ? `?list` : ""
- }`;
- }
- //超时3s自动隐藏等待狂,加强用户体验
- let time = 3;
- const timeFunc = setInterval(() => {
- time--;
- if (time === 0) {
- this.hide();
- clearInterval(timeFunc);
- }
- }, 1000);
- this.iframeInit();
- },
- //iframe窗口初始化
- iframeInit() {
- const iframe = this.$refs.iframe;
- const clientHeight =
- document.documentElement.clientHeight - (screen > 1 ? 200 : 130);
- if (!iframe) return;
- iframe.style.height = `${clientHeight}px`;
- if (iframe.attachEvent) {
- iframe.attachEvent("onload", () => {
- this.hide();
- });
- } else {
- iframe.onload = () => {
- this.hide();
- };
- }
- },
- getUrlPath: function () {
- //获取 iframe src 路径
- let url = window.location.href;
- url = url.replace("/myiframe", "");
- return url;
}
- }
- };
+ },
+ getUrlPath: function () {
+ //获取 iframe src 路径
+ let url = window.location.href;
+ url = url.replace("/myiframe", "");
+ return url;
+ },
+ },
+};
</script>
<style lang="scss">
- .iframe {
- width: 100%;
- height: 100%;
- border: 0;
- overflow: hidden;
- box-sizing: border-box;
- }
+.iframe {
+ width: 100%;
+ height: 100%;
+ border: 0;
+ overflow: hidden;
+ box-sizing: border-box;
+}
</style>
diff --git a/src/page/login/userlogin copy.vue b/src/page/login/userlogin copy.vue
deleted file mode 100644
index 5628137..0000000
--- a/src/page/login/userlogin copy.vue
+++ /dev/null
@@ -1,260 +0,0 @@
-<template>
- <el-form
- class="login-form"
- status-icon
- :rules="loginRules"
- ref="loginForm"
- :model="loginForm"
- label-width="0"
- >
- <el-form-item v-if="tenantMode" prop="tenantId">
- <el-input
- size="small"
- @keyup.enter.native="handleLogin"
- v-model="loginForm.tenantId"
- auto-complete="off"
- :placeholder="$t('login.tenantId')"
- >
- <i slot="prefix" class="icon-quanxian" />
- </el-input>
- </el-form-item>
- <el-form-item prop="username">
- <el-input
- size="small"
- @keyup.enter.native="handleLogin"
- v-model="loginForm.username"
- auto-complete="off"
- :placeholder="$t('login.username')"
- >
- <i slot="prefix" class="icon-yonghu" />
- </el-input>
- </el-form-item>
- <el-form-item prop="password">
- <el-input
- size="small"
- @keyup.enter.native="handleLogin"
- :type="passwordType"
- v-model="loginForm.password"
- auto-complete="off"
- :placeholder="$t('login.password')"
- >
- <i
- class="el-icon-view el-input__icon"
- slot="suffix"
- @click="showPassword"
- />
- <i slot="prefix" class="icon-mima" />
- </el-input>
- </el-form-item>
- <el-form-item v-if="this.website.captchaMode" prop="code">
- <el-row :span="24">
- <el-col :span="16">
- <el-input
- size="small"
- @keyup.enter.native="handleLogin"
- v-model="loginForm.code"
- auto-complete="off"
- :placeholder="$t('login.code')"
- >
- <i slot="prefix" class="icon-yanzhengma" />
- </el-input>
- </el-col>
- <el-col :span="8">
- <div class="login-code">
- <img
- :src="loginForm.image"
- class="login-code-img"
- @click="refreshCode"
- />
- </div>
- </el-col>
- </el-row>
- </el-form-item>
- <el-form-item>
- <el-button
- type="primary"
- size="small"
- @click.native.prevent="handleLogin"
- class="login-submit"
- >{{ $t("login.submit") }}
- </el-button>
- </el-form-item>
- </el-form>
-</template>
-
-<script>
-import { mapGetters } from "vuex";
-import { info } from "@/api/system/tenant";
-import { getCaptcha } from "@/api/user";
-import { getTopUrl } from "@/util/util";
-
-export default {
- name: "userlogin",
- data() {
- return {
- tenantMode: this.website.tenantMode,
- loginForm: {
- //租户ID
- tenantId: "000000",
- //用户名
- username: "admin",
- //密码
- password: "admin",
- //账号类型
- type: "account",
- //验证码的值
- code: "",
- //验证码的索引
- key: "",
- //预加载白色背景
- image:
- "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
- },
- loginRules: {
- tenantId: [
- { required: false, message: "请输入租户ID", trigger: "blur" },
- ],
- username: [
- { required: true, message: "请输入用户名", trigger: "blur" },
- ],
- password: [
- { required: true, message: "请输入密码", trigger: "blur" },
- { min: 1, message: "密码长度最少为6位", trigger: "blur" },
- ],
- },
- passwordType: "password",
- };
- },
- created() {
- this.getTenant();
- this.refreshCode();
- },
- mounted() {},
- computed: {
- ...mapGetters(["tagWel"]),
- keys() {
- return this.loginForm.key;
- },
- },
- props: [],
- methods: {
- goOnS() {
- if (this.$route.query.main != undefined) {
- var a = this.$route.query.main;
- console.log(a);
- if (typeof a == "string") {
- try {
- var obj = JSON.parse(a);
- console.log(obj, "obj");
- if (typeof obj == "object" && obj) {
- console.log("自动登入");
- var data = {
- code: this.loginForm.code,
- tenantId: this.obj.dip,
- //用户名
- username: this.obj.rese,
- //密码
- password: this.obj.sap,
- //账号类型
- type: this.loginForm.type,
- //验证码的值
- code: this.loginForm.code,
- //验证码的索引
- key: this.keys,
- //预加载白色背景
- image: this.loginForm.image,
- };
- // this.loginForm.username = obj.data.rese;
- // this.loginForm.password = obj.data.admin;
- // this.loginForm.tenantId = obj.data.dip;
- // console.log(this.loginForm1·);
- const loading = this.$loading({
- lock: true,
- text: "登录中,请稍后。。。",
- spinner: "el-icon-loading",
- });
- this.$store
- .dispatch("LoginByUsername", data)
- .then(() => {
- this.$router.push({ path: "/wel" });
- loading.close();
- })
- .catch(() => {
- loading.close();
- this.refreshCode();
- });
- console.log(data, "自动ssss");
- return true;
- } else {
- console.log("手动登入");
- return false;
- }
- } catch (e) {
- console.log("手动登入");
- return false;
- }
- }
- } else {
- console.log("nothing");
- }
- },
- refreshCode() {
- getCaptcha().then((res) => {
- const data = res.data;
- this.loginForm.key = data.key;
- this.loginForm.image = data.image;
- });
- },
- showPassword() {
- this.passwordType === ""
- ? (this.passwordType = "password")
- : (this.passwordType = "");
- },
- handleLogin() {
- console.log(this.loginForm, "once");
- this.$refs.loginForm.validate((valid) => {
- if (valid) {
- console.log(this.loginForm, "befor");
- const loading = this.$loading({
- lock: true,
- text: "登录中,请稍后。。。",
- spinner: "el-icon-loading",
- });
- this.$store
- .dispatch("LoginByUsername", this.loginForm)
- .then(() => {
- this.$router.push({ path: "/wel" });
- loading.close();
- })
- .catch(() => {
- loading.close();
- this.refreshCode();
- });
- }
- });
- },
- getTenant() {
- let domain = getTopUrl();
- // 临时指定域名,方便测试
- //domain = "https://bladex.vip";
- info(domain).then((res) => {
- const data = res.data;
- if (data.success && data.data.tenantId) {
- this.tenantMode = false;
- this.loginForm.tenantId = data.data.tenantId;
- this.$parent.$refs.login.style.backgroundImage = `url(${data.data.backgroundUrl})`;
- }
- });
- },
- },
- watch: {
- keys() {
- console.log(this.keys, "keys");
- this.goOnS();
- },
- },
-};
-</script>
-
-<style>
-</style>
diff --git a/src/permission.js b/src/permission.js
index 2f88c34..899de1f 100644
--- a/src/permission.js
+++ b/src/permission.js
@@ -2,13 +2,18 @@
* 全站权限配置
*
*/
+import md5 from 'js-md5'
+import request from '@/router/axios';
+import { Message } from 'element-ui'
+
+
import router from './router/router'
import store from './store'
-import {validatenull} from '@/util/validate'
-import {getToken} from '@/util/auth'
+import { validatenull } from '@/util/validate'
+import { getToken } from '@/util/auth'
import NProgress from 'nprogress' // progress bar
import 'nprogress/nprogress.css' // progress bar style
-NProgress.configure({showSpinner: false});
+NProgress.configure({ showSpinner: false });
const lockPage = store.getters.website.lockPage; //锁屏页
router.beforeEach((to, from, next) => {
const meta = to.meta || {};
@@ -16,14 +21,14 @@
store.commit('SET_IS_MENU', isMenu === undefined);
if (getToken()) {
if (store.getters.isLock && to.path !== lockPage) { //如果系统激活锁屏,全部跳转到锁屏页
- next({path: lockPage})
+ next({ path: lockPage })
} else if (to.path === '/login') { //如果登录成功访问登录页跳转到主页
- next({path: '/'})
+ next({ path: '/' })
} else {
//如果用户信息为空则获取用户信息,获取用户信息失败,跳转到登录页
if (store.getters.token.length === 0) {
store.dispatch('FedLogOut').then(() => {
- next({path: '/login'})
+ next({ path: '/login' })
})
} else {
const value = to.query.src || to.fullPath;
@@ -57,7 +62,64 @@
if (meta.isAuth === false) {
next()
} else {
- next('/login')
+ // console.log(to, from);
+ next();
+ if (to.path == '/wel') {
+ var a = to.query.securitySupervisionSystem;
+ if (typeof a == "string") {
+ console.log(to.query.securitySupervisionSystem, 'securitySupervisionSystem');
+ // console.log("有main");
+
+ var obj = JSON.parse(a);
+ console.log(obj, "obj");
+ if (typeof obj == "object" && obj) {
+ // console.log("自动登入");
+ var data = {
+ tenantId: obj.data.dip,
+ username: obj.data.rese,
+ password: md5(obj.data.sap),
+ grant_type: 'password',
+ scope: 'all',
+ type: 'account'
+ };
+ // console.log(data, "自动ssss");
+ request({
+ url: 'http://192.168.109:80/blade-auth/oauth/token',
+ method: 'post',
+ headers: {
+ 'Authorization': 'Basic c2FiZXI6c2FiZXJfc2VjcmV0',
+ "Tenant-Id": "000000"
+ },
+ params: data
+ }).then(res => {
+ const data = res.data;
+ if (data.error_description) {
+ Message({
+ message: data.error_description,
+ type: 'error'
+ })
+ } else {
+ store.commit('SET_TOKEN', data.access_token);
+ store.commit('SET_REFRESH_TOKEN', data.refresh_token);
+ store.commit('SET_TENANT_ID', data.tenant_id);
+ store.commit('SET_USER_INFO', data);
+ store.commit('DEL_ALL_TAG');
+ store.commit('CLEAR_LOCK');
+ }
+ })
+ return true;
+ } else {
+ // console.log("手动登入main不是JSON对象");
+ return false;
+ }
+
+ } else {
+ next('/login');
+ }
+
+ return;
+ }
+ next('/login');
}
}
})
diff --git a/src/router/axios.js b/src/router/axios.js
index 7b0a00d..9d05a2f 100644
--- a/src/router/axios.js
+++ b/src/router/axios.js
@@ -8,11 +8,11 @@
import axios from 'axios';
import store from '@/store/';
import router from '@/router/router';
-import {serialize} from '@/util/util';
-import {getToken} from '@/util/auth';
-import {Message} from 'element-ui';
+import { serialize } from '@/util/util';
+import { getToken } from '@/util/auth';
+import { Message } from 'element-ui';
import website from '@/config/website';
-import {Base64} from 'js-base64';
+import { Base64 } from 'js-base64';
import NProgress from 'nprogress';
import 'nprogress/nprogress.css';
@@ -62,7 +62,7 @@
//如果在白名单里则自行catch逻辑处理
if (statusWhiteList.includes(status)) return Promise.reject(res);
//如果是401则跳转到登录页面
- if (status === 401) store.dispatch('FedLogOut').then(() => router.push({path: '/login'}));
+ if (status === 401) store.dispatch('FedLogOut').then(() => router.push({ path: '/login' }));
// 如果请求为非200否者默认统一处理
if (status !== 200) {
Message({
diff --git a/src/store/modules/user.js b/src/store/modules/user.js
index f8fe52e..c0e5d63 100644
--- a/src/store/modules/user.js
+++ b/src/store/modules/user.js
@@ -1,11 +1,11 @@
-import {setToken, setRefreshToken, removeToken, removeRefreshToken} from '@/util/auth'
-import {Message} from 'element-ui'
-import {setStore, getStore} from '@/util/store'
-import {isURL, validatenull} from '@/util/validate'
-import {deepClone} from '@/util/util'
+import { setToken, setRefreshToken, removeToken, removeRefreshToken } from '@/util/auth'
+import { Message } from 'element-ui'
+import { setStore, getStore } from '@/util/store'
+import { isURL, validatenull } from '@/util/validate'
+import { deepClone } from '@/util/util'
import website from '@/config/website'
-import {loginByUsername, loginBySocial, getUserInfo, logout, refreshToken, getButtons} from '@/api/user'
-import {getTopMenu, getRoutes} from '@/api/system/menu'
+import { loginByUsername, loginBySocial, getUserInfo, logout, refreshToken, getButtons } from '@/api/user'
+import { getTopMenu, getRoutes } from '@/api/system/menu'
import md5 from 'js-md5'
@@ -34,22 +34,24 @@
const user = {
state: {
- tenantId: getStore({name: 'tenantId'}) || '',
- userInfo: getStore({name: 'userInfo'}) || [],
- permission: getStore({name: 'permission'}) || {},
+ tenantId: getStore({ name: 'tenantId' }) || '',
+ userInfo: getStore({ name: 'userInfo' }) || [],
+ permission: getStore({ name: 'permission' }) || {},
roles: [],
menuId: {},
- menu: getStore({name: 'menu'}) || [],
- menuAll: getStore({name: 'menuAll'}) || [],
- token: getStore({name: 'token'}) || '',
- refreshToken: getStore({name: 'refreshToken'}) || '',
+ menu: getStore({ name: 'menu' }) || [],
+ menuAll: getStore({ name: 'menuAll' }) || [],
+ token: getStore({ name: 'token' }) || '',
+ refreshToken: getStore({ name: 'refreshToken' }) || '',
},
actions: {
//根据用户名登录
- LoginByUsername({commit}, userInfo) {
+ LoginByUsername({ commit }, userInfo) {
return new Promise((resolve, reject) => {
loginByUsername(userInfo.tenantId, userInfo.username, md5(userInfo.password), userInfo.type, userInfo.key, userInfo.code).then(res => {
+ console.log(res, 'res');
const data = res.data;
+ console.log(data, 'data');
if (data.error_description) {
Message({
message: data.error_description,
@@ -62,6 +64,7 @@
commit('SET_USER_INFO', data);
commit('DEL_ALL_TAG');
commit('CLEAR_LOCK');
+ console.log(data.access_token, data.refresh_toke, data.tenant_id, data, 'usedatas');
}
resolve();
}).catch(error => {
@@ -70,7 +73,7 @@
})
},
//根据手机号登录
- LoginByPhone({commit}, userInfo) {
+ LoginByPhone({ commit }, userInfo) {
return new Promise((resolve) => {
loginByUsername(userInfo.phone, userInfo.code).then(res => {
const data = res.data.data;
@@ -82,7 +85,7 @@
})
},
//根据第三方信息登录
- LoginBySocial({commit}, userInfo) {
+ LoginBySocial({ commit }, userInfo) {
return new Promise((resolve) => {
loginBySocial(userInfo.tenantId, userInfo.source, userInfo.code, userInfo.state).then(res => {
const data = res.data;
@@ -103,7 +106,7 @@
})
},
//获取用户信息
- GetUserInfo({commit}) {
+ GetUserInfo({ commit }) {
return new Promise((resolve, reject) => {
getUserInfo().then((res) => {
const data = res.data.data;
@@ -115,7 +118,7 @@
})
},
//刷新token
- refreshToken({state, commit}) {
+ refreshToken({ state, commit }) {
window.console.log('handle refresh token')
return new Promise((resolve, reject) => {
refreshToken(state.refreshToken, state.tenantId).then(res => {
@@ -129,7 +132,7 @@
})
},
// 登出
- LogOut({commit}) {
+ LogOut({ commit }) {
return new Promise((resolve, reject) => {
logout().then(() => {
commit('SET_TOKEN', '');
@@ -148,7 +151,7 @@
})
},
//注销session
- FedLogOut({commit}) {
+ FedLogOut({ commit }) {
return new Promise(resolve => {
commit('SET_TOKEN', '');
commit('SET_MENU_ALL_NULL', []);
@@ -172,7 +175,7 @@
})
},
//获取系统菜单
- GetMenu({commit, dispatch}, topMenuId) {
+ GetMenu({ commit, dispatch }, topMenuId) {
return new Promise(resolve => {
getRoutes(topMenuId).then((res) => {
const data = res.data.data
@@ -188,7 +191,7 @@
})
},
//获取系统按钮
- GetButtons({commit}) {
+ GetButtons({ commit }) {
return new Promise((resolve) => {
getButtons().then(res => {
const data = res.data.data;
@@ -202,7 +205,7 @@
SET_TOKEN: (state, token) => {
setToken(token);
state.token = token;
- setStore({name: 'token', content: state.token})
+ setStore({ name: 'token', content: state.token })
},
SET_MENU_ID(state, menuId) {
state.menuId = menuId;
@@ -228,18 +231,18 @@
SET_REFRESH_TOKEN: (state, refreshToken) => {
setRefreshToken(refreshToken)
state.refreshToken = refreshToken;
- setStore({name: 'refreshToken', content: state.refreshToken})
+ setStore({ name: 'refreshToken', content: state.refreshToken })
},
SET_TENANT_ID: (state, tenantId) => {
state.tenantId = tenantId;
- setStore({name: 'tenantId', content: state.tenantId})
+ setStore({ name: 'tenantId', content: state.tenantId })
},
SET_USER_INFO: (state, userInfo) => {
if (validatenull(userInfo.avatar)) {
userInfo.avatar = "/img/bg/img-logo.png";
}
state.userInfo = userInfo;
- setStore({name: 'userInfo', content: state.userInfo})
+ setStore({ name: 'userInfo', content: state.userInfo })
},
SET_ROLES: (state, roles) => {
state.roles = roles;
@@ -266,7 +269,7 @@
result.forEach(ele => {
state.permission[ele] = true;
});
- setStore({name: 'permission', content: state.permission})
+ setStore({ name: 'permission', content: state.permission })
}
}
diff --git a/vue.config.js b/vue.config.js
index 3a9b2a9..a639cee 100644
--- a/vue.config.js
+++ b/vue.config.js
@@ -23,11 +23,11 @@
//开发模式反向代理配置,生产模式请使用Nginx部署并配置反向代理
devServer: {
port: 1888,
- disableHostCheck : true,
+ disableHostCheck: true,
proxy: {
'/api': {
//本地服务接口地址
- // target: 'http://192.168.0.104',
+ // target: 'http://192.168.0.109:1',
//远程演示服务地址,可用于直接启动项目
target: 'http://2h3f861221.wicp.vip:58646',
ws: true,
--
Gitblit v1.9.3