李楠 4 years ago
commit
deccf1e5fe

+ 3 - 0
.browserslistrc

@@ -0,0 +1,3 @@
+> 1%
+last 2 versions
+not dead

+ 23 - 0
.gitignore

@@ -0,0 +1,23 @@
+.DS_Store
+node_modules
+/dist
+
+
+# local env files
+.env.local
+.env.*.local
+
+# Log files
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+pnpm-debug.log*
+
+# Editor directories and files
+.idea
+.vscode
+*.suo
+*.ntvs*
+*.njsproj
+*.sln
+*.sw?

+ 19 - 0
README.md

@@ -0,0 +1,19 @@
+# snt.butcher
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 5 - 0
babel.config.js

@@ -0,0 +1,5 @@
+module.exports = {
+  presets: [
+    '@vue/cli-plugin-babel/preset'
+  ]
+}

File diff suppressed because it is too large
+ 11951 - 0
package-lock.json


+ 29 - 0
package.json

@@ -0,0 +1,29 @@
+{
+  "name": "snt.butcher",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build"
+  },
+  "dependencies": {
+    "axios": "^0.21.0",
+    "core-js": "^3.6.5",
+    "echarts": "^4.9.0",
+    "element-ui": "^2.14.1",
+    "moment": "^2.29.1",
+    "vue": "^2.6.11",
+    "vue-axios": "^3.2.0",
+    "vue-router": "^3.2.0",
+    "vuex": "^3.4.0"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "~4.5.0",
+    "@vue/cli-plugin-router": "~4.5.0",
+    "@vue/cli-plugin-vuex": "~4.5.0",
+    "@vue/cli-service": "~4.5.0",
+    "node-sass": "^4.12.0",
+    "sass-loader": "^8.0.2",
+    "vue-template-compiler": "^2.6.11"
+  }
+}

BIN
public/favicon.ico


+ 17 - 0
public/index.html

@@ -0,0 +1,17 @@
+<!DOCTYPE html>
+<html lang="en">
+  <head>
+    <meta charset="utf-8">
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+    <meta name="viewport" content="width=device-width,initial-scale=1.0">
+    <link rel="icon" href="<%= BASE_URL %>favicon.ico">
+    <title><%= htmlWebpackPlugin.options.title %></title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but <%= htmlWebpackPlugin.options.title %> doesn't work properly without JavaScript enabled. Please enable it to continue.</strong>
+    </noscript>
+    <div id="app"></div>
+    <!-- built files will be auto injected -->
+  </body>
+</html>

+ 24 - 0
src/App.vue

@@ -0,0 +1,24 @@
+<template>
+    <div id="app">
+        <router-view />
+    </div>
+</template>
+
+<script>
+export default {
+    created() {}
+};
+</script>
+
+<style lang="scss">
+#app {
+    height: 100%;
+    margin: 0;
+}
+body,
+html {
+    height: 100%;
+    width: 100%;
+    margin: 0 0 0 0;
+}
+</style>

+ 6 - 0
src/api/basicInfo.js

@@ -0,0 +1,6 @@
+import { ajax } from "../sdk/ajax";
+
+/* 企业信息 */
+export const reqFirminfo = () => ajax("get", "/publics/sysconf/get", {code: 'huyang_company'})
+
+export const reqUpdateFirm = (data) => ajax("post", "/publics/sysconf/update", data)

+ 11 - 0
src/api/login.js

@@ -0,0 +1,11 @@
+import { ajax } from "../sdk/ajax";
+
+
+/* 登录 */
+export const reqLogin = (data) => ajax("post", "/core/auth/login", data)
+
+/* 选择组织 */
+export const reqOrgChoose = () => ajax("get", "/core/employ-relation/under-list")
+
+
+export const reqOrganizationId = (data) => ajax("POST", "/core/auth/choose-org",data)

+ 5 - 0
src/assets/css/reset.scss

@@ -0,0 +1,5 @@
+/* 公用scss */
+div,h1,h2,h3,h4,h5,h3,body,html,ul,li,p{margin: 0;padding: 0;}
+a{text-decoration: none;}
+li{list-style:none;} 
+/*css初始化完成*/

BIN
src/assets/login_bg.jpg


BIN
src/assets/logo.png


+ 59 - 0
src/components/HelloWorld.vue

@@ -0,0 +1,59 @@
+<template>
+  <div class="hello">
+    <h1>{{ msg }}</h1>
+    <p>
+      For a guide and recipes on how to configure / customize this project,<br>
+      check out the
+      <a href="https://cli.vuejs.org" target="_blank" rel="noopener">vue-cli documentation</a>.
+    </p>
+    <h3>Installed CLI Plugins</h3>
+    <ul>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-babel" target="_blank" rel="noopener">babel</a></li>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-router" target="_blank" rel="noopener">router</a></li>
+      <li><a href="https://github.com/vuejs/vue-cli/tree/dev/packages/%40vue/cli-plugin-vuex" target="_blank" rel="noopener">vuex</a></li>
+    </ul>
+    <h3>Essential Links</h3>
+    <ul>
+      <li><a href="https://vuejs.org" target="_blank" rel="noopener">Core Docs</a></li>
+      <li><a href="https://forum.vuejs.org" target="_blank" rel="noopener">Forum</a></li>
+      <li><a href="https://chat.vuejs.org" target="_blank" rel="noopener">Community Chat</a></li>
+      <li><a href="https://twitter.com/vuejs" target="_blank" rel="noopener">Twitter</a></li>
+      <li><a href="https://news.vuejs.org" target="_blank" rel="noopener">News</a></li>
+    </ul>
+    <h3>Ecosystem</h3>
+    <ul>
+      <li><a href="https://router.vuejs.org" target="_blank" rel="noopener">vue-router</a></li>
+      <li><a href="https://vuex.vuejs.org" target="_blank" rel="noopener">vuex</a></li>
+      <li><a href="https://github.com/vuejs/vue-devtools#vue-devtools" target="_blank" rel="noopener">vue-devtools</a></li>
+      <li><a href="https://vue-loader.vuejs.org" target="_blank" rel="noopener">vue-loader</a></li>
+      <li><a href="https://github.com/vuejs/awesome-vue" target="_blank" rel="noopener">awesome-vue</a></li>
+    </ul>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'HelloWorld',
+  props: {
+    msg: String
+  }
+}
+</script>
+
+<!-- Add "scoped" attribute to limit CSS to this component only -->
+<style scoped lang="scss">
+h3 {
+  margin: 40px 0 0;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>

+ 23 - 0
src/main.js

@@ -0,0 +1,23 @@
+import Vue from 'vue'
+import ElementUI from 'element-ui';
+// import '../theme/index.css'
+import 'element-ui/lib/theme-chalk/index.css';
+import App from './App.vue'
+import router from './router'
+import store from './store'
+import './assets/css/reset.scss'
+import echarts from "echarts";
+import moment from 'moment'
+moment.locale('zh-cn');  // 汉化
+Vue.prototype.$moment = moment; 
+
+Vue.prototype.$echarts = echarts
+
+Vue.use(ElementUI);
+
+
+new Vue({
+	router,
+	store,
+	render: h => h(App)
+}).$mount('#app')

+ 44 - 0
src/router/index.js

@@ -0,0 +1,44 @@
+import Vue from 'vue'
+import VueRouter from 'vue-router'
+// import store from '../store'
+import subRouters from './routes'
+
+import App from '../App.vue'
+import Login from '../views/Login/Login.vue'
+import Home from '../views/Home/Home.vue'
+
+
+Vue.use(VueRouter)
+
+const routes = [
+	{
+		path: '/',
+		component: App,
+		children: [
+			{
+				path: '',
+				redirect: '/login'
+			},
+		]
+	},
+	{
+		path: '/login',
+		name: 'login',
+		component: Login
+	},
+	{
+		path: '/home',
+		component: Home
+	},
+	{
+		path: '*',
+		name: '*',
+		component: Login
+	}
+]
+
+const router = new VueRouter({
+	routes: [...routes, ...subRouters]
+})
+
+export default router

+ 17 - 0
src/router/routes.js

@@ -0,0 +1,17 @@
+import Home from '../views/Home/Home.vue'
+
+
+export default [
+	{
+		path: '/home',
+		component: Home,
+		children: [
+			/* 基本信息 */
+			{
+				path: 'herdsmanInfo',
+				name: 'herdsmanInfo',
+				component: () => import('@/views/basicInfo/herdsmanInfo.vue')
+			},
+		]
+	},
+]

+ 95 - 0
src/sdk/ajax.js

@@ -0,0 +1,95 @@
+import Vue from 'vue';
+import axios from 'axios';
+import VueAxios from 'vue-axios';
+import config from './config'
+import Qs from 'qs';
+
+const { serverAddress } = config
+
+// import DEV from "@/dev_config"; // 导入上线配置
+// const { ONLINE_BASE_HREF, SERVER_HREF } = DEV;
+
+Vue.use(VueAxios, axios)
+
+
+/* 常用ajax封装 */
+export const ajax = function (type = "post", url, params) {
+    let token = localStorage.getItem("token")
+    if (type.toLowerCase() == 'get') {
+        return new Promise((resole, reject) => {
+            axios({
+                method: type,
+                url: serverAddress + url,
+                params,
+                paramsSerializer(params) {
+                    return Qs.stringify(params, { arrayFormat: 'brackets' })
+                },
+                headers: {
+                    'Content-Type': 'application/x-www-form-urlencoded',
+                    'x-auth-token': token
+                }
+            }).then((res) => {
+                switch (res.data.errCode) {
+                    case 'request_not_authorize': // 登录过期
+                        let url = window.location.protocol + "//" + window.location.host + "/#/login"
+                        window.location.replace(url)
+                        break;
+                }
+                resole(res.data);
+            }).catch((err) => {
+                reject(err);
+            });
+        });
+    } else {
+        return new Promise((resole, reject) => {
+            axios({
+                method: type,
+                url: serverAddress + url,
+                params,
+                headers: {
+                    'Content-Type': 'application/x-www-form-urlencoded',
+                    'x-auth-token': token
+                }
+            }).then((res) => {
+                switch (res.data.errCode) {
+                    case 'request_not_authorize': // 登录过期
+                        let url = window.location.protocol + "//" + window.location.host + "/#/login"
+                        window.location.replace(url)
+                        break;
+                }
+                resole(res.data);
+            }).catch((err) => {
+                reject(err);
+            });
+        });
+    }
+}
+
+
+
+// export const upload = function (url, data) {
+//     let token = localStorage.getItem("token")
+//     return new Promise((resole, reject) => {
+//         axios({
+//             method: 'POST',
+//             url: serverAddress + url,
+//             data,
+//             headers: {
+//                 'Content-Type': 'multipart/form-data',
+//                 'x-auth-token': token
+//             }
+//         }).then((res) => {
+//             switch (res.data.errCode) {
+//                 case 'request_not_authorize': // 登录过期
+//                     let url = window.location.protocol + "//" + window.location.host + "/#/login"
+//                     window.location.replace(url)
+//                     break;
+//             }
+//             resole(res.data);
+//         }).catch((err) => {
+//             reject(err);
+//         });
+//     });
+// }
+
+

+ 6 - 0
src/sdk/config.js

@@ -0,0 +1,6 @@
+export default {
+  // http://192.168.1.6/uploads/20d27b607c8045279f7a41a7defa0d62.jpg
+  // http://115.238.57.190:8888/uploads/20d27b607c8045279f7a41a7defa0d62.jpg
+  serverAddress: 'http://115.238.57.190:8010',
+  IMG_BASE: 'http://115.238.57.190:8888/uploads/'
+}

+ 24 - 0
src/store/index.js

@@ -0,0 +1,24 @@
+import Vue from 'vue'
+import Vuex from 'vuex'
+
+Vue.use(Vuex)
+
+export default new Vuex.Store({
+	state: {},
+	mutations: {
+		setState(state, [key, val]) {
+			state[key] = val
+		}
+	},
+	actions: {
+		// getWorkerList({ commit }) {
+		//   reqWorkerList({
+		//     searchStr: '',
+		//     pageSize: 1000,
+		//     pageNum: 1
+		//   }).then(res => {
+		//     commit('setState', ['workerList', res.content])
+		//   })
+		// },
+	},
+})

+ 223 - 0
src/views/Home/Home.vue

@@ -0,0 +1,223 @@
+<template>
+    <div class="home">
+        <header class="header">
+            <div class="left">
+                苏尼特羊区块链平台
+                <el-button
+                    @click="onMenuCollapse"
+                    circle
+                    style="font-size: 20px"
+                    :icon="menuCollapse ? 'el-icon-s-unfold' : 'el-icon-s-fold'"
+                ></el-button>
+            </div>
+            <div class="right">
+                <span class="warp">
+                    <el-dropdown @command="onLogOut">
+                        <span class="el-dropdown-link">
+                            账号管理
+                            <i class="el-icon-arrow-down el-icon--right"></i>
+                        </span>
+                        <el-dropdown-menu slot="dropdown">
+                            <el-dropdown-item>退出登录</el-dropdown-item>
+                            <el-dropdown-item>切换账号</el-dropdown-item>
+                        </el-dropdown-menu>
+                    </el-dropdown>
+                </span>
+                <span>
+                    <el-dropdown @command="onLogOut">
+                        <span class="el-dropdown-link">
+                            权限切换
+                            <i class="el-icon-arrow-down el-icon--right"></i>
+                        </span>
+                        <el-dropdown-menu slot="dropdown">
+                            <el-dropdown-item disabled>权限一</el-dropdown-item>
+                            <el-dropdown-item divided>权限二</el-dropdown-item>
+                        </el-dropdown-menu>
+                    </el-dropdown>
+                </span>
+            </div>
+        </header>
+        <section class="section">
+            <div class="col1">
+                <el-menu
+                    class="el-menu-vertical-demo"
+                    @open="handleOpen"
+                    @select="handleSelect"
+                    @close="handleClose"
+                    :collapse="menuCollapse"
+                    :unique-opened="true"
+                    :default-active="defaultActiveMenu"
+                    select="1-1"
+                    background-color="#545c64"
+                    text-color="#eee"
+                    active-text-color="#ffd04b"
+                >
+                    <div v-for="(item, index1) in menuData" :key="index1">
+                        <el-submenu
+                            v-if="item.childList && item.childList.length > 0"
+                            :index="`${index1}`"
+                        >
+                            <template slot="title">
+                                <i :class="item.iconClassName"></i>
+                                <span slot="title">{{
+                                    !menuCollapse ? item.optionName : ""
+                                }}</span>
+                            </template>
+                            <el-menu-item
+                                v-for="(item1, index2) in item.childList"
+                                :key="`${index1}-${index2}`"
+                                :index="`${index1}-${index2}`"
+                                :routerName="item1.routerName"
+                                @click="onClickMenu(item1)"
+                                >{{ item1.optionName }}</el-menu-item
+                            >
+                        </el-submenu>
+                        <el-menu-item
+                            v-else
+                            :index="`${index1}`"
+                            :disabled="item.disabled"
+                            :routerName="item.routerName"
+                            @click="onClickMenu(item)"
+                        >
+                            <i :class="item.iconClassName"></i>
+                            <span slot="title">{{
+                                !menuCollapse ? item.optionName : ""
+                            }}</span>
+                        </el-menu-item>
+                    </div>
+                </el-menu>
+            </div>
+
+            <div class="col2">
+                <div class="warp">
+                    <router-view />
+                </div>
+            </div>
+        </section>
+    </div>
+</template>
+
+<script>
+import { menuData } from "./mencCofig.js";
+
+export default {
+    data() {
+        return {
+            // 菜单配置
+            menuData,
+            menuCollapse: false, //是否水平折叠收起菜单
+            defaultActiveMenu: '0-0', //是否水平折叠收起菜单
+        };
+    },
+    created() {
+        this.defaultActiveMenu = localStorage.getItem("defaultActiveMenu")
+        this.menuCollapse = JSON.parse(localStorage.getItem("menuCollapse"));
+    },
+    mounted() {},
+    methods: {
+        // 收取菜单按钮
+        onMenuCollapse() {
+            this.menuCollapse = !this.menuCollapse;
+            localStorage.setItem("menuCollapse", this.menuCollapse);
+        },
+        // 菜单展开
+        handleOpen(key, keyPath) {},
+        // 菜单选中
+        handleSelect(index) {
+            localStorage.setItem("defaultActiveMenu", index);
+        },
+        // 菜单收取
+        handleClose(key, keyPath) {},
+        // 点击菜单项
+        onClickMenu(item) {
+            // 如果要跳转的路由和当前路由一致就 return
+            if (this.$router.history.current.name == item.routerName) return;
+            this.$router.push({
+                name: item.routerName,
+            });
+        },
+        onLogOut() {
+            this.$router.replace("login");
+        },
+    },
+};
+</script>
+
+<style lang="scss" scoped>
+.home {
+    height: 100%;
+    min-width: 800px;
+    overflow: hidden;
+    box-sizing: border-box;
+    background-color: #eee;
+    display: flex;
+    flex-direction: column;
+    > .header {
+        background-color: #4b545e;
+        height: 40px;
+        padding: 10px 20px;
+        margin-bottom: 5px;
+        display: flex;
+        justify-content: space-between;
+        align-items: center;
+        .left {
+            font-size: 25px;
+            color: #fff;
+            /deep/ .is-circle {
+                margin-left: 40px;
+            }
+        }
+        .right {
+            .warp {
+                margin-right: 20px;
+            }
+        }
+    }
+    .section {
+        flex-grow: 1;
+        box-sizing: border-box;
+        overflow: auto;
+        display: flex;
+        box-sizing: border-box;
+        .col1 {
+            margin-right: 5px;
+            background-color: #545c64;
+            border-radius: 15px;
+            overflow: auto;
+            /deep/ .el-menu-vertical-demo {
+                border: #545c64 1px solid;
+                -webkit-user-select: none;
+                -moz-user-select: none;
+                -ms-user-select: none;
+                user-select: none;
+            }
+        }
+        .col2 {
+            flex: 1;
+            background-color: #fff;
+            padding: 0 15px 0px 15px;
+            border-radius: 5px;
+            margin-right: 5px;
+            height: 100%;
+            overflow: auto;
+            .warp {
+                margin: 15px;
+            }
+        }
+    }
+    // border: 1px solid #f00;
+}
+
+.el-menu-vertical-demo:not(.el-menu--collapse) {
+    width: 200px;
+    min-height: 400px;
+}
+// 下拉菜单
+.el-dropdown-link {
+    cursor: pointer;
+    color: #fff;
+}
+.el-icon-arrow-down {
+    font-size: 12px;
+}
+</style>

+ 75 - 0
src/views/Home/mencCofig.js

@@ -0,0 +1,75 @@
+
+export const menuData = [
+    {
+        // basicInfo
+        optionName: "基本信息",
+        iconClassName: "el-icon-s-order",
+        disabled: false, // 是否禁用
+        childList: [
+            {
+                optionName: '牧民信息管理',
+                routerName: "herdsmanInfo"
+            },
+        ]
+    },
+]
+
+// export default {menuData}
+
+
+
+
+/* 菜单配置 描述 */
+const menuData描述 = [
+    // 有子菜单 并且字菜单分组的
+    {
+        optionName: "导航一", // 一级菜单名
+        iconClassName: "aaa", // element-ui图标名
+        childList: [ // 分组的
+            {
+                groupName: '组名一',
+                list: [
+                    {
+                        optionName: '选项1',
+                        routerName: "home"
+                    },
+                    {}
+                ],
+            },
+            {
+                groupName: '组名二',
+                list: [
+                    {
+                        optionName: '选项1',
+                        routerName: "home"
+                    },
+                    {}
+                ],
+            }
+        ],
+    },
+    // 有子菜单 字菜单不分组的
+    {
+        optionName: "导航二",
+        iconClassName: "el-icon-menu",
+        disabled: false, // 是否禁用
+        childList: [ // 不分组的
+            {
+                optionName: '选项1',
+                routerName: "home"
+            },
+            {}
+        ]
+    },
+    // 无子菜单的
+    {
+        optionName: "导航三",
+        iconClassName: "el-icon-document",
+        routerName: "home",
+        disabled: false
+    },
+
+    "导航四"
+]
+
+

+ 167 - 0
src/views/Login/Login.vue

@@ -0,0 +1,167 @@
+<template>
+    <div class="login">
+        <div class="shade">
+            <header class="header">
+                <img class="logo" src="../../assets/logo.png" alt="长兴湖羊LOGO" />
+                长兴湖羊
+            </header>
+            <article class="article">
+                <h1>登录界面</h1>
+                <el-form label-position="right" label-width="80px" :model="form">
+                    <el-form-item label="账号:">
+                        <el-input v-model="form.userName" placeholder="请输入账号"></el-input>
+                    </el-form-item>
+                    <el-form-item label="密码:">
+                        <el-input v-model="form.userPwd" placeholder="请输入密码" show-password></el-input>
+                    </el-form-item>
+                    <el-form-item>
+                        <el-button type="primary" @click="onSignIn">登录</el-button>
+                    </el-form-item>
+                </el-form>
+            </article>
+            <el-dialog title="请选择一个组织" :visible.sync="isShowDialog" append-to-body>
+                <el-select v-model="orgSelected">
+                    <el-option
+                        v-for="item in orgList"
+                        :key="item.id"
+                        :value="item.id"
+                        :label="item.orgName"
+                    ></el-option>
+                </el-select>
+                <div slot="footer">
+                    <el-button @click="isShowDialog=false">取 消</el-button>
+                    <el-button type="primary" @click="handleSet">设置</el-button>
+                </div>
+            </el-dialog>
+        </div>
+    </div>
+</template>
+<script>
+import { reqLogin, reqOrgChoose, reqOrganizationId } from "@/api/login";
+
+export default {
+    name: "login",
+    data() {
+        return {
+            form: {
+                userName: "huyang",
+                userPwd: "123456"
+            },
+            isShowDialog: false,
+            orgList: null,
+            orgSelected: null
+        };
+    },
+    created() {},
+    methods: {
+        /* 登录按钮 */
+        onSignIn() {
+            const loading = this.$loading({
+                lock: true,
+                text: "登录中...",
+                spinner: "el-icon-loading",
+                background: "rgba(0, 0, 0, 0.7)"
+            });
+            reqLogin(this.form)
+                .then(res => {
+                    loading.close();
+                    localStorage.setItem("token", res.token);
+                    this.doOrganizationChoose();
+                })
+                .catch(err => {
+                    console.log("登录失败", err);
+                    this.$message.error("登录失败:" + err);
+                });
+        },
+        handleSet: function() {
+            if (!this.orgSelected) {
+                this.$message.info("请先选择组织");
+            } else this.setOrganizationId(this.orgSelected);
+        },
+        doOrganizationChoose() {
+            this.loading = true;
+            reqOrgChoose()
+                .then(res => {
+                    if (res == null || res.length == 0) {
+                        this.$message.info("您没有加入任何组织!");
+                    } else if (res.length > 1) {
+                        this.isShowDialog = true;
+                        this.orgList = res;
+                    } else {
+                        this.setOrganizationId(res[0].id);
+                    }
+                })
+                .catch(err => {
+                    console.log(err);
+                    this.loading = false;
+                    this.$message.error("登录失败:" + err);
+                });
+        },
+        setOrganizationId(id) {
+            if (!id) {
+                this.$message.error("发生了一点不愉快的错误!");
+                return;
+            }
+            this.loading = true;
+            reqOrganizationId({ orgId: id })
+                .then(res => {
+                    this.isShowDialog = false;
+                    //导航到 正式页面
+                    this.$router.replace("/home/herdsmanInfo");
+                })
+                .catch(err => {
+                    if (err.errMsg) this.$message.error(err.errMsg);
+                    else this.$message.error("服务器发生异常");
+                })
+                .finally(res => {
+                    this.loading = false;
+                });
+        }
+    },
+    mounted() {}
+};
+</script>
+
+<style lang="scss" scoped>
+.login {
+    width: 100%;
+    height: 100%;
+    background: url(../../assets/login_bg.jpg) 0 0 no-repeat;
+    background-size: 100% 100%;
+    .shade {
+        height: 100%;
+        width: 100%;
+        background-color: #8899aa44;
+        display: flex;
+        flex-direction: column;
+        align-items: center;
+        .header {
+            font-size: 60px;
+            color: #eee;
+            margin: 180px 0 50px 0;
+            display: flex;
+            justify-content: center;
+            align-items: center;
+            .logo {
+                height: 70px;
+                width: 70px;
+                margin-right: 20px;
+            }
+        }
+        .article {
+            width: 400px;
+            background-color: #ffffff44;
+            padding: 20px 60px 40px 20px;
+            border-radius: 20px;
+            h1 {
+                font-size: 20px;
+                color: #eee;
+                margin-left: 25px;
+            }
+            /deep/ .el-form-item .el-form-item__label {
+                color: #eee;
+            }
+        }
+    }
+}
+</style>

+ 24 - 0
src/views/basicInfo/herdsmanInfo.vue

@@ -0,0 +1,24 @@
+<template>
+    <div class="firmInfo">
+        <h2
+            style="margin-bottom: 20px;padding-bottom:7px;border-bottom:2px solid #ddd"
+        >
+            牧民信息管理
+        </h2>
+    </div>
+</template>
+
+<script>
+export default {
+    name: "firmInfo",
+    data() {
+        return {};
+    },
+    created() {
+    },
+    methods: {}
+};
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 17 - 0
vue.config.js

@@ -0,0 +1,17 @@
+module.exports = {
+  publicPath: './', // 这个值被设置为空字符串 ('') 或是相对路径 ('./'),这样所有的资源都会被链接为相对路径,这样打出来的包可以被部署在任意路径。
+  devServer: {
+    disableHostCheck: true
+    // proxy: {
+    //   '^/': {                //这里最好有一个 /
+    //     target: 'http://115.238.57.190:8010',         // 服务器端接口地址
+    //     ws: true,            //如果要代理 websockets,配置这个参数
+    //     // 如果是https接口,需要配置这个参数
+    //     changeOrigin: true,  //是否跨域
+    //     pathRewrite: {
+    //       '^/api': ''
+    //     }
+    //   }
+    // }
+  }
+}