diff --git a/backend/.gitignore b/backend/.gitignore
new file mode 100644
index 0000000000..783a7f6184
--- /dev/null
+++ b/backend/.gitignore
@@ -0,0 +1,29 @@
+# Created by .ignore support plugin (hsz.mobi)
+.DS_Store
+node_modules
+node/
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+*.iml
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+
+
+src/main/resources/static
+src/main/resources/templates
+target
\ No newline at end of file
diff --git a/backend/pom.xml b/backend/pom.xml
new file mode 100644
index 0000000000..66cd44b0b7
--- /dev/null
+++ b/backend/pom.xml
@@ -0,0 +1,258 @@
+
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.2.2.RELEASE
+
+
+
+ 4.0.0
+
+ backend
+
+
+ UTF-8
+ 1.4.0
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+ spring-boot-starter-tomcat
+ org.springframework.boot
+
+
+ hibernate-validator
+ org.hibernate.validator
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+
+
+ org.springframework.boot
+ spring-boot-starter-aop
+
+
+ org.springframework.boot
+ spring-boot-starter-jetty
+
+
+
+ org.mybatis.spring.boot
+ mybatis-spring-boot-starter
+ 1.3.2
+
+
+
+ org.springframework.boot
+ spring-boot-starter-websocket
+
+
+
+ mysql
+ mysql-connector-java
+ runtime
+
+
+ com.github.pagehelper
+ pagehelper
+ 5.0.3
+
+
+
+ org.apache.shiro
+ shiro-core
+ ${shiro.version}
+
+
+ commons-collections
+ commons-collections
+
+
+ commons-beanutils
+ commons-beanutils
+
+
+
+
+ org.apache.shiro
+ shiro-web
+ ${shiro.version}
+
+
+ org.apache.shiro
+ shiro-spring
+ ${shiro.version}
+
+
+
+ org.apache.commons
+ commons-lang3
+
+
+ junit
+ junit
+
+
+
+ com.alibaba
+ fastjson
+ 1.2.45
+
+
+
+ org.slf4j
+ slf4j-simple
+
+
+
+
+
+
+
+ src/main/java
+
+ **/*.properties
+ **/*.xml
+
+ false
+
+
+ src/main/resources
+
+ **/*.*
+
+ false
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ true
+
+
+
+ org.apache.maven.plugins
+ maven-surefire-plugin
+ 2.12.4
+
+ true
+
+
+
+ maven-source-plugin
+ 3.0.0
+
+ true
+
+
+
+ attach-sources
+
+ jar
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-compiler-plugin
+
+
+ 1.8
+
+
+
+
+
+ org.apache.maven.plugins
+ maven-war-plugin
+ 2.6
+
+
+
+ org.apache.maven.plugins
+ maven-antrun-plugin
+
+
+ main-class-placement
+ generate-resources
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ run
+
+
+
+
+
+ org.mybatis.generator
+ mybatis-generator-maven-plugin
+ 1.3.7
+
+ true
+ true
+
+
+
+ mysql
+ mysql-connector-java
+ 5.1.41
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/src/main/java/com/fit2cloud/metersphere/Application.java b/backend/src/main/java/com/fit2cloud/metersphere/Application.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/Application.java
rename to backend/src/main/java/com/fit2cloud/metersphere/Application.java
diff --git a/src/main/java/com/fit2cloud/metersphere/base/domain/User.java b/backend/src/main/java/com/fit2cloud/metersphere/base/domain/User.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/base/domain/User.java
rename to backend/src/main/java/com/fit2cloud/metersphere/base/domain/User.java
diff --git a/src/main/java/com/fit2cloud/metersphere/base/domain/UserExample.java b/backend/src/main/java/com/fit2cloud/metersphere/base/domain/UserExample.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/base/domain/UserExample.java
rename to backend/src/main/java/com/fit2cloud/metersphere/base/domain/UserExample.java
diff --git a/src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.java b/backend/src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.java
rename to backend/src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.java
diff --git a/src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.xml b/backend/src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.xml
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.xml
rename to backend/src/main/java/com/fit2cloud/metersphere/base/mapper/UserMapper.xml
diff --git a/src/main/java/com/fit2cloud/metersphere/config/MybatisConfig.java b/backend/src/main/java/com/fit2cloud/metersphere/config/MybatisConfig.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/config/MybatisConfig.java
rename to backend/src/main/java/com/fit2cloud/metersphere/config/MybatisConfig.java
diff --git a/src/main/java/com/fit2cloud/metersphere/config/ShiroConfig.java b/backend/src/main/java/com/fit2cloud/metersphere/config/ShiroConfig.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/config/ShiroConfig.java
rename to backend/src/main/java/com/fit2cloud/metersphere/config/ShiroConfig.java
diff --git a/src/main/java/com/fit2cloud/metersphere/config/WebConfig.java b/backend/src/main/java/com/fit2cloud/metersphere/config/WebConfig.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/config/WebConfig.java
rename to backend/src/main/java/com/fit2cloud/metersphere/config/WebConfig.java
diff --git a/src/main/java/com/fit2cloud/metersphere/config/WebSocketConfig.java b/backend/src/main/java/com/fit2cloud/metersphere/config/WebSocketConfig.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/config/WebSocketConfig.java
rename to backend/src/main/java/com/fit2cloud/metersphere/config/WebSocketConfig.java
diff --git a/src/main/java/com/fit2cloud/metersphere/controller/IndexController.java b/backend/src/main/java/com/fit2cloud/metersphere/controller/IndexController.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/controller/IndexController.java
rename to backend/src/main/java/com/fit2cloud/metersphere/controller/IndexController.java
diff --git a/src/main/java/com/fit2cloud/metersphere/controller/LoginController.java b/backend/src/main/java/com/fit2cloud/metersphere/controller/LoginController.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/controller/LoginController.java
rename to backend/src/main/java/com/fit2cloud/metersphere/controller/LoginController.java
diff --git a/src/main/java/com/fit2cloud/metersphere/controller/ResultHolder.java b/backend/src/main/java/com/fit2cloud/metersphere/controller/ResultHolder.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/controller/ResultHolder.java
rename to backend/src/main/java/com/fit2cloud/metersphere/controller/ResultHolder.java
diff --git a/src/main/java/com/fit2cloud/metersphere/controller/TestController.java b/backend/src/main/java/com/fit2cloud/metersphere/controller/TestController.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/controller/TestController.java
rename to backend/src/main/java/com/fit2cloud/metersphere/controller/TestController.java
diff --git a/src/main/java/com/fit2cloud/metersphere/controller/request/LoginRequest.java b/backend/src/main/java/com/fit2cloud/metersphere/controller/request/LoginRequest.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/controller/request/LoginRequest.java
rename to backend/src/main/java/com/fit2cloud/metersphere/controller/request/LoginRequest.java
diff --git a/src/main/java/com/fit2cloud/metersphere/interceptor/TestInterceptor.java b/backend/src/main/java/com/fit2cloud/metersphere/interceptor/TestInterceptor.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/interceptor/TestInterceptor.java
rename to backend/src/main/java/com/fit2cloud/metersphere/interceptor/TestInterceptor.java
diff --git a/src/main/java/com/fit2cloud/metersphere/security/LoginFilter.java b/backend/src/main/java/com/fit2cloud/metersphere/security/LoginFilter.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/security/LoginFilter.java
rename to backend/src/main/java/com/fit2cloud/metersphere/security/LoginFilter.java
diff --git a/src/main/java/com/fit2cloud/metersphere/security/ShiroDBRealm.java b/backend/src/main/java/com/fit2cloud/metersphere/security/ShiroDBRealm.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/security/ShiroDBRealm.java
rename to backend/src/main/java/com/fit2cloud/metersphere/security/ShiroDBRealm.java
diff --git a/src/main/java/com/fit2cloud/metersphere/user/SessionUser.java b/backend/src/main/java/com/fit2cloud/metersphere/user/SessionUser.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/user/SessionUser.java
rename to backend/src/main/java/com/fit2cloud/metersphere/user/SessionUser.java
diff --git a/src/main/java/com/fit2cloud/metersphere/user/SessionUtils.java b/backend/src/main/java/com/fit2cloud/metersphere/user/SessionUtils.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/user/SessionUtils.java
rename to backend/src/main/java/com/fit2cloud/metersphere/user/SessionUtils.java
diff --git a/src/main/java/com/fit2cloud/metersphere/websocket/ServerEndpointConfigurator.java b/backend/src/main/java/com/fit2cloud/metersphere/websocket/ServerEndpointConfigurator.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/websocket/ServerEndpointConfigurator.java
rename to backend/src/main/java/com/fit2cloud/metersphere/websocket/ServerEndpointConfigurator.java
diff --git a/src/main/java/com/fit2cloud/metersphere/websocket/WebSocketServer.java b/backend/src/main/java/com/fit2cloud/metersphere/websocket/WebSocketServer.java
similarity index 100%
rename from src/main/java/com/fit2cloud/metersphere/websocket/WebSocketServer.java
rename to backend/src/main/java/com/fit2cloud/metersphere/websocket/WebSocketServer.java
diff --git a/src/main/resources/application.properties b/backend/src/main/resources/application.properties
similarity index 100%
rename from src/main/resources/application.properties
rename to backend/src/main/resources/application.properties
diff --git a/src/main/resources/generatorConfig.xml b/backend/src/main/resources/generatorConfig.xml
similarity index 100%
rename from src/main/resources/generatorConfig.xml
rename to backend/src/main/resources/generatorConfig.xml
diff --git a/src/main/resources/logback.xml b/backend/src/main/resources/logback.xml
similarity index 100%
rename from src/main/resources/logback.xml
rename to backend/src/main/resources/logback.xml
diff --git a/src/test/java/com/fit2cloud/metersphere/ApplicationTests.java b/backend/src/test/java/com/fit2cloud/metersphere/ApplicationTests.java
similarity index 100%
rename from src/test/java/com/fit2cloud/metersphere/ApplicationTests.java
rename to backend/src/test/java/com/fit2cloud/metersphere/ApplicationTests.java
diff --git a/frontend/.editorconfig b/frontend/.editorconfig
new file mode 100644
index 0000000000..3454886e3a
--- /dev/null
+++ b/frontend/.editorconfig
@@ -0,0 +1,14 @@
+# https://editorconfig.org
+root = true
+
+[*]
+charset = utf-8
+indent_style = space
+indent_size = 2
+end_of_line = lf
+insert_final_newline = true
+trim_trailing_whitespace = true
+
+[*.md]
+insert_final_newline = false
+trim_trailing_whitespace = false
diff --git a/frontend/.gitignore b/frontend/.gitignore
new file mode 100644
index 0000000000..ad34583de6
--- /dev/null
+++ b/frontend/.gitignore
@@ -0,0 +1,29 @@
+.DS_Store
+node_modules
+node/
+/dist
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Editor directories and files
+.idea
+*.iml
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?
+.setting
+.project
+.classpath
+yarn.lock
+package-lock.json
+
diff --git a/frontend/babel.config.js b/frontend/babel.config.js
new file mode 100644
index 0000000000..e9558405fd
--- /dev/null
+++ b/frontend/babel.config.js
@@ -0,0 +1,5 @@
+module.exports = {
+ presets: [
+ '@vue/cli-plugin-babel/preset'
+ ]
+}
diff --git a/frontend/package.json b/frontend/package.json
new file mode 100644
index 0000000000..c5fd5c64a9
--- /dev/null
+++ b/frontend/package.json
@@ -0,0 +1,49 @@
+{
+ "name": "vue-demo",
+ "version": "0.1.0",
+ "private": true,
+ "scripts": {
+ "serve": "vue-cli-service serve",
+ "build": "vue-cli-service build",
+ "lint": "vue-cli-service lint"
+ },
+ "dependencies": {
+ "@fortawesome/fontawesome-svg-core": "^1.2.26",
+ "@fortawesome/free-regular-svg-icons": "^5.12.0",
+ "@fortawesome/free-solid-svg-icons": "^5.12.0",
+ "@fortawesome/vue-fontawesome": "^0.1.9",
+ "axios": "^0.19.0",
+ "core-js": "^3.4.3",
+ "element-ui": "^2.13.0",
+ "vue": "^2.6.10",
+ "vue-i18n": "^8.15.3",
+ "vue-router": "^3.1.3"
+ },
+ "devDependencies": {
+ "@vue/cli-plugin-babel": "^4.1.0",
+ "@vue/cli-plugin-eslint": "^4.1.0",
+ "@vue/cli-service": "^4.1.0",
+ "babel-eslint": "^10.0.3",
+ "eslint": "^5.16.0",
+ "eslint-plugin-vue": "^5.0.0",
+ "vue-template-compiler": "^2.6.10"
+ },
+ "eslintConfig": {
+ "root": true,
+ "env": {
+ "node": true
+ },
+ "extends": [
+ "plugin:vue/essential",
+ "eslint:recommended"
+ ],
+ "rules": {},
+ "parserOptions": {
+ "parser": "babel-eslint"
+ }
+ },
+ "browserslist": [
+ "> 1%",
+ "last 2 versions"
+ ]
+}
diff --git a/frontend/pom.xml b/frontend/pom.xml
new file mode 100644
index 0000000000..8dd702aa4c
--- /dev/null
+++ b/frontend/pom.xml
@@ -0,0 +1,68 @@
+
+
+
+ vue-demo
+ com.fit2cloud
+ 1.0
+
+ 4.0.0
+
+ frontend
+
+
+ UTF-8
+ UTF-8
+ 1.9.1
+
+
+
+
+
+ com.github.eirslett
+ frontend-maven-plugin
+ ${frontend-maven-plugin.version}
+
+
+
+ install node and yarn
+
+ install-node-and-yarn
+
+
+ generate-resources
+
+ v12.14.1
+ v1.21.1
+
+
+
+
+ yarn install
+
+ yarn
+
+
+
+ install
+
+
+
+
+ yarn build
+
+ yarn
+
+
+ build
+
+
+
+
+
+
+
diff --git a/frontend/public/favicon.png b/frontend/public/favicon.png
new file mode 100644
index 0000000000..15fb97a693
Binary files /dev/null and b/frontend/public/favicon.png differ
diff --git a/frontend/src/assets/MeterSphere-反白.png b/frontend/src/assets/MeterSphere-反白.png
new file mode 100644
index 0000000000..479ded7aed
Binary files /dev/null and b/frontend/src/assets/MeterSphere-反白.png differ
diff --git a/frontend/src/assets/MeterSphere-彩色.png b/frontend/src/assets/MeterSphere-彩色.png
new file mode 100644
index 0000000000..66d9c25d60
Binary files /dev/null and b/frontend/src/assets/MeterSphere-彩色.png differ
diff --git a/frontend/src/assets/favicon-反白.png b/frontend/src/assets/favicon-反白.png
new file mode 100644
index 0000000000..c9ad4be020
Binary files /dev/null and b/frontend/src/assets/favicon-反白.png differ
diff --git a/frontend/src/assets/favicon-彩色.png b/frontend/src/assets/favicon-彩色.png
new file mode 100644
index 0000000000..15fb97a693
Binary files /dev/null and b/frontend/src/assets/favicon-彩色.png differ
diff --git a/frontend/src/assets/info.png b/frontend/src/assets/info.png
new file mode 100644
index 0000000000..5d7d73fddc
Binary files /dev/null and b/frontend/src/assets/info.png differ
diff --git a/frontend/src/common/ajax.js b/frontend/src/common/ajax.js
new file mode 100644
index 0000000000..270bd88c13
--- /dev/null
+++ b/frontend/src/common/ajax.js
@@ -0,0 +1,82 @@
+import {Message, MessageBox} from 'element-ui';
+import axios from "axios";
+
+export default {
+ install(Vue) {
+ if (!axios) {
+ window.console.error('You have to install axios');
+ return
+ }
+
+ if (!Message) {
+ window.console.error('You have to install Message of ElementUI');
+ return
+ }
+
+ let login = function () {
+ MessageBox.alert("认证信息已过期,请重新登录。", {
+ callback: () => {
+ window.location.href = "/login"
+ }
+ });
+ };
+
+ axios.defaults.withCredentials = true;
+
+ axios.interceptors.response.use(response => {
+ if (response.headers["authentication-status"] === "invalid") {
+ login();
+ }
+ return response;
+ }, error => {
+ return Promise.reject(error);
+ });
+
+ Vue.prototype.$get = function (url, success) {
+ if (!success) {
+ return axios.get(url);
+ } else {
+ axios.get(url).then(response => {
+ if (!response.data) {
+ return success(response);
+ }
+ if (response.data.success) {
+ return success(response.data);
+ } else {
+ window.console.warn(response.data);
+ Message.warning(response.data.message);
+ }
+ }).catch(error => {
+ window.console.error(error.response || error.message);
+ Message.error({message: error.message, showClose: true});
+ })
+ }
+ };
+
+ Vue.prototype.$post = function (url, data, success) {
+ if (!success) {
+ return axios.post(url, data);
+ } else {
+ axios.post(url, data).then(response => {
+ if (!response.data) {
+ return success(response);
+ }
+ if (response.data.success) {
+ return success(response.data);
+ } else {
+ window.console.warn(response.data);
+ Message.warning(response.data.message);
+ }
+ }).catch(error => {
+ window.console.error(error.response || error.message);
+ Message.error({message: error.message, showClose: true});
+ })
+ }
+ };
+
+ Vue.prototype.$all = function (array, callback) {
+ if (array.length < 1) return;
+ axios.all(array).then(axios.spread(callback));
+ };
+ }
+}
diff --git a/frontend/src/common/filter.js b/frontend/src/common/filter.js
new file mode 100644
index 0000000000..9acd46cd07
--- /dev/null
+++ b/frontend/src/common/filter.js
@@ -0,0 +1,24 @@
+const options = function (value, array) {
+ if (!value) return '';
+ if (array) {
+ for (let i = 0; i < array.length; i++) {
+ if (value === array[i].key) {
+ return array[i].value
+ }
+ }
+ }
+ return value;
+};
+
+const filters = {
+ "options": options,
+};
+
+export default {
+ install(Vue) {
+ // 注册公用过滤器
+ Object.keys(filters).forEach(key => {
+ Vue.filter(key, filters[key])
+ });
+ }
+}
diff --git a/frontend/src/common/icon.js b/frontend/src/common/icon.js
new file mode 100644
index 0000000000..1632c4104d
--- /dev/null
+++ b/frontend/src/common/icon.js
@@ -0,0 +1,11 @@
+import {library} from '@fortawesome/fontawesome-svg-core'
+import {fas} from '@fortawesome/free-solid-svg-icons'
+import {far} from '@fortawesome/free-regular-svg-icons'
+import {FontAwesomeIcon} from '@fortawesome/vue-fontawesome'
+
+export default {
+ install(Vue) {
+ library.add(fas, far);
+ Vue.component('font-awesome-icon', FontAwesomeIcon);
+ }
+}
diff --git a/frontend/src/i18n/en_US.js b/frontend/src/i18n/en_US.js
new file mode 100644
index 0000000000..9d93c61805
--- /dev/null
+++ b/frontend/src/i18n/en_US.js
@@ -0,0 +1,7 @@
+const en_US = {
+ i18n: {
+ 'home': 'Home',
+ }
+};
+
+export default en_US
diff --git a/frontend/src/i18n/i18n.js b/frontend/src/i18n/i18n.js
new file mode 100644
index 0000000000..b521912ba1
--- /dev/null
+++ b/frontend/src/i18n/i18n.js
@@ -0,0 +1,26 @@
+import Vue from 'vue';
+import VueI18n from "vue-i18n";
+import enLocale from "element-ui/lib/locale/lang/en";
+import zh_CNLocale from "element-ui/lib/locale/lang/zh-CN";
+import en_US from "./en_US";
+import zh_CN from "./zh_CN";
+
+Vue.use(VueI18n);
+
+const messages = {
+ 'en_US': {
+ ...en_US,
+ ...enLocale
+ },
+ 'zh_CN': {
+ ...zh_CN,
+ ...zh_CNLocale
+ }
+};
+
+const i18n = new VueI18n({
+ locale: 'en_US',
+ messages,
+});
+
+export default i18n;
diff --git a/frontend/src/i18n/zh_CN.js b/frontend/src/i18n/zh_CN.js
new file mode 100644
index 0000000000..7b248babfa
--- /dev/null
+++ b/frontend/src/i18n/zh_CN.js
@@ -0,0 +1,7 @@
+const zh_CN = {
+ i18n: {
+ 'home': '首页',
+ }
+};
+
+export default zh_CN
diff --git a/frontend/src/login/Login.vue b/frontend/src/login/Login.vue
new file mode 100644
index 0000000000..b707131db9
--- /dev/null
+++ b/frontend/src/login/Login.vue
@@ -0,0 +1,200 @@
+
+
+
+
+
+
+
+
+
+ 登录
+ MeterSphere
+
+
+
+ 欢迎回来,请输入用户名和密码登录MeterSphere
+
+
+
+
+
+
+
+
+
+
+ 登录
+
+
+
+ {{msg}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/login/login.html b/frontend/src/login/login.html
new file mode 100644
index 0000000000..57ffc9dfbb
--- /dev/null
+++ b/frontend/src/login/login.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+ MeterSphere
+
+
+
+
+
diff --git a/frontend/src/login/login.js b/frontend/src/login/login.js
new file mode 100644
index 0000000000..030f88b11d
--- /dev/null
+++ b/frontend/src/login/login.js
@@ -0,0 +1,19 @@
+import Vue from 'vue';
+import {Button, Col, Form, FormItem, Input, Row} from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import Login from "./Login.vue";
+import Ajax from "../common/ajax";
+
+Vue.config.productionTip = false;
+Vue.use(Row);
+Vue.use(Col);
+Vue.use(Form);
+Vue.use(FormItem);
+Vue.use(Input);
+Vue.use(Button);
+Vue.use(Ajax);
+
+new Vue({
+ el: '#login',
+ render: h => h(Login)
+});
diff --git a/frontend/src/performance/App.vue b/frontend/src/performance/App.vue
new file mode 100644
index 0000000000..5a0a6aebd8
--- /dev/null
+++ b/frontend/src/performance/App.vue
@@ -0,0 +1,105 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/HeaderMenus.vue b/frontend/src/performance/components/HeaderMenus.vue
new file mode 100644
index 0000000000..33775017fc
--- /dev/null
+++ b/frontend/src/performance/components/HeaderMenus.vue
@@ -0,0 +1,60 @@
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/HeaderSetting.vue b/frontend/src/performance/components/HeaderSetting.vue
new file mode 100644
index 0000000000..62d6e78d3f
--- /dev/null
+++ b/frontend/src/performance/components/HeaderSetting.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/HeaderUser.vue b/frontend/src/performance/components/HeaderUser.vue
new file mode 100644
index 0000000000..80b6ca787f
--- /dev/null
+++ b/frontend/src/performance/components/HeaderUser.vue
@@ -0,0 +1,41 @@
+
+
+
+ 莫 鹍
+
+
+ 个人信息
+ 退出系统
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/router/RouterSidebar.vue b/frontend/src/performance/components/router/RouterSidebar.vue
new file mode 100644
index 0000000000..9c5b1d2218
--- /dev/null
+++ b/frontend/src/performance/components/router/RouterSidebar.vue
@@ -0,0 +1,15 @@
+
+
+ adfdsaf
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/router/View.vue b/frontend/src/performance/components/router/View.vue
new file mode 100644
index 0000000000..c96d35a780
--- /dev/null
+++ b/frontend/src/performance/components/router/View.vue
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/router/router.js b/frontend/src/performance/components/router/router.js
new file mode 100644
index 0000000000..3fcd964a5a
--- /dev/null
+++ b/frontend/src/performance/components/router/router.js
@@ -0,0 +1,28 @@
+import Vue from "vue";
+import VueRouter from 'vue-router'
+import RouterSidebar from "./RouterSidebar";
+import Setting from "../settings/Setting";
+import Workspace from "../settings/Workspace";
+
+Vue.use(VueRouter);
+
+const router = new VueRouter({
+ routes: [
+ {
+ path: "/sidebar", components: {
+ sidebar: RouterSidebar
+ }
+ },
+ {
+ path: "/content", components: {
+ content: Setting
+ }, children: [
+ {
+ path: 'workspace',
+ component: Workspace
+ }
+ ]
+ }]
+});
+
+export default router
diff --git a/frontend/src/performance/components/settings/CreateBox.vue b/frontend/src/performance/components/settings/CreateBox.vue
new file mode 100644
index 0000000000..bb9b8c7e28
--- /dev/null
+++ b/frontend/src/performance/components/settings/CreateBox.vue
@@ -0,0 +1,36 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/settings/CurrentUser.vue b/frontend/src/performance/components/settings/CurrentUser.vue
new file mode 100644
index 0000000000..e9c16e0b05
--- /dev/null
+++ b/frontend/src/performance/components/settings/CurrentUser.vue
@@ -0,0 +1,65 @@
+
+
+
+ kun@fit2cloud.com
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/settings/Setting.vue b/frontend/src/performance/components/settings/Setting.vue
new file mode 100644
index 0000000000..cd31eb86e0
--- /dev/null
+++ b/frontend/src/performance/components/settings/Setting.vue
@@ -0,0 +1,64 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/settings/SettingMenu.vue b/frontend/src/performance/components/settings/SettingMenu.vue
new file mode 100644
index 0000000000..d869c1ec9c
--- /dev/null
+++ b/frontend/src/performance/components/settings/SettingMenu.vue
@@ -0,0 +1,61 @@
+
+
+
+
+
+ 账号
+
+ 用户
+ 工作空间
+ API Keys
+
+
+
+
+ 工作空间
+
+ 成员
+ 证书
+ 测试计划
+ 警告
+
+
+
+
+ 个人
+
+ 个人设置
+ API Keys
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/settings/Workspace.vue b/frontend/src/performance/components/settings/Workspace.vue
new file mode 100644
index 0000000000..825a8d5e76
--- /dev/null
+++ b/frontend/src/performance/components/settings/Workspace.vue
@@ -0,0 +1,101 @@
+
+
+
+
+
+ 工作空间
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/components/websocket/WebSocket.vue b/frontend/src/performance/components/websocket/WebSocket.vue
new file mode 100644
index 0000000000..74a6366920
--- /dev/null
+++ b/frontend/src/performance/components/websocket/WebSocket.vue
@@ -0,0 +1,53 @@
+
+
+
+
+
+
+
+
+
diff --git a/frontend/src/performance/index.html b/frontend/src/performance/index.html
new file mode 100644
index 0000000000..4c586dd423
--- /dev/null
+++ b/frontend/src/performance/index.html
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+ MeterSphere
+
+
+
+
+
diff --git a/frontend/src/performance/main.js b/frontend/src/performance/main.js
new file mode 100644
index 0000000000..db085981a7
--- /dev/null
+++ b/frontend/src/performance/main.js
@@ -0,0 +1,24 @@
+import Vue from 'vue';
+import ElementUI from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+import icon from "../common/icon";
+import filters from "../common/filter";
+import ajax from "../common/ajax";
+import App from './App.vue';
+import router from "./components/router/router";
+import i18n from "../i18n/i18n";
+
+Vue.config.productionTip = false;
+Vue.use(icon);
+Vue.use(ElementUI, {
+ i18n: (key, value) => i18n.t(key, value)
+});
+Vue.use(filters);
+Vue.use(ajax);
+
+new Vue({
+ el: '#app',
+ router,
+ i18n,
+ render: h => h(App)
+});
diff --git a/frontend/vue.config.js b/frontend/vue.config.js
new file mode 100644
index 0000000000..240cd4343b
--- /dev/null
+++ b/frontend/vue.config.js
@@ -0,0 +1,26 @@
+module.exports = {
+ productionSourceMap: true,
+ configureWebpack: {
+ devtool: 'source-map'
+ },
+ devServer: {
+ proxy: {
+ ['^(?!/login)']: {
+ target: 'http://localhost:8888',
+ ws: true,
+ }
+ }
+ },
+ pages: {
+ performance: {
+ entry: "src/performance/main.js",
+ template: "src/performance/index.html",
+ filename: "index.html"
+ },
+ login: {
+ entry: "src/login/login.js",
+ template: "src/login/login.html",
+ filename: "login.html"
+ }
+ }
+};
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 3a23a9eefe..0c07c5d93f 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,196 +1,83 @@
-
-
- org.springframework.boot
- spring-boot-starter-parent
- 2.2.2.RELEASE
-
-
-
+
4.0.0
-
+ com.fit2cloud
metersphere-server
+ 0.0.1-SNAPSHOT
+ pom
+
+ root
+
+ frontend
+ backend
+
- UTF-8
- 1.4.0
1.8
+ 4.12
+ 5.2.1
-
-
- org.springframework.boot
- spring-boot-starter-web
-
-
- spring-boot-starter-tomcat
- org.springframework.boot
-
-
- hibernate-validator
- org.hibernate.validator
-
-
-
+
+
+
+
+ org.apache.jmeter
+ ApacheJMeter_http
+ ${jmeter.version}
+
+
+ org.apache.logging.log4j
+ log4j-slf4j-impl
+
+
+
-
- org.springframework.boot
- spring-boot-starter
-
+
+ org.apache.commons
+ commons-lang3
+ 3.9
+
+
+ org.apache.httpcomponents
+ httpclient
+ 4.5.10
+
+
+ org.apache.httpcomponents
+ httpasyncclient
+ 4.1.4
+
+
+ commons-io
+ commons-io
+ 2.6
+
-
+
+ org.influxdb
+ influxdb-java
+ 2.16
+
-
- org.springframework.boot
- spring-boot-starter-test
-
-
- org.springframework.boot
- spring-boot-starter-aop
-
-
- org.springframework.boot
- spring-boot-starter-jetty
-
+
+ org.slf4j
+ slf4j-simple
+ 1.7.29
+
-
- org.mybatis.spring.boot
- mybatis-spring-boot-starter
- 1.3.2
-
-
-
- org.springframework.boot
- spring-boot-starter-websocket
-
-
-
- mysql
- mysql-connector-java
- runtime
-
-
- com.github.pagehelper
- pagehelper
- 5.0.3
-
-
-
- org.apache.shiro
- shiro-core
- ${shiro.version}
-
-
- commons-collections
- commons-collections
-
-
- commons-beanutils
- commons-beanutils
-
-
-
-
- org.apache.shiro
- shiro-web
- ${shiro.version}
-
-
- org.apache.shiro
- shiro-spring
- ${shiro.version}
-
-
-
- org.apache.commons
- commons-lang3
-
-
- junit
- junit
-
-
-
- com.alibaba
- fastjson
- 1.2.45
-
-
-
- org.slf4j
- slf4j-simple
-
-
-
+
+ junit
+ junit
+ ${junit.version}
+ test
+
+
+
-
-
- src/main/java
-
- **/*.properties
- **/*.xml
-
- false
-
-
- src/main/resources
-
- **/*.*
-
- false
-
-
-
-
- org.springframework.boot
- spring-boot-maven-plugin
-
- true
-
-
-
- org.apache.maven.plugins
- maven-surefire-plugin
- 2.12.4
-
- true
-
-
-
- maven-source-plugin
- 3.0.0
-
- true
-
-
-
- attach-sources
-
- jar
-
-
-
-
org.apache.maven.plugins
maven-compiler-plugin
@@ -199,60 +86,6 @@
1.8
-
-
-
- org.apache.maven.plugins
- maven-war-plugin
- 2.6
-
-
-
- org.apache.maven.plugins
- maven-antrun-plugin
-
-
- main-class-placement
- generate-resources
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- run
-
-
-
-
-
- org.mybatis.generator
- mybatis-generator-maven-plugin
- 1.3.7
-
- true
- true
-
-
-
- mysql
- mysql-connector-java
- 5.1.41
-
-
-
-
-
-
\ No newline at end of file