lrf402788946 5 năm trước cách đây
commit
f5e9efd024

+ 33 - 0
.eslintrc.js

@@ -0,0 +1,33 @@
+// https://eslint.org/docs/user-guide/configuring
+
+module.exports = {
+  root: true,
+  env: {
+    node: true,
+  },
+  extends: ['plugin:vue/essential', '@vue/prettier'],
+  plugins: ['vue'],
+  rules: {
+    'max-len': [
+      'warn',
+      {
+        code: 250,
+      },
+    ],
+    'no-unused-vars': 'off',
+    'no-console': 'off',
+    'prettier/prettier': [
+      'warn',
+      {
+        singleQuote: true,
+        trailingComma: 'es5',
+        bracketSpacing: true,
+        jsxBracketSameLine: true,
+        printWidth: 160,
+      },
+    ],
+  },
+  parserOptions: {
+    parser: 'babel-eslint',
+  },
+};

+ 21 - 0
.gitignore

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

+ 29 - 0
README.md

@@ -0,0 +1,29 @@
+# web-common
+
+## Project setup
+```
+npm install
+```
+
+### Compiles and hot-reloads for development
+```
+npm run serve
+```
+
+### Compiles and minifies for production
+```
+npm run build
+```
+
+### Run your tests
+```
+npm run test
+```
+
+### Lints and fixes files
+```
+npm run lint
+```
+
+### Customize configuration
+See [Configuration Reference](https://cli.vuejs.org/config/).

+ 3 - 0
babel.config.js

@@ -0,0 +1,3 @@
+module.exports = {
+  presets: ["@vue/app"]
+};

+ 56 - 0
package.json

@@ -0,0 +1,56 @@
+{
+  "name": "web-common",
+  "version": "0.1.0",
+  "private": true,
+  "scripts": {
+    "serve": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "axios": "^0.19.0",
+    "core-js": "^2.6.5",
+    "element-ui": "^2.11.1",
+    "lodash": "^4.17.15",
+    "naf-core": "^0.1.2",
+    "vue": "^2.6.10",
+    "vue-meta": "^2.2.0",
+    "vue-router": "^3.0.3",
+    "vuex": "^3.0.1"
+  },
+  "devDependencies": {
+    "@vue/cli-plugin-babel": "^3.9.0",
+    "@vue/cli-plugin-eslint": "^3.9.0",
+    "@vue/cli-service": "^3.9.0",
+    "@vue/eslint-config-prettier": "^4.0.1",
+    "babel-eslint": "^10.0.1",
+    "eslint": "^5.16.0",
+    "eslint-plugin-vue": "^5.0.0",
+    "less": "^3.0.4",
+    "less-loader": "^4.1.0",
+    "vue-template-compiler": "^2.6.10"
+  },
+  "eslintConfig": {
+    "root": true,
+    "env": {
+      "node": true
+    },
+    "extends": [
+      "plugin:vue/essential",
+      "@vue/prettier"
+    ],
+    "rules": {},
+    "parserOptions": {
+      "parser": "babel-eslint"
+    }
+  },
+  "postcss": {
+    "plugins": {
+      "autoprefixer": {}
+    }
+  },
+  "browserslist": [
+    "> 1%",
+    "last 2 versions"
+  ]
+}

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>web-common</title>
+  </head>
+  <body>
+    <noscript>
+      <strong>We're sorry but web-common 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>

+ 12 - 0
src/App.vue

@@ -0,0 +1,12 @@
+<template>
+  <div id="app">
+    <router-view />
+  </div>
+</template>
+
+<style lang="less">
+body {
+  margin: 0;
+  padding: 0;
+}
+</style>

BIN
src/assets/background.png


BIN
src/assets/erweima.png


BIN
src/assets/logo.png


BIN
src/assets/logos.png


BIN
src/assets/schoolLogo.png


BIN
src/assets/studentLogo.png


+ 114 - 0
src/components/HelloWorld.vue

@@ -0,0 +1,114 @@
+<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-eslint"
+          target="_blank"
+          rel="noopener"
+          >eslint</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="less">
+h3 {
+  margin: 40px 0 0;
+}
+ul {
+  list-style-type: none;
+  padding: 0;
+}
+li {
+  display: inline-block;
+  margin: 0 10px;
+}
+a {
+  color: #42b983;
+}
+</style>

+ 18 - 0
src/main.js

@@ -0,0 +1,18 @@
+import Vue from 'vue';
+import App from './App.vue';
+import router from './router';
+import store from './store';
+import '@/plugins/element.js';
+import '@/plugins/axios';
+import '@/plugins/check-res';
+import '@/plugins/meta';
+import '@/plugins/filters';
+import '@/plugins/loading';
+
+Vue.config.productionTip = false;
+
+new Vue({
+  router,
+  store,
+  render: h => h(App),
+}).$mount('#app');

+ 19 - 0
src/plugins/axios.js

@@ -0,0 +1,19 @@
+import Vue from 'vue';
+import AxiosWrapper from '@/util/axios-wrapper';
+
+const Plugin = {
+  install(vue, options) {
+    // 3. 注入组件
+    vue.mixin({
+      created() {
+        if (this.$store && !this.$store.$axios) {
+          this.$store.$axios = this.$axios;
+        }
+      },
+    });
+    // 4. 添加实例方法
+    vue.prototype.$axios = new AxiosWrapper(options);
+  },
+};
+
+Vue.use(Plugin, { baseUrl: process.env.VUE_APP_AXIOS_BASE_URL });

+ 39 - 0
src/plugins/check-res.js

@@ -0,0 +1,39 @@
+/* eslint-disable no-underscore-dangle */
+/* eslint-disable no-param-reassign */
+/* eslint-disable no-unused-vars */
+/* eslint-disable no-shadow */
+import Vue from 'vue';
+import _ from 'lodash';
+import { Message } from 'element-ui';
+
+const vm = new Vue({});
+const Plugin = {
+  install(Vue, options) {
+    // 4. 添加实例方法
+    Vue.prototype.$checkRes = (res, okText, errText) => {
+      let _okText = okText;
+      let _errText = errText;
+      if (!_.isFunction(okText) && _.isObject(okText) && okText != null) {
+        ({ okText: _okText, errText: _errText } = okText);
+      }
+      const { errcode = 0, errmsg } = res || {};
+      if (errcode === 0) {
+        if (_.isFunction(_okText)) {
+          return _okText();
+        }
+        if (_okText) {
+          Message.success(_okText);
+        }
+        return true;
+      }
+      if (_.isFunction(_errText)) {
+        return _errText();
+      }
+      Message.error(_errText || errmsg);
+      // Message({ message: _errText || errmsg, duration: 60000 });
+      return false;
+    };
+  },
+};
+
+Vue.use(Plugin);

+ 5 - 0
src/plugins/element.js

@@ -0,0 +1,5 @@
+import Vue from 'vue';
+import Element from 'element-ui';
+import 'element-ui/lib/theme-chalk/index.css';
+
+Vue.use(Element);

+ 6 - 0
src/plugins/filters.js

@@ -0,0 +1,6 @@
+import Vue from 'vue';
+import filters from '@/util/filters';
+
+for (const method in filters) {
+  Vue.filter(method, filters[method]);
+}

+ 27 - 0
src/plugins/loading.js

@@ -0,0 +1,27 @@
+/* eslint-disable no-console */
+/* eslint-disable no-param-reassign */
+
+import Vue from 'vue';
+
+const Plugin = {
+  // eslint-disable-next-line no-unused-vars
+  install(vue, options) {
+    // 3. 注入组件
+    vue.mixin({
+      created() {
+        // eslint-disable-next-line no-underscore-dangle
+        const isRoot = this.constructor === Vue;
+        // console.log(`rootId:${rootVue_uid}; thisId:${this._uid}`);
+        // if (rootVue_uid !== 3) {
+        //   console.log(this);
+        // }
+        if (isRoot) {
+          const el = document.getElementById('loading');
+          if (el) el.style.display = 'none';
+        }
+      },
+    });
+  },
+};
+
+Vue.use(Plugin, { baseUrl: process.env.VUE_APP_AXIOS_BASE_URL });

+ 4 - 0
src/plugins/meta.js

@@ -0,0 +1,4 @@
+import Vue from 'vue';
+import Meta from 'vue-meta';
+
+Vue.use(Meta);

+ 65 - 0
src/plugins/stomp.js

@@ -0,0 +1,65 @@
+/**
+ * 基于WebStomp的消息处理插件
+ */
+
+import Vue from 'vue';
+import _ from 'lodash';
+import assert from 'assert';
+import { Client } from '@stomp/stompjs/esm5/client';
+
+const Plugin = {
+  install(Vue, options) {
+    assert(_.isObject(options));
+    if (options.debug && !_.isFunction(options.debug)) {
+      options.debug = str => {
+        console.log(str);
+      };
+    }
+    assert(_.isString(options.brokerURL));
+    if (!options.brokerURL.startsWith('ws://')) {
+      options.brokerURL = `ws://${location.host}${options.brokerURL}`;
+    }
+
+    // 3. 注入组件
+    Vue.mixin({
+      beforeDestroy: function() {
+        if (this.$stompClient) {
+          this.$stompClient.deactivate();
+          delete this.$stompClient;
+        }
+      },
+    });
+
+    // 4. 添加实例方法
+    Vue.prototype.$stomp = function(subscribes = {}) {
+      // connect to mq
+      const client = new Client(options);
+      client.onConnect = frame => {
+        // Do something, all subscribes must be done is this callback
+        // This is needed because this will be executed after a (re)connect
+        console.log('[stomp] connected');
+        Object.keys(subscribes)
+          .filter(p => _.isFunction(subscribes[p]))
+          .forEach(key => {
+            client.subscribe(key, subscribes[key]);
+          });
+      };
+
+      client.onStompError = frame => {
+        // Will be invoked in case of error encountered at Broker
+        // Bad login/passcode typically will cause an error
+        // Complaint brokers will set `message` header with a brief message. Body may contain details.
+        // Compliant brokers will terminate the connection after any error
+        console.log('Broker reported error: ' + frame.headers['message']);
+        console.log('Additional details: ' + frame.body);
+      };
+
+      client.activate();
+
+      this.$stompClient = client;
+    };
+  },
+};
+export default () => {
+  Vue.use(Plugin, Vue.config.stomp);
+};

+ 31 - 0
src/router.js

@@ -0,0 +1,31 @@
+import Vue from 'vue';
+import Router from 'vue-router';
+
+Vue.use(Router);
+
+export default new Router({
+  mode: 'history',
+  base: process.env.BASE_URL,
+  routes: [
+    {
+      path: '/',
+      name: 'resume',
+      component: () => import('@/views/resume.vue'),
+    },
+    {
+      path: '/cor',
+      name: 'resumeCor',
+      component: () => import('@/views/resumeCor.vue'),
+    },
+    {
+      path: '/com',
+      name: 'compangyDetail',
+      component: () => import('@/views/compangyDetail.vue'),
+    },
+    {
+      path: '/job',
+      name: 'resumeJob',
+      component: () => import('@/views/resumeJob.vue'),
+    },
+  ],
+});

+ 10 - 0
src/store.js

@@ -0,0 +1,10 @@
+import Vue from 'vue';
+import Vuex from 'vuex';
+
+Vue.use(Vuex);
+
+export default new Vuex.Store({
+  state: {},
+  mutations: {},
+  actions: {},
+});

+ 114 - 0
src/util/axios-wrapper.js

@@ -0,0 +1,114 @@
+/* eslint-disable no-console */
+/* eslint-disable no-param-reassign */
+
+import _ from 'lodash';
+import Axios from 'axios';
+import { Util, Error } from 'naf-core';
+// import { Indicator } from 'mint-ui';
+import util from './user-util';
+
+const { trimData, isNullOrUndefined } = Util;
+const { ErrorCode } = Error;
+
+let currentRequests = 0;
+
+export default class AxiosWrapper {
+  constructor({ baseUrl = '', unwrap = true } = {}) {
+    this.baseUrl = baseUrl;
+    this.unwrap = unwrap;
+  }
+
+  // 替换uri中的参数变量
+  static merge(uri, query = {}) {
+    if (!uri.includes(':')) {
+      return uri;
+    }
+    const keys = [];
+    const regexp = /\/:([a-z0-9_]+)/gi;
+    let res;
+    // eslint-disable-next-line no-cond-assign
+    while ((res = regexp.exec(uri)) != null) {
+      keys.push(res[1]);
+    }
+    keys.forEach(key => {
+      if (!isNullOrUndefined(query[key])) {
+        uri = uri.replace(`:${key}`, query[key]);
+      }
+    });
+    return uri;
+  }
+
+  $get(uri, query, options) {
+    return this.$request(uri, null, query, options);
+  }
+
+  $post(uri, data = {}, query, options) {
+    return this.$request(uri, data, query, options);
+  }
+
+  async $request(uri, data, query, options) {
+    // TODO: 合并query和options
+    if (_.isObject(query) && _.isObject(options)) {
+      options = { ...options, params: query, method: 'get' };
+    } else if (_.isObject(query) && !query.params) {
+      options = { params: query };
+    } else if (_.isObject(query) && query.params) {
+      options = query;
+    }
+    if (!options) options = {};
+    if (options.params) options.params = trimData(options.params);
+    const url = AxiosWrapper.merge(uri, options.params);
+    currentRequests += 1;
+    // Indicator.open({
+    //   spinnerType: 'fading-circle',
+    // });
+
+    try {
+      const axios = Axios.create({
+        baseURL: this.baseUrl,
+      });
+      axios.defaults.headers.common.Authorization = util.token;
+      let res = await axios.request({
+        method: isNullOrUndefined(data) ? 'get' : 'post',
+        url,
+        data,
+        responseType: 'json',
+        ...options,
+      });
+      res = res.data;
+      const { errcode, errmsg, details } = res;
+      if (errcode) {
+        console.warn(`[${uri}] fail: ${errcode}-${errmsg} ${details}`);
+        return res;
+      }
+      // unwrap data
+      if (this.unwrap) {
+        res = _.omit(res, ['errcode', 'errmsg', 'details']);
+        const keys = Object.keys(res);
+        if (keys.length === 1 && keys.includes('data')) {
+          res = res.data;
+        }
+      }
+      return res;
+    } catch (err) {
+      let errmsg = '接口请求失败,请稍后重试';
+      if (err.response) {
+        const { status } = err.response;
+        if (status === 401) errmsg = '用户认证失败,请重新登录';
+        if (status === 403) errmsg = '当前用户不允许执行该操作';
+      }
+      console.error(
+        `[AxiosWrapper] 接口请求失败: ${err.config && err.config.url} - 
+        ${err.message}`
+      );
+      return { errcode: ErrorCode.SERVICE_FAULT, errmsg, details: err.message };
+    } finally {
+    /* eslint-disable */
+      currentRequests -= 1;
+      if (currentRequests <= 0) {
+        currentRequests = 0;
+        // Indicator.close();
+      }
+    }
+  }
+}

+ 10 - 0
src/util/filters.js

@@ -0,0 +1,10 @@
+import _ from 'lodash';
+
+const filters = {
+  getName(object) {
+    const { data, searchItem } = object;
+    return _.get(data, searchItem) === undefined ? '' : _.get(data, searchItem);
+  },
+};
+
+export default filters;

+ 50 - 0
src/util/methods-util.js

@@ -0,0 +1,50 @@
+import { Util } from 'naf-core';
+
+const { isNullOrUndefined } = Util;
+
+export default {
+  //判断信息是否过期
+  isDateOff(dataDate) {
+    const now = new Date(new Date().getTime() - 24 * 60 * 60 * 1000);
+    dataDate = new Date(dataDate);
+    return now.getTime() <= dataDate.getTime();
+  },
+  //判断企业是否可以执行此动作/显示
+  checkCorp(data) {
+    const { role, unit, selfUnit, status, displayType, userid } = data;
+    if (!isNullOrUndefined(selfUnit) && !isNullOrUndefined(status)) {
+      return role === 'corp' && selfUnit === unit && status === '0';
+    } else if (!isNullOrUndefined(displayType)) {
+      if (role === 'corp') {
+        return role === displayType;
+      } else {
+        return role === displayType && !isNullOrUndefined(userid);
+      }
+    }
+  },
+  //获取url的参数params
+  getParams() {
+    let str = location.href;
+    let num = str.indexOf('?');
+    const param = {};
+    str = str.substr(num + 1);
+    let num2 = str.indexOf('#');
+    let str2 = '';
+    if (num2 > 0) {
+      str2 = str.substr(0, num2);
+    } else {
+      num2 = str.indexOf('/');
+      str2 = str.substr(0, num2);
+    }
+    const arr = str2.split('&');
+    for (let i = 0; i < arr.length; i++) {
+      num = arr[i].indexOf('=');
+      if (num > 0) {
+        const name = arr[i].substring(0, num);
+        const value = arr[i].substr(num + 1);
+        param[name] = decodeURI(value);
+      }
+    }
+    return param;
+  },
+};

+ 47 - 0
src/util/optionTitles.js

@@ -0,0 +1,47 @@
+export const JOBFAIR_TITLE = [
+  { prop: 'subject', label: '' },
+  { prop: 'address', label: '举办地址' },
+  { prop: 'date', label: '举办日期' },
+  { prop: 'unit', label: '分站信息' },
+];
+
+export const CAMPUS_TITLE = [
+  { prop: 'subject', label: '' },
+  { prop: 'address', label: '举办地址' },
+  { prop: 'status', label: '审核状态' },
+  { prop: 'date', label: '举办日期' },
+  { prop: 'unit', label: '分站信息' },
+];
+
+export const JOBINFO_TITLE = [
+  { prop: 'title', label: '' },
+  { prop: 'count', label: '需求人数' },
+  { prop: 'nature.name', label: '工作性质' },
+  { prop: 'salary.name', label: '薪资待遇' },
+  { prop: 'xlreqs.name', label: '最低学历' },
+  { prop: 'city.name', label: '所在城市' },
+  // { prop: 'expired', label: '状态' },
+];
+
+export const RESUME_TITLE = [{ prop: 'title', label: '' }];
+
+export const LETTER_TITLE = [
+  { prop: 'title', label: '' },
+  { prop: 'corpname', label: '企业名称' },
+  { prop: 'type', label: '类型' },
+  { prop: 'status', label: '状态' },
+];
+
+export const TICKET_TITLE = [
+  { prop: 'subject', label: '' },
+  { prop: 'type', label: '门票类型' },
+  { prop: 'origin', label: '' },
+  { prop: 'date', label: '举办日期' },
+];
+
+export const CORP_JOBFAIR = [
+  { prop: 'subject', label: '' },
+  { prop: 'time', label: '举办时间' },
+  { prop: 'date', label: '举办日期' },
+  { prop: 'unit', label: '分站信息' },
+];

+ 96 - 0
src/util/qrcode.vue

@@ -0,0 +1,96 @@
+<template lang="html">
+  <div id="qrcodes" style="width:100%;">
+    <mt-header title="二维码">
+      <mt-button class="bgnone" slot="left" @click="$router.go(-1)">返回</mt-button>
+    </mt-header>
+    <span v-if="user.role === 'user'">
+      <li class="txtQr" style="padding-top:7vh;">学生姓名:{{ userInfo.xm || '' }}</li>
+      <li class="txtQr">门票类型:{{ ticketType }}</li>
+    </span>
+    <div id="qrcode" style="display:flex;justify-content:center;align-items:center;" :style="newHeight" ref="qrcode">
+      <canvas id="canvas" style="display:-webkit-inline-box;width: 4rem !important;height:4rem !important;margin-top: 200px;"></canvas>
+    </div>
+  </div>
+</template>
+
+<script>
+import { mapActions, mapState, mapMutations } from 'vuex';
+import QRCode from 'qrcode';
+export default {
+  name: 'qrcodes',
+  data() {
+    return {
+      id: this.$route.query.id || '',
+      ticketType: this.$route.query.type && this.$route.query.type === '0' ? '普通票' : '受限票' || '',
+      popupVisible: false,
+    };
+  },
+  computed: {
+    ...mapState({
+      user: state => state.publics.user,
+      userInfo: state => state.self.userInfo,
+    }),
+    newHeight: {
+      get() {
+        let height;
+        if (this.user.role === 'user') {
+          height = window.screen.availHeight * 0.3 + 'px';
+        } else {
+          height = window.screen.availHeight * 0.6 + 'px';
+        }
+        let style = { height: height };
+        return style;
+      },
+    },
+  },
+  created() {
+    this.$nextTick(() => {
+      this.initQrcode();
+    });
+  },
+  methods: {
+    async initQrcode() {
+      if (!this.booForQrcode) {
+        await QRCode.toCanvas(document.getElementById('canvas'), this.id, {
+          width: 300,
+          margin: 0,
+          color: { dark: this.$route.query.type === '0' ? '#00ff14' : '#FF9900' },
+        });
+      }
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.txtQr {
+  font-size: 14px;
+  text-align: center;
+  min-height: 30px;
+  margin-bottom: 1px;
+  white-space: nowrap;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.mint-header {
+  -webkit-box-align: center;
+  -ms-flex-align: center;
+  align-items: center;
+  background-color: #26a2ff;
+  -webkit-box-sizing: border-box;
+  box-sizing: border-box;
+  color: #fff;
+  display: -webkit-box;
+  display: -ms-flexbox;
+  display: flex;
+  height: 50px;
+  line-height: 50px;
+  color: #fff;
+  font-size: 16px;
+  background: #2577e3;
+  padding: 0;
+  position: relative;
+  text-align: center;
+  white-space: nowrap;
+}
+</style>

+ 69 - 0
src/util/user-util.js

@@ -0,0 +1,69 @@
+/* eslint-disable no-console */
+export default {
+  get user() {
+    const val = sessionStorage.getItem('user');
+    try {
+      if (val) return JSON.parse(val);
+    } catch (err) {
+      console.error(err);
+    }
+    return null;
+  },
+  set user(userinfo) {
+    sessionStorage.setItem('user', JSON.stringify(userinfo));
+  },
+  get token() {
+    return sessionStorage.getItem('token');
+  },
+  set token(token) {
+    sessionStorage.setItem('token', token);
+  },
+  get openid() {
+    return sessionStorage.getItem('openid');
+  },
+  set openid(openid) {
+    sessionStorage.setItem('openid', openid);
+  },
+  get isGuest() {
+    return !this.user || this.user.role === 'guest';
+  },
+  save({ userinfo, token }) {
+    sessionStorage.setItem('user', JSON.stringify(userinfo));
+    sessionStorage.setItem('token', token);
+  },
+
+  get corpInfo() {
+    const val = sessionStorage.getItem('corpInfo');
+    if (val) return JSON.parse(val);
+    return null;
+  },
+  set corpInfo(corpInfo) {
+    sessionStorage.setItem('corpInfo', JSON.stringify(corpInfo));
+  },
+  saveCorpInfo(corpInfo) {
+    sessionStorage.setItem('corpInfo', JSON.stringify(corpInfo));
+  },
+
+  get unit() {
+    const val = sessionStorage.getItem('unit');
+    if (val) return JSON.parse(val);
+    return null;
+  },
+  set unit(unitList) {
+    sessionStorage.setItem('unit', JSON.stringify(unitList));
+  },
+  saveUnit(unitList) {
+    sessionStorage.setItem('unit', JSON.stringify(unitList));
+  },
+  get userInfo() {
+    const val = sessionStorage.getItem('userInfo');
+    if (val) return JSON.parse(val);
+    return null;
+  },
+  set userInfo(userInfo) {
+    sessionStorage.setItem('userInfo', JSON.stringify(userInfo));
+  },
+  saveUserInfo(userInfo) {
+    sessionStorage.setItem('userInfo', JSON.stringify(userInfo));
+  },
+};

Những thai đổi đã bị hủy bỏ vì nó quá lớn
+ 440 - 0
src/views/compangyDetail.vue


+ 335 - 0
src/views/resume.vue

@@ -0,0 +1,335 @@
+<template>
+  <div id="resume">
+    <div class="w_0100 resume">
+      <div class="w_1200">
+        <el-row class="resumeTxt">
+          <el-col :span="24" class="resumeMain">
+            <!-- <el-col :span="24" class="resumeMainTop">
+              <el-col>
+                <img src="http://pic.bibibi.net/school/1460284850-8033.jpg@1e_80w_80h_1c_0i_1o_90Q_1x.png" width="60px" height="60" />
+              </el-col>
+              <p>长春大学</p>
+            </el-col> -->
+            <el-col :span="24" class="resumeMainHead">
+              <el-col :span="20" class="resumeMainHeadTxt">
+                <p class="bi-text">
+                  <span class="bi-inline user-name">{{ info.info.xm }}</span>
+                  <span class="bi-inline">{{ info.info.xb }}</span>
+                  <span class="bi-inline">
+                    {{ info.profile }}
+                  </span>
+                  <span class="label label-success">已认证毕业生</span>
+                </p>
+                <p class="bi-text">
+                  <span class="bi-inline">籍贯:{{ info.info.syszd }}</span>
+                  <span class="bi-inline">专业:{{ info.info.zy }}</span>
+                  <span class="bi-inline">学校:{{ info.info.yx }}</span>
+                </p>
+                <p class="bi-text">
+                  <span class="bi-inline"></span>
+                  <span class="bi-inline"></span>
+                </p>
+              </el-col>
+              <el-col :span="4" class="resumeMainHeadImg">
+                <img :src="info.avatar_url" style="max-height: 120px" width="100" height="100" />
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="resumeMainMod">
+              <el-col :span="3" class="resumeMainModSide">
+                <h4 class="sideTit">求职意向</h4>
+              </el-col>
+              <el-col :span="21" class="sideMain">
+                <ul>
+                  <li><span style="font-weight: bold;">期望职业:</span>{{ info.expect.job }}</li>
+                  <li><span style="font-weight: bold;">期望薪资:</span>{{ info.expect.salary }}</li>
+                  <li>
+                    <span style="font-weight: bold;">期望城市:</span>
+                    {{ info.expect.city }}
+                  </li>
+                </ul>
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="resumeMainMod">
+              <el-col :span="3" class="resumeMainModSide">
+                <h4 class="sideTit">教育经历</h4>
+              </el-col>
+              <el-col :span="21" class="sideMain">
+                <p class="sideMain-p" v-for="(item, index) in info.educations" :key="index">
+                  <span class="sideMain-inline"> {{ item.rxsj }}&nbsp;-&nbsp;{{ item.bysj }} </span>
+                  <span class="sideMain-inline">{{ item.yx }}-</span>
+                  <span class="sideMain-inline">{{ item.fy }}-</span>
+                  <span class="sideMain-inline">{{ item.zy }}-</span>
+                  <span class="sideMain-inline">{{ item.xl }}</span>
+                </p>
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="resumeMainMod">
+              <el-col :span="3" class="resumeMainModSide">
+                <h4 class="sideTit">专业技能</h4>
+              </el-col>
+              <el-col :span="21" class="sideMain">
+                <div class="sideMain-list">
+                  <span class="sideMain-item" v-for="(item, index) in skillPro(info.skill)" :key="index">{{ item }}</span>
+                </div>
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="resumeMainMod">
+              <el-col :span="3" class="resumeMainModSide">
+                <h4 class="sideTit">工作经历/项目经历</h4>
+              </el-col>
+              <el-col :span="21" class="sideMain">
+                <ul v-for="(item, index) in info.works" :key="index">
+                  <li class="sideMainLi">
+                    <p class="sideMain-p">{{ item.begin }} - {{ item.end }}</p>
+                    <p class="sideMain-p">
+                      <span class="sideMain-inline">
+                        {{ item.corpname }}
+                      </span>
+                      <span class="sideMain-inline">{{ item.position }}</span>
+                    </p>
+                  </li>
+                </ul>
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="resumeMainMod">
+              <el-col :span="3" class="resumeMainModSide">
+                <h4 class="sideTit">证书或荣誉</h4>
+              </el-col>
+              <el-col :span="21" class="sideMain">
+                <div class="sideMain-list">
+                  <span class="sideMain-item" v-for="item in info.honors" :key="item.name">{{ item.name }}</span>
+                  <span class="sideMain-item" v-for="item in info.abilities" :key="item.name">{{ item.name }}</span>
+                </div>
+              </el-col>
+            </el-col>
+            <el-col :span="24" class="resumeMainMod">
+              <el-col :span="3" class="resumeMainModSide">
+                <h4 class="sideTit">自我介绍</h4>
+              </el-col>
+              <el-col :span="21" class="sideMain">
+                <p class="sideMain-p">
+                  {{ info.content }}
+                </p>
+              </el-col>
+            </el-col>
+          </el-col>
+          <!-- <el-col :span="4" class="resumeBtn">
+            <el-col>
+              <img width="120" height="120" src="http://static.bibibi.net/frontend/public/images/other/s-yxqqnn0100000011.png" />
+            </el-col>
+            <el-button type="success">
+              <a href="" style="color: #fff;">
+                邀约
+                <br />
+                <br />
+                今日剩余10次
+                <br />
+                请谨慎选择
+              </a>
+            </el-button>
+            <el-button type="success">
+              <a href="" style="color: #fff;">成长档案</a>
+            </el-button>
+          </el-col> -->
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'resume',
+  props: {
+    info: { type: Object, default: () => {} },
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  // mounted() {
+  //   console.log('in function:');
+  // },
+  // watch:{
+  //   info:{
+  //     handler(val){
+  //       console.log('in function:watch');
+  //     }
+  //   }
+  // },
+  computed: {},
+  methods: {
+    skillPro(data) {
+      let arr = data.split(',');
+      return arr;
+    },
+  },
+};
+</script>
+
+<style lang="less" scoped>
+.w_0100 {
+  float: left;
+  width: 100%;
+}
+.w_1200 {
+  margin: 0 auto;
+  width: 1200px;
+}
+p {
+  margin: 0;
+  padding: 0;
+}
+img {
+  max-height: 100%;
+  max-width: 100%;
+}
+ul {
+  margin: 0;
+  padding: 0;
+}
+li {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+a {
+  text-decoration: none;
+}
+.resume {
+  float: left;
+  width: 100%;
+  height: 68rem;
+  background: #e7e8eb;
+}
+.resumeTxt {
+  width: 800px;
+  margin: 0 auto;
+  background: #fff;
+  position: relative;
+}
+.resumeMain {
+  position: absolute;
+  width: 800px;
+  padding: 0 30px;
+  margin: 36px 0 0 0;
+  background-color: #fff;
+  border: 1px solid #d9dadc;
+}
+.resumeBtn {
+  position: fixed;
+  top: 38px;
+  left: 50%;
+  margin: 0 0 0 420px;
+  width: 120px;
+  height: 170px;
+}
+.resumeMainTop {
+  overflow: hidden;
+  border-bottom: 1px solid #eee;
+  padding-bottom: 10px;
+}
+
+.resumeMainTop .el-col {
+  width: 60px;
+  height: 80px;
+  padding: 10px 0;
+}
+.resumeMainTop p {
+  float: left;
+  font-size: 18px;
+  height: 80px;
+  line-height: 80px;
+  margin-left: 20px;
+  color: #333;
+}
+.resumeMainHead {
+  padding: 35px 0 15px;
+}
+
+.resumeMainHeadTxt {
+  font-size: 14px;
+}
+.resumeMainHeadTxt .bi-text {
+  padding: 5px 0;
+}
+.resumeMainHeadTxt .bi-text .bi-inline {
+  margin-right: 10px;
+}
+.resumeMainHeadTxt .bi-text .user-name {
+  font-size: 24px;
+}
+.resumeMainHeadTxt .bi-text .label {
+  display: inline;
+  padding: 0.2em 0.6em 0.3em;
+  font-size: 75%;
+  font-weight: 700;
+  line-height: 1;
+  color: #fff;
+  text-align: center;
+  white-space: nowrap;
+  vertical-align: baseline;
+  border-radius: 0.25em;
+}
+.resumeMainHeadTxt .bi-text .label-success {
+  background-color: #5cb85c;
+}
+.resumeMainHeadImg {
+  float: right;
+  height: 100px;
+  width: 100px;
+  display: table;
+}
+
+.resumeMainMod {
+  font-size: 14px;
+  overflow: hidden;
+}
+.resumeMainModSide {
+  float: left;
+}
+.sideTit {
+  font-size: 18px;
+  margin: 0;
+  color: #333;
+  font-weight: 500;
+}
+.sideMain {
+  border-top: 12px solid #eee;
+  margin: 5px 0 0 0px;
+  padding: 10px 0 30px;
+}
+.sideMain ul {
+  overflow: hidden;
+}
+.sideMain ul li {
+  float: left;
+  width: 100%;
+  margin-right: 2%;
+  /*height: 30px;*/
+  line-height: 30px;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+  overflow: hidden;
+}
+.sideMain .sideMainLi {
+  border-bottom: 1px dashed #eee;
+  padding: 10px 0;
+}
+.sideMain-list {
+  margin-top: 10px;
+}
+.sideMain-list .sideMain-item {
+  margin: 0 10px 5px 0;
+  color: white;
+  background-color: #a7a5a5;
+  padding: 2px 5px;
+  border-radius: 5px;
+}
+.resumeBtn .el-button {
+  width: 120px;
+  padding: 10px 16px;
+  margin: 9px 0 0;
+  font-size: 15px;
+  margin-top: 5px;
+}
+</style>

+ 595 - 0
src/views/resumeCor.vue

@@ -0,0 +1,595 @@
+<template lang="html">
+  <div id="resume">
+    <!-- <div class="w_0100 resumeCor">
+      <div class="w_1200"><h2></h2></div>
+    </div> -->
+    <div class="w_0100 resumeCorMain">
+      <div class="w_1200">
+        <el-row class="resumeCont">
+          <el-col :span="24" class="resumeContMain">
+            <el-row class="mainTop">
+              <el-col :span="12" class="mainTopInter">
+                <el-col class="mainTopInterImg">
+                  <img src="../assets/studentLogo.png" width="200" height="200" />
+                </el-col>
+                <el-col class="mainTopInterName">
+                  <h1>{{ info.info.xm }}</h1>
+                  <h3>求职意向:{{ info.expect.job }}</h3>
+                </el-col>
+              </el-col>
+              <el-col :span="12" class="mainTopInfo">
+                <el-col class="mainTopInfoTop">基本信息</el-col>
+                <el-col class="mainTopInfoName">
+                  <p>
+                    <i class="el-icon-user-solid"></i>
+                    <span>性别:{{ info.info.xb }}</span>
+                  </p>
+                  <p>
+                    <i class="el-icon-location-outline"></i>
+                    <span>期望城市:{{ info.expect.city }}</span>
+                  </p>
+                  <p>
+                    <i class="el-icon-phone"></i>
+                    <span>电话:{{ info.contact.mobile }}</span>
+                  </p>
+                  <p>
+                    <i class="el-icon-message"></i>
+                    <span>邮箱:{{ info.contact.email }}</span>
+                  </p>
+                </el-col>
+              </el-col>
+            </el-row>
+            <el-row class="mainTopMain">
+              <el-col style="width: 518px;">
+                <el-col class="mainTopMainInfo">
+                  <el-col class="mainTopInfoTop">工作经历</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList" v-for="(item, index) in info.works" :key="index">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key">{{ item.begin }}</span>
+                        <em>-</em>
+                        <span class="resume_key">{{ item.begin }}</span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemHead">
+                          <span class="resume_key">{{ item.corpname }}</span>
+                          <span class="resume_key">{{ item.position }}</span>
+                        </el-col>
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key"></el-col>
+                        </el-col>
+                      </el-col>
+                      <el-col class="line-box">
+                        <el-col class="line-head"></el-col>
+                        <el-col class="line"></el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+                <el-col class="mainTopMainInfo">
+                  <el-col class="mainTopInfoTop">实习经历</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList" v-for="(item, index) in info.educations" :key="index">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key">{{ item.rxsj }}</span>
+                        <em>-</em>
+                        <span class="resume_key">{{ item.bysj }}</span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemHead">
+                          <span class="resume_key">{{ item.xl }}</span>
+                          <span class="resume_key">{{ item.yx }}</span>
+                          <span class="resume_key">{{ item.zy }}</span>
+                        </el-col>
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key"></el-col>
+                        </el-col>
+                      </el-col>
+                      <el-col class="line-box">
+                        <el-col class="line-head"></el-col>
+                        <el-col class="line"></el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+                <el-col class="mainTopMainInfo">
+                  <el-col class="mainTopInfoTop">项目经历</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key">2019/02</span>
+                        <em>-</em>
+                        <span class="resume_key">2019/04</span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemHead">
+                          <span class="resume_key">无</span>
+                          <span class="resume_key">无</span>
+                        </el-col>
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key"></el-col>
+                        </el-col>
+                      </el-col>
+                      <el-col class="line-box">
+                        <el-col class="line-head"></el-col>
+                        <el-col class="line"></el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+                <el-col class="mainTopMainInfo">
+                  <el-col class="mainTopInfoTop">培训经历</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key">2019/02</span>
+                        <em>-</em>
+                        <span class="resume_key">2019/04</span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemHead">
+                          <span class="resume_key">无</span>
+                          <span class="resume_key">无</span>
+                        </el-col>
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key"></el-col>
+                        </el-col>
+                      </el-col>
+                      <el-col class="line-box">
+                        <el-col class="line-head"></el-col>
+                        <el-col class="line"></el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+              </el-col>
+              <el-col style="width: 388px;float: right;">
+                <el-col class="mainTopMainInfo Educational">
+                  <el-col class="mainTopInfoTop">教育经历</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key"></span>
+                        <em>-</em>
+                        <span class="resume_key">2019/04</span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemHead">
+                          <span class="resume_key">海南热带海洋学院</span>
+                          <span class="resume_key">海洋渔业科学与技术</span>
+                          <span class="resume_key">本科毕业</span>
+                        </el-col>
+                      </el-col>
+                      <el-col class="ItemDetails">
+                        <el-col class="resume_key">
+                          <ul>
+                            <li style="list-style-type: disc;"></li>
+                          </ul>
+                        </el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+                <el-col class="mainTopMainInfo Certificate">
+                  <el-col class="mainTopInfoTop">获得证书</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key"></span>
+                        <em>-</em>
+                        <span class="resume_key"></span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemHead">
+                          <span class="resume_key">2018/06/28</span>
+                          <span class="resume_key">大学英语四级</span>
+                        </el-col>
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key"></el-col>
+                        </el-col>
+                      </el-col>
+                      <el-col class="line-box">
+                        <el-col class="line-head"></el-col>
+                        <el-col class="line"></el-col>
+                      </el-col>
+                    </el-col>
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key"></span>
+                        <em>-</em>
+                        <span class="resume_key"></span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemHead">
+                          <span class="resume_key">2018/03/28</span>
+                          <span class="resume_key">计算机二级</span>
+                        </el-col>
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key"></el-col>
+                        </el-col>
+                      </el-col>
+                      <el-col class="line-box">
+                        <el-col class="line-head"></el-col>
+                        <el-col class="line"></el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+                <el-col class="mainTopMainInfo Skills">
+                  <el-col class="mainTopInfoTop">个人技能</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key"></span>
+                        <em>-</em>
+                        <span class="resume_key"></span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key">
+                            <p>
+                              <i class="el-icon-football" style="color: #00c091;margin-right: 5px;"></i>
+                              <span>办公基本操作</span>
+                            </p>
+                            <el-col class="progress">
+                              <span></span>
+                            </el-col>
+                          </el-col>
+                        </el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+                <el-col class="mainTopMainInfo Selfappraise">
+                  <el-col class="mainTopInfoTop">自我评价</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key"></span>
+                        <em>-</em>
+                        <span class="resume_key"></span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key">
+                            <p>
+                              本人适应能力较强,性格沉稳,观察力强,有上进心,为人随和,易于沟通,能够比较轻松的融入工作群体,服从公司纪律,愿意尝试各类型工作,发挥所长,同时有信心迎接各种工作的挑战。
+                            </p>
+                          </el-col>
+                        </el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+                <el-col class="mainTopMainInfo Signs">
+                  <el-col class="mainTopInfoTop">能力标签</el-col>
+                  <el-col class="ItemControl">
+                    <el-col class="ItemList">
+                      <el-col class="ItemLeft">
+                        <span class="resume_key"></span>
+                        <em>-</em>
+                        <span class="resume_key"></span>
+                      </el-col>
+                      <el-col class="ItemRight">
+                        <el-col class="ItemDetails">
+                          <el-col class="resume_key">
+                            <p>
+                              Excel | PPT | Word | 办公软件 | 抗压能力 | 团队合作 | 沟通协调能力 | 执行力 | 团队精神 | 个人能力
+                            </p>
+                          </el-col>
+                        </el-col>
+                      </el-col>
+                    </el-col>
+                  </el-col>
+                </el-col>
+              </el-col>
+            </el-row>
+          </el-col>
+          <el-col :span="3" class="resumeContBtn">
+            <el-button type="success"><a href="" style="color: #fff;">纳入考虑</a></el-button>
+            <el-button type="success"><a href="" style="color: #fff;">下载简历</a></el-button>
+            <el-button type="success"><a href="" style="color: #fff;">打印简历</a></el-button>
+          </el-col>
+        </el-row>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'resume',
+  props: {
+    info: { type: Object, default: () => {} },
+  },
+  components: {},
+  data: () => ({}),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+.w_0100 {
+  float: left;
+  width: 100%;
+}
+.w_1200 {
+  margin: 0 auto;
+  width: 1200px;
+}
+p {
+  margin: 0;
+  padding: 0;
+}
+img {
+  max-height: 100%;
+  max-width: 100%;
+}
+ul {
+  margin: 0;
+  padding: 0;
+}
+li {
+  list-style: none;
+  margin: 0;
+  padding: 0;
+}
+h1,
+h2,
+h3,
+h4,
+h5,
+h6 {
+  margin: 0;
+  padding: 0;
+}
+a {
+  text-decoration: none;
+}
+.resumeCor {
+  position: fixed;
+  top: 0;
+  z-index: 50;
+  height: 59px;
+  background-color: #fff;
+  -webkit-box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25);
+  box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25);
+}
+.resumeCor h2 {
+  position: absolute;
+  top: 15px;
+  left: 50%;
+  width: 800px;
+  height: 30px;
+  line-height: 30px;
+  margin-left: -400px;
+  text-align: center;
+  font-size: 14px;
+  color: #51d3d9;
+}
+.resumeCorMain {
+  position: relative;
+  // margin: 60px 0 0 0px;
+  width: 100%;
+  height: 65rem;
+  background: url(../assets/background.png) center center repeat;
+}
+.resumeCont {
+  float: left;
+  width: 100%;
+  margin-top: 30px;
+  padding: 0 127px;
+}
+.resumeContMain {
+  position: absolute;
+  width: 946px;
+  padding: 15px 19px;
+  background-color: #fff;
+  border: 1px solid #d9dadc;
+}
+.resumeContBtn {
+  position: fixed;
+  right: 1.6rem;
+}
+.resumeContBtn .el-button {
+  width: 150px;
+  height: 31px;
+  padding: 6px 12px;
+  margin: 10px 0 0 0;
+}
+.mainTop {
+  width: 100%;
+  height: 200px;
+  margin: 15px 0;
+}
+.mainTopInter {
+  height: 200px;
+}
+.mainTopInterImg {
+  width: 200px;
+  height: 200px;
+  border-radius: 90px;
+}
+.mainTopInterName {
+  width: 50%;
+  height: 200px;
+  padding: 40px 0 0 20px;
+}
+.mainTopInterName h1 {
+  font-size: 37px;
+  font-weight: bold;
+  margin-bottom: 22px;
+}
+.mainTopInterName h3 {
+  font-size: 18px;
+  font-weight: bold;
+  padding: 3px;
+}
+.mainTopInfo {
+  height: 200px;
+  padding: 40px 0 0 0;
+}
+.mainTopInfoTop {
+  height: 31px;
+  padding-left: 16px;
+  line-height: 31px;
+  font-size: 22px;
+  font-weight: bold;
+  color: #040404;
+  border-left: 6px solid #00c091;
+}
+.mainTopInfoName {
+  position: relative;
+  font-size: 16px;
+  color: #767676;
+  padding-left: 50px;
+  line-height: 20px;
+  background-color: #fff;
+}
+.mainTopInfoName p {
+  position: relative;
+  padding: 5px 0;
+  background-color: #fff;
+}
+.mainTopInfoName p i {
+  position: absolute;
+  width: 20px;
+  height: 20px;
+  text-align: center;
+  line-height: 20px;
+  top: 5px;
+  left: -28px;
+  color: #fff;
+  border-radius: 90px;
+  background-color: #00c091;
+  background-position: center center;
+  background-repeat: no-repeat;
+  font-size: 15px;
+  cursor: pointer;
+}
+.mainTopInfoName p span {
+  display: inline-block;
+  min-width: 150px;
+  padding: 0 5px;
+  border: 1px solid transparent;
+}
+.mainTopMain {
+  width: 100%;
+}
+.mainTopMainInfo {
+  width: 100%;
+  margin-bottom: 12px;
+}
+.ItemControl {
+  position: relative;
+}
+.ItemList {
+  position: relative;
+  padding: 5px 10px 5px 50px;
+  border: 1px dotted transparent;
+  outline: 0;
+}
+.resume_key {
+  height: 20px;
+  padding-top: 0;
+  padding-bottom: 0;
+  display: inline-block;
+  padding: 3px;
+  font-size: 16px;
+  color: #515151;
+  padding: 3px 2px;
+  border: 1px solid transparent;
+}
+.ItemHead {
+  margin-bottom: 1px;
+  font-size: 16px;
+  padding-left: 0;
+}
+.ItemDetails {
+  line-height: 21px;
+  border: 1px solid transparent;
+}
+.ItemList .line-box {
+  position: absolute;
+  left: 20px;
+  top: 0;
+  width: 22px;
+  height: 102%;
+}
+.line-box .line-head {
+  position: absolute;
+  left: 0;
+  top: 10px;
+  width: 20px;
+  height: 20px;
+  border-radius: 50%;
+  background-color: #00c091;
+}
+.line-box .line {
+  position: absolute;
+  left: 10px;
+  top: 10px;
+  width: 1px;
+  height: 99%;
+  background-color: #00c091;
+  z-index: 10;
+}
+.ItemHead > span {
+  display: inline-block;
+  font-size: 16px;
+  font-weight: bold;
+  color: #515151;
+  border: 1px solid transparent;
+}
+.Educational .ItemList {
+  padding: 5px 5px 8px 25px;
+}
+.Certificate .ItemLeft {
+  display: none;
+}
+.Skills {
+  margin-bottom: 30px;
+}
+.Skills .ItemLeft {
+  display: none;
+}
+.Skills .ItemList {
+  padding: 5px 5px 8px 25px;
+}
+.Skills .progress {
+  width: 70%;
+  height: 8px;
+  margin: 10px 0 12px 20px;
+  overflow: hidden;
+  cursor: pointer;
+  border: 1px solid #040404;
+  border-color: #00c091;
+}
+.Skills .progress span {
+  display: block;
+  height: 100%;
+  width: 50%;
+  background-color: #00c091;
+  cursor: w-resize;
+}
+.Selfappraise {
+  margin-bottom: 90px;
+}
+.Selfappraise .ItemLeft {
+  display: none;
+}
+.Selfappraise .ItemList {
+  padding: 5px 5px 8px 25px;
+}
+.Signs {
+  margin-bottom: 80px;
+}
+.Signs .ItemLeft {
+  display: none;
+}
+.Signs .ItemList {
+  padding: 5px 5px 8px 25px;
+}
+</style>

+ 154 - 0
src/views/resumeJob.vue

@@ -0,0 +1,154 @@
+<template>
+  <div id="resumeJob">
+    <el-row>
+      <el-col :span="24" class="jobTop">
+        <el-col :span="5">
+          <el-avatar :size="60" :src="circleUrl"></el-avatar>
+        </el-col>
+        <el-col :span="19" class="topRight">
+          <el-col :span="24"><span style="font-size: 16px;">于奇&nbsp;&nbsp;(男)</span></el-col>
+          <el-col :span="24"><span style="color: #7CFC00;">没有</span></el-col>
+          <el-col :span="24">
+            <el-col :span="6"><span>长春大学</span></el-col>
+            <el-col :span="18"><el-tag class="isStu" style="color: #00bfff;">未认证为本校生</el-tag></el-col>
+          </el-col>
+          <el-col :span="24"><span>政治面貌:&nbsp;共青团员</span></el-col>
+        </el-col>
+      </el-col>
+      <el-col style="border-bottom: 1px solid #ccc;">
+        <el-col :span="24" class="jobBottom">
+          <el-col :span="24" class="itemDetail">
+            <el-col :span="24" class="jobItem"><span>求职意向</span></el-col>
+            <el-col :span="24" class="itemList">
+              <el-col :span="2" class="itemPoint"><span></span></el-col>
+              <el-col :span="22" class="itemTit">期望职业:程序员</el-col>
+            </el-col>
+            <el-col :span="24" class="itemList">
+              <el-col :span="2" class="itemPoint"><span></span></el-col>
+              <el-col :span="22" class="itemTit">期望薪资:6K</el-col>
+            </el-col>
+            <el-col :span="24" class="itemList">
+              <el-col :span="2" class="itemPoint"><span></span></el-col>
+              <el-col :span="22" class="itemTit">期望城市:长春</el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="itemDetail">
+            <el-col :span="24" class="jobItem"><span>专业技能</span></el-col>
+            <el-col :span="24" style="padding: 10px;">
+              <el-tag effect="plain" class="jobSkill" style="color: #606266;">思维敏捷</el-tag>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="itemDetail">
+            <el-col :span="24" class="jobItem"><span>教育经历</span></el-col>
+            <el-col :span="24" class="itemList">
+              <el-col :span="2" class="itemPoint"><span></span></el-col>
+              <el-col :span="22" class="itemTit">2015年7月至2019年7月&nbsp;&nbsp;长春大学&nbsp;&nbsp;本科</el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="itemDetail">
+            <el-col :span="24" class="jobItem"><span>工作\项目经历</span></el-col>
+            <el-col :span="24" class="itemList">
+              <el-col :span="2" class="itemPoint"><span></span></el-col>
+              <el-col :span="22" class="itemTit">2018年12月至2019年7月&nbsp;&nbsp;长春市福瑞科技有限公司&nbsp;&nbsp;测试</el-col>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="itemDetail">
+            <el-col :span="24" class="jobItem" style="margin-top: 20px;"><span>证书或荣誉</span></el-col>
+            <el-col :span="24" style="padding: 10px;">
+              <el-tag effect="plain" class="jobSkill" style="color: #606266;">三等奖学金</el-tag>
+            </el-col>
+          </el-col>
+          <el-col :span="24" class="itemDetail">
+            <el-col :span="24" class="jobItem"><span>自我介绍</span></el-col>
+            <el-col :span="24" class="itemList" style="padding-left: 10px;"><span class="itemTit">你好</span></el-col>
+          </el-col>
+          <el-col :span="24" class="itemDetail">
+            <el-col :span="24" class="jobItem"><span>能力介绍</span></el-col>
+            <el-col :span="24" class="itemList" style="padding-left: 10px;"><span class="itemTit">无</span></el-col>
+          </el-col>
+        </el-col>
+      </el-col>
+      <el-col :span="24" style="text-align: center; padding: 10px;">
+        <el-col :span="12"><el-button class="noBtn">暂不考虑</el-button></el-col>
+        <el-col :span="12"><el-button class="yesBtn">合格</el-button></el-col>
+      </el-col>
+    </el-row>
+  </div>
+</template>
+
+<script>
+export default {
+  name: 'resumeJob',
+  props: {},
+  components: {},
+  data: () => ({
+    circleUrl: 'https://cube.elemecdn.com/3/7c/3ea6beec64369c2642b92c6726f1epng.png',
+  }),
+  created() {},
+  computed: {},
+  methods: {},
+};
+</script>
+
+<style lang="less" scoped>
+.jobTop {
+  background-color: rgb(0, 191, 255);
+  border-bottom-right-radius: 10%;
+  border-bottom-left-radius: 10%;
+  padding: 15px;
+}
+.jobBottom {
+  padding: 15px 0 0 15px;
+}
+.topRight span {
+  color: #fff;
+  font-size: 14px;
+}
+.isStu {
+  background-color: #fff;
+  height: 20px;
+  line-height: 20px;
+  padding: 0 5px;
+}
+.itemDetail {
+  margin-bottom: 20px;
+}
+.jobItem {
+  margin-bottom: 5px;
+}
+.itemPoint {
+  text-align: center;
+}
+.itemList {
+  height: 25px;
+  line-height: 25px;
+}
+.itemTit {
+  font-size: 14px;
+  color: #606266;
+}
+.itemPoint span {
+  width: 5px;
+  height: 5px;
+  background-color: rgb(0, 191, 255);
+  border-radius: 90px;
+  display: inline-block;
+  margin: 2px 0;
+}
+.jobSkill {
+  border: 1px solid #ebeef5;
+  border-radius: 30px;
+  height: 23px;
+  line-height: 23px;
+}
+.noBtn {
+  width: 95%;
+  background-color: #ff1493;
+  color: white;
+}
+.yesBtn {
+  width: 95%;
+  background-color: #3cb371;
+  color: white;
+}
+</style>

+ 28 - 0
vue.config.js

@@ -0,0 +1,28 @@
+const path = require('path');
+
+module.exports = {
+  publicPath: '/',
+  configureWebpack: config => {
+    Object.assign(config, {
+      // 开发生产共同配置
+      resolve: {
+        alias: {
+          '@': path.resolve(__dirname, './src'),
+          '@c': path.resolve(__dirname, './src/components'),
+          '@a': path.resolve(__dirname, './src/assets'),
+        },
+      },
+    });
+  },
+  devServer: {
+    port: '8001',
+    //api地址前缀
+    proxy: {
+      '/weixin': {
+        target: 'http://smart.jilinjobswx.cn',
+        changeOrigin: true,
+        ws: true,
+      },
+    },
+  },
+};