From 8189bce7b736e74ee13f70c53e705ac67e6d60c0 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Mon, 11 Jul 2022 09:29:12 +0800 Subject: [PATCH 01/47] =?UTF-8?q?=E5=B2=97=E4=BD=8D=E9=A1=B5=E9=9D=A2?= =?UTF-8?q?=E5=88=9D=E6=AD=A5=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- package.json | 5 +- src/api/hello.js | 11 + src/assets/css/jsmind.css | 160 +++++ src/assets/js/jsmind.menu.js | 439 ++++++++++++++ src/components/EditDiv/index.vue | 61 ++ src/components/EditList/index.vue | 44 ++ src/components/EditText/EditText.vue | 71 +++ src/components/EditText/index.js | 9 + src/icons/svg/plane.svg | 2 + src/icons/svg/事件.svg | 2 + src/icons/svg/人员.svg | 2 + src/icons/svg/岗位.svg | 2 + src/main.js | 14 +- src/router/index.js | 62 +- src/utils/request.js | 58 +- src/views/event/event.vue | 20 + src/views/hello/hello.vue | 30 + src/views/job/job.vue | 57 ++ src/views/job/job2.vue | 509 ++++++++++++++++ src/views/job/search.vue | 5 + src/views/job/show.vue | 867 +++++++++++++++++++++++++++ src/views/login/index.vue | 35 +- src/views/person/person.vue | 20 + vue.config.js | 10 +- 25 files changed, 2458 insertions(+), 39 deletions(-) create mode 100644 src/api/hello.js create mode 100644 src/assets/css/jsmind.css create mode 100644 src/assets/js/jsmind.menu.js create mode 100644 src/components/EditDiv/index.vue create mode 100644 src/components/EditList/index.vue create mode 100644 src/components/EditText/EditText.vue create mode 100644 src/components/EditText/index.js create mode 100644 src/icons/svg/plane.svg create mode 100644 src/icons/svg/事件.svg create mode 100644 src/icons/svg/人员.svg create mode 100644 src/icons/svg/岗位.svg create mode 100644 src/views/event/event.vue create mode 100644 src/views/hello/hello.vue create mode 100644 src/views/job/job.vue create mode 100644 src/views/job/job2.vue create mode 100644 src/views/job/search.vue create mode 100644 src/views/job/show.vue create mode 100644 src/views/person/person.vue diff --git a/.env.development b/.env.development index de583d0..3e53e1d 100644 --- a/.env.development +++ b/.env.development @@ -2,4 +2,4 @@ ENV = 'development' # base api -VUE_APP_BASE_API = '/dev-api' +VUE_APP_BASE_API = '/admin' diff --git a/package.json b/package.json index 2413824..becf3c6 100644 --- a/package.json +++ b/package.json @@ -16,8 +16,11 @@ "dependencies": { "axios": "0.18.1", "core-js": "3.6.5", - "element-ui": "2.13.2", + "echarts": "^5.3.3", + "element-ui": "^2.13.2", "js-cookie": "2.2.0", + "jsmind": "^0.4.8", + "neovis.js": "^2.0.2", "normalize.css": "7.0.0", "nprogress": "0.2.0", "path-to-regexp": "2.4.0", diff --git a/src/api/hello.js b/src/api/hello.js new file mode 100644 index 0000000..07fa80a --- /dev/null +++ b/src/api/hello.js @@ -0,0 +1,11 @@ +// src/api/test.js +import request from '@/utils/request' + +export function getList(params) { + return request({ + url: '', + method: 'get', + params + }) +} + diff --git a/src/assets/css/jsmind.css b/src/assets/css/jsmind.css new file mode 100644 index 0000000..2d61dcb --- /dev/null +++ b/src/assets/css/jsmind.css @@ -0,0 +1,160 @@ +/* + * Released under BSD License + * Copyright (c) 2014-2021 hizzgdev@163.com + * + * Project Home: + * https://github.com/hizzgdev/jsmind/ + */ + +/* important section */ +.jsmind-inner{position:relative;overflow: hidden auto;width:100%;height:100%;outline:none;}/*box-shadow:0 0 2px #000;*/ +.jsmind-inner{ + moz-user-select:-moz-none; + -moz-user-select:none; + -o-user-select:none; + -khtml-user-select:none; + -webkit-user-select:none; + -ms-user-select:none; + user-select:none; +} + +/* z-index:1 */ +svg.jsmind{position:absolute;z-index:1;} +canvas.jsmind{position:absolute;z-index:1;} + +/* z-index:2 */ +jmnodes{position:absolute;z-index:2;background-color:rgba(0,0,0,0);}/*background color is necessary*/ +jmnode{position:absolute;cursor:default;max-width:400px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;} +jmexpander{position:absolute;width:11px;height:11px;display:block;overflow:hidden;line-height:12px;font-size:12px;text-align:center;border-radius:6px;border-width:1px;border-style:solid;cursor:pointer;} + +/* default theme */ +jmnode{padding:10px;background-color:#fff;color:#333;border-radius:5px;box-shadow:1px 1px 3px #bfbfbf;font:16px/1.125 Verdana,Arial,Helvetica,sans-serif;} +jmnode:hover{box-shadow:2px 2px 8px #999;background-color:#ebebeb;color:#333;} +jmnode.selected{background-color:#ebebeb;color:#333;box-shadow:2px 2px 8px #999;} +jmnode.root{font-size:24px;} +jmexpander{border-color:gray;} +jmexpander:hover{border-color:#000;} + +@media screen and (max-device-width: 1024px) { + jmnode{padding:5px;border-radius:3px;font-size:14px;} + jmnode.root{font-size:21px;} +} +/* primary theme */ +jmnodes.theme-primary jmnode{background-color:#428bca;color:#fff;border-color:#357ebd;} +jmnodes.theme-primary jmnode:hover{background-color:#3276b1;border-color:#285e8e;} +jmnodes.theme-primary jmnode.selected{background-color:#f1c40f;color:#fff;} +jmnodes.theme-primary jmnode.root{} +jmnodes.theme-primary jmexpander{} +jmnodes.theme-primary jmexpander:hover{} + +/* warning theme */ +jmnodes.theme-warning jmnode{background-color:#f0ad4e;border-color:#eea236;color:#fff;} +jmnodes.theme-warning jmnode:hover{background-color:#ed9c28;border-color:#d58512;} +jmnodes.theme-warning jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-warning jmnode.root{} +jmnodes.theme-warning jmexpander{} +jmnodes.theme-warning jmexpander:hover{} + +/* danger theme */ +jmnodes.theme-danger jmnode{background-color:#d9534f;border-color:#d43f3a;color:#fff;} +jmnodes.theme-danger jmnode:hover{background-color:#d2322d;border-color:#ac2925;} +jmnodes.theme-danger jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-danger jmnode.root{} +jmnodes.theme-danger jmexpander{} +jmnodes.theme-danger jmexpander:hover{} + +/* success theme */ +jmnodes.theme-success jmnode{background-color:#5cb85c;border-color:#4cae4c;color:#fff;} +jmnodes.theme-success jmnode:hover{background-color:#47a447;border-color:#398439;} +jmnodes.theme-success jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-success jmnode.root{} +jmnodes.theme-success jmexpander{} +jmnodes.theme-success jmexpander:hover{} + +/* info theme */ +jmnodes.theme-info jmnode{background-color:#5dc0de;border-color:#46b8da;;color:#fff;} +jmnodes.theme-info jmnode:hover{background-color:#39b3d7;border-color:#269abc;} +jmnodes.theme-info jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-info jmnode.root{} +jmnodes.theme-info jmexpander{} +jmnodes.theme-info jmexpander:hover{} + +/* greensea theme */ +jmnodes.theme-greensea jmnode{background-color:#1abc9c;color:#fff;} +jmnodes.theme-greensea jmnode:hover{background-color:#16a085;} +jmnodes.theme-greensea jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-greensea jmnode.root{} +jmnodes.theme-greensea jmexpander{} +jmnodes.theme-greensea jmexpander:hover{} + +/* nephrite theme */ +jmnodes.theme-nephrite jmnode{background-color:#2ecc71;color:#fff;} +jmnodes.theme-nephrite jmnode:hover{background-color:#27ae60;} +jmnodes.theme-nephrite jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-nephrite jmnode.root{} +jmnodes.theme-nephrite jmexpander{} +jmnodes.theme-nephrite jmexpander:hover{} + +/* belizehole theme */ +jmnodes.theme-belizehole jmnode{background-color:#3498db;color:#fff;} +jmnodes.theme-belizehole jmnode:hover{background-color:#2980b9;} +jmnodes.theme-belizehole jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-belizehole jmnode.root{} +jmnodes.theme-belizehole jmexpander{} +jmnodes.theme-belizehole jmexpander:hover{} + +/* wisteria theme */ +jmnodes.theme-wisteria jmnode{background-color:#9b59b6;color:#fff;} +jmnodes.theme-wisteria jmnode:hover{background-color:#8e44ad;} +jmnodes.theme-wisteria jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-wisteria jmnode.root{} +jmnodes.theme-wisteria jmexpander{} +jmnodes.theme-wisteria jmexpander:hover{} + +/* asphalt theme */ +jmnodes.theme-asphalt jmnode{background-color:#34495e;color:#fff;} +jmnodes.theme-asphalt jmnode:hover{background-color:#2c3e50;} +jmnodes.theme-asphalt jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-asphalt jmnode.root{} +jmnodes.theme-asphalt jmexpander{} +jmnodes.theme-asphalt jmexpander:hover{} + +/* orange theme */ +jmnodes.theme-orange jmnode{background-color:#f1c40f;color:#fff;} +jmnodes.theme-orange jmnode:hover{background-color:#f39c12;} +jmnodes.theme-orange jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-orange jmnode.root{} +jmnodes.theme-orange jmexpander{} +jmnodes.theme-orange jmexpander:hover{} + +/* pumpkin theme */ +jmnodes.theme-pumpkin jmnode{background-color:#e67e22;color:#fff;} +jmnodes.theme-pumpkin jmnode:hover{background-color:#d35400;} +jmnodes.theme-pumpkin jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-pumpkin jmnode.root{} +jmnodes.theme-pumpkin jmexpander{} +jmnodes.theme-pumpkin jmexpander:hover{} + +/* pomegranate theme */ +jmnodes.theme-pomegranate jmnode{background-color:#e74c3c;color:#fff;} +jmnodes.theme-pomegranate jmnode:hover{background-color:#c0392b;} +jmnodes.theme-pomegranate jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-pomegranate jmnode.root{} +jmnodes.theme-pomegranate jmexpander{} +jmnodes.theme-pomegranate jmexpander:hover{} + +/* clouds theme */ +jmnodes.theme-clouds jmnode{background-color:#ecf0f1;color:#333;} +jmnodes.theme-clouds jmnode:hover{background-color:#bdc3c7;} +jmnodes.theme-clouds jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-clouds jmnode.root{} +jmnodes.theme-clouds jmexpander{} +jmnodes.theme-clouds jmexpander:hover{} + +/* asbestos theme */ +jmnodes.theme-asbestos jmnode{background-color:#95a5a6;color:#fff;} +jmnodes.theme-asbestos jmnode:hover{background-color:#7f8c8d;} +jmnodes.theme-asbestos jmnode.selected{background-color:#11f;color:#fff;} +jmnodes.theme-asbestos jmnode.root{} +jmnodes.theme-asbestos jmexpander{} +jmnodes.theme-asbestos jmexpander:hover{} diff --git a/src/assets/js/jsmind.menu.js b/src/assets/js/jsmind.menu.js new file mode 100644 index 0000000..1f4bceb --- /dev/null +++ b/src/assets/js/jsmind.menu.js @@ -0,0 +1,439 @@ +/* + * Released under BSD License + * Copyright (c) 2019-2020 Allen_sun_js@hotmail.com + * + * Project Home: + * https://github.com/allensunjian + */ + +(function ($w, temp) { + var obj = null + + + var Jm = $w[temp], name = 'menu', $d = $w['document'], menuEvent = 'oncontextmenu', clickEvent = 'onclick', $c = function (tag) { return $d.createElement(tag); }, _noop = function () { }, logger = (typeof console === 'undefined') ? { log: _noop, debug: _noop, error: _noop, warn: _noop, info: _noop } : console; + + var $t = function (n, t) { if (n.hasChildNodes()) { n.firstChild.nodeValue = t; } else { n.appendChild($d.createTextNode(t)); } }; + + var $h = function (n, t) { + if (t instanceof HTMLElement) { + t.innerHTML = ""; + n.appendChild(t) + } else { + n.innerHTML = t; + } + }; + + if (!Jm || Jm[name]) return; + + Jm.menu = function (_jm) { + obj = this + this._get_menu_options(_jm, function () { + + this.init(_jm); + + this._mount_events() + }) + } + Jm.menu.prototype = { + + defaultDataMap: { + funcMap: { + edit: { + isDepNode: true, + // defaultFn不受到中台变量的控制,始终会先于fn去执行 + defaultFn: function (node) { + var f = this._menu_default_mind_methods._menu_begin_edit.call(this.jm); + f && this._menu_default_mind_methods._menu_edit_node_begin(this.jm.view, node); + }, + fn: _noop, + text: 'edit node' + }, + addChild: { + isDepNode: true, + fn: function (nodeid,text) { + var selected_node = this.get_selected_node(); + if (selected_node) { + var node = this.add_node(selected_node, nodeid, text); + if (node) { + this.select_node(nodeid); + this.begin_edit(nodeid); + obj._mount_events(); + } + } + }, + text: 'append child' + }, + addBrother: { + isDepNode: true, + fn: function (nodeid,text) { + var selected_node = this.get_selected_node(); + if (selected_node && !selected_node.isroot) { + var node = this.insert_node_after(selected_node, nodeid, text); + if (node) { + this.select_node(nodeid); + this.begin_edit(nodeid); + obj._mount_events(); + } + } + }, + text: 'append brother' + }, + delete: { + isDepNode: true, + fn: function () { + this.shortcut.handle_delnode.call(this.shortcut, this); + }, + text: 'delete node' + }, + showAll: { + sDepNode: false, + fn: function () { + this.expand_all(this) + }, + text: 'show all' + }, + hideAll: { + isDepNode: false, + fn: function () { + this.collapse_all(this) + }, + text: 'hide all' + }, + screenshot: { + isDepNode: false, + fn: function () { + if (!this.screenshot) { + logger.error('[jsmind] screenshot dependent on jsmind.screenshot.js !'); + return; + } + this.screenshot.shootDownload(); + }, + text: 'load mind picture' + }, + showNode: { + isDepNode: true, + fn: function (node) { + this.expand_node(node); + }, + text: 'show target node' + }, + hideNode: { + isDepNode: true, + fn: function (node) { + this.collapse_node(node); + }, + text: 'hide target node' + }, + }, + menuStl: { + 'width': '150px', + 'padding': '12px 0', + 'position': 'fixed', + 'z-index': '10', + 'background': '#fff', + 'box-shadow': '0 2px 12px 0 rgba(0,0,0,0.1)', + 'border-radius': '5px', + 'font-size': '12px', + 'display': 'none' + }, + menuItemStl:{ + padding: '5px 15px', + cursor: 'pointer', + display: 'block', + 'text-align': 'center', + 'transition':'all .2s' + }, + injectionList:['edit','addChild','delete'] + }, + + init: function (_jm) { + this._create_menu(_jm); + this._get_injectionList(_jm); + this.menuOpts.switchMidStage && Jm.util.dom.add_event(_jm.view.e_editor , 'blur', function () { + this._menu_default_mind_methods._menu_edit_node_end.call(_jm.view); + if(typeof this.menuOpts.editCaller == 'function') { + this.menuOpts.editCaller($w.menu._update_node_info, this._menu_default_mind_methods._menu_update_edit_node) + return + } + this._menu_default_mind_methods._menu_update_edit_node(); + }.bind(this)); + }, + + _event_contextMenu (e) { + e.preventDefault(); + this.menu.style.left = e.clientX + 'px'; + this.menu.style.top = e.clientY + 'px'; + this.menu.style.display = 'block'; + this.selected_node = this.jm.get_selected_node(); + } , + + _event_hideMenu() { + this.menu.style.display = 'none' + }, + + _mount_events () { + var items = document.getElementsByTagName('jmnode') + for(let i = 0; i < items.length; i++) { + items[i][menuEvent] = this._event_contextMenu.bind(this); + } + $w[clickEvent] = this._event_hideMenu.bind(this); + }, + + _create_menu (_jm) { + var d = $c('menu'); + this._set_menu_wrap_syl(d); + this.menu = d; + this.e_panel = _jm.view.e_panel; + this.e_panel.appendChild(d); + }, + + _create_menu_item (j, text, fn, isDepNode,cb, defaultFn) { + var d = $c('menu-item'),_this = this; + this._set_menu_item_syl(d); + d.innerText = text; + d.addEventListener('click', function () { + if (this.selected_node || !isDepNode) { + defaultFn.call(_this, this.selected_node); + if (!_this._get_mid_opts()) { + cb(this.selected_node, _noop) + fn.call(j,Jm.util.uuid.newid(), this.menuOpts.newNodeText || 'New Node'); + return; + } + cb(this.selected_node,_this._mid_stage_next(function () { + var retArgs = [this.selected_node], + argus = Array.prototype.slice.call(arguments[0],0); + argus[1] = this.menuOpts.newNodeText || 'New Node'; + if (argus[0]) { + retArgs = argus + } + fn.apply(j,retArgs); + }.bind(this))) + return + } + alert(this.menuOpts.tipContent || 'Continue with node selected!') + }.bind(this)) + d.addEventListener('mouseover', function () { + d.style.background = 'rgb(179, 216, 255)' + }.bind(this)) + d.addEventListener('mouseleave', function () { + d.style.background = '#fff' + }.bind(this)) + return d + }, + + _set_menu_wrap_syl (d) { + var os = this._get_option_sty('menu',this._get_mixin_sty); + d.style.cssText = this._format_cssText(os); + }, + + _set_menu_item_syl (d) { + var os = this._get_option_sty('menuItem',this._get_mixin_sty); + d.style.cssText = this._format_cssText(os) + }, + + _format_cssText (o) { + var text = ''; + Object.keys(o).forEach(function (k) { + text += k +':'+o[k] +';' + }) + return text; + }, + + _empty_object (o) { + return Object.keys(o).length == 0? true :false + }, + + _get_option_sty (type, fn) { + var sty = this.menuOpts.style, + menu = this.defaultDataMap.menuStl, + menuItem = this.defaultDataMap.menuItemStl, + o = {menu,menuItem} + + if (!sty) return o[type]; + if (!sty[type]) return o[type]; + if (!sty[type] || this._empty_object(sty[type])) return o[type]; + return fn( o[type],sty[type]) + }, + + _get_mixin_sty (dSty, oSty) { + var o = {}; + Object.keys(oSty).forEach(function (k) { + o[k] = oSty[k]; + }) + Object.keys(dSty).forEach(function (k) { + if (!o[k]) o[k] = dSty[k]; + }) + return o + }, + + _get_menu_options (j, fn) { + var options = j.options; + if (!options.menuOpts) return; + if (!options.menuOpts.showMenu) return; + this.menuOpts = j.options.menuOpts + fn.call(this) + }, + + _get_injectionDetail () { + var iLs = this.menuOpts.injectionList, + dLs = this.defaultDataMap.injectionList; + if (!iLs) return dLs; + if (!Array.isArray(iLs)) { + logger.error('[jsmind] injectionList must be a Array'); + return; + } + if (iLs.length == 0) return dLs; + return iLs + }, + + _get_injectionList (j) { + var list = this._get_injectionDetail(), + _this = this; + list.forEach(function (k) { + var o = null, + text = "", + callback = _noop, + defaultFn = _noop; + + if (typeof k == 'object') { + o = _this.defaultDataMap.funcMap[k.target]; + text = k.text; + k.callback && (callback = k.callback); + } else { + o = _this.defaultDataMap.funcMap[k]; + text = o.text; + } + + if (o.defaultFn) defaultFn = o.defaultFn; + _this.menu.appendChild(_this._create_menu_item(j ,text, o.fn, o.isDepNode,callback, defaultFn)); + }) + }, + + _get_mid_opts () { + var b = this.menuOpts.switchMidStage; + if (!b) return false; + if (typeof b !== 'boolean') { + logger.error('[jsmind] switchMidStage must be Boolean'); + return false; + } + return b + }, + + _switch_view_db_event () { + Jm.prototype.dblclick_handle = _noop; + Jm.shortcut_provider.prototype.handler = _noop; + Jm.view_provider.prototype.edit_node_end = _noop; + }, + + _mid_stage_next (fn) { + return function () { + fn(arguments); + } + }, + + _reset_mind_event_edit () {}, + + _menu_default_mind_methods: { + _menu_begin_edit: function () { + var f = this.get_editable(); + if (!f) { + logger.error('fail, this mind map is not editable.'); + } + return f; + }, + _menu_edit_node_begin (scope, node) { + if (!node.topic) { + logger.warn("don't edit image nodes"); + return; + } + if (scope.editing_node != null) { + this._menu_default_mind_methods._menu_edit_node_end.call(scope); + } + scope.editing_node = node; + var view_data = node._data.view; + var element = view_data.element; + var topic = node.topic; + var ncs = getComputedStyle(element); + scope.e_editor.value = topic; + scope.e_editor.style.width = (element.clientWidth - parseInt(ncs.getPropertyValue('padding-left')) - parseInt(ncs.getPropertyValue('padding-right'))) + 'px'; + element.innerHTML = ''; + element.appendChild(scope.e_editor); + element.style.zIndex = 5; + scope.e_editor.focus(); + scope.e_editor.select(); + }, + _menu_edit_node_end: function () { + if (this.editing_node != null) { + var node = this.editing_node; + this.editing_node = null; + var view_data = node._data.view; + var element = view_data.element; + var topic = this.e_editor.value; + element.style.zIndex = 'auto'; + element.removeChild(this.e_editor); + $w.menu._update_node_info = {id: node.id, topic: topic}; + if (Jm.util.text.is_empty(topic) || node.topic === topic) { + if (this.opts.support_html) { + $h(element, node.topic); + } else { + $t(element, node.topic); + } + } + } + }, + _menu_update_edit_node: function () { + var info = $w.menu._update_node_info; + $w.menu.jm.update_node(info.id, info.topic); + } + } + + } + var plugin = new Jm.plugin('menu',function (_jm) { + + $w.menu = new Jm.menu(_jm); + + $w.menu.jm = _jm; + + if($w.menu.menuOpts) _jm.menu = $w.menu; + + }) + + Jm.register_plugin(plugin) + + function preventMindEventDefault() { + + Jm.menu.prototype._switch_view_db_event(); + + } + Jm.preventMindEventDefault = preventMindEventDefault + + + // eslint-disable-next-line no-unused-vars + function reBuild () { + if (obj !== null) { + obj._mount_events() + } + } + // export reBuild + if (typeof module !== 'undefined' && typeof exports === 'object') { + module.exports = { + reBuild, + init: function (opt) { + Jm = opt + } + }; + } + // exports = { + // reBuild, + // // init: function (opt) { + // // console.log(opt) + // // } + // }; + + // $w['render'] = function () { + // if (obj !== null) { + // obj._mount_events() + // } + // } + +})(window, 'jsMind') \ No newline at end of file diff --git a/src/components/EditDiv/index.vue b/src/components/EditDiv/index.vue new file mode 100644 index 0000000..ee997c9 --- /dev/null +++ b/src/components/EditDiv/index.vue @@ -0,0 +1,61 @@ + + + + diff --git a/src/components/EditList/index.vue b/src/components/EditList/index.vue new file mode 100644 index 0000000..51f473e --- /dev/null +++ b/src/components/EditList/index.vue @@ -0,0 +1,44 @@ + + + + + diff --git a/src/components/EditText/EditText.vue b/src/components/EditText/EditText.vue new file mode 100644 index 0000000..002f6ff --- /dev/null +++ b/src/components/EditText/EditText.vue @@ -0,0 +1,71 @@ + + + + + + diff --git a/src/components/EditText/index.js b/src/components/EditText/index.js new file mode 100644 index 0000000..c5740fe --- /dev/null +++ b/src/components/EditText/index.js @@ -0,0 +1,9 @@ +/** + * 文本双击可编辑 组件 + */ + import EditText from "./EditText.vue"; + EditText.install = function (vue) { + vue.component(EditText.name, EditText); + }; + export default EditText; + \ No newline at end of file diff --git a/src/icons/svg/plane.svg b/src/icons/svg/plane.svg new file mode 100644 index 0000000..123905f --- /dev/null +++ b/src/icons/svg/plane.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/icons/svg/事件.svg b/src/icons/svg/事件.svg new file mode 100644 index 0000000..ab9ff4b --- /dev/null +++ b/src/icons/svg/事件.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/icons/svg/人员.svg b/src/icons/svg/人员.svg new file mode 100644 index 0000000..fda04d9 --- /dev/null +++ b/src/icons/svg/人员.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/icons/svg/岗位.svg b/src/icons/svg/岗位.svg new file mode 100644 index 0000000..ca1137d --- /dev/null +++ b/src/icons/svg/岗位.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/main.js b/src/main.js index 01cba2f..3b08cae 100644 --- a/src/main.js +++ b/src/main.js @@ -14,7 +14,12 @@ import router from './router' import '@/icons' // icon import '@/permission' // permission control +import request from '@/utils/request' +// import EditText from "@/components/EditText/index"; +// Vue.use(EditText); + +Vue.prototype.req = request /** * If you don't want to use mock-server * you want to use MockJs for mock api @@ -23,10 +28,10 @@ import '@/permission' // permission control * Currently MockJs will be used in the production environment, * please remove it before going online ! ! ! */ -if (process.env.NODE_ENV === 'production') { - const { mockXHR } = require('../mock') - mockXHR() -} +// if (process.env.NODE_ENV === 'production') { +// const { mockXHR } = require('../mock') +// mockXHR() +// } // set ElementUI lang to EN Vue.use(ElementUI, { locale }) @@ -35,6 +40,7 @@ Vue.use(ElementUI, { locale }) Vue.config.productionTip = false + new Vue({ el: '#app', router, diff --git a/src/router/index.js b/src/router/index.js index 13459e9..6f7652b 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -150,16 +150,72 @@ export const constantRoutes = [ }, { - path: 'external-link', + path: '/hello', component: Layout, + children: [{ + path: 'hello', + name: 'hello', + component: () => import('@/views/hello/hello'), + meta: { + title: 'Hello', + icon: 'plane' + } + }] + }, + + { + path: '/job', + component: Layout, + redirect: '/job/show', + name: 'Job', + meta: { + title: '岗位', + icon: '岗位' + }, children: [ { - path: 'https://panjiachen.github.io/vue-element-admin-site/#/', - meta: { title: 'External Link', icon: 'link' } + path: 'show', + name: 'JobShow', + component: () => import('@/views/job/show'), + meta: { title: '岗位总览' } + }, + { + path: 'search', + name: 'JobSearch', + component: () => import('@/views/job/search'), + meta: { title: '岗位标签搜索' } } ] }, + { + path: '/person', + component: Layout, + children: [{ + path: 'person', + name: 'person', + component: () => import('@/views/person/person'), + meta: { + title: '人员', + icon: '人员' + } + }] + }, + + { + path: '/event', + component: Layout, + children: [{ + path: 'event', + name: 'event', + component: () => import('@/views/event/event'), + meta: { + title: '事件', + icon: '事件' + } + }] + }, + // 404 page must be placed at the end !!! { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/utils/request.js b/src/utils/request.js index 2fb95ac..74bb82d 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -12,22 +12,23 @@ const service = axios.create({ // request interceptor service.interceptors.request.use( - config => { - // do something before request is sent + console.log('have a request') + // config => { + // // do something before request is sent - if (store.getters.token) { - // let each request carry token - // ['X-Token'] is a custom headers key - // please modify it according to the actual situation - config.headers['X-Token'] = getToken() - } - return config - }, - error => { - // do something with request error - console.log(error) // for debug - return Promise.reject(error) - } + // if (store.getters.token) { + // // let each request carry token + // // ['X-Token'] is a custom headers key + // // please modify it according to the actual situation + // config.headers['X-Token'] = getToken() + // } + // return config + // }, + // error => { + // // do something with request error + // console.log(error) // for debug + // return Promise.reject(error) + // } ) // response interceptor @@ -42,7 +43,7 @@ service.interceptors.response.use( * Here is just an example * You can also judge the status by HTTP Status Code */ - response => { +/* response => { const res = response.data // if the custom code is not 20000, it is judged as an error. @@ -79,6 +80,31 @@ service.interceptors.response.use( duration: 5 * 1000 }) return Promise.reject(error) + } */ + + response => { + const res = response.data + return res + // if (res.code !== 20000) { + // Message({ + // message: res.msg || 'Error check your token or method', + // type: 'error', + // duration: 2 * 1000 + // }) + // console.log(res.code) + // return Promise.reject(new Error(res.msg || 'Error')) + // } else{ + // return res + // } + }, + error => { + console.log('err' + error) + Message({ + message: error.message, + type: 'error', + duration: 2 * 1000 + }) + return Promise.reject(error) } ) diff --git a/src/views/event/event.vue b/src/views/event/event.vue new file mode 100644 index 0000000..03e3873 --- /dev/null +++ b/src/views/event/event.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/src/views/hello/hello.vue b/src/views/hello/hello.vue new file mode 100644 index 0000000..b2471b8 --- /dev/null +++ b/src/views/hello/hello.vue @@ -0,0 +1,30 @@ + + + + + diff --git a/src/views/job/job.vue b/src/views/job/job.vue new file mode 100644 index 0000000..6c975fe --- /dev/null +++ b/src/views/job/job.vue @@ -0,0 +1,57 @@ + + + + + \ No newline at end of file diff --git a/src/views/job/job2.vue b/src/views/job/job2.vue new file mode 100644 index 0000000..f56a93b --- /dev/null +++ b/src/views/job/job2.vue @@ -0,0 +1,509 @@ + + + + + \ No newline at end of file diff --git a/src/views/job/search.vue b/src/views/job/search.vue new file mode 100644 index 0000000..212f936 --- /dev/null +++ b/src/views/job/search.vue @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/src/views/job/show.vue b/src/views/job/show.vue new file mode 100644 index 0000000..f6c578a --- /dev/null +++ b/src/views/job/show.vue @@ -0,0 +1,867 @@ + + + + + diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 1db2464..f29509c 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -106,19 +106,28 @@ export default { }) }, handleLogin() { - this.$refs.loginForm.validate(valid => { - if (valid) { - this.loading = true - this.$store.dispatch('user/login', this.loginForm).then(() => { - this.$router.push({ path: this.redirect || '/' }) - this.loading = false - }).catch(() => { - this.loading = false - }) - } else { - console.log('error submit!!') - return false - } + // this.$refs.loginForm.validate(valid => { + // if (valid) { + // this.loading = true + // this.$store.dispatch('user/login', this.loginForm).then(() => { + // this.$router.push({ path: this.redirect || '/' }) + // this.loading = false + // }).catch(() => { + // this.loading = false + // }) + // } else { + // console.log('error submit!!') + // return false + // } + // }) + + + this.loading = true + this.$store.dispatch('user/login', this.loginForm).then(() => { + this.$router.push({ path: this.redirect || '/' }) + this.loading = false + }).catch(() => { + this.loading = false }) } } diff --git a/src/views/person/person.vue b/src/views/person/person.vue new file mode 100644 index 0000000..8ee0c2d --- /dev/null +++ b/src/views/person/person.vue @@ -0,0 +1,20 @@ + + + + + \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index 4856ed0..ee52389 100644 --- a/vue.config.js +++ b/vue.config.js @@ -36,7 +36,15 @@ module.exports = { warnings: false, errors: true }, - before: require('./mock/mock-server.js') + proxy: { + '/admin': { + target: 'http://localhost:8886/', + changeOrigin: true, + pathRewrite: { + } + } + } + // before: require('./mock/mock-server.js') }, configureWebpack: { // provide the app's title in webpack's name field, so that From 866aefe0a8d99589550e9e1557e25f0c769dd8df Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Wed, 13 Jul 2022 19:42:07 +0800 Subject: [PATCH 02/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E6=9E=B6=E6=9E=84?= =?UTF-8?q?=E5=9B=BE=E3=80=81=E9=83=A8=E9=97=A8=E3=80=81=E5=B2=97=E4=BD=8D?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E7=9A=84=E6=9F=A5=E8=AF=A2=E6=93=8D=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.development | 2 +- src/api/job.js | 49 + src/api/user.js | 6 +- src/assets/css/mydoc.css | 86 ++ src/components/EditDiv/index.vue | 22 +- src/components/EditList/index.vue | 5 +- src/utils/request.js | 24 +- src/views/job/components/DepDescription.vue | 51 + src/views/job/components/JobDescription.vue | 373 +++++++ src/views/job/components/NoData.vue | 22 + src/views/job/show.vue | 1109 +++++++++---------- vue.config.js | 5 +- 12 files changed, 1126 insertions(+), 628 deletions(-) create mode 100644 src/api/job.js create mode 100644 src/assets/css/mydoc.css create mode 100644 src/views/job/components/DepDescription.vue create mode 100644 src/views/job/components/JobDescription.vue create mode 100644 src/views/job/components/NoData.vue diff --git a/.env.development b/.env.development index 3e53e1d..8245922 100644 --- a/.env.development +++ b/.env.development @@ -2,4 +2,4 @@ ENV = 'development' # base api -VUE_APP_BASE_API = '/admin' +VUE_APP_BASE_API = '/' diff --git a/src/api/job.js b/src/api/job.js new file mode 100644 index 0000000..555aa96 --- /dev/null +++ b/src/api/job.js @@ -0,0 +1,49 @@ +import request from '@/utils/request' + +export function getFramework(params) { + return request({ + url: '/job/framework', + method: 'get', + params + }) +} + +export function modifyFramework(data) { + return request({ + url: '/job/framework', + method: 'post', + data + }) +} + +export function getDepartmentDetail(params) { + return request({ + url: '/job/department-detail', + method: 'get', + params + }) +} + +export function modifyDepartmentDetail(data) { + return request({ + url: '/job/department-detail', + method: 'post', + data + }) +} + +export function getJobDetail(params) { + return request({ + url: '/job/job-detail', + method: 'get', + params + }) +} + +export function modifyJobDetail(data) { + return request({ + url: '/job/job-detail', + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/api/user.js b/src/api/user.js index 8ff4389..de69f70 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -2,7 +2,7 @@ import request from '@/utils/request' export function login(data) { return request({ - url: '/vue-admin-template/user/login', + url: '/user/login', method: 'post', data }) @@ -10,7 +10,7 @@ export function login(data) { export function getInfo(token) { return request({ - url: '/vue-admin-template/user/info', + url: '/user/info', method: 'get', params: { token } }) @@ -18,7 +18,7 @@ export function getInfo(token) { export function logout() { return request({ - url: '/vue-admin-template/user/logout', + url: '/user/logout', method: 'post' }) } diff --git a/src/assets/css/mydoc.css b/src/assets/css/mydoc.css new file mode 100644 index 0000000..11e9159 --- /dev/null +++ b/src/assets/css/mydoc.css @@ -0,0 +1,86 @@ + +.right-main { + /* padding-top: 10px; */ + padding-left: 30px; + padding-right: 30px; + padding-bottom: 100px; + } + + .jd-title { + text-align: center; + /* font-family: "Times New Roman","宋体","微软雅黑"; */ + font-size: 2em; + /* line-height: 2em; */ + } + + .jd-h1 { + font-size: 1.5em; + line-height: 1.8em; + } + + .jd-h2 { + font-size: 1.3em; + line-height: 1.5em; + } + + .jd-h3 { + font-size: 1.2em; + line-height: 1.5em; + text-indent: 1em; + } + + .jd-text { + font-size: 1.1em; + line-height: 1.5em; + text-indent: 2em; + } + + .jd-block1 { + margin-top: 15px; + } + + .jd-block2 { + margin-top: 10px; + } + + .jd-block3 { + margin-top: 7px; + } + + .jd-table { + border-collapse: collapse; + width: 80%; + margin: 10px auto 0px; + } + + .jd-table tr { + height: 2em; + } + + .jd-table table, + th, + td { + border: 1px solid #ebebeb; + } + + .jd-table td { + text-align: center; + } + + .jd-table2 td { + text-align: left; + text-indent: 2em; + line-height: 1.5em; + } + + .vertical-one { + width: 2em; + } + + .vertical-two { + width: 3em; + } + + .vertical-four { + width: 5em; + } \ No newline at end of file diff --git a/src/components/EditDiv/index.vue b/src/components/EditDiv/index.vue index ee997c9..9ebe752 100644 --- a/src/components/EditDiv/index.vue +++ b/src/components/EditDiv/index.vue @@ -4,7 +4,6 @@ :contenteditable="editAble" :class="{ editing: editAble }" @blur="inputBlur" - @focus="inputFocus" @keyup.27="$event.target.blur" @dblclick="allowInput" v-text="inputText" @@ -13,36 +12,27 @@ \ No newline at end of file diff --git a/src/views/job/components/JobDescription.vue b/src/views/job/components/JobDescription.vue new file mode 100644 index 0000000..f978450 --- /dev/null +++ b/src/views/job/components/JobDescription.vue @@ -0,0 +1,373 @@ + + + + + + \ No newline at end of file diff --git a/src/views/job/components/NoData.vue b/src/views/job/components/NoData.vue new file mode 100644 index 0000000..e5871c9 --- /dev/null +++ b/src/views/job/components/NoData.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/views/job/show.vue b/src/views/job/show.vue index f6c578a..2646701 100644 --- a/src/views/job/show.vue +++ b/src/views/job/show.vue @@ -70,344 +70,24 @@ > 展开全部Test1 关闭全部Test2 保存修改保存 - -
{{ jobData.岗位名称 }} 岗位说明书
-
-
一、岗位概况
- - - - - - - - - - - - - - - - - - - - - - - -
岗位名称 - - 岗位级别 - - 定编人数 - -
所属部门 - - 岗位类别 - - 辖员人数 - -
直接上级 - - 直接下级 - -
-
-
-
二、工作内容
-
-
1、工作概况
- - -
-
-
2、工作说明
-
-
党风廉政建设
- -
-
-
部门管理
- -
-
-
业务管理
- -
-
-
属员管理
- -
-
-
安全职责
- -
-
-
兼办、协助、临时代理工作
- -
-
-
-
3、职权范围
- - - - - - - - - - - - - - - - - - - - - - -
所受监督 - -
所施监督 - -
工作权限 - -
沟通关系企业内部 - -
企业外部 - -
-
-
-
4、工作环境与条件
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
工作时间 - - 办公班,实际工作时间8小时 - 综合计算工时工作制 - 不定时工作制 - -
脑力强度 - - - - - -
体力强度 - - - - - -
出差频度 - - 驻外工作 - 经常出差 - 有时出差 - 极少或不出差 - -
主要工作场所 - - 室内 - 室外 - -
环境舒适性 - - 舒适 - 一般 - 较差 - -
环境特殊性 - - - - - - -
-
-
-
-
三、任职资格
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
学历 - -
专业
技术职称
所需知识
所需技能能力 - - -
所需经历经验 - -
所需体能
所需职业风格 - -
-
-
-
四、备注
- -
-
+ + @@ -415,21 +95,27 @@ @@ -775,93 +787,4 @@ export default { top: 50%; transform: translateY(-50%); } - -.right-main { - /* padding-top: 10px; */ - padding-left: 30px; - padding-right: 30px; - padding-bottom: 100px; -} - -.jd-title { - text-align: center; - /* font-family: "Times New Roman","宋体","微软雅黑"; */ - font-size: 2em; - /* line-height: 2em; */ -} - -.jd-h1 { - font-size: 1.5em; - line-height: 1.8em; -} - -.jd-h2 { - font-size: 1.3em; - line-height: 1.5em; -} - -.jd-h3 { - font-size: 1.2em; - line-height: 1.5em; - text-indent: 1em; -} - -.jd-text { - font-size: 1.1em; - line-height: 1.5em; - text-indent: 2em; -} - -.jd-block1 { - margin-top: 15px; -} - -.jd-block2 { - margin-top: 10px; -} - -.jd-block3 { - margin-top: 7px; -} - -.jd-table { - border-collapse: collapse; - width: 80%; - margin: 10px auto 0px; -} - -.jd-table tr { - height: 2em; -} - -.jd-table table, -th, -td { - border: 1px solid #ebebeb; -} - -.jd-table td { - text-align: center; -} - -.jd-table2 td { - text-align: left; - text-indent: 2em; - line-height: 1.5em; -} - -.vertical-one { - width: 2em; -} - -.vertical-two { - width: 3em; -} - -.vertical-four { - width: 5em; -} - -.header-menu { -} diff --git a/vue.config.js b/vue.config.js index ee52389..b34a86a 100644 --- a/vue.config.js +++ b/vue.config.js @@ -37,8 +37,9 @@ module.exports = { errors: true }, proxy: { - '/admin': { - target: 'http://localhost:8886/', + '/': { + target: 'http://127.0.0.1:4523/m1/1256020-0-default/', + // target: 'http://192.168.31.102:8000', changeOrigin: true, pathRewrite: { } From 937f8f0529f4a909d5a6897ceb84081fcda35ceb Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Fri, 15 Jul 2022 17:29:28 +0800 Subject: [PATCH 03/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B2=97=E4=BD=8D?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=A2=9E=E5=88=A0=E6=9F=A5=E6=94=B9?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/css/mydoc.css | 192 ++++--- src/components/EditList/index.vue | 46 +- src/utils/request.js | 1 - src/views/job/components/DepDescription.vue | 23 +- src/views/job/components/JobDescription.vue | 70 ++- src/views/job/show.vue | 592 ++++++++++---------- vue.config.js | 4 +- 7 files changed, 519 insertions(+), 409 deletions(-) diff --git a/src/assets/css/mydoc.css b/src/assets/css/mydoc.css index 11e9159..7ba9511 100644 --- a/src/assets/css/mydoc.css +++ b/src/assets/css/mydoc.css @@ -1,86 +1,108 @@ - .right-main { - /* padding-top: 10px; */ - padding-left: 30px; - padding-right: 30px; - padding-bottom: 100px; - } - - .jd-title { - text-align: center; - /* font-family: "Times New Roman","宋体","微软雅黑"; */ - font-size: 2em; - /* line-height: 2em; */ - } - - .jd-h1 { - font-size: 1.5em; - line-height: 1.8em; - } - - .jd-h2 { - font-size: 1.3em; - line-height: 1.5em; - } - - .jd-h3 { - font-size: 1.2em; - line-height: 1.5em; - text-indent: 1em; - } - - .jd-text { - font-size: 1.1em; - line-height: 1.5em; - text-indent: 2em; - } - - .jd-block1 { - margin-top: 15px; - } - - .jd-block2 { - margin-top: 10px; - } - - .jd-block3 { - margin-top: 7px; - } - - .jd-table { - border-collapse: collapse; - width: 80%; - margin: 10px auto 0px; - } - - .jd-table tr { - height: 2em; - } - - .jd-table table, - th, - td { - border: 1px solid #ebebeb; - } - - .jd-table td { - text-align: center; - } - - .jd-table2 td { - text-align: left; - text-indent: 2em; - line-height: 1.5em; - } - - .vertical-one { - width: 2em; - } - - .vertical-two { - width: 3em; - } - - .vertical-four { - width: 5em; - } \ No newline at end of file + /* padding-top: 10px; */ + padding-left: 30px; + padding-right: 30px; + padding-bottom: 100px; +} + +.jd-title { + text-align: center; + /* font-family: "Times New Roman","宋体","微软雅黑"; */ + font-size: 2em; + /* line-height: 2em; */ +} + +.jd-h1 { + font-size: 1.5em; + line-height: 1.8em; +} + +.jd-h2 { + font-size: 1.3em; + line-height: 1.5em; +} + +.jd-h3 { + font-size: 1.2em; + line-height: 1.5em; + text-indent: 1em; +} + +.jd-text { + font-size: 1.1em; + line-height: 1.5em; + text-indent: 2em; +} + +.jd-li { + font-size: 1.1em; + line-height: 1.5em; + padding-left: 3em; +} + +.jd-li2 { + padding-left: 1em; +} + +.jd-block1 { + margin-top: 15px; +} + +.jd-block2 { + margin-top: 10px; +} + +.jd-block3 { + margin-top: 7px; +} + +.jd-table { + border-collapse: collapse; + width: 80%; + margin: 10px auto 0px; +} + +.jd-table tr { + height: 2em; +} + +.jd-table table, +th, +td { + border: 1px solid #ebebeb; +} + +.jd-table td { + text-align: center; +} + +.jd-table2 td { + padding-left: 1em; + text-align: left; + /* text-indent: 1em; */ + line-height: 1.5em; +} + +.vertical-one { + width: 2em; +} + +.vertical-two { + width: 3em; +} + +.vertical-four { + width: 5em; +} + +.confirm-button { + background: #fff; + color:#000; + border: 1px solid #dcdfe6; + border-radius: 5px; +} + +.confirm-button:hover { + color: #409eff; + background-color: #ecf5ff; +} \ No newline at end of file diff --git a/src/components/EditList/index.vue b/src/components/EditList/index.vue index d9317fb..402b12e 100644 --- a/src/components/EditList/index.vue +++ b/src/components/EditList/index.vue @@ -1,13 +1,13 @@ diff --git a/src/views/job/components/JobDescription.vue b/src/views/job/components/JobDescription.vue index f978450..721aaf6 100644 --- a/src/views/job/components/JobDescription.vue +++ b/src/views/job/components/JobDescription.vue @@ -1,6 +1,19 @@ @@ -97,10 +103,10 @@ import "@/assets/css/jsmind.css"; import jsMind from "jsmind/js/jsmind.js"; window.jsMind = jsMind; -const { init } = require("@/assets/js/jsmind.menu.js"); +// const { init } = require("@/assets/js/jsmind.menu.js"); // require("jsmind/js/jsmind.draggable.js"); require("jsmind/js/jsmind.screenshot.js"); -init(jsMind); +// init(jsMind); import JobDescription from "./components/JobDescription.vue"; import DepDescription from "./components/DepDescription.vue"; @@ -153,125 +159,25 @@ export default { preSelectNodeId: null, curDep: null, curJob: null, + curNewNode: null, + intervalId: null, + comTitleEdit: null, }; }, - created() { - this.jobData = { - 岗位名称: "财务科科长", - 岗位概况: { - 岗位名称: "科长", - 岗位级别: "10", - 定编人数: "1", - 所属部门: "财务科", - 岗位类别: "专业管理类", - 辖员人数: "9", - 直接上级: "分管领导", - 直接下级: "副科长", - }, - 工作内容: { - 工作概况: - "依据《会计法》及相关财经法规,开展企业会计审核、会计监督、资金调拨、预算控制、财务分析等财务管理工作,建立、健全现代企业财务管理体系,确保企业稳定健康发展对财务的需求。", - 工作说明: { - 党风廉政建设: - '1、抓好全面从严治党和党风廉政建设,切实履行好党建的“一岗双责”。抓好本部门的党风廉政建设,把反腐倡廉、案件防范工作与业务工作同研究、同规划、同布置、同检查、同考核、同问责,真正做到"两手抓、两手硬",使党风廉政建设和反腐败工作始终保持应有的力度。', - 部门管理: [ - "2、根据企业管理规范,组织制定企业内部财务管理制度、会计控制规范及会计核算规程,以及部门相关的岗位职责、和工作流程;", - "3、组织开展本部门综合管理体系的推行与维护工作;", - "4、根据预算管理,执行本部门费用控制;", - "5、对本部门直接管辖范围内人员、场所负全面安全管理责任。", - ], - 业务管理: [ - "6、协助分管财务厂长完善全厂的财务管理体系,主持全厂会计核算工作;", - "7、组织实施企业全面预算管理工作,监督财务预算执行情况,上报企业年度及月度财务预算;", - "8、组织企业财务分析,参与企业生产经营决策,编制财务分析资料,供领导决策参考;", - "9、筹集、调度资金,保证企业生产及经营管理的正常运行对资金的需求;", - "10、审批会计凭证及各项资金和费用;", - "11、监督和参与企业重大采购、投资、资产处置及工程招投标活动;", - "12、组织财经法规、财务制度的宣传工作。", - ], - 属员管理: [ - "13、开展本部门员工的绩效管理工作,对员工任免提出意见;", - "14、组织部门员工培训工作,督导企业会计人员的政治学习和业务学习,加强团队建设与廉政作风建设,增强团队凝聚力。", - ], - 安全职责: [ - "15、保证国家安全生产法规和厂安全生产规章制度在本部门的贯彻执行,对本部门的安全工作负全面责任,健全安全机构,层层落实安全生产责任。", - "16、贯彻“五同时”的原则,即在计划、布置、检查、总结、评比生产工作的同时,同时计划、布置、检查、总结、评比安全工作。", - "17、监督检查本部门对安全生产各项规章制度的执行情况,及时纠正“三违”行为。", - "18、组织制订并实施本部门安全生产管理规定、安全技术操作规程、安全技术措施计划。", - "19、负责组织对部门职工进行经常性的安全思想、安全知识和安全技术教育培训;组织并参加厂组织的安全活动,至少组织两次部门的安全活动,掌握其部门存在的危险因素、防范措施及事故应急措施。", - "20、负责组织本部门安全检查,每季度参加本部门安全检查一次以上,落实隐患整改,保证生产设备、安全设施、消防设施、防护器材等处于完好状态,并教育职工加强维护、正确使用。", - "21、负责本部门的应急管理,定期开展应急处置预案的演练及评估,发生事故应及时现场组织抢救,协助事故调查处理。", - "22、负责组织分析本部门安全生产动态,向上级领导汇报本部门的安全生产情况。", - ], - 临时代理工作: ["23、完成上级领导临时交办的其他工作任务。"], - }, - 职权范围: { - 所受监督: - "企业资金安全、资金和费用的审批支付、资金调度、企业预算管理", - 所施监督: - "会计核算、财务分析、预算的执行与控制、资金与费用的支付、工程招投标", - 工作权限: [ - "1、对企业财务预算的分解落实、资金及费用的支付有建议权和执行权;", - "2、对企业内部财务管理制度有拟定权和监督权;", - "3、企业重大采购、投资、资产处置及工程招投标有监督权;", - "4、对财务会计人员的任用、考核、培训、晋升有建议权;", - "5、对本部门费用的使用有支配权;", - "6、对本厂安全工作有建议权,对本部门安全工作有决策权;", - "7、有权拒绝违章指挥和强令冒险作业,并对他人违章作业加以劝阻和制止。", - ], - 沟通关系企业内部: [ - "与企业领导就预算执行情况、财务分析、资金使用情况等进行请示、汇报;", - "与厂内各科室就安全管理、财务预算、固定资产保管与处置等进行沟通。", - ], - 沟通关系企业外部: [ - "与中烟公司财务部领导就本企业财务预算及资金使用情况等进行汇报;", - "与银行、税务、财政、保险等单位就资金划拨、税收、财产保险等事项进行沟通。", - ], - }, - 工作环境与条件: { - 工作时间: "不定时工作制", - 工作强度脑力劳动: "中", - 工作强度体力劳动: "低", - 出差频度: "经常出差", - 主要工作场所: "室内", - 工作环境的舒适性: "舒适", - 工作环境的特殊性: ["无"], - }, - }, - 任职资格: { - 学历: "大专及以上", - 专业: "财会", - 技术职称: "会计师及以上职称", - 所需知识: "熟悉会计及税务法规,掌握财务及企业管理知识", - 所需技能或能力: [ - "具备较强的独立工作能力、良好的沟通与团队协作能力、写作与表达能力;", - "具备良好的人际交往和社会活动能力以及计划和执行能力;", - "对企业财务有较强的理解、分析和判断的能力;", - "熟练掌握财务软件及办公软件。", - ], - 所需经历或经验: - "行业工作经验5年以上,相关中层管理岗位工作经验2年以上。", - 所需体能: "身体健康,精力充沛,能连续工作8小时以上", - 所需职业风格: "作风严谨、思维敏捷、开拓创新;为人诚实可靠、品行端正", - }, - 备注: "无", - }; - this.comData = this.jobData; - }, + created() {}, mounted() { // 请求组织架构 jobApi.getFramework().then( (res) => { let originalMindData = res.data; // 添加 id 和 expanded - let i = 1; - originalMindData["id"] = "root"; + // let i = 1; originalMindData["expanded"] = true; let addId = function (data) { - if (!data.hasOwnProperty("id")) { - data["id"] = i; - i += 1; - } + // if (!data.hasOwnProperty("id")) { + // data["id"] = i; + // i += 1; + // } if (!data.hasOwnProperty("expanded")) { data["expanded"] = false; } @@ -285,7 +191,7 @@ export default { // 修改方向 for (let j = 0; j < originalMindData["children"].length; j++) { - if (originalMindData["children"][j]["id"] % 2 == 0) { + if (j % 2 == 0) { originalMindData["children"][j]["direction"] = "right"; } else { originalMindData["children"][j]["direction"] = "left"; @@ -301,15 +207,33 @@ export default { } ); - // 绑定全局键盘输入事件 - document.onkeydown = function (e) { - // jsmind输入事件 - // console.log(e); - }; + // this.intervalId = setInterval(() => { + // if (this.jm) { + // // 绑定全局键盘输入事件 + // let that = this; + // document.onkeydown = function (e) { + // // jsmind输入事件 + // if ( + // e.code == "Enter" && + // document.activeElement.className == "jsmind-inner" + // ) { + // // 在编辑节点时输入Enter不会捕获到这里 + // let node = that.jm.get_selected_node(); + // if (node) { + // if (node.topic == "新节点") { + // that.curNewNode = node; + // that.addNewDoc(); + // } + // } + // } + // }; + // clearInterval(this.intervalId); + // } else { + // } + // }, 1000); }, methods: { showChart() { - console.log(this.mindIndex); var mind = { /* 元数据,定义思维导图的名称、作者、版本等信息 */ meta: { @@ -349,21 +273,25 @@ export default { myAddChild: function (jm, e) { let node = jm.get_selected_node(); if (node) { - let childId = jm.options.maxIndex; - jm.options.maxIndex += 1; - jm.add_node(node, childId, "新节点", ""); - jm.select_node(jm.get_node(childId)); - jm.begin_edit(childId); + if (jm.options.editable) { + let childId = jm.options.maxIndex; + jm.options.maxIndex += 1; + jm.add_node(node, childId, "新节点", ""); + jm.select_node(jm.get_node(childId)); + // jm.begin_edit(childId); + } } }, myAddBrother: function (jm, e) { let node = jm.get_selected_node(); if (node) { - let broId = jm.options.maxIndex; - jm.options.maxIndex += 1; - jm.insert_node_after(node, broId, "新节点", ""); - jm.select_node(jm.get_node(broId)); - jm.begin_edit(broId); + if (jm.options.editable && !node.isroot) { + let broId = jm.options.maxIndex; + jm.options.maxIndex += 1; + jm.insert_node_after(node, broId, "新节点", ""); + jm.select_node(jm.get_node(broId)); + // jm.begin_edit(broId); + } } }, }, // 命名的快捷键事件处理器 @@ -380,23 +308,8 @@ export default { down: 40, // }, }, - menuOpts: { - // 这里加入一个专门配置menu的对象 - showMenu: true, //showMenu 为 true 则打开右键功能 ,反之关闭 - injectionList: [ - { target: "edit", text: "编辑节点" }, - { target: "delete", text: "删除节点" }, - { target: "addChild", text: "添加子节点" }, - { target: "addBrother", text: "添加兄弟节点" }, - ], - style: { - menuItem: { - "line-height": "28px", - }, - }, - }, - // 修改与整理 - maxIndex: 10000, + // 新增节点id十万起步,保证容错 + maxIndex: 100000, }; this.jm = new jsMind(options); this.jm.show(mind); @@ -421,17 +334,22 @@ export default { this.comKey = (this.comKey + 1) % 100; }, clickNode() { - // let jsmindElement = document.getElementById('jsmind_container') - // console.log(jsmindElement.hasFocus()); - let node = this.jm.get_selected_node(); if (node) { + // 新节点 添加文档 + if (node.topic == "新节点") { + // this.curNewNode = node; + // this.addNewDoc(); + return; + } + // 重复点击不变 if (node.id === this.preSelectNodeId) { return; } else { this.preSelectNodeId = node.id; } + // 根节点无动作 if (node.isroot) { return; @@ -440,12 +358,18 @@ export default { // 请求部门详细数据 jobApi.getDepartmentDetail({ department: node.topic }).then( (res) => { - // 切换右边页面 - this.depData = res.data; - this.comName = "DepDescription"; - this.comData = this.depData; - this.renderComponent(); - this.curDep = node.topic; + if (res.code === 0) { + // 切换右边页面 + this.depData = res.data; + this.comName = "DepDescription"; + this.comData = this.depData; + this.comTitleEdit = false; + this.renderComponent(); + this.curDep = node.topic; + } else { + this.comName = "NoData"; + this.comData = null; + } }, (err) => { console.log("err: ", err); @@ -453,134 +377,132 @@ export default { ); } else { // 请求岗位详细数据 - // let jobDep = node.parent.topic; - // jobApi.getJobDetail({ department: jobDep, job: node.topic }).then( - // (res) => { - // if (res.code === 0) { - // // 数据存在 - // this.jobData = res.data; - // this.comName = "JobDescription"; - // this.comData = this.jobData; - // this.renderComponent(); - // this.curDep = jobDep; - // this.curJob = node.topic; - // } else { - // this.comName = "NoData"; - // this.comData = null; - // } - // }, - // (err) => { - // console.log("err: ", err); - // } - // ); + let jobDep = node.parent.topic; + jobApi.getJobDetail({ department: jobDep, job: node.topic }).then( + (res) => { + if (res.code === 0) { + // 数据存在 + this.jobData = res.data; + this.comName = "JobDescription"; + this.comData = this.jobData; + this.comTitleEdit = false; + this.renderComponent(); + this.curDep = jobDep; + this.curJob = node.topic; + } else { + this.comName = "NoData"; + this.comData = null; + } + }, + (err) => { + console.log("err: ", err); + } + ); + } + } + }, + editNode() { + let node = this.jm.get_selected_node(); + if (node) { + if (node.topic == "新节点") { + this.curNewNode = node; + this.addNewDoc(); + } + } + }, + addNewDoc() { + this.$confirm("新建部门还是岗位?", "提示", { + confirmButtonText: "部门", + confirmButtonClass: "confirm-button", + cancelButtonText: "岗位", + cancelButtonClass: "confirm-button", + type: "success", + }) + .then(() => { + this.depData = { + 部门名称: "<<部门名称>>", + 所属上级组织机构: "<<湖北中烟工业有限责任公司恩施卷烟厂>>", + 部门属性: "<<职能部门>>", + 是否为虚拟部门: true, + }; + this.comName = "DepDescription"; + this.comData = this.depData; + this.comTitleEdit = true; + this.renderComponent(); + + this.curDep = null; + }) + .catch(() => { + this.curDep = this.curNewNode.parent.topic; + this.curJob = null; + // 切换页面 this.jobData = { - 岗位名称: "财务科科长", + 岗位名称: "<<岗位名称>>", 岗位概况: { - 岗位名称: "科长", - 岗位级别: "10", - 定编人数: "1", - 所属部门: "财务科", - 岗位类别: "专业管理类", - 辖员人数: "9", - 直接上级: "分管领导", - 直接下级: "副科长", + 岗位名称: "<<科长>>", + 岗位级别: "<<10>>", + 定编人数: "<<1>>", + 所属部门: this.curDep, + 岗位类别: "<<专业管理类>>", + 辖员人数: "<<9>>", + 直接上级: "<<分管领导>>", + 直接下级: "<<副科长>>", }, 工作内容: { - 工作概况: - "依据《会计法》及相关财经法规,开展企业会计审核、会计监督、资金调拨、预算控制、财务分析等财务管理工作,建立、健全现代企业财务管理体系,确保企业稳定健康发展对财务的需求。", + 工作概况: "依据《会计法》及相关财经法规,……", 工作说明: { - 党风廉政建设: [ - '1、抓好全面从严治党和党风廉政建设,切实履行好党建的“一岗双责”。抓好本部门的党风廉政建设,把反腐倡廉、案件防范工作与业务工作同研究、同规划、同布置、同检查、同考核、同问责,真正做到"两手抓、两手硬",使党风廉政建设和反腐败工作始终保持应有的力度。', - ], - 部门管理: [ - "2、根据企业管理规范,组织制定企业内部财务管理制度、会计控制规范及会计核算规程,以及部门相关的岗位职责、和工作流程;", - "3、组织开展本部门综合管理体系的推行与维护工作;", - "4、根据预算管理,执行本部门费用控制;", - "5、对本部门直接管辖范围内人员、场所负全面安全管理责任。", - ], - 业务管理: [ - "6、协助分管财务厂长完善全厂的财务管理体系,主持全厂会计核算工作;", - "7、组织实施企业全面预算管理工作,监督财务预算执行情况,上报企业年度及月度财务预算;", - "8、组织企业财务分析,参与企业生产经营决策,编制财务分析资料,供领导决策参考;", - "9、筹集、调度资金,保证企业生产及经营管理的正常运行对资金的需求;", - "10、审批会计凭证及各项资金和费用;", - "11、监督和参与企业重大采购、投资、资产处置及工程招投标活动;", - "12、组织财经法规、财务制度的宣传工作。", - ], - 属员管理: [ - "13、开展本部门员工的绩效管理工作,对员工任免提出意见;", - "14、组织部门员工培训工作,督导企业会计人员的政治学习和业务学习,加强团队建设与廉政作风建设,增强团队凝聚力。", + 党风廉政建设: ["抓好全面从严治党和党风廉政建设,……"], + 工作职责: [ + "组织制定企业内部财务管理制度、会计控制规范及会计核算规程,……", ], + 部门管理: ["根据企业管理规范,……"], + 业务管理: ["协助分管财务厂长完善全厂的财务管理体系,……"], + 属员管理: ["开展本部门员工的绩效管理工作,……"], 安全职责: [ - "15、保证国家安全生产法规和厂安全生产规章制度在本部门的贯彻执行,对本部门的安全工作负全面责任,健全安全机构,层层落实安全生产责任。", - "16、贯彻“五同时”的原则,即在计划、布置、检查、总结、评比生产工作的同时,同时计划、布置、检查、总结、评比安全工作。", - "17、监督检查本部门对安全生产各项规章制度的执行情况,及时纠正“三违”行为。", - "18、组织制订并实施本部门安全生产管理规定、安全技术操作规程、安全技术措施计划。", - "19、负责组织对部门职工进行经常性的安全思想、安全知识和安全技术教育培训;组织并参加厂组织的安全活动,至少组织两次部门的安全活动,掌握其部门存在的危险因素、防范措施及事故应急措施。", - "20、负责组织本部门安全检查,每季度参加本部门安全检查一次以上,落实隐患整改,保证生产设备、安全设施、消防设施、防护器材等处于完好状态,并教育职工加强维护、正确使用。", - "21、负责本部门的应急管理,定期开展应急处置预案的演练及评估,发生事故应及时现场组织抢救,协助事故调查处理。", - "22、负责组织分析本部门安全生产动态,向上级领导汇报本部门的安全生产情况。", + "保证国家安全生产法规和厂安全生产规章制度在本部门的贯彻执行,……", ], - 临时代理工作: ["23、完成上级领导临时交办的其他工作任务。"], + 临时代理工作: ["完成上级领导临时交办的其他工作任务,……"], }, 职权范围: { - 所受监督: - "企业资金安全、资金和费用的审批支付、资金调度、企业预算管理", - 所施监督: - "会计核算、财务分析、预算的执行与控制、资金与费用的支付、工程招投标", + 所受监督: "企业资金安全、……", + 所施监督: "会计核算、……", 工作权限: [ - "1、对企业财务预算的分解落实、资金及费用的支付有建议权和执行权;", - "2、对企业内部财务管理制度有拟定权和监督权;", - "3、企业重大采购、投资、资产处置及工程招投标有监督权;", - "4、对财务会计人员的任用、考核、培训、晋升有建议权;", - "5、对本部门费用的使用有支配权;", - "6、对本厂安全工作有建议权,对本部门安全工作有决策权;", - "7、有权拒绝违章指挥和强令冒险作业,并对他人违章作业加以劝阻和制止。", + "对企业财务预算的分解落实、资金及费用的支付有建议权和执行权……", ], 沟通关系企业内部: [ - "与企业领导就预算执行情况、财务分析、资金使用情况等进行请示、汇报;", - "与厂内各科室就安全管理、财务预算、固定资产保管与处置等进行沟通。", + "与企业领导就预算执行情况、财务分析、资金使用情况等……", ], 沟通关系企业外部: [ - "与中烟公司财务部领导就本企业财务预算及资金使用情况等进行汇报;", - "与银行、税务、财政、保险等单位就资金划拨、税收、财产保险等事项进行沟通。", + "与中烟公司财务部领导就本企业财务预算及资金使用情况等……", ], }, 工作环境与条件: { - 工作时间: "不定时工作制", - 工作强度脑力劳动: "中", - 工作强度体力劳动: "低", - 出差频度: "经常出差", + 工作时间: "办公班,实际工作时间8小时", + 工作强度脑力劳动: "高", + 工作强度体力劳动: "高", + 出差频度: "驻外工作", 主要工作场所: "室内", 工作环境的舒适性: "舒适", - 工作环境的特殊性: ["无"], + 工作环境的特殊性: ["无", "噪音"], }, }, 任职资格: { - 学历: "大专及以上", - 专业: "财会", - 技术职称: "会计师及以上职称", - 所需知识: "熟悉会计及税务法规,掌握财务及企业管理知识", - 所需技能或能力: [ - "具备较强的独立工作能力、良好的沟通与团队协作能力、写作与表达能力;", - "具备良好的人际交往和社会活动能力以及计划和执行能力;", - "对企业财务有较强的理解、分析和判断的能力;", - "熟练掌握财务软件及办公软件。", - ], - 所需经历或经验: - "行业工作经验5年以上,相关中层管理岗位工作经验2年以上。", - 所需体能: "身体健康,精力充沛,能连续工作8小时以上", - 所需职业风格: - "作风严谨、思维敏捷、开拓创新;为人诚实可靠、品行端正", + 学历: "<<大专及以上>>", + 专业: "<<财会>>", + 技术职称: "<<会计师及以上职称>>", + 所需知识: "熟悉会计及税务法规,……", + 所需技能或能力: ["具备较强的独立工作能力,……"], + 所需经历或经验: "行业工作经验5年以上,……", + 所需体能: "身体健康,……", + 所需职业风格: "作风严谨,……", }, 备注: "无", }; this.comName = "JobDescription"; this.comData = this.jobData; + this.comTitleEdit = true; this.renderComponent(); - - } - } + }); }, shotScreen() { this.jm.screenshot.shootDownload(); @@ -607,29 +529,29 @@ export default { type: "warning", }); this.allowSave = true; - // this.jm.options.editable = true; this.jm.enable_edit(); }, - clickSave() { + cleanTreeData() { // 深复制对象 - let deepClone = function (obj, newObj) { - var newObj = newObj || {}; - for (let key in obj) { - if (typeof obj[key] == "object") { - newObj[key] = obj[key].constructor === Array ? [] : {}; - deepClone(obj[key], newObj[key]); - } else { - newObj[key] = obj[key]; - } - } - return newObj; - }; - let resData = deepClone(this.jm.get_data("node_tree")["data"]); + // let deepClone = function (obj, newObj) { + // var newObj = newObj || {}; + // for (let key in obj) { + // if (typeof obj[key] == "object") { + // newObj[key] = obj[key].constructor === Array ? [] : {}; + // deepClone(obj[key], newObj[key]); + // } else { + // newObj[key] = obj[key]; + // } + // } + // return newObj; + // }; + // let resData = deepClone(this.jm.get_data("node_tree")["data"]); + let resData = this.jm.get_data("node_tree")["data"]; // 去除id, expanded, direction let removeInvalidAttribution = function (data) { - if (data.hasOwnProperty("id")) { - delete data.id; - } + // if (data.hasOwnProperty("id")) { + // delete data.id; + // } if (data.hasOwnProperty("expanded")) { delete data.expanded; } @@ -638,14 +560,22 @@ export default { } if (data.hasOwnProperty("children")) { for (let i = 0; i < data.children.length; i++) { - removeInvalidAttribution(data.children[i]); + if (data.children[i].topic == "新节点") { + data.children.splice(i, 1); + i -= 1; + } else { + removeInvalidAttribution(data.children[i]); + } } } }; removeInvalidAttribution(resData); - + return resData; + }, + clickSaveTree() { + let resData = this.cleanTreeData(); // 发送请求 - jobApi.modifyFramework(resData).then( + jobApi.modifyFramework({ data: resData }).then( (res) => { if (res.code === 0) { Message({ @@ -679,6 +609,7 @@ export default { // }, err => { // console.log('err :', err); // }) + console.log("Hello"); }, clickTest1() { console.log(this.depData); @@ -687,10 +618,70 @@ export default { this.comName = "DepDescription"; this.comData = "Hello"; }, + checkNewNodeValid(nodeName) { + if (nodeName.indexOf("<") != -1 || nodeName.indexOf(">") != -1) { + return "名称不能包含'<' 或 '>'"; + } + + // 不能有重复的兄弟 + let brotherArr = this.curNewNode.parent.children; + for (let brother of brotherArr) { + if (brother.id != this.curNewNode.id) { + if (brother.topic == nodeName) { + return "名称与不能与兄弟节点重名"; + } + } + } + return "合法名称"; + }, clickSaveDoc() { + // 增加节点,判断是否可添加 + if (this.curNewNode) { + if (this.comName == "DepDescription") { + this.curDep = this.depData.部门名称; + } else { + this.curJob = this.jobData.岗位概况.岗位名称; + } + let nodeName = + this.comName == "DepDescription" ? this.curDep : this.curJob; + let msg = this.checkNewNodeValid(nodeName); + if (msg == "合法名称") { + // 保存修改到架构图 + this.jm.update_node(this.curNewNode.id, nodeName); + // 发送保存架构图请求 + let resData = this.cleanTreeData(); + // 发送请求 + jobApi.modifyFramework({ data: resData }).then( + (res) => { + if (res.code == 0) { + } + }, + (err) => { + console.log("err: ", err); + } + ); + // 还原curNewNode状态 + this.curNewNode = null; + } else { + Message({ + message: msg, + type: "error", + duration: 1 * 1000, + }); + return; + } + } + + // 修改节点 if (this.comName === "DepDescription") { - // todo 整理数据 - console.log(this.depData) + // 整理数据 + // 去除两端空字符 + for (let i of Object.keys(this.depData)) { + if (i == "是否为虚拟部门") { + continue; + } + this.depData[i] = this.depData[i].trim(); + } // 部门保存 jobApi .modifyDepartmentDetail({ @@ -712,10 +703,47 @@ export default { } ); } else if (this.comName === "JobDescription") { - // 岗位保存 - // 整理数据 - console.log(this.jobData); + let tinyData = function (data) { + for (let name in data) { + if (typeof data[name] == "string") { + data[name] = data[name].trim(); + } else if (data[name] instanceof Array) { + // 去除 "双击添加" + let arr = data[name]; + while (arr[arr.length - 1] == "双击添加") { + arr.pop(); + } + // 去除 空字符串"" + // for (let i = 0; i < arr.length; i++) { + // if (arr[i].trim() == "") { + // arr.splice(i, 1); + // i -= 1; + // } + // } + + // 去除空数组 + let deleteArr = [ + "党风廉政建设", + "工作职责", + "部门管理", + "业务管理", + "属员管理", + "安全职责", + "临时代理工作", + ]; + if (!arr.length && deleteArr.includes(name)) { + delete data[name]; + } + } else if (data[name] instanceof Object) { + tinyData(data[name]); + } else { + // console.log(data[name]); + } + } + }; + tinyData(this.jobData); + // 岗位保存 jobApi .modifyJobDetail({ data: this.jobData, @@ -724,7 +752,7 @@ export default { }) .then( (res) => { - if (res.code === 0) { + if (res.code) { Message({ message: "保存成功", type: "success", diff --git a/vue.config.js b/vue.config.js index b34a86a..ee11d71 100644 --- a/vue.config.js +++ b/vue.config.js @@ -38,8 +38,8 @@ module.exports = { }, proxy: { '/': { - target: 'http://127.0.0.1:4523/m1/1256020-0-default/', - // target: 'http://192.168.31.102:8000', + // target: 'http://127.0.0.1:4523/m1/1256020-0-default/', + target: 'http://192.168.31.102:8000', changeOrigin: true, pathRewrite: { } From 6570d27a3d40afedebff9e02758ed708cb5cbd0f Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Mon, 18 Jul 2022 21:47:07 +0800 Subject: [PATCH 04/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E8=B6=85=E7=BA=A7?= =?UTF-8?q?=E7=AE=A1=E7=90=86=E5=91=98=E7=9A=84=E7=AE=A1=E7=90=86=E7=95=8C?= =?UTF-8?q?=E9=9D=A2=E7=9A=84=E5=89=8D=E5=90=8E=E7=AB=AF=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/priotity.js | 33 +++++ src/craft.js | 14 ++ src/icons/svg/权限.svg | 2 + src/main.js | 6 +- src/router/index.js | 13 +- src/views/job/show.vue | 72 ++++----- src/views/priority/components/add.vue | 177 +++++++++++++++++++++++ src/views/priority/components/modify.vue | 174 ++++++++++++++++++++++ src/views/priority/components/select.vue | 171 ++++++++++++++++++++++ src/views/priority/priority.vue | 51 +++++++ vue.config.js | 4 +- 11 files changed, 671 insertions(+), 46 deletions(-) create mode 100644 src/api/priotity.js create mode 100644 src/craft.js create mode 100644 src/icons/svg/权限.svg create mode 100644 src/views/priority/components/add.vue create mode 100644 src/views/priority/components/modify.vue create mode 100644 src/views/priority/components/select.vue create mode 100644 src/views/priority/priority.vue diff --git a/src/api/priotity.js b/src/api/priotity.js new file mode 100644 index 0000000..57724d5 --- /dev/null +++ b/src/api/priotity.js @@ -0,0 +1,33 @@ +import request from '@/utils/request' + +export function getPriority(params) { + return request({ + url: '/priority/select', + method: 'get', + params + }) +} + +export function modifyPriority(data) { + return request({ + url: '/priority/modify', + method: 'post', + data + }) +} + +export function addUser(data) { + return request({ + url: '/priority/add-user', + method: 'post', + data + }) +} + +export function deleteUser(data) { + return request({ + url: '/priority/delete-user', + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/craft.js b/src/craft.js new file mode 100644 index 0000000..1142c5a --- /dev/null +++ b/src/craft.js @@ -0,0 +1,14 @@ +new Promise(function (resolve, reject) { + console.log(1111); + resolve(2222); +}).then(function (value) { + setTimeout(() => { + console.log(value); + }, 1000) + return 3333; +}).then(function (value) { + console.log(value); + throw "An error"; +}).catch(function (err) { + console.log(err); +}); \ No newline at end of file diff --git a/src/icons/svg/权限.svg b/src/icons/svg/权限.svg new file mode 100644 index 0000000..a84cb54 --- /dev/null +++ b/src/icons/svg/权限.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/main.js b/src/main.js index 3b08cae..2ec3d39 100644 --- a/src/main.js +++ b/src/main.js @@ -4,7 +4,7 @@ import 'normalize.css/normalize.css' // A modern alternative to CSS resets import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' -import locale from 'element-ui/lib/locale/lang/en' // lang i18n +// import locale from 'element-ui/lib/locale/lang/en' // lang i18n import '@/styles/index.scss' // global css @@ -34,9 +34,9 @@ Vue.prototype.req = request // } // set ElementUI lang to EN -Vue.use(ElementUI, { locale }) +// Vue.use(ElementUI, { locale }) // 如果想要中文版 element-ui,按如下方式声明 -// Vue.use(ElementUI) +Vue.use(ElementUI) Vue.config.productionTip = false diff --git a/src/router/index.js b/src/router/index.js index 6f7652b..0895e0e 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -150,15 +150,16 @@ export const constantRoutes = [ }, { - path: '/hello', + path: '/priority', component: Layout, + children: [{ - path: 'hello', - name: 'hello', - component: () => import('@/views/hello/hello'), + path: 'priority', + name: 'priority', + component: () => import('@/views/priority/priority'), meta: { - title: 'Hello', - icon: 'plane' + title: '权限管理', + icon: '权限' } }] }, diff --git a/src/views/job/show.vue b/src/views/job/show.vue index 8f62627..949e9d9 100644 --- a/src/views/job/show.vue +++ b/src/views/job/show.vue @@ -167,45 +167,47 @@ export default { created() {}, mounted() { // 请求组织架构 - jobApi.getFramework().then( - (res) => { - let originalMindData = res.data; - // 添加 id 和 expanded - // let i = 1; - originalMindData["expanded"] = true; - let addId = function (data) { - // if (!data.hasOwnProperty("id")) { - // data["id"] = i; - // i += 1; - // } - if (!data.hasOwnProperty("expanded")) { - data["expanded"] = false; - } - if (data.hasOwnProperty("children")) { - for (let j = 0; j < data["children"].length; j++) { - addId(data["children"][j]); + jobApi + .getFramework() + .then( + (res) => { + let originalMindData = res.data; + // 添加 id 和 expanded + // let i = 1; + originalMindData["expanded"] = true; + let addId = function (data) { + // if (!data.hasOwnProperty("id")) { + // data["id"] = i; + // i += 1; + // } + if (!data.hasOwnProperty("expanded")) { + data["expanded"] = false; + } + if (data.hasOwnProperty("children")) { + for (let j = 0; j < data["children"].length; j++) { + addId(data["children"][j]); + } + } + }; + addId(originalMindData); + + // 修改方向 + for (let j = 0; j < originalMindData["children"].length; j++) { + if (j % 2 == 0) { + originalMindData["children"][j]["direction"] = "right"; + } else { + originalMindData["children"][j]["direction"] = "left"; } } - }; - addId(originalMindData); + this.mindData = originalMindData; - // 修改方向 - for (let j = 0; j < originalMindData["children"].length; j++) { - if (j % 2 == 0) { - originalMindData["children"][j]["direction"] = "right"; - } else { - originalMindData["children"][j]["direction"] = "left"; - } + // 展示思维导图 + this.showChart(); + }, + (err) => { + console.log("err: ", err); } - this.mindData = originalMindData; - - // 展示思维导图 - this.showChart(); - }, - (err) => { - console.log("err: ", err); - } - ); + ); // this.intervalId = setInterval(() => { // if (this.jm) { diff --git a/src/views/priority/components/add.vue b/src/views/priority/components/add.vue new file mode 100644 index 0000000..01bccb3 --- /dev/null +++ b/src/views/priority/components/add.vue @@ -0,0 +1,177 @@ + + + + + \ No newline at end of file diff --git a/src/views/priority/components/modify.vue b/src/views/priority/components/modify.vue new file mode 100644 index 0000000..75022c7 --- /dev/null +++ b/src/views/priority/components/modify.vue @@ -0,0 +1,174 @@ + + + + + \ No newline at end of file diff --git a/src/views/priority/components/select.vue b/src/views/priority/components/select.vue new file mode 100644 index 0000000..361ff4c --- /dev/null +++ b/src/views/priority/components/select.vue @@ -0,0 +1,171 @@ + + + + + + diff --git a/src/views/priority/priority.vue b/src/views/priority/priority.vue new file mode 100644 index 0000000..0213561 --- /dev/null +++ b/src/views/priority/priority.vue @@ -0,0 +1,51 @@ + + + + + \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index ee11d71..b34a86a 100644 --- a/vue.config.js +++ b/vue.config.js @@ -38,8 +38,8 @@ module.exports = { }, proxy: { '/': { - // target: 'http://127.0.0.1:4523/m1/1256020-0-default/', - target: 'http://192.168.31.102:8000', + target: 'http://127.0.0.1:4523/m1/1256020-0-default/', + // target: 'http://192.168.31.102:8000', changeOrigin: true, pathRewrite: { } From 9bb2391a14c3365e7907003e6ad5a510004d92d8 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Tue, 19 Jul 2022 21:35:47 +0800 Subject: [PATCH 05/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=88=9D=E6=AD=A5?= =?UTF-8?q?=E7=9A=84=E6=9D=83=E9=99=90=E6=8E=A7=E5=88=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/job.js | 3 +- src/api/priotity.js | 11 +- src/api/user.js | 8 ++ src/assets/images/default.png | Bin 0 -> 6390 bytes src/icons/svg/我的.svg | 2 + src/layout/components/Navbar.vue | 15 +- src/permission.js | 120 +++++++++++----- src/router/index.js | 16 ++- src/store/modules/user.js | 81 ++++++----- src/utils/auth.js | 30 ++-- src/views/job/show.vue | 155 +++++++++++++++------ src/views/login/index.vue | 113 ++++++++------- src/views/priority/components/add.vue | 44 ++++-- src/views/priority/components/modify.vue | 34 +++-- src/views/priority/components/password.vue | 121 ++++++++++++++++ src/views/priority/components/select.vue | 23 +-- src/views/priority/priority.vue | 12 +- src/views/user/user.vue | 118 ++++++++++++++++ 18 files changed, 673 insertions(+), 233 deletions(-) create mode 100644 src/assets/images/default.png create mode 100644 src/icons/svg/我的.svg create mode 100644 src/views/priority/components/password.vue create mode 100644 src/views/user/user.vue diff --git a/src/api/job.js b/src/api/job.js index 555aa96..fff9118 100644 --- a/src/api/job.js +++ b/src/api/job.js @@ -46,4 +46,5 @@ export function modifyJobDetail(data) { method: 'post', data }) -} \ No newline at end of file +} + diff --git a/src/api/priotity.js b/src/api/priotity.js index 57724d5..75cdfeb 100644 --- a/src/api/priotity.js +++ b/src/api/priotity.js @@ -30,4 +30,13 @@ export function deleteUser(data) { method: 'post', data }) -} \ No newline at end of file +} + +export function verifyJobPriority(params) { + return request({ + url: '/priority/verify', + method: 'get', + params + }) + } + diff --git a/src/api/user.js b/src/api/user.js index de69f70..d4f9032 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -22,3 +22,11 @@ export function logout() { method: 'post' }) } + +export function changePassword(data) { + return request({ + url: '/user/change-password', + method: 'post', + data + }) +} \ No newline at end of file diff --git a/src/assets/images/default.png b/src/assets/images/default.png new file mode 100644 index 0000000000000000000000000000000000000000..639f85566bd1eefe3860607471de5622c1ac9ba3 GIT binary patch literal 6390 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 Ef?3fS+5i9m literal 0 HcmV?d00001 diff --git a/src/icons/svg/我的.svg b/src/icons/svg/我的.svg new file mode 100644 index 0000000..6841f91 --- /dev/null +++ b/src/icons/svg/我的.svg @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/src/layout/components/Navbar.vue b/src/layout/components/Navbar.vue index 0ca5cf6..a57ab54 100644 --- a/src/layout/components/Navbar.vue +++ b/src/layout/components/Navbar.vue @@ -7,23 +7,17 @@
- +
- Home + 首页 - - Github - - - Docs - - Log Out + 退出登录
@@ -43,8 +37,7 @@ export default { }, computed: { ...mapGetters([ - 'sidebar', - 'avatar' + 'sidebar' ]) }, methods: { diff --git a/src/permission.js b/src/permission.js index fa1ea19..8b69730 100644 --- a/src/permission.js +++ b/src/permission.js @@ -3,14 +3,14 @@ import store from './store' import { Message } from 'element-ui' import NProgress from 'nprogress' // progress bar import 'nprogress/nprogress.css' // progress bar style -import { getToken } from '@/utils/auth' // get token from cookie +// import { getToken } from '@/utils/auth' // get token from cookie import getPageTitle from '@/utils/get-page-title' NProgress.configure({ showSpinner: false }) // NProgress Configuration const whiteList = ['/login'] // no redirect whitelist -router.beforeEach(async(to, from, next) => { +router.beforeEach(async (to, from, next) => { // start progress bar NProgress.start() @@ -18,44 +18,98 @@ router.beforeEach(async(to, from, next) => { document.title = getPageTitle(to.meta.title) // determine whether the user has logged in - const hasToken = getToken() - - if (hasToken) { - if (to.path === '/login') { - // if is logged in, redirect to the home page - next({ path: '/' }) - NProgress.done() + if (to.path != '/login' && !store.state.user.id_card) { + // 没有登录,跳转到登录页面 + next({ path: '/login' }); + NProgress.done(); + } else { + let getPriorityName = function (path) { + let pos = path.indexOf('/', 1); + pos = pos == -1 ? path.length : pos; + return path.substring(1, pos); + } + let allow = false; + if (store.state.user.is_admin) { + allow = true; } else { - const hasGetUserInfo = store.getters.name - if (hasGetUserInfo) { - next() - } else { - try { - // get user info - await store.dispatch('user/getInfo') - - next() - } catch (error) { - // remove token and go to login page to re-login - await store.dispatch('user/resetToken') - Message.error(error || 'Has Error') - next(`/login?redirect=${to.path}`) - NProgress.done() - } + switch (getPriorityName(to.path)) { + case 'priority': + break; + case 'job': + // 判断岗位读权限 + allow = true; + break; + case 'person': + // 判断人员读权限 + allow = true; + break; + case 'event': + // 判断人员读权限 + allow = true; + break; + default: + allow = true; } } - } else { - /* has no token*/ - if (whiteList.indexOf(to.path) !== -1) { - // in the free login whitelist, go directly - next() + + if (allow) { + next(); } else { - // other pages that do not have permission to access are redirected to the login page. - next(`/login?redirect=${to.path}`) - NProgress.done() + Message({ + message: '权限不足', + type: 'error', + duration: 2000 + }) + next(false); + NProgress.done(); } } + + + // next() + // NProgress.done() + + // next(`/login?redirect=${to.path}`) + // NProgress.done() + + // const hasToken = getToken() + // if (hasToken) { + // if (to.path === '/login') { + // // if is logged in, redirect to the home page + // next({ path: '/' }) + // NProgress.done() + // } else { + // const hasGetUserInfo = store.getters.name + // if (hasGetUserInfo) { + // next() + // } else { + // try { + // // get user info + // await store.dispatch('user/getInfo') + + // next() + // } catch (error) { + // // remove token and go to login page to re-login + // await store.dispatch('user/resetToken') + // Message.error(error || 'Has Error') + // next(`/login?redirect=${to.path}`) + // NProgress.done() + // } + // } + // } + // } else { + // /* has no token*/ + + // if (whiteList.indexOf(to.path) !== -1) { + // // in the free login whitelist, go directly + // next() + // } else { + // // other pages that do not have permission to access are redirected to the login page. + // next(`/login?redirect=${to.path}`) + // NProgress.done() + // } + // } }) router.afterEach(() => { diff --git a/src/router/index.js b/src/router/index.js index 0895e0e..7b89e5e 100644 --- a/src/router/index.js +++ b/src/router/index.js @@ -158,7 +158,7 @@ export const constantRoutes = [ name: 'priority', component: () => import('@/views/priority/priority'), meta: { - title: '权限管理', + title: '管理员专用', icon: '权限' } }] @@ -217,6 +217,20 @@ export const constantRoutes = [ }] }, + { + path: '/user', + component: Layout, + children: [{ + path: 'user', + name: 'user', + component: () => import('@/views/user/user'), + meta: { + title: '我的', + icon: '我的' + } + }] + }, + // 404 page must be placed at the end !!! { path: '*', redirect: '/404', hidden: true } ] diff --git a/src/store/modules/user.js b/src/store/modules/user.js index 2f6423f..8c2eaeb 100644 --- a/src/store/modules/user.js +++ b/src/store/modules/user.js @@ -1,12 +1,11 @@ import { login, logout, getInfo } from '@/api/user' -import { getToken, setToken, removeToken } from '@/utils/auth' +import { setSessionItem, getSessionItem, clearSession } from '@/utils/auth' import { resetRouter } from '@/router' const getDefaultState = () => { return { - token: getToken(), - name: '', - avatar: '' + id_card: '', + is_admin: 0 } } @@ -16,14 +15,11 @@ const mutations = { RESET_STATE: (state) => { Object.assign(state, getDefaultState()) }, - SET_TOKEN: (state, token) => { - state.token = token + SET_ID_CARD: (state, id_card) => { + state.id_card = id_card; }, - SET_NAME: (state, name) => { - state.name = name - }, - SET_AVATAR: (state, avatar) => { - state.avatar = avatar + SET_IS_ADMIN: (state, is_admin) => { + state.is_admin = is_admin; } } @@ -32,10 +28,13 @@ const actions = { login({ commit }, userInfo) { const { username, password } = userInfo return new Promise((resolve, reject) => { - login({ username: username.trim(), password: password }).then(response => { + login({ id_card: username.trim(), password: password }).then(response => { const { data } = response - commit('SET_TOKEN', data.token) - setToken(data.token) + commit('SET_ID_CARD', data.id_card) + commit('SET_IS_ADMIN', data.is_admin) + // 存储到本地 + setSessionItem('id_card', data.id_card); + setSessionItem('is_admin', data.is_admin); resolve() }).catch(error => { reject(error) @@ -44,37 +43,43 @@ const actions = { }, // get user info - getInfo({ commit, state }) { - return new Promise((resolve, reject) => { - getInfo(state.token).then(response => { - const { data } = response + // getInfo({ commit, state }) { + // return new Promise((resolve, reject) => { + // getInfo(state.token).then(response => { + // const { data } = response - if (!data) { - return reject('Verification failed, please Login again.') - } + // if (!data) { + // return reject('Verification failed, please Login again.') + // } - const { name, avatar } = data + // const { name, avatar } = data - commit('SET_NAME', name) - commit('SET_AVATAR', avatar) - resolve(data) - }).catch(error => { - reject(error) - }) - }) - }, + // commit('SET_NAME', name) + // commit('SET_AVATAR', avatar) + // resolve(data) + // }).catch(error => { + // reject(error) + // }) + // }) + // }, // user logout logout({ commit, state }) { return new Promise((resolve, reject) => { - logout(state.token).then(() => { - removeToken() // must remove token first - resetRouter() - commit('RESET_STATE') - resolve() - }).catch(error => { - reject(error) - }) + // 没有token不必再发请求 + clearSession(); + resetRouter(); + commit('RESET_STATE'); + resolve(); + + // logout(state.token).then(() => { + // removeToken() // must remove token first + // resetRouter() + // commit('RESET_STATE') + // resolve() + // }).catch(error => { + // reject(error) + // }) }) }, diff --git a/src/utils/auth.js b/src/utils/auth.js index 059af18..2e4ac31 100644 --- a/src/utils/auth.js +++ b/src/utils/auth.js @@ -1,15 +1,27 @@ -import Cookies from 'js-cookie' +// import Cookies from 'js-cookie' -const TokenKey = 'vue_admin_template_token' +// const TokenKey = 'vue_admin_template_token' -export function getToken() { - return Cookies.get(TokenKey) +// export function getToken() { +// return Cookies.get(TokenKey) +// } + +// export function setToken(token) { +// return Cookies.set(TokenKey, token) +// } + +// export function removeToken() { +// return Cookies.remove(TokenKey) +// } + +export function setSessionItem(key, value) { + sessionStorage[key] = value; } -export function setToken(token) { - return Cookies.set(TokenKey, token) +export function getSessionItem(key) { + return sessionStorage[key]; } -export function removeToken() { - return Cookies.remove(TokenKey) -} +export function clearSession() { + sessionStorage.clear(); +} \ No newline at end of file diff --git a/src/views/job/show.vue b/src/views/job/show.vue index 949e9d9..63ad3a9 100644 --- a/src/views/job/show.vue +++ b/src/views/job/show.vue @@ -113,6 +113,7 @@ import DepDescription from "./components/DepDescription.vue"; import NoData from "./components/NoData.vue"; import * as jobApi from "@/api/job"; +import { verifyJobPriority } from "@/api/priotity"; import { MessageBox, Message } from "element-ui"; @@ -162,52 +163,51 @@ export default { curNewNode: null, intervalId: null, comTitleEdit: null, + writePriority: null, }; }, created() {}, mounted() { // 请求组织架构 - jobApi - .getFramework() - .then( - (res) => { - let originalMindData = res.data; - // 添加 id 和 expanded - // let i = 1; - originalMindData["expanded"] = true; - let addId = function (data) { - // if (!data.hasOwnProperty("id")) { - // data["id"] = i; - // i += 1; - // } - if (!data.hasOwnProperty("expanded")) { - data["expanded"] = false; - } - if (data.hasOwnProperty("children")) { - for (let j = 0; j < data["children"].length; j++) { - addId(data["children"][j]); - } - } - }; - addId(originalMindData); - - // 修改方向 - for (let j = 0; j < originalMindData["children"].length; j++) { - if (j % 2 == 0) { - originalMindData["children"][j]["direction"] = "right"; - } else { - originalMindData["children"][j]["direction"] = "left"; + jobApi.getFramework().then( + (res) => { + let originalMindData = res.data; + // 添加 id 和 expanded + // let i = 1; + originalMindData["expanded"] = true; + let addId = function (data) { + // if (!data.hasOwnProperty("id")) { + // data["id"] = i; + // i += 1; + // } + if (!data.hasOwnProperty("expanded")) { + data["expanded"] = false; + } + if (data.hasOwnProperty("children")) { + for (let j = 0; j < data["children"].length; j++) { + addId(data["children"][j]); } } - this.mindData = originalMindData; + }; + addId(originalMindData); - // 展示思维导图 - this.showChart(); - }, - (err) => { - console.log("err: ", err); + // 修改方向 + for (let j = 0; j < originalMindData["children"].length; j++) { + if (j % 2 == 0) { + originalMindData["children"][j]["direction"] = "right"; + } else { + originalMindData["children"][j]["direction"] = "left"; + } } - ); + this.mindData = originalMindData; + + // 展示思维导图 + this.showChart(); + }, + (err) => { + console.log("err: ", err); + } + ); // this.intervalId = setInterval(() => { // if (this.jm) { @@ -525,13 +525,65 @@ export default { set_theme(theme_name) { this.jm.set_theme(theme_name); }, - clickModify() { - this.$message({ - message: "修改数据", - type: "warning", - }); - this.allowSave = true; - this.jm.enable_edit(); + verifyWritePriority() { + if (this.writePriority === null) { + return new Promise((resolve, reject) => { + verifyJobPriority({ + id_card: this.$store.state.user.id_card, + priority_type: "job_write", + }).then( + (res) => { + this.writePriority = res.data.result; + resolve(); + }, + (err) => { + this.writePriority = 0; + console.log("err:", err); + reject(); + } + ); + }); + } else { + return new Promise((resolve, reject) => { + resolve(); + }) + } + }, + async clickModify() { + await this.verifyWritePriority(); + if (this.writePriority) { + this.allowSave = true; + this.jm.enable_edit(); + } else { + // 没有权限 + this.$message({ + message: "没有修改权限", + type: "error", + duration: 2000, + }); + } + // 判断是否有修改权限 + // verifyJobPriority({ + // id_card: this.$store.state.user.id_card, + // priority_type: "job_write", + // }).then( + // (res) => { + // if (!res.data.result) { + // // 没有权限 + // this.$message({ + // message: "没有修改权限", + // type: "warning", + // duration: 2000, + // }); + // } else { + // this.allowSave = true; + // this.jm.enable_edit(); + // } + // }, + // (err) => { + // console.log("err:", err); + // } + // ); }, cleanTreeData() { // 深复制对象 @@ -636,7 +688,20 @@ export default { } return "合法名称"; }, - clickSaveDoc() { + async clickSaveDoc() { + // 判断权限 + await this.verifyWritePriority(); + + if (!this.writePriority) { + // 没有权限 + this.$message({ + message: "没有修改权限", + type: "error", + duration: 2000, + }); + return; + } + // 增加节点,判断是否可添加 if (this.curNewNode) { if (this.comName == "DepDescription") { diff --git a/src/views/login/index.vue b/src/views/login/index.vue index f29509c..7842aac 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,7 +1,13 @@ diff --git a/src/views/priority/components/select.vue b/src/views/priority/components/select.vue index 361ff4c..014d9f7 100644 --- a/src/views/priority/components/select.vue +++ b/src/views/priority/components/select.vue @@ -1,22 +1,5 @@ @@ -17,18 +20,20 @@ import PriorityFind from "./components/select.vue"; import PriorityModify from "./components/modify.vue"; import PriorityAdd from "./components/add.vue"; +import PriorityPassword from "./components/password.vue" export default { data() { return { comName: "PriorityFind", - comData: null, + comData: null }; }, components: { PriorityFind, PriorityModify, PriorityAdd, + PriorityPassword }, methods: { handleClick(tab, event) { @@ -47,5 +52,4 @@ export default { padding-left: 5%; padding-right: 5%; } - \ No newline at end of file diff --git a/src/views/user/user.vue b/src/views/user/user.vue new file mode 100644 index 0000000..9d09653 --- /dev/null +++ b/src/views/user/user.vue @@ -0,0 +1,118 @@ + + + + + From 5b147bafaa1834aac0681091e48832318764104e Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Wed, 20 Jul 2022 10:55:47 +0800 Subject: [PATCH 06/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=B2=97=E4=BD=8D?= =?UTF-8?q?=E5=92=8C=E6=9D=83=E9=99=90=E7=AE=A1=E7=90=86=EF=BC=8C=E5=A4=87?= =?UTF-8?q?=E4=BB=BD=E5=88=B0gitee?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/priority/components/add.vue | 6 ++++++ vue.config.js | 4 ++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/views/priority/components/add.vue b/src/views/priority/components/add.vue index 6875e5c..b3f8c4c 100644 --- a/src/views/priority/components/add.vue +++ b/src/views/priority/components/add.vue @@ -142,6 +142,12 @@ export default { type: "success", duration: 2000, }); + } else { + this.$message({ + message: res.code + " " + res.msg, + type: "error", + duration: 2000, + }); } }, (err) => { diff --git a/vue.config.js b/vue.config.js index b34a86a..ee11d71 100644 --- a/vue.config.js +++ b/vue.config.js @@ -38,8 +38,8 @@ module.exports = { }, proxy: { '/': { - target: 'http://127.0.0.1:4523/m1/1256020-0-default/', - // target: 'http://192.168.31.102:8000', + // target: 'http://127.0.0.1:4523/m1/1256020-0-default/', + target: 'http://192.168.31.102:8000', changeOrigin: true, pathRewrite: { } From 452423967df55fd3eee809f613af39a81dab0f70 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Wed, 20 Jul 2022 20:32:56 +0800 Subject: [PATCH 07/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E9=A1=B5=E9=9D=A2=E7=9A=84=E6=9F=A5=E7=9C=8B=E5=B8=83=E5=B1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/images/女.png | Bin 0 -> 22952 bytes src/assets/images/男.png | Bin 0 -> 21052 bytes src/views/person/components/Change.vue | 18 +++ .../person/components/PersonInformation.vue | 19 +++ src/views/person/components/PersonPicture.vue | 93 ++++++++++++++ .../person/components/WorkInformation.vue | 14 +++ src/views/person/person.vue | 114 ++++++++++++++++-- vue.config.js | 4 +- 8 files changed, 250 insertions(+), 12 deletions(-) create mode 100644 src/assets/images/女.png create mode 100644 src/assets/images/男.png create mode 100644 src/views/person/components/Change.vue create mode 100644 src/views/person/components/PersonInformation.vue create mode 100644 src/views/person/components/PersonPicture.vue create mode 100644 src/views/person/components/WorkInformation.vue diff --git a/src/assets/images/女.png b/src/assets/images/女.png new file mode 100644 index 0000000000000000000000000000000000000000..d802b6981e8dffb6af67a75b6fd11178915142e3 GIT binary patch literal 22952 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 literal 0 HcmV?d00001 diff --git a/src/assets/images/男.png b/src/assets/images/男.png new file mode 100644 index 0000000000000000000000000000000000000000..dad88249a3b52c457c1423191e9e5434dd0db9f3 GIT binary patch literal 21052 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 +
+ 人事变动记录 +
+ + + + \ No newline at end of file diff --git a/src/views/person/components/PersonInformation.vue b/src/views/person/components/PersonInformation.vue new file mode 100644 index 0000000..bf5cfdd --- /dev/null +++ b/src/views/person/components/PersonInformation.vue @@ -0,0 +1,19 @@ + + + + + \ No newline at end of file diff --git a/src/views/person/components/PersonPicture.vue b/src/views/person/components/PersonPicture.vue new file mode 100644 index 0000000..ff01e40 --- /dev/null +++ b/src/views/person/components/PersonPicture.vue @@ -0,0 +1,93 @@ + + + + + \ No newline at end of file diff --git a/src/views/person/components/WorkInformation.vue b/src/views/person/components/WorkInformation.vue new file mode 100644 index 0000000..3868539 --- /dev/null +++ b/src/views/person/components/WorkInformation.vue @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/src/views/person/person.vue b/src/views/person/person.vue index 8ee0c2d..df5dfaf 100644 --- a/src/views/person/person.vue +++ b/src/views/person/person.vue @@ -1,20 +1,114 @@ \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index ee11d71..b34a86a 100644 --- a/vue.config.js +++ b/vue.config.js @@ -38,8 +38,8 @@ module.exports = { }, proxy: { '/': { - // target: 'http://127.0.0.1:4523/m1/1256020-0-default/', - target: 'http://192.168.31.102:8000', + target: 'http://127.0.0.1:4523/m1/1256020-0-default/', + // target: 'http://192.168.31.102:8000', changeOrigin: true, pathRewrite: { } From f1f4752d82c42ecd448cc972ba50799d8cda45ef Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Wed, 3 Aug 2022 16:55:35 +0800 Subject: [PATCH 08/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E7=9A=84=E4=BF=A1=E6=81=AF=E5=B1=95=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/person.js | 9 + src/views/job/show.vue | 4 + src/views/login/index.vue | 4 +- .../person/components/PersonInformation.vue | 193 ++++++++++++++- src/views/person/components/PersonPicture.vue | 120 ++++++++-- .../person/components/WorkInformation.vue | 222 +++++++++++++++++- src/views/person/person.vue | 135 ++++++++--- vue.config.js | 4 +- 8 files changed, 619 insertions(+), 72 deletions(-) create mode 100644 src/api/person.js diff --git a/src/api/person.js b/src/api/person.js new file mode 100644 index 0000000..b27ca57 --- /dev/null +++ b/src/api/person.js @@ -0,0 +1,9 @@ +import request from '@/utils/request' + +export function getPersonData(params) { + return request({ + url: '/person/person-information2', + method: 'get', + params + }) +} \ No newline at end of file diff --git a/src/views/job/show.vue b/src/views/job/show.vue index 63ad3a9..cba7ec4 100644 --- a/src/views/job/show.vue +++ b/src/views/job/show.vue @@ -209,6 +209,10 @@ export default { } ); + // admin + if (this.$store.state.user.is_admin) { + this.writePriority = true; + } // this.intervalId = setInterval(() => { // if (this.jm) { // // 绑定全局键盘输入事件 diff --git a/src/views/login/index.vue b/src/views/login/index.vue index 7842aac..b0207e4 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -87,8 +87,8 @@ export default { }; return { loginForm: { - username: "admin", - password: "admin", + username: "422823198510203671", + password: "123456", }, loginRules: { username: [ diff --git a/src/views/person/components/PersonInformation.vue b/src/views/person/components/PersonInformation.vue index bf5cfdd..1209ed3 100644 --- a/src/views/person/components/PersonInformation.vue +++ b/src/views/person/components/PersonInformation.vue @@ -1,19 +1,196 @@ \ No newline at end of file diff --git a/src/views/person/components/PersonPicture.vue b/src/views/person/components/PersonPicture.vue index ff01e40..7e9bd3f 100644 --- a/src/views/person/components/PersonPicture.vue +++ b/src/views/person/components/PersonPicture.vue @@ -1,29 +1,28 @@ @@ -55,20 +105,42 @@ export default { .content-side { width: 200px; height: 1100px; - background: #ffcccc; + border: 1px #e4e7ed solid; float: right; } -.pp-half-block1 { - display: inline-block; +.pp-block1-left { + float: left; + margin-right: 1%; border: 1px #e4e7ed solid; - /* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */ - height: 200px; + height: 400px; + width: 49%; +} + +.pp-block1-right { + float: left; + border: 1px #e4e7ed solid; + height: 400px; width: 50%; } .pp-block2 { - margin-top: 10px; + margin-top: 0px; +} + +.pp-block2-left { + float: left; + margin-right: 1%; + /* border: 1px #e4e7ed solid; */ + height: 200px; + width: 49%; +} + +.pp-block2-right { + float: left; + /* border: 1px #e4e7ed solid; */ + height: 200px; + width: 50%; } .pp-half-block2 { @@ -86,7 +158,7 @@ export default { } .item-content-div { - /* width: 100%; */ + width: 100%; height: 80%; border: 1px #e4e7ed solid; } diff --git a/src/views/person/components/WorkInformation.vue b/src/views/person/components/WorkInformation.vue index 3868539..0fe90e4 100644 --- a/src/views/person/components/WorkInformation.vue +++ b/src/views/person/components/WorkInformation.vue @@ -1,14 +1,232 @@ \ No newline at end of file diff --git a/src/views/person/person.vue b/src/views/person/person.vue index df5dfaf..0344ade 100644 --- a/src/views/person/person.vue +++ b/src/views/person/person.vue @@ -10,19 +10,20 @@

- {{ personData.name }} + {{ personData["姓名"] }}

- {{ personData.sex }} - {{ personData.age }}岁 - {{ personData.education }} - {{ - personData.political_identity - }} + {{ personData["性别"] }} + {{ personAge }}岁 + {{ personEd }} + {{ personData["政治面貌"] }}

- 工号:{{ workData.person_id }} - 手机号:{{ personData.phone }} + {{ personData["部门名称"] }} + {{ personData["岗位名称"] }} + 手机号:{{ personData["联系电话"] }}

@@ -33,7 +34,7 @@ - + @@ -43,6 +44,8 @@ import ComWorkInformation from "./components/WorkInformation.vue"; import ComPersonInformation from "./components/PersonInformation.vue"; import ComChange from "./components/Change.vue"; +import * as personApi from "@/api/person"; + export default { name: "person", components: { @@ -55,33 +58,99 @@ export default { return { comName: "ComPersonPicture", personData: { - age: 49, - education: "大学", - id_card: "422827197309031821", - major: "人力资源管理", - name: "杨秀芬", - nation: "苗族", - phone: "13986854131", - political_identity: "中共党员", - sex: "女", - working_date: "1994-05-01", - working_years: 28.24, - }, - workData: { - person_id: "1242280311961615", - archives_unit: "恩施卷烟厂", - department: "厂办公室", - employer: "恩施卷烟厂", - employment_relationship: "在职", - job: "档案管理员", - team: "", - wage_relation_unit: "恩施卷烟厂", + 机构名称: "湖北中烟工业有限责任公司恩施卷烟厂", + 部门名称: "厂办公室", + 岗位名称: "档案管理员", + 现岗位起始时间: "2008-12-01", + 姓名: "杨秀芬", + 用工形式: "劳动关系", + 人员状态: "在职", + 个人职级: "正科级", + 岗位类别: "专业技术类", + 任职单位: "1", + 职务名称: "1", + 职务属性: "1", + 职务级别: "1", + 任现职务级别时间: "1", + 性别: "女", + 出生日期: "1973-09-03", + 证件类型: "身份证", + 证件号码: "422827197309031821", + 民族: "苗族", + 籍贯: "湖北来凤", + 出生地: "湖北来凤", + 参加工作时间: "1994-05-01", + 进入行业时间: "1998-06-01", + 到本单位时间: "1998-06-01", + 行业入职类别: "社会招聘", + 本单位入职类别: "社会招聘", + 联系电话: "13986854131", + 国籍: "中国", + 预计退休年龄: "55", + 是否本单位集中保管档案: "是", + 档案保管机构: "本级人事部门", + 政治面貌: "中共党员", + 入党时间: "2012-12-18", + 最高全日制学历: "初中", + 最高全日制学位: "无", + "全日制毕(肄)业学校(单位)名称": "1", + 全日制学校所在国家: "1", + "全日制毕(肄)业专业名称": "1", + 最高在职学历: "大学", + 最高在职学位: "无", + "在职毕(肄)业学校(单位)名称": "华中农业大学", + 在职学校所在国家: "中国", + "在职毕(肄)业专业名称": "人力资源管理", + 最高专业技术资格名称: "助理馆员", + 最高专业技术资格等级: "初级", + 最高职业技能等级名称: "1", + 最高职业技能等级级别: "1", + 备注说明: "1", }, }; }, + mounted() { + // 发送请求 + personApi.getPersonData({ + "id_card": this.$store.state.user.id_card + }).then( + (res)=> { + this.personData = res.data; + }, + (err) => { + console.log('err:', err); + } + ) + }, computed: { getPicUrl() { - return require("@/assets/images/" + this.personData.sex + ".png"); + return require("@/assets/images/" + this.personData["性别"] + ".png"); + }, + personAge() { + return this.getAge(this.personData["出生日期"]); + }, + personEd() { + let education = "-"; + if (this.personData["最高在职学历"]) { + education = this.personData["最高在职学历"]; + } else if (this.personData["最高全日制学历"]) { + education = this.personData["最高全日制学历"]; + } + return education; + }, + }, + methods: { + getAge(birthday) { + //出生时间 毫秒 + let birthDayTime = new Date(birthday).getTime(); + if (birthDayTime !== birthDayTime) { + // NaN + return "-"; + } + //当前时间 毫秒 + let nowTime = new Date().getTime(); + //一年毫秒数(365 * 86400000 = 31536000000) + return Math.ceil((nowTime - birthDayTime) / 31536000000); }, }, }; @@ -109,6 +178,4 @@ export default { .basic-msg-item { margin-right: 20px; } - - \ No newline at end of file diff --git a/vue.config.js b/vue.config.js index b34a86a..ee11d71 100644 --- a/vue.config.js +++ b/vue.config.js @@ -38,8 +38,8 @@ module.exports = { }, proxy: { '/': { - target: 'http://127.0.0.1:4523/m1/1256020-0-default/', - // target: 'http://192.168.31.102:8000', + // target: 'http://127.0.0.1:4523/m1/1256020-0-default/', + target: 'http://192.168.31.102:8000', changeOrigin: true, pathRewrite: { } From c866c076f6b4b397f0af2964da5a0e5b1343e1a4 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Tue, 18 Oct 2022 08:32:17 +0800 Subject: [PATCH 09/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BE=A7=E8=BE=B9?= =?UTF-8?q?=E5=AF=BC=E8=88=AA=E6=A0=8F=E7=9A=84=E5=8C=BA=E5=88=AB=E5=B1=95?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/layout/components/Sidebar/SidebarItem.vue | 95 ++++--- src/router/index.js | 14 + src/views/login/index.vue | 2 + src/views/person/person.vue | 59 +--- src/views/person_review/person_review.vue | 255 ++++++++++++++++++ vue.config.js | 5 +- 6 files changed, 340 insertions(+), 90 deletions(-) create mode 100644 src/views/person_review/person_review.vue diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue index a418c3d..3050cf8 100644 --- a/src/layout/components/Sidebar/SidebarItem.vue +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -1,16 +1,43 @@ @@ -147,6 +156,8 @@ export default { }, ], appraiseData: {}, + honorData: [], + advanceData: [], }; }, mounted() { @@ -213,6 +224,34 @@ export default { console.log("err", err); } ); + + // 发送荣誉请求 + personApi.getHonor({ id_card: this.$store.state.user.id_card }).then( + (res) => { + this.honorData = res.data; + }, + (err) => { + console.log("err", err); + } + ); + + // 发送先进请求 + personApi.getAdvance({ id_card: this.$store.state.user.id_card }).then( + (res) => { + let advanceData = res.data; + // 按时间降序排列 + function sortByTime(x, y) { + let numX = parseInt(x), + numY = parseInt(y); + return numY - numX; + } + advanceData.sort(sortByTime); + this.advanceData = advanceData; + }, + (err) => { + console.log("err", err); + } + ); }, computed: { industryExperience() { @@ -359,6 +398,40 @@ export default { }; myChart.setOption(option); }, + getHonorTagType(value) { + if (value.includes("全国")) { + // 红色 + return "danger"; + } + if (value.includes("省级")) { + // 橙色 + return "warning"; + } + if (value.includes("州级")) { + // 蓝色 + return ""; + } + if (value.includes("厂级")) { + // 绿色 + return "success"; + } + return ""; + }, + getHonorIconName(value) { + if (value.includes("全国")) { + return "红色勋章"; + } + if (value.includes("省级")) { + return "橙色勋章"; + } + if (value.includes("州级")) { + return "蓝色勋章"; + } + if (value.includes("厂级")) { + return "绿色勋章"; + } + return "蓝色勋章"; + }, }, }; @@ -382,6 +455,10 @@ export default { float: right; } +.pp-block1 { + overflow: hidden; +} + .pp-block1-left { float: left; margin-right: 1%; @@ -399,6 +476,7 @@ export default { .pp-block2 { margin-top: 0px; + /* overflow: hidden; */ } .pp-block2-left { @@ -416,14 +494,6 @@ export default { width: 50%; } -.pp-half-block2 { - display: inline-block; - /* border: 1px #e4e7ed solid; */ - /* box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.1); */ - height: 200px; - width: 50%; -} - .item-title-p { border-left: 4px solid #000; padding-left: 10px; @@ -434,15 +504,24 @@ export default { width: 100%; height: 80%; border: 1px #e4e7ed solid; + margin-right: 10px; } .tag-bar { margin: 10px 0px 0px 10px; } + +.honor-bar { + margin: 10px 0px 0px 10px; +} \ No newline at end of file From 2b180f8dd3b4d9126809259c1b2652460751b259 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Wed, 28 Dec 2022 17:27:56 +0800 Subject: [PATCH 33/47] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E4=BA=86=E5=91=98?= =?UTF-8?q?=E5=B7=A5=E9=A1=B5=E9=9D=A2=E7=9A=84=E5=88=9B=E6=96=B0=E3=80=81?= =?UTF-8?q?=E6=B4=BB=E5=8A=A8=E3=80=81=E8=AE=BA=E6=96=87=E6=A8=A1=E5=9D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/person.js | 24 +++ src/views/person/components/PersonPicture.vue | 178 ++++++++++++++---- 2 files changed, 167 insertions(+), 35 deletions(-) diff --git a/src/api/person.js b/src/api/person.js index 05c4de2..c892699 100644 --- a/src/api/person.js +++ b/src/api/person.js @@ -102,4 +102,28 @@ export function getAdvance(params) { method: 'get', params }) +} + +export function getInnovation(params) { + return request({ + url: '/person/innovation', + method: 'get', + params + }) +} + +export function getArticle(params) { + return request({ + url: '/person/article', + method: 'get', + params + }) +} + +export function getActivity(params) { + return request({ + url: '/person/activity', + method: 'get', + params + }) } \ No newline at end of file diff --git a/src/views/person/components/PersonPicture.vue b/src/views/person/components/PersonPicture.vue index 16373f7..fa37b13 100644 --- a/src/views/person/components/PersonPicture.vue +++ b/src/views/person/components/PersonPicture.vue @@ -59,12 +59,79 @@
-
+

创新

-
+
+ + + + + + + + + + +
-
+

活动

+
+ + + + +
+
+
+ +
+
+

论文

+
+ + + + + + + + + + + + + +
+
+
+

项目

@@ -108,7 +175,6 @@
- @@ -124,40 +190,14 @@ export default { data() { return { personData: this.data, - wordcloudData: [ - { name: "女", value: 1 }, - { name: "三连优秀", value: 90 }, - { name: "学士", value: 40 }, - { name: "大学", value: 40 }, - { name: "90后", value: 1 }, - { name: "兴趣盎然", value: 24 }, - { name: "初出茅庐", value: 10 }, - { name: "中共党员", value: 25 }, - { name: "本省人", value: 1 }, - { name: "三次优秀", value: 90 }, - { name: "文思敏捷", value: 70 }, - { name: "新党员", value: 25 }, - { name: "运动达人", value: 24 }, - { name: "初来乍到", value: 20 }, - { name: "四级电工", value: 80 }, - { name: "优秀员工", value: 90 }, - { name: "积极踊跃", value: 8 }, - { name: "创新达人", value: 90 }, - { name: "初级助理工程师", value: 80 }, - ], - radarData: [ - { - value: [49, 45, 34, 20, 78], - name: "个人", - }, - { - value: [33, 73, 21, 22, 57], - name: "全员平均", - }, - ], + wordcloudData: [], + radarData: [], appraiseData: {}, honorData: [], advanceData: [], + innovationData: [], + articleData: [], + activityData: [], }; }, mounted() { @@ -252,6 +292,36 @@ export default { console.log("err", err); } ); + + // 发送创新请求 + personApi.getInnovation({ id_card: this.$store.state.user.id_card }).then( + (res) => { + this.innovationData = res.data; + }, + (err) => { + console.log("err", err); + } + ); + + // 发送论文请求 + personApi.getArticle({ id_card: this.$store.state.user.id_card }).then( + (res) => { + this.articleData = res.data; + }, + (err) => { + console.log("err", err); + } + ); + + // 发送活动请求 + personApi.getActivity({ id_card: this.$store.state.user.id_card }).then( + (res) => { + this.activityData = res.data; + }, + (err) => { + console.log("err", err); + } + ); }, computed: { industryExperience() { @@ -260,6 +330,40 @@ export default { jobExperience() { return this.getAge(this.personData["现岗位起始时间"]); }, + activityColumns() { + let columns = [ + { + prop: "year", + label: "年份", + width: "100", + sortable: true, + }, + { + prop: "name", + label: "活动名", + }, + { + prop: "item", + label: "项目名", + }, + { + prop: "grade", + label: "级别", + width: "80", + }, + ]; + // 动态添加列名 + if (this.activityData.length > 0) { + let row = this.activityData[0]; + if ("prize" in row) { + columns.push({ prop: "prize", label: "奖品" }); + } + if ("role" in row) { + columns.push({ prop: "role", label: "角色", width: "80" }); + } + } + return columns; + }, }, methods: { showRadarChart() { @@ -494,6 +598,10 @@ export default { width: 50%; } +.height-350 { + height: 350px; +} + .item-title-p { border-left: 4px solid #000; padding-left: 10px; From a025baf3ccfea2fef8bc69b80776e0c33d2153a5 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Thu, 29 Dec 2022 11:16:44 +0800 Subject: [PATCH 34/47] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E5=91=98=E5=B7=A5?= =?UTF-8?q?=E4=BF=A1=E6=81=AF=E9=A1=B5=E9=9D=A2=E7=9A=84=E4=BA=8B=E5=8A=A1?= =?UTF-8?q?=E5=92=8C=E5=85=9A=E5=8A=A1=E6=A8=A1=E5=9D=97=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/person.js | 16 +++ src/icons/svg/优秀党员.svg | 1 + src/views/person/components/PersonPicture.vue | 106 +++++++++++++----- src/views/person/review.vue | 2 +- 4 files changed, 98 insertions(+), 27 deletions(-) create mode 100644 src/icons/svg/优秀党员.svg diff --git a/src/api/person.js b/src/api/person.js index c892699..87af371 100644 --- a/src/api/person.js +++ b/src/api/person.js @@ -126,4 +126,20 @@ export function getActivity(params) { method: 'get', params }) +} + +export function getRoutine(params) { + return request({ + url: '/person/routine', + method: 'get', + params + }) +} + +export function getParty(params) { + return request({ + url: '/person/party', + method: 'get', + params + }) } \ No newline at end of file diff --git a/src/icons/svg/优秀党员.svg b/src/icons/svg/优秀党员.svg new file mode 100644 index 0000000..eeb33d1 --- /dev/null +++ b/src/icons/svg/优秀党员.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/views/person/components/PersonPicture.vue b/src/views/person/components/PersonPicture.vue index fa37b13..29eea71 100644 --- a/src/views/person/components/PersonPicture.vue +++ b/src/views/person/components/PersonPicture.vue @@ -104,46 +104,36 @@
-

论文

+

事务

+ + - - - - - - - - + +
-

项目

-
-
-
- -
-
-

事务

-
-
-

党务

-
+
+
+ + {{ value }} +
+
@@ -175,6 +165,40 @@ + +
+
+

论文

+
+ + + + + + + + + + + + + +
+
+
+

项目

+
+
+
@@ -198,6 +222,8 @@ export default { innovationData: [], articleData: [], activityData: [], + routineData: [], + partyData: [], }; }, mounted() { @@ -322,6 +348,34 @@ export default { console.log("err", err); } ); + + // 发送事务请求 + personApi.getRoutine({ id_card: this.$store.state.user.id_card }).then( + (res) => { + this.routineData = res.data; + }, + (err) => { + console.log("err", err); + } + ); + + // 发送党务请求 + personApi.getParty({ id_card: this.$store.state.user.id_card }).then( + (res) => { + let partyData = res.data; + // 按时间降序排列 + function sortByTime(x, y) { + let numX = parseInt(x), + numY = parseInt(y); + return numY - numX; + } + partyData.sort(sortByTime); + this.partyData = partyData; + }, + (err) => { + console.log("err", err); + } + ); }, computed: { industryExperience() { diff --git a/src/views/person/review.vue b/src/views/person/review.vue index f9d82bd..85e332d 100644 --- a/src/views/person/review.vue +++ b/src/views/person/review.vue @@ -546,7 +546,7 @@

厂里累计有 {{ totalPersonProjectNum }} - 人负责过项目,最多有人负责过7次项目。 + 人负责过项目,最多有人负责过5次项目。

立项最多的年份是2021年,共计13个项目;立项最少的年份是2022年,仅1个项目。 From 7510ef8f671b425ee05fe7fcb046f8ada1b6cd63 Mon Sep 17 00:00:00 2001 From: Endercad <547473437@qq.com> Date: Sun, 1 Jan 2023 16:36:06 +0800 Subject: [PATCH 35/47] 2023/1/1 --- src/api/job.js | 66 ++- src/api/user.js | 2 +- src/layout/components/Sidebar/SidebarItem.vue | 17 +- src/router/index.js | 6 + src/store/modules/user.js | 11 +- src/utils/request.js | 87 ++-- src/views/analysis/show.vue | 21 +- src/views/job/evaluation.vue | 444 +++++++++++++++++- src/views/job/score.vue | 251 ++++++++++ src/views/job/show.vue | 4 +- src/views/person/review.vue | 159 ++++++- vue.config.js | 6 +- 12 files changed, 976 insertions(+), 98 deletions(-) create mode 100644 src/views/job/score.vue diff --git a/src/api/job.js b/src/api/job.js index fff9118..ec07681 100644 --- a/src/api/job.js +++ b/src/api/job.js @@ -17,34 +17,72 @@ export function modifyFramework(data) { } export function getDepartmentDetail(params) { - return request({ - url: '/job/department-detail', - method: 'get', - params - }) + return request({ + url: '/job/department-detail', + method: 'get', + params + }) } export function modifyDepartmentDetail(data) { return request({ - url: '/job/department-detail', - method: 'post', - data + url: '/job/department-detail', + method: 'post', + data }) } export function getJobDetail(params) { return request({ - url: '/job/job-detail', - method: 'get', - params + url: '/job/job-detail', + method: 'get', + params }) } export function modifyJobDetail(data) { return request({ - url: '/job/job-detail', - method: 'post', - data + url: '/job/job-detail', + method: 'post', + data }) } +export function queryDepartmentJob() { + return request({ + url: '/ahp/department-job-copy/query', + method: 'get' + }) +} + +export function queryAhpFramework(params) { + return request({ + url: '/ahp/framework/query', + method: 'get', + params + }) +} + +export function modifyAhpFramework(params) { + return request({ + url: '/ahp/framework/save', + method: 'post', + params + }) +} + +export function queryScore(params) { + return request({ + url: '/ahp/score/query', + method: 'get', + params + }) +} + +export function saveScore(params) { + return request({ + url: '/ahp/score/save', + method: 'post', + params + }) +} diff --git a/src/api/user.js b/src/api/user.js index 4b13514..f9d6e28 100644 --- a/src/api/user.js +++ b/src/api/user.js @@ -29,4 +29,4 @@ export function changePassword(data) { method: 'post', data }) -} \ No newline at end of file +} diff --git a/src/layout/components/Sidebar/SidebarItem.vue b/src/layout/components/Sidebar/SidebarItem.vue index 3050cf8..acdfa7e 100644 --- a/src/layout/components/Sidebar/SidebarItem.vue +++ b/src/layout/components/Sidebar/SidebarItem.vue @@ -1,5 +1,12 @@ --> -

{{index+1}}.{{item}}

+

{{index+1}}.{{item}}

+ > 提交 diff --git a/src/views/person/components/PersonPicture.vue b/src/views/person/components/PersonPicture.vue index 29eea71..5c61ad0 100644 --- a/src/views/person/components/PersonPicture.vue +++ b/src/views/person/components/PersonPicture.vue @@ -376,6 +376,7 @@ export default { console.log("err", err); } ); + }, computed: { industryExperience() { diff --git a/src/views/person/review.vue b/src/views/person/review.vue index 433ea92..da9b409 100644 --- a/src/views/person/review.vue +++ b/src/views/person/review.vue @@ -602,7 +602,6 @@ export default { fullSchoolData: {}, workSchoolData: {}, schoolCategory: ["211", "985"], - majorData: [], fullMajorData: [], workMajorData: [], @@ -1054,25 +1053,22 @@ export default { tempArr.push(workSchoolData["级别"][key]); } this.workSchoolData["级别"] = tempArr; + //专业 + // 全日制专业 tempArr = []; - tempObj = { 类别: "全日制" }; - Object.assign(tempObj, resData["全日制专业"]); - tempArr.push(tempObj); - tempObj = { 类别: "在职" }; - Object.assign(tempObj, resData["在职专业"]); - tempArr.push(tempObj); - this.majorData = tempArr; - tempArr = []; - tempArr2 = []; - for (let major in this.majorData[0]) { - tempArr.push({ name: major, value: this.majorData[0][major] }); + let fullMajorData = resData['全日制专业'] + for (let major in fullMajorData) { + tempArr.push({name: major, value: fullMajorData[major]}) } this.fullMajorData = tempArr; - for (let major in this.majorData[1]) { - tempArr2.push({ name: major, value: this.majorData[1][major] }); - this.workMajorData = tempArr2; + // 在职专业 + tempArr = [] + let workMajorData = resData['在职专业'] + for (let major in workMajorData) { + tempArr.push({name: major, value: workMajorData[major]}) } + this.workMajorData = tempArr; }, (err) => { console.log("err", err); @@ -1907,30 +1903,10 @@ export default { }, showFullMajorPie() { let option = { - grid: [ - { - x: "70%", - y: "20%", - width: "30%", - height: "60%", - }, - ], - xAxis: [ - { - gridIndex: 0, - type: "category", - data: this.majorCategory, - }, - ], - yAxis: [ - { - gridIndex: 0, - }, - ], title: [ { text: "全日制教育专业分布饼图", - x: "20%", + x: "center", y: "3%", }, ], @@ -1942,8 +1918,8 @@ export default { series: [ { type: "pie", - radius: "50%", - center: ["30%", "50%"], + // radius: "50%", + // center: ["30%", "50%"], data: this.fullMajorData, }, ], @@ -1952,30 +1928,10 @@ export default { }, showWorkMajorPie() { let option = { - grid: [ - { - x: "70%", - y: "20%", - width: "30%", - height: "60%", - }, - ], - xAxis: [ - { - gridIndex: 0, - type: "category", - data: this.majorCategory, - }, - ], - yAxis: [ - { - gridIndex: 0, - }, - ], title: [ { text: "在职教育专业分布饼图", - x: "20%", + x: "center", y: "3%", }, ], @@ -1987,8 +1943,8 @@ export default { series: [ { type: "pie", - radius: "50%", - center: ["30%", "50%"], + // radius: "50%", + // center: ["30%", "50%"], data: this.workMajorData, }, ], @@ -1999,12 +1955,6 @@ export default { if (tab.label == "在职") { setTimeout(this.showWorkMajorPie, 10); } - console.log(this.majorData); - console.log(this.degreeData); - personApi.getReviewEducation().then((res) => { - console.log(res.data); - }); - console.log(this.fullEduData); }, showFullCheckBar() { let option = { diff --git a/vue.config.js b/vue.config.js index 1ac3c11..52e4358 100644 --- a/vue.config.js +++ b/vue.config.js @@ -38,17 +38,9 @@ module.exports = { }, proxy: { '/': { - // target: 'http://127.0.0.1:4523/m1/1256020-0-default/', -<<<<<<< HEAD - // target: 'http://127.0.0.1:8000', - // target: 'http://192.168.31.102:8000', - // target: 'http://222.20.95.239:8000', - target: 'http://127.0.0.1:4523/m1/1256020-0-default', - // target: 'http://127.0.0.1:8123', -======= // target: 'http://222.20.95.239:8000', + // target: 'http://127.0.0.1:4523/m1/1256020-0-default', target: 'http://127.0.0.1:8123', ->>>>>>> a025baf3ccfea2fef8bc69b80776e0c33d2153a5 changeOrigin: true, pathRewrite: { } From f98adc4bba579fbd93a59a3930142736861e41eb Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Sat, 7 Jan 2023 17:29:35 +0800 Subject: [PATCH 37/47] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E4=BA=BA?= =?UTF-8?q?=E6=89=8D=E7=94=BB=E5=83=8F=E6=98=BE=E7=A4=BA=E6=9A=82=E6=97=A0?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/api/job.js | 2 +- src/api/table.js | 9 - src/utils/request.js | 21 +- src/views/job/show copy.vue | 891 ++++++++++++++++++ src/views/job/show.vue | 337 +++---- src/views/person/components/PersonPicture.vue | 3 + 6 files changed, 1074 insertions(+), 189 deletions(-) delete mode 100644 src/api/table.js create mode 100644 src/views/job/show copy.vue diff --git a/src/api/job.js b/src/api/job.js index ec07681..a1acca4 100644 --- a/src/api/job.js +++ b/src/api/job.js @@ -50,7 +50,7 @@ export function modifyJobDetail(data) { export function queryDepartmentJob() { return request({ - url: '/ahp/department-job-copy/query', + url: '/ahp/department-job/query', method: 'get' }) } diff --git a/src/api/table.js b/src/api/table.js deleted file mode 100644 index 2752f52..0000000 --- a/src/api/table.js +++ /dev/null @@ -1,9 +0,0 @@ -import request from '@/utils/request' - -export function getList(params) { - return request({ - url: '/vue-admin-template/table/list', - method: 'get', - params - }) -} diff --git a/src/utils/request.js b/src/utils/request.js index c0103c1..4ddcc72 100644 --- a/src/utils/request.js +++ b/src/utils/request.js @@ -84,17 +84,16 @@ service.interceptors.response.use( response => { const res = response.data // 状态码 - return res - // if (res.code !== 0) { - // Message({ - // message: `${res.code}: ${res.msg}` || 'Error check your token or method', - // type: 'error', - // duration: 2 * 1000 - // }) - // return Promise.reject(new Error(res.msg || 'Error')) - // } else { - // return res - // } + if (res.code !== 0) { + Message({ + message: `${res.code}: ${res.msg}` || 'Error check your token or method', + type: 'error', + duration: 2 * 1000 + }) + return Promise.reject(new Error(res.msg || 'Error')) + } else { + return res + } }, error => { Message({ diff --git a/src/views/job/show copy.vue b/src/views/job/show copy.vue new file mode 100644 index 0000000..15b4b50 --- /dev/null +++ b/src/views/job/show copy.vue @@ -0,0 +1,891 @@ + + + + + diff --git a/src/views/job/show.vue b/src/views/job/show.vue index 15b4b50..15accbb 100644 --- a/src/views/job/show.vue +++ b/src/views/job/show.vue @@ -555,18 +555,19 @@ export default { } }, async clickModify() { - await this.verifyWritePriority(); - if (this.writePriority) { - this.allowSave = true; - this.jm.enable_edit(); - } else { - // 没有权限 - this.$message({ - message: "没有修改权限", - type: "error", - duration: 2000, - }); - } + // await this.verifyWritePriority(); + // if (this.writePriority) { + // this.allowSave = true; + // this.jm.enable_edit(); + // } else { + // // 没有权限 + // this.$message({ + // message: "没有修改权限", + // type: "error", + // duration: 2000, + // }); + // } + // 判断是否有修改权限 // verifyJobPriority({ // id_card: this.$store.state.user.id_card, @@ -632,23 +633,23 @@ export default { return resData; }, clickSaveTree() { - let resData = this.cleanTreeData(); - // 发送请求 - jobApi.modifyFramework({ data: resData }).then( - (res) => { - if (res.code === 0) { - Message({ - message: "保存成功", - type: "success", - duration: 1 * 1000, - }); - } - console.log(resData); - }, - (err) => { - console.log("err: ", err); - } - ); + // let resData = this.cleanTreeData(); + // // 发送请求 + // jobApi.modifyFramework({ data: resData }).then( + // (res) => { + // if (res.code === 0) { + // Message({ + // message: "保存成功", + // type: "success", + // duration: 1 * 1000, + // }); + // } + // console.log(resData); + // }, + // (err) => { + // console.log("err: ", err); + // } + // ); }, clickHello() { // 发起请求 @@ -695,149 +696,149 @@ export default { return "合法名称"; }, async clickSaveDoc() { - // 判断权限 - await this.verifyWritePriority(); + // // 判断权限 + // await this.verifyWritePriority(); - if (!this.writePriority) { - // 没有权限 - this.$message({ - message: "没有修改权限", - type: "error", - duration: 2000, - }); - return; - } + // if (!this.writePriority) { + // // 没有权限 + // this.$message({ + // message: "没有修改权限", + // type: "error", + // duration: 2000, + // }); + // return; + // } - // 增加节点,判断是否可添加 - if (this.curNewNode) { - if (this.comName == "DepDescription") { - this.curDep = this.depData.部门名称; - } else { - this.curJob = this.jobData.岗位概况.岗位名称; - } - let nodeName = - this.comName == "DepDescription" ? this.curDep : this.curJob; - let msg = this.checkNewNodeValid(nodeName); - if (msg == "合法名称") { - // 保存修改到架构图 - this.jm.update_node(this.curNewNode.id, nodeName); - // 发送保存架构图请求 - let resData = this.cleanTreeData(); - // 发送请求 - jobApi.modifyFramework({ data: resData }).then( - (res) => { - if (res.code == 0) { - } - }, - (err) => { - console.log("err: ", err); - } - ); - // 还原curNewNode状态 - this.curNewNode = null; - } else { - Message({ - message: msg, - type: "error", - duration: 1 * 1000, - }); - return; - } - } + // // 增加节点,判断是否可添加 + // if (this.curNewNode) { + // if (this.comName == "DepDescription") { + // this.curDep = this.depData.部门名称; + // } else { + // this.curJob = this.jobData.岗位概况.岗位名称; + // } + // let nodeName = + // this.comName == "DepDescription" ? this.curDep : this.curJob; + // let msg = this.checkNewNodeValid(nodeName); + // if (msg == "合法名称") { + // // 保存修改到架构图 + // this.jm.update_node(this.curNewNode.id, nodeName); + // // 发送保存架构图请求 + // let resData = this.cleanTreeData(); + // // 发送请求 + // jobApi.modifyFramework({ data: resData }).then( + // (res) => { + // if (res.code == 0) { + // } + // }, + // (err) => { + // console.log("err: ", err); + // } + // ); + // // 还原curNewNode状态 + // this.curNewNode = null; + // } else { + // Message({ + // message: msg, + // type: "error", + // duration: 1 * 1000, + // }); + // return; + // } + // } - // 修改节点 - if (this.comName === "DepDescription") { - // 整理数据 - // 去除两端空字符 - for (let i of Object.keys(this.depData)) { - if (i == "是否为虚拟部门") { - continue; - } - this.depData[i] = this.depData[i].trim(); - } - // 部门保存 - jobApi - .modifyDepartmentDetail({ - data: this.depData, - department: this.curDep, - }) - .then( - (res) => { - if (res.code === 0) { - Message({ - message: "保存成功", - type: "success", - duration: 1 * 1000, - }); - } - }, - (err) => { - console.log("err:", err); - } - ); - } else if (this.comName === "JobDescription") { - // 整理数据 - let tinyData = function (data) { - for (let name in data) { - if (typeof data[name] == "string") { - data[name] = data[name].trim(); - } else if (data[name] instanceof Array) { - // 去除 "双击添加" - let arr = data[name]; - while (arr[arr.length - 1] == "双击添加") { - arr.pop(); - } - // 去除 空字符串"" - // for (let i = 0; i < arr.length; i++) { - // if (arr[i].trim() == "") { - // arr.splice(i, 1); - // i -= 1; - // } - // } + // // 修改节点 + // if (this.comName === "DepDescription") { + // // 整理数据 + // // 去除两端空字符 + // for (let i of Object.keys(this.depData)) { + // if (i == "是否为虚拟部门") { + // continue; + // } + // this.depData[i] = this.depData[i].trim(); + // } + // // 部门保存 + // jobApi + // .modifyDepartmentDetail({ + // data: this.depData, + // department: this.curDep, + // }) + // .then( + // (res) => { + // if (res.code === 0) { + // Message({ + // message: "保存成功", + // type: "success", + // duration: 1 * 1000, + // }); + // } + // }, + // (err) => { + // console.log("err:", err); + // } + // ); + // } else if (this.comName === "JobDescription") { + // // 整理数据 + // let tinyData = function (data) { + // for (let name in data) { + // if (typeof data[name] == "string") { + // data[name] = data[name].trim(); + // } else if (data[name] instanceof Array) { + // // 去除 "双击添加" + // let arr = data[name]; + // while (arr[arr.length - 1] == "双击添加") { + // arr.pop(); + // } + // // 去除 空字符串"" + // // for (let i = 0; i < arr.length; i++) { + // // if (arr[i].trim() == "") { + // // arr.splice(i, 1); + // // i -= 1; + // // } + // // } - // 去除空数组 - let deleteArr = [ - "党风廉政建设", - "工作职责", - "部门管理", - "业务管理", - "属员管理", - "安全职责", - "临时代理工作", - ]; - if (!arr.length && deleteArr.includes(name)) { - delete data[name]; - } - } else if (data[name] instanceof Object) { - tinyData(data[name]); - } else { - // console.log(data[name]); - } - } - }; - tinyData(this.jobData); - // 岗位保存 - jobApi - .modifyJobDetail({ - data: this.jobData, - department: this.curDep, - job: this.curJob, - }) - .then( - (res) => { - if (res.code) { - Message({ - message: "保存成功", - type: "success", - duration: 1 * 1000, - }); - } - }, - (err) => { - console.log("err:", err); - } - ); - } + // // 去除空数组 + // let deleteArr = [ + // "党风廉政建设", + // "工作职责", + // "部门管理", + // "业务管理", + // "属员管理", + // "安全职责", + // "临时代理工作", + // ]; + // if (!arr.length && deleteArr.includes(name)) { + // delete data[name]; + // } + // } else if (data[name] instanceof Object) { + // tinyData(data[name]); + // } else { + // // console.log(data[name]); + // } + // } + // }; + // tinyData(this.jobData); + // // 岗位保存 + // jobApi + // .modifyJobDetail({ + // data: this.jobData, + // department: this.curDep, + // job: this.curJob, + // }) + // .then( + // (res) => { + // if (res.code) { + // Message({ + // message: "保存成功", + // type: "success", + // duration: 1 * 1000, + // }); + // } + // }, + // (err) => { + // console.log("err:", err); + // } + // ); + // } }, }, components: { diff --git a/src/views/person/components/PersonPicture.vue b/src/views/person/components/PersonPicture.vue index 5c61ad0..f476304 100644 --- a/src/views/person/components/PersonPicture.vue +++ b/src/views/person/components/PersonPicture.vue @@ -133,6 +133,7 @@ {{ value }} +
暂无数据。
@@ -149,6 +150,7 @@ {{ value }} +
暂无数据。
@@ -162,6 +164,7 @@ {{ value }}
+
暂无数据。
From b75f77594845d3f3acee432f47f8930d8c1b0e00 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Tue, 10 Jan 2023 17:48:11 +0800 Subject: [PATCH 38/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=BA=E5=91=98?= =?UTF-8?q?=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF=E6=9F=A5=E8=AF=A2=E5=8F=8A?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=A1=B5=E9=9D=A2=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/Test/test1.vue | 694 ++++++++++---- .../person/basic/components/AddInfo.vue | 3 + .../person/basic/components/DeleteInfo.vue | 3 + .../manage/person/basic/components/SMInfo.vue | 893 ++++++++++++++++++ src/views/manage/person/basic/index.vue | 39 +- src/views/person/components/Change.vue | 2 +- 6 files changed, 1464 insertions(+), 170 deletions(-) create mode 100644 src/views/manage/person/basic/components/AddInfo.vue create mode 100644 src/views/manage/person/basic/components/DeleteInfo.vue create mode 100644 src/views/manage/person/basic/components/SMInfo.vue diff --git a/src/views/Test/test1.vue b/src/views/Test/test1.vue index 7bc9190..7687ffc 100644 --- a/src/views/Test/test1.vue +++ b/src/views/Test/test1.vue @@ -1,181 +1,541 @@ - - - \ No newline at end of file + diff --git a/src/views/manage/person/basic/components/AddInfo.vue b/src/views/manage/person/basic/components/AddInfo.vue new file mode 100644 index 0000000..c3be519 --- /dev/null +++ b/src/views/manage/person/basic/components/AddInfo.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/views/manage/person/basic/components/DeleteInfo.vue b/src/views/manage/person/basic/components/DeleteInfo.vue new file mode 100644 index 0000000..6fdd66c --- /dev/null +++ b/src/views/manage/person/basic/components/DeleteInfo.vue @@ -0,0 +1,3 @@ + \ No newline at end of file diff --git a/src/views/manage/person/basic/components/SMInfo.vue b/src/views/manage/person/basic/components/SMInfo.vue new file mode 100644 index 0000000..755ef05 --- /dev/null +++ b/src/views/manage/person/basic/components/SMInfo.vue @@ -0,0 +1,893 @@ + + + + + + diff --git a/src/views/manage/person/basic/index.vue b/src/views/manage/person/basic/index.vue index 49cf81f..77becdf 100644 --- a/src/views/manage/person/basic/index.vue +++ b/src/views/manage/person/basic/index.vue @@ -1,3 +1,38 @@ \ No newline at end of file +
+ + + + + + +
+ + + + + \ No newline at end of file diff --git a/src/views/person/components/Change.vue b/src/views/person/components/Change.vue index 6903b03..bd710e5 100644 --- a/src/views/person/components/Change.vue +++ b/src/views/person/components/Change.vue @@ -1,6 +1,6 @@ + + \ No newline at end of file diff --git a/src/views/manage/person/basic/components/DeleteInfo.vue b/src/views/manage/person/basic/components/DeleteInfo.vue index 6fdd66c..517e3d3 100644 --- a/src/views/manage/person/basic/components/DeleteInfo.vue +++ b/src/views/manage/person/basic/components/DeleteInfo.vue @@ -1,3 +1,86 @@ \ No newline at end of file +
+ +
+ + + + + \ No newline at end of file diff --git a/src/views/manage/person/basic/components/SMInfo.vue b/src/views/manage/person/basic/components/SMInfo.vue index 755ef05..4226321 100644 --- a/src/views/manage/person/basic/components/SMInfo.vue +++ b/src/views/manage/person/basic/components/SMInfo.vue @@ -4,10 +4,11 @@ + + + + + - + - + + + +
备注
+
+ + + + + + + +
+
+ 提交 @@ -659,61 +693,67 @@ + - diff --git a/vue.config.js b/vue.config.js index 52e4358..545dfd8 100644 --- a/vue.config.js +++ b/vue.config.js @@ -39,8 +39,8 @@ module.exports = { proxy: { '/': { // target: 'http://222.20.95.239:8000', - // target: 'http://127.0.0.1:4523/m1/1256020-0-default', - target: 'http://127.0.0.1:8123', + target: 'http://127.0.0.1:4523/m1/1256020-0-default', + // target: 'http://127.0.0.1:8123', changeOrigin: true, pathRewrite: { } From afe9fb19332f0a452c86115069e98fc523b1e340 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Wed, 11 Jan 2023 16:09:31 +0800 Subject: [PATCH 40/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E5=89=8D=E7=AB=AF?= =?UTF-8?q?=E4=BA=BA=E5=91=98=E5=9F=BA=E6=9C=AC=E4=BF=A1=E6=81=AF=E7=9A=84?= =?UTF-8?q?=E6=96=B0=E6=97=A7=E6=8E=A5=E5=8F=A3=E8=BF=87=E6=B8=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../person/components/PersonInformation.vue | 56 +++++++++--------- src/views/person/components/PersonPicture.vue | 34 +++++------ .../person/components/WorkInformation.vue | 59 ++++++++++--------- src/views/person/information.vue | 59 +++++++++++-------- 4 files changed, 109 insertions(+), 99 deletions(-) diff --git a/src/views/person/components/PersonInformation.vue b/src/views/person/components/PersonInformation.vue index 1209ed3..18432a6 100644 --- a/src/views/person/components/PersonInformation.vue +++ b/src/views/person/components/PersonInformation.vue @@ -5,31 +5,31 @@ - + - - - + + + - + - + - + - + - + - - + + - + - + @@ -40,28 +40,28 @@
最高全日制学历: - {{ personData.最高全日制学历 }} + {{ personData.full_education }}
最高全日制学位: - {{ personData.最高全日制学位 }} + {{ personData.full_degree }}
全日制毕(肄)业学校(单位)名称: {{ - personData["全日制毕(肄)业学校(单位)名称"] + personData["full_school"] }}
全日制毕(肄)业专业名称: {{ - personData["全日制毕(肄)业专业名称"] + personData["full_major"] }}
全日制学校所在国家: - {{ personData.全日制学校所在国家 }} + {{ personData.full_school_nation }}
@@ -69,27 +69,27 @@
最高在职学历: - {{ personData.最高在职学历 }} + {{ personData.work_education }}
最高在职学位: - {{ personData.最高在职学位 }} + {{ personData.work_degree }}
在职毕(肄)业学校(单位)名称: {{ - personData["在职毕(肄)业学校(单位)名称"] + personData["work_school"] }}
在职毕(肄)业专业名称: {{ - personData["在职毕(肄)业专业名称"] + personData["work_major"] }}
在职学校所在国家: - {{ personData.在职学校所在国家 }} + {{ personData.work_school_nation }}
@@ -98,21 +98,21 @@
姓名:{{ personData["姓名"] }}{{ personData["name"] }} 性别:{{ personData["性别"] }}{{ personData["证件类型"] }}号:{{ personData["证件号码"] }}{{ personData["sex"] }}{{ personData["certificate"] }}号:{{ personData["card_num"] }} 出生日期:{{ personData["出生日期"] }}{{ personData["birth_time"] }}
民族:{{ personData["民族"] }}{{ personData["nation"] }} 国籍:{{ personData["国籍"] }}{{ personData["citizenship"] }} 政治面貌:{{ personData["政治面貌"] }}{{ personData["politics"] }} 入党时间:{{ personData["入党时间"] }}{{ personData["party_start_time"] }}
籍贯:{{ personData["籍贯"] }}籍贯地:{{ personData["native_place"] }} 出生地:{{ personData["出生地"] }}{{ personData["birth_place"] }} 联系电话:{{ personData["联系电话"] }}{{ personData["phone_num"] }}
- + - + - + - +
最高专业技术资格名: {{ personData["最高专业技术资格名称"] }}{{ personData["professional_skill"] }} 等级: {{ personData["最高专业技术资格等级"] }}{{ personData["professional_skill_level"] }}
最高职业技能等级名: {{ personData["最高职业技能等级名称"] }}{{ personData["vocational_skill"] }} 级别: {{ personData["最高职业技能等级级别"] }}{{ personData["vocational_skill_level"] }}

备注

-

{{ personData["备注说明"] }}

+

{{ personData["remark"] }}

diff --git a/src/views/person/components/PersonPicture.vue b/src/views/person/components/PersonPicture.vue index f476304..d4b484b 100644 --- a/src/views/person/components/PersonPicture.vue +++ b/src/views/person/components/PersonPicture.vue @@ -23,29 +23,29 @@
教育经历 - 全日制 - {{ personData["全日制毕(肄)业学校(单位)名称"] }} - 全日制 {{ personData["全日制毕(肄)业专业名称"] }}全日制 {{ personData["full_major"] }} - 在职 {{ personData["在职毕(肄)业学校(单位)名称"] }}在职 {{ personData["work_school"] }} - 在职 {{ personData["在职毕(肄)业专业名称"] }}在职 {{ personData["work_major"] }}
知识技能 - {{ personData["最高专业技术资格等级"] - }}{{ personData["最高专业技术资格名称"] }}{{ personData["professional_skill_level"] + }}{{ personData["professional_skill"] }} - {{ personData["最高职业技能等级级别"] - }}{{ personData["最高职业技能等级名称"] }}{{ personData["vocational_skill_level"] + }}{{ personData["vocational_skill"] }}
@@ -230,7 +230,7 @@ export default { }; }, mounted() { - if (!this.personData.hasOwnProperty("姓名")) { + if (!this.personData.hasOwnProperty("card_num")) { return; } // 发送词云请求 @@ -383,10 +383,10 @@ export default { }, computed: { industryExperience() { - return this.getAge(this.personData["进入行业时间"]); + return this.getAge(this.personData["industry_start_time"]); }, jobExperience() { - return this.getAge(this.personData["现岗位起始时间"]); + return this.getAge(this.personData["job_start_time"]); }, activityColumns() { let columns = [ diff --git a/src/views/person/components/WorkInformation.vue b/src/views/person/components/WorkInformation.vue index 43a7331..dd3e366 100644 --- a/src/views/person/components/WorkInformation.vue +++ b/src/views/person/components/WorkInformation.vue @@ -1,20 +1,20 @@ + + + +.divider-1 { + height: 20px; +} + \ No newline at end of file diff --git a/src/views/manage/person/basic/components/AddInfo.vue b/src/views/manage/person/basic/components/AddInfo.vue index 5c833cf..552aaa8 100644 --- a/src/views/manage/person/basic/components/AddInfo.vue +++ b/src/views/manage/person/basic/components/AddInfo.vue @@ -24,11 +24,19 @@
- + > + + @@ -57,11 +65,20 @@ - + filterable + > + + @@ -75,24 +92,26 @@ - + placeholder="请选择籍贯地" + filterable + > - + placeholder="请选择出生地" + filterable + > @@ -119,13 +138,22 @@ - - + + @@ -157,12 +185,23 @@ label="最高全日制学历" prop="full_education" > - + filterable + allow-create + clearable + @focus="focusSelect('full_education')" + > + + @@ -171,12 +210,23 @@ label="最高全日制学位" prop="full_degree" > - + filterable + allow-create + clearable + @focus="focusSelect('full_degree')" + > + + @@ -188,12 +238,23 @@ label="全日制毕(肄)业学校(单位)名称" prop="full_school" > - + filterable + allow-create + clearable + @focus="focusSelect('full_school')" + > + +
@@ -202,12 +263,23 @@ label="全日制毕(肄)业专业名称" prop="full_major" > - + filterable + allow-create + clearable + @focus="focusSelect('full_major')" + > + + @@ -231,12 +303,23 @@ label="最高在职学历" prop="work_education" > - + filterable + allow-create + clearable + @focus="focusSelect('work_education')" + > + + @@ -245,12 +328,23 @@ label="最高在职学位" prop="work_degree" > - + filterable + allow-create + clearable + @focus="focusSelect('work_degree')" + > + + @@ -262,12 +356,23 @@ label="在职毕(肄)业学校(单位)名称" prop="work_school" > - + filterable + allow-create + clearable + @focus="focusSelect('work_school')" + > + + @@ -276,12 +381,23 @@ label="在职毕(肄)业专业名称" prop="work_major" > - + filterable + allow-create + clearable + @focus="focusSelect('work_major')" + > + + @@ -314,22 +430,44 @@ label="最高专业技术资格名" prop="professional_skill" > - + filterable + allow-create + clearable + @focus="focusSelect('professional_skill')" + > + + - + filterable + allow-create + clearable + @focus="focusSelect('professional_skill_level')" + > + + @@ -341,22 +479,44 @@ label="最高职业技能等级名" prop="vocational_skill" > - + filterable + allow-create + clearable + @focus="focusSelect('vocational_skill')" + > + + - + filterable + allow-create + clearable + @focus="focusSelect('vocational_skill_level')" + > + + @@ -373,66 +533,123 @@ - + filterable + clearable + @focus="focusSelect('organization')" + > + + - + filterable + clearable + @focus="focusSelect('department')" + > + + - - + + - - + + - - + + - + filterable + clearable + @focus="focusSelect('person_status')" + > + + @@ -447,24 +664,44 @@ - - + + - - + + @@ -487,35 +724,65 @@ - - + + - - + + - - + + @@ -557,12 +824,23 @@ - + filterable + clearable + allow-create + @focus="focusSelect('industry_entry')" + > + + @@ -582,12 +860,23 @@ - + filterable + clearable + allow-create + @focus="focusSelect('company_entry')" + > + + @@ -608,24 +897,44 @@ - - + + - - + + @@ -673,7 +982,15 @@ import { MessageBox, Message } from "element-ui"; export default { data() { return { - personData: {}, + personData: { + citizenship: "中国", + certificate: "身份证", + full_school_nation: "中国", + work_school_nation: "中国", + organization: "湖北中烟工业有限责任公司恩施卷烟厂", + company: "湖北中烟工业有限责任公司恩施卷烟厂", + file: "本级人事部门", + }, rules: { name: [ { @@ -685,8 +1002,8 @@ export default { sex: [ { required: true, - message: "请输入性别", - trigger: "blur", + message: "请选择性别", + trigger: "change", }, ], birth_time: [ @@ -702,12 +1019,16 @@ export default { message: "请输入联系电话", trigger: "blur", }, + { + pattern: /^\d+$/, + message: '电话号码只能由数字构成' + } ], nation: [ { required: true, - message: "请输入民族", - trigger: "blur", + message: "请选择民族", + trigger: "change", }, ], citizenship: [ @@ -720,15 +1041,17 @@ export default { native_place: [ { required: true, - message: "请输入籍贯地", - trigger: "blur", + type: "array", + message: "请选择一个籍贯地", + trigger: "change", }, ], birth_place: [ { required: true, - message: "请输入出生地", - trigger: "blur", + type: "array", + message: "请选择一个出生地", + trigger: "change", }, ], certificate: [ @@ -748,8 +1071,8 @@ export default { politics: [ { required: true, - message: "请输入政治面貌", - trigger: "blur", + message: "请选择政治面貌", + trigger: "change", }, ], party_start_time: [], @@ -770,43 +1093,43 @@ export default { organization: [ { required: true, - message: "请输入机构名称", - trigger: "blur", + message: "请选择机构名称", + trigger: "change", }, ], department: [ { required: true, - message: "请输入部门名称", - trigger: "blur", + message: "请选择部门名称", + trigger: "change", }, ], jobname: [ { required: true, - message: "请输入岗位名称", - trigger: "blur", + message: "请选择岗位名称", + trigger: "change", }, ], jobtype: [ { required: true, - message: "请输入岗位类别", - trigger: "blur", + message: "请选择岗位类别", + trigger: "change", }, ], jobform: [ { required: true, - message: "请输入用工形式", - trigger: "blur", + message: "请选择用工形式", + trigger: "change", }, ], person_status: [ { required: true, - message: "请输入人员状态", - trigger: "blur", + message: "请选择人员状态", + trigger: "change", }, ], company: [], @@ -825,14 +1148,73 @@ export default { retire_age: [], remark: [], }, + + placeProps: { + multiple: false, + label: "label", + value: "value", + children: "children", + checkStrictly: false, + }, + + Options: { + sex: [ + { + label: "男", + value: "男", + }, + { + label: "女", + value: "女", + }, + ], + nation: require("@/assets/json/nation.json"), + place: require("@/assets/json/place.json"), + politics: [], + full_education: [], + full_degree: [], + full_school: [], + full_major: [], + work_education: [], + work_degree: [], + work_school: [], + work_major: [], + professional_skill: [], + professional_skill_level: [], + vocational_skill: [], + vocational_skill_level: [], + department: [], + jobname: [], + organization: [], + department: [], + jobname: [], + jobtype: [], + jobform: [], + person_status: [], + company: [], + dutyname: [], + dutylevel: [], + level: [], + attribute: [], + company_entry: [], + industry_entry: [], + file: [], + retire_age: [], + }, }; }, methods: { submitForm() { this.$refs["basicInfo"].validate((valid) => { if (!valid) return; + // 在不改变页面数据的情况下,修正地区字段类型 array -> string + let submitData = Object.assign({}, this.personData); + submitData["native_place"] = + submitData["native_place"].join("/"); + submitData["birth_place"] = + submitData["birth_place"].join("/"); // 提交表单 - personApi.addBasicInfo({ data: this.personData }).then( + personApi.addBasicInfo({ data: submitData }).then( (res) => { if (!res.code) { Message({ @@ -851,6 +1233,23 @@ export default { resetForm() { this.$refs["basicInfo"].resetFields(); }, + focusSelect(field) { + // 访问后端获取提示 + if (this.Options[field].length == 0) { + personApi.getBasicTips({ field: field }).then( + (res) => { + let options = []; + for (let op of res.data) { + options.push({ label: op, value: op }); + } + this.Options[field] = options; + }, + (err) => { + console.log("err", err); + } + ); + } + }, }, }; diff --git a/src/views/manage/person/basic/components/SMInfo.vue b/src/views/manage/person/basic/components/SMInfo.vue index 4226321..d1b3279 100644 --- a/src/views/manage/person/basic/components/SMInfo.vue +++ b/src/views/manage/person/basic/components/SMInfo.vue @@ -48,11 +48,19 @@ - + > + + @@ -81,11 +89,20 @@ - + filterable + > + + @@ -101,7 +118,7 @@ @@ -145,13 +162,22 @@ - - + + @@ -183,12 +209,23 @@ label="最高全日制学历" prop="full_education" > - + filterable + allow-create + clearable + @focus="focusSelect('full_education')" + > + + @@ -197,12 +234,23 @@ label="最高全日制学位" prop="full_degree" > - + filterable + allow-create + clearable + @focus="focusSelect('full_degree')" + > + + @@ -214,12 +262,23 @@ label="全日制毕(肄)业学校(单位)名称" prop="full_school" > - + filterable + allow-create + clearable + @focus="focusSelect('full_school')" + > + + @@ -228,12 +287,23 @@ label="全日制毕(肄)业专业名称" prop="full_major" > - + filterable + allow-create + clearable + @focus="focusSelect('full_major')" + > + + @@ -257,12 +327,23 @@ label="最高在职学历" prop="work_education" > - + filterable + allow-create + clearable + @focus="focusSelect('work_education')" + > + + @@ -271,12 +352,23 @@ label="最高在职学位" prop="work_degree" > - + filterable + allow-create + clearable + @focus="focusSelect('work_degree')" + > + + @@ -288,12 +380,23 @@ label="在职毕(肄)业学校(单位)名称" prop="work_school" > - + filterable + allow-create + clearable + @focus="focusSelect('work_school')" + > + + @@ -302,12 +405,23 @@ label="在职毕(肄)业专业名称" prop="work_major" > - + filterable + allow-create + clearable + @focus="focusSelect('work_major')" + > + + @@ -340,22 +454,44 @@ label="最高专业技术资格名" prop="professional_skill" > - + filterable + allow-create + clearable + @focus="focusSelect('professional_skill')" + > + + - + filterable + allow-create + clearable + @focus="focusSelect('professional_skill_level')" + > + + @@ -367,22 +503,44 @@ label="最高职业技能等级名" prop="vocational_skill" > - + filterable + allow-create + clearable + @focus="focusSelect('vocational_skill')" + > + + - + filterable + allow-create + clearable + @focus="focusSelect('vocational_skill_level')" + > + + @@ -399,66 +557,123 @@ - + filterable + clearable + @focus="focusSelect('organization')" + > + + - + filterable + clearable + @focus="focusSelect('department')" + > + + - - + + - - + + - - + + - + filterable + clearable + @focus="focusSelect('person_status')" + > + + @@ -473,24 +688,44 @@ - - + + - - + + @@ -513,35 +748,65 @@ - - + + - - + + - - + + @@ -583,12 +848,23 @@ - + filterable + clearable + allow-create + @focus="focusSelect('industry_entry')" + > + + @@ -608,12 +884,23 @@ - + filterable + clearable + allow-create + @focus="focusSelect('company_entry')" + > + + @@ -634,24 +921,44 @@ - - + + - - + + @@ -701,57 +1008,6 @@ export default { return { query: "", curCardNum: "", - // personData: { - // attribute: "领导职务副职", - // birth_place: "湖北巴东", - // birth_time: "1985-10-20", - // card_num: "422823198510203671", - // certificate: "身份证", - // citizenship: "中国", - // company_entry: "社会招聘", - // company: "湖北中烟工业有限责任公司恩施卷烟厂", - // company_save_file: "是", - // company_start_time: "2012-08-01", - // department: "厂办公室", - // duty_level_start_time: "2020-04-26", - // duty_start_time: "2020-04-26", - // dutylevel: "副科级", - // dutyname: "厂办公室副主任", - // file: "本级人事部门", - // full_degree: "法学学士", - // full_education: "大学", - // full_major: "政治学与行政学", - // full_school: "长春大学", - // full_school_nation: "中国", - // industry_entry: "社会招聘", - // industry_start_time: "2012-08-01", - // jobname: "副主任", - // job_start_time: "2020-04-26", - // jobform: "劳动关系", - // jobtype: "管理类", - // level: "副科级", - // name: "徐明", - // nation: "土家族", - // native_place: "湖北巴东", - // organization: "湖北中烟工业有限责任公司恩施卷烟厂", - // party_start_time: "2019-06-21", - // person_status: "在职", - // phone_num: "15971776753", - // politics: "中共党员", - // professional_skill: "助理政工师", - // professional_skill_level: "初级", - // remark: null, - // retire_age: "60", - // sex: "男", - // vocational_skill: null, - // vocational_skill_level: null, - // work_degree: null, - // work_education: null, - // work_major: null, - // work_school: null, - // work_school_nation: null, - // work_start_time: "2012-08-01", - // }, personData: {}, personDataBackup: {}, rules: { @@ -765,8 +1021,8 @@ export default { sex: [ { required: true, - message: "请输入性别", - trigger: "blur", + message: "请选择性别", + trigger: "change", }, ], birth_time: [ @@ -782,12 +1038,16 @@ export default { message: "请输入联系电话", trigger: "blur", }, + { + pattern: /^\d+$/, + message: "电话号码只能由数字构成", + }, ], nation: [ { required: true, - message: "请输入民族", - trigger: "blur", + message: "请选择民族", + trigger: "change", }, ], citizenship: [ @@ -800,14 +1060,14 @@ export default { native_place: [ { required: true, - message: "请输入籍贯地", + message: "请输入籍贯地,如:湖北省/恩施州/来凤县", trigger: "blur", }, ], birth_place: [ { required: true, - message: "请输入出生地", + message: "请输入出生地,如:湖北省/恩施州/来凤县", trigger: "blur", }, ], @@ -828,8 +1088,8 @@ export default { politics: [ { required: true, - message: "请输入政治面貌", - trigger: "blur", + message: "请选择政治面貌", + trigger: "change", }, ], party_start_time: [], @@ -850,43 +1110,43 @@ export default { organization: [ { required: true, - message: "请输入机构名称", - trigger: "blur", + message: "请选择机构名称", + trigger: "change", }, ], department: [ { required: true, - message: "请输入部门名称", - trigger: "blur", + message: "请选择部门名称", + trigger: "change", }, ], jobname: [ { required: true, - message: "请输入岗位名称", - trigger: "blur", + message: "请选择岗位名称", + trigger: "change", }, ], jobtype: [ { required: true, - message: "请输入岗位类别", - trigger: "blur", + message: "请选择岗位类别", + trigger: "change", }, ], jobform: [ { required: true, - message: "请输入用工形式", - trigger: "blur", + message: "请选择用工形式", + trigger: "change", }, ], person_status: [ { required: true, - message: "请输入人员状态", - trigger: "blur", + message: "请选择人员状态", + trigger: "change", }, ], company: [], @@ -905,6 +1165,50 @@ export default { retire_age: [], remark: [], }, + Options: { + sex: [ + { + label: "男", + value: "男", + }, + { + label: "女", + value: "女", + }, + ], + nation: require("@/assets/json/nation.json"), + place: require("@/assets/json/place.json"), + politics: [], + full_education: [], + full_degree: [], + full_school: [], + full_major: [], + work_education: [], + work_degree: [], + work_school: [], + work_major: [], + professional_skill: [], + professional_skill_level: [], + vocational_skill: [], + vocational_skill_level: [], + department: [], + jobname: [], + organization: [], + department: [], + jobname: [], + jobtype: [], + jobform: [], + person_status: [], + company: [], + dutyname: [], + dutylevel: [], + level: [], + attribute: [], + company_entry: [], + industry_entry: [], + file: [], + retire_age: [], + }, }; }, methods: { @@ -928,10 +1232,10 @@ export default { this.$refs["basicInfo"].validate((valid) => { if (!valid) return; // 找到修改过的字段 - let changeData = {} + let changeData = {}; for (let key in this.personData) { if (this.personData[key] != this.personDataBackup[key]) { - changeData[key] = this.personData[key] + changeData[key] = this.personData[key]; } } // 提交表单 @@ -958,6 +1262,23 @@ export default { let personData = Object.assign({}, this.personDataBackup); this.personData = personData; }, + focusSelect(field) { + // 访问后端获取提示 + if (this.Options[field].length == 0) { + personApi.getBasicTips({ field: field }).then( + (res) => { + let options = []; + for (let op of res.data) { + options.push({ label: op, value: op }); + } + this.Options[field] = options; + }, + (err) => { + console.log("err", err); + } + ); + } + }, }, }; From b2dd78398231f894db993470b3035f83cb0a1ae9 Mon Sep 17 00:00:00 2001 From: Endercad <547473437@qq.com> Date: Thu, 19 Jan 2023 14:59:56 +0800 Subject: [PATCH 42/47] =?UTF-8?q?=E8=94=A1=E5=85=83=E6=B5=A9=E5=89=8D?= =?UTF-8?q?=E7=AB=AF=E5=B7=A5=E4=BD=9C=E6=8F=90=E4=BA=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/assets/css/mydoc.css | 2 +- src/views/job/components/DepDescription.vue | 25 +- src/views/job/components/JobDescription.vue | 396 ++++----- src/views/manage/job/basic/index.vue | 896 +++++++++++++++++++- vue.config.js | 3 +- 5 files changed, 1072 insertions(+), 250 deletions(-) diff --git a/src/assets/css/mydoc.css b/src/assets/css/mydoc.css index 7ba9511..23621f3 100644 --- a/src/assets/css/mydoc.css +++ b/src/assets/css/mydoc.css @@ -105,4 +105,4 @@ td { .confirm-button:hover { color: #409eff; background-color: #ecf5ff; -} \ No newline at end of file +} diff --git a/src/views/job/components/DepDescription.vue b/src/views/job/components/DepDescription.vue index a1e9f12..daddf17 100644 --- a/src/views/job/components/DepDescription.vue +++ b/src/views/job/components/DepDescription.vue @@ -1,12 +1,15 @@ + + + + diff --git a/vue.config.js b/vue.config.js index 545dfd8..9a07850 100644 --- a/vue.config.js +++ b/vue.config.js @@ -39,8 +39,9 @@ module.exports = { proxy: { '/': { // target: 'http://222.20.95.239:8000', - target: 'http://127.0.0.1:4523/m1/1256020-0-default', + // target: 'http://127.0.0.1:4523/m1/1256020-0-default', // target: 'http://127.0.0.1:8123', + target: 'http://127.0.0.1:8123', changeOrigin: true, pathRewrite: { } From 30292b21861d1989e148fdcd628cbcf7aab7fdbf Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Fri, 20 Jan 2023 11:32:13 +0800 Subject: [PATCH 43/47] =?UTF-8?q?manage=E4=B8=AD=E5=B2=97=E4=BD=8D?= =?UTF-8?q?=E8=AF=A6=E7=BB=86=E9=A1=B5=E9=9D=A2=E9=9C=80=E6=B7=BB=E5=8A=A0?= =?UTF-8?q?=E4=BF=AE=E6=94=B9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/views/job/components/JobDescription.vue | 31 +- .../job/basic/components/DepDescription.vue | 66 +++ .../job/basic/components/JobDescription.vue | 393 ++++++++++++++++++ .../manage/job/basic/components/NoData.vue | 22 + src/views/manage/job/basic/index.vue | 6 +- vue.config.js | 1 - 6 files changed, 496 insertions(+), 23 deletions(-) create mode 100644 src/views/manage/job/basic/components/DepDescription.vue create mode 100644 src/views/manage/job/basic/components/JobDescription.vue create mode 100644 src/views/manage/job/basic/components/NoData.vue diff --git a/src/views/job/components/JobDescription.vue b/src/views/job/components/JobDescription.vue index b44b801..cd567a5 100644 --- a/src/views/job/components/JobDescription.vue +++ b/src/views/job/components/JobDescription.vue @@ -4,12 +4,6 @@
{{ jobData.岗位名称 }}
- -
一、基本信息
@@ -272,19 +266,19 @@ export default { } return res; }, - jobResponsibility(){ - let jobres=this.jobData.岗位职责.工作职责 - let keyArr=Object.keys(jobres) - keyArr.splice(keyArr.indexOf('临时代理工作'),1) - keyArr.splice(keyArr.indexOf('工作职责'),1) - keyArr.splice(0,0,'工作职责') - keyArr.splice(keyArr.length,0,'临时代理工作') - let newjobres={} - for(let i=0;i diff --git a/src/views/manage/job/basic/components/DepDescription.vue b/src/views/manage/job/basic/components/DepDescription.vue new file mode 100644 index 0000000..a1e9f12 --- /dev/null +++ b/src/views/manage/job/basic/components/DepDescription.vue @@ -0,0 +1,66 @@ + + + + + \ No newline at end of file diff --git a/src/views/manage/job/basic/components/JobDescription.vue b/src/views/manage/job/basic/components/JobDescription.vue new file mode 100644 index 0000000..b02967a --- /dev/null +++ b/src/views/manage/job/basic/components/JobDescription.vue @@ -0,0 +1,393 @@ + + + + + + \ No newline at end of file diff --git a/src/views/manage/job/basic/components/NoData.vue b/src/views/manage/job/basic/components/NoData.vue new file mode 100644 index 0000000..e5871c9 --- /dev/null +++ b/src/views/manage/job/basic/components/NoData.vue @@ -0,0 +1,22 @@ + + + + + \ No newline at end of file diff --git a/src/views/manage/job/basic/index.vue b/src/views/manage/job/basic/index.vue index 5b4ab91..7c89ff0 100644 --- a/src/views/manage/job/basic/index.vue +++ b/src/views/manage/job/basic/index.vue @@ -108,9 +108,9 @@ window.jsMind = jsMind; require("jsmind/js/jsmind.screenshot.js"); // init(jsMind); -import JobDescription from "@/views/job/components/JobDescription.vue"; -import DepDescription from "@/views/job/components/DepDescription.vue"; -import NoData from "@/views/job/components/NoData.vue"; +import JobDescription from "./components/JobDescription.vue"; +import DepDescription from "./components/DepDescription.vue"; +import NoData from "./components/NoData.vue"; import * as jobApi from "@/api/job"; import { verifyJobPriority } from "@/api/priotity"; diff --git a/vue.config.js b/vue.config.js index 9a07850..52e4358 100644 --- a/vue.config.js +++ b/vue.config.js @@ -40,7 +40,6 @@ module.exports = { '/': { // target: 'http://222.20.95.239:8000', // target: 'http://127.0.0.1:4523/m1/1256020-0-default', - // target: 'http://127.0.0.1:8123', target: 'http://127.0.0.1:8123', changeOrigin: true, pathRewrite: { From f13fda06909762541d3970f3b8634cd0ffaa7bf0 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Tue, 14 Feb 2023 18:50:49 +0800 Subject: [PATCH 44/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E6=9F=A5=E8=AF=A2=E5=92=8C=E9=83=A8?= =?UTF-8?q?=E5=88=86=E4=BF=AE=E6=94=B9=E5=B7=A5=E4=BD=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../D3Visualization/GraphEventHandler.js | 13 +- .../D3Visualization/components/Graph.vue | 12 +- src/store/getters.js | 3 +- src/store/index.js | 4 +- src/store/modules/kg.js | 32 + src/views/Test/test2.vue | 34 +- src/views/event/select copy.vue | 618 ++++++++++++++ src/views/event/select.vue | 132 ++- src/views/manage/event/basic/index.vue | 770 +++++++++++++++++- 9 files changed, 1558 insertions(+), 60 deletions(-) create mode 100644 src/store/modules/kg.js create mode 100644 src/views/event/select copy.vue diff --git a/src/components/D3Visualization/GraphEventHandler.js b/src/components/D3Visualization/GraphEventHandler.js index 708b290..9cdf7f1 100644 --- a/src/components/D3Visualization/GraphEventHandler.js +++ b/src/components/D3Visualization/GraphEventHandler.js @@ -19,6 +19,7 @@ */ import {mapNodes, mapRelationships, getGraphStats} from './mapper' +import store from '@/store' export class GraphEventHandler { constructor (graph, graphView, getNodeNeighbours, onItemMouseOver, onItemSelected, onGraphModelChange) { @@ -66,10 +67,8 @@ export class GraphEventHandler { if (!d.selected) { this.selectItem(d) this.onItemSelected({type: 'node', item: {id: d.id, labels: d.labels, properties: d.propertyList}}) - this.selectedNode = d - store.state.selectedNode = {type: 'node', item: {id: d.id, labels: d.labels, properties: d.propertyList}} - store.state.selectedItem = 1 - console.log("graph.js", store.state.selectedNode) + // 存储节点数据到vuex中,其他模块可使用,mutation函数似乎只能传一个参数 + store.commit('kg/SET_KG', {type: 'node', item: {id: d.id, labels: d.labels, properties: d.propertyList}}) } else { this.deselectItem() } @@ -108,10 +107,8 @@ export class GraphEventHandler { if (!relationship.selected) { this.selectItem(relationship) this.onItemSelected({type: 'relationship', item: {id: relationship.id, type: relationship.type, properties: relationship.propertyList}}) - this.selectedRelationShip = relationship - store.state.selectedRelationShip = {type: 'relationship', item: {id: relationship.id, type: relationship.type, properties: relationship.propertyList}} - store.state.selectedItem = 2 - console.log("graph.js", this.selectedRelationShip) + // 存储关系数据到vuex中,其他模块可使用 + store.commit('kg/SET_KG', {type: 'relation', item: {id: relationship.id, labels: relationship.type, properties: relationship.propertyList}}) } else { this.deselectItem() } diff --git a/src/components/D3Visualization/components/Graph.vue b/src/components/D3Visualization/components/Graph.vue index f8da05c..a978bcf 100644 --- a/src/components/D3Visualization/components/Graph.vue +++ b/src/components/D3Visualization/components/Graph.vue @@ -176,12 +176,12 @@ }, deep: true }, - selectedNode: { - handler: function(val, oldVal) { - this.$store.state.selectedNode = val - console.log("change:", val) - } - }, + // selectedNode: { + // handler: function(val, oldVal) { + // this.$store.state.selectedNode = val + // console.log("change:", val) + // } + // }, relationships: { handler: function(val, oldVal) { if (oldVal.toString() !== val.toString() && this.graphView) { diff --git a/src/store/getters.js b/src/store/getters.js index 5ab7b4c..2155a3c 100644 --- a/src/store/getters.js +++ b/src/store/getters.js @@ -3,6 +3,7 @@ const getters = { device: state => state.app.device, token: state => state.user.token, avatar: state => state.user.avatar, - name: state => state.user.name + name: state => state.user.name, + kg: state => state.kg } export default getters diff --git a/src/store/index.js b/src/store/index.js index 6be466a..c984251 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -4,6 +4,7 @@ import getters from './getters' import app from './modules/app' import settings from './modules/settings' import user from './modules/user' +import kg from './modules/kg' Vue.use(Vuex) @@ -11,7 +12,8 @@ const store = new Vuex.Store({ modules: { app, settings, - user + user, + kg }, getters }) diff --git a/src/store/modules/kg.js b/src/store/modules/kg.js new file mode 100644 index 0000000..44e0d76 --- /dev/null +++ b/src/store/modules/kg.js @@ -0,0 +1,32 @@ + + +const getDefaultState = () => { + return { + // type = node ? relation + type: 'node', + data: {} + } +} + +const state = getDefaultState() + +const mutations = { + RESET_KG: (state) => { + state = getDefaultState() + }, + SET_KG: (state, obj) => { + state.type = obj.type + state.data = obj.item + }, +} + +const actions = { + +} + +export default { + namespaced: true, + state, + mutations, + actions +} \ No newline at end of file diff --git a/src/views/Test/test2.vue b/src/views/Test/test2.vue index 1b80e5f..fa4dda3 100644 --- a/src/views/Test/test2.vue +++ b/src/views/Test/test2.vue @@ -1,18 +1,32 @@ + + + diff --git a/src/views/event/select copy.vue b/src/views/event/select copy.vue new file mode 100644 index 0000000..aaaeeaa --- /dev/null +++ b/src/views/event/select copy.vue @@ -0,0 +1,618 @@ + + + + + + + + \ No newline at end of file diff --git a/src/views/event/select.vue b/src/views/event/select.vue index a95252e..9bf77e4 100644 --- a/src/views/event/select.vue +++ b/src/views/event/select.vue @@ -1,15 +1,46 @@ + + + + + + + + From ed243f1d4b27632e2efac4121303eac1a1961242 Mon Sep 17 00:00:00 2001 From: Endercad <547473437@qq.com> Date: Wed, 15 Feb 2023 14:24:13 +0800 Subject: [PATCH 45/47] =?UTF-8?q?=E5=B2=97=E4=BD=8D=E8=83=9C=E4=BB=BB?= =?UTF-8?q?=E5=BA=A6=E5=AE=8C=E5=96=84=E3=80=81=E5=B2=97=E4=BD=8D=E8=AF=A6?= =?UTF-8?q?=E7=BB=86=E4=BF=A1=E6=81=AF=E4=BF=AE=E6=94=B9=E5=A2=9E=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/EditText/EditText.vue | 7 +- src/views/job/evaluation.vue | 77 ++-- src/views/job/score.vue | 107 ++--- .../job/basic/components/JobDescription.vue | 396 +++++++++++------- src/views/manage/job/basic/index.vue | 85 ++-- 5 files changed, 375 insertions(+), 297 deletions(-) diff --git a/src/components/EditText/EditText.vue b/src/components/EditText/EditText.vue index 002f6ff..80718b9 100644 --- a/src/components/EditText/EditText.vue +++ b/src/components/EditText/EditText.vue @@ -17,13 +17,14 @@ diff --git a/src/views/manage/job/basic/components/JobDescription.vue b/src/views/manage/job/basic/components/JobDescription.vue index b02967a..db9cab9 100644 --- a/src/views/manage/job/basic/components/JobDescription.vue +++ b/src/views/manage/job/basic/components/JobDescription.vue @@ -1,63 +1,74 @@ - \ No newline at end of file +ul { + list-style-type: circle; + margin-top: 0px; + margin-bottom: 0px; +} + + diff --git a/src/views/manage/job/basic/index.vue b/src/views/manage/job/basic/index.vue index 7c89ff0..2ba2a69 100644 --- a/src/views/manage/job/basic/index.vue +++ b/src/views/manage/job/basic/index.vue @@ -388,6 +388,7 @@ export default { jobApi.getJobDetail({ department: jobDep, job: node.topic }).then( (res) => { if (res.code === 0) { + console.log(res, "岗位信息"); // 数据存在 this.jobData = res.data; this.comName = "JobDescription"; @@ -443,67 +444,63 @@ export default { this.curDep = this.curNewNode.parent.topic; this.curJob = null; // 切换页面 + this.jobData = { - 岗位名称: "<<岗位名称>>", - 岗位概况: { - 岗位名称: "<<科长>>", - 岗位级别: "<<10>>", + 任职资格: { + 专业: ["<<财会>>"], + 学历: ["<<大专及以上>>"], + 所需体能: ["身体健康,……"], + 所需技能或能力: ["具备较强的独立工作能力,……"], + 所需知识: ["熟悉会计及税务法规,……"], + 所需经历或经验: ["行业工作经验5年以上,……"], + 所需职业风格: ["作风严谨,……"], + 职业资格: ["<<会计师及以上职称>>"], + }, + 基本信息: { 定编人数: "<<1>>", - 所属部门: this.curDep, + 岗位使命: "<< >>", + 岗位名称: "<<科长>>", 岗位类别: "<<专业管理类>>", - 辖员人数: "<<9>>", + 岗位级别: "<<10>>", + 所属部门: this.curDep, 直接上级: "<<分管领导>>", 直接下级: "<<副科长>>", + 辖员人数: "<<9>>", }, - 工作内容: { - 工作概况: "依据《会计法》及相关财经法规,……", - 工作说明: { - 党风廉政建设: ["抓好全面从严治党和党风廉政建设,……"], - 工作职责: [ - "组织制定企业内部财务管理制度、会计控制规范及会计核算规程,……", - ], - 部门管理: ["根据企业管理规范,……"], + 岗位职责: { + 工作环境与条件: { + 主要工作场所: ["室内"], + 体力工作强度: ["高"], + 出差频度: ["驻外工作"], + 工作时间: ["办公班,实际工作时间8小时"], + 工作环境的特殊性: ["无", "噪音"], + 工作环境的舒适性: ["舒适"], + 脑力工作强度: ["高"], + }, + 工作职责: { 业务管理: ["协助分管财务厂长完善全厂的财务管理体系,……"], - 属员管理: ["开展本部门员工的绩效管理工作,……"], + 临时代理工作: ["完成上级领导临时交办的其他工作任务,……"], + 党风廉政建设: ["抓好全面从严治党和党风廉政建设,……"], 安全职责: [ "保证国家安全生产法规和厂安全生产规章制度在本部门的贯彻执行,……", ], - 临时代理工作: ["完成上级领导临时交办的其他工作任务,……"], + 属员管理: ["开展本部门员工的绩效管理工作,……"], + 部门管理: ["根据企业管理规范,……"], }, 职权范围: { - 所受监督: "企业资金安全、……", - 所施监督: "会计核算、……", + 企业内部沟通: [ + "与企业领导就预算执行情况、财务分析、资金使用情况等……", + ], + 企业外部沟通: [ + "与中烟公司财务部领导就本企业财务预算及资金使用情况等……", + ], 工作权限: [ "对企业财务预算的分解落实、资金及费用的支付有建议权和执行权……", ], - 沟通关系企业内部: [ - "与企业领导就预算执行情况、财务分析、资金使用情况等……", - ], - 沟通关系企业外部: [ - "与中烟公司财务部领导就本企业财务预算及资金使用情况等……", - ], - }, - 工作环境与条件: { - 工作时间: "办公班,实际工作时间8小时", - 工作强度脑力劳动: "高", - 工作强度体力劳动: "高", - 出差频度: "驻外工作", - 主要工作场所: "室内", - 工作环境的舒适性: "舒适", - 工作环境的特殊性: ["无", "噪音"], + 所受监督: ["企业资金安全、……"], + 所施监督: ["会计核算、……"], }, }, - 任职资格: { - 学历: "<<大专及以上>>", - 专业: "<<财会>>", - 技术职称: "<<会计师及以上职称>>", - 所需知识: "熟悉会计及税务法规,……", - 所需技能或能力: ["具备较强的独立工作能力,……"], - 所需经历或经验: "行业工作经验5年以上,……", - 所需体能: "身体健康,……", - 所需职业风格: "作风严谨,……", - }, - 备注: "无", }; this.comName = "JobDescription"; this.comData = this.jobData; From 2788d3b1376fd6d74471fbe74ae1eeb293763786 Mon Sep 17 00:00:00 2001 From: yzw <2431960323@qq.com> Date: Wed, 15 Feb 2023 20:16:43 +0800 Subject: [PATCH 46/47] =?UTF-8?q?=E5=AE=8C=E6=88=90=E4=BA=8B=E4=BB=B6?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=9A=84=E6=9F=A5=E8=AF=A2=E3=80=81=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E3=80=81=E5=88=A0=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../D3Visualization/GraphEventHandler.js | 2 +- src/store/modules/kg.js | 27 ++- src/views/Test/test2.vue | 81 +++++-- src/views/manage/event/basic/index.vue | 225 +++++++++++++++++- 4 files changed, 303 insertions(+), 32 deletions(-) diff --git a/src/components/D3Visualization/GraphEventHandler.js b/src/components/D3Visualization/GraphEventHandler.js index 9cdf7f1..c00b3e2 100644 --- a/src/components/D3Visualization/GraphEventHandler.js +++ b/src/components/D3Visualization/GraphEventHandler.js @@ -108,7 +108,7 @@ export class GraphEventHandler { this.selectItem(relationship) this.onItemSelected({type: 'relationship', item: {id: relationship.id, type: relationship.type, properties: relationship.propertyList}}) // 存储关系数据到vuex中,其他模块可使用 - store.commit('kg/SET_KG', {type: 'relation', item: {id: relationship.id, labels: relationship.type, properties: relationship.propertyList}}) + store.commit('kg/SET_KG', {type: 'relation', item: {id: relationship.id, labels: [relationship.type], properties: relationship.propertyList}}) } else { this.deselectItem() } diff --git a/src/store/modules/kg.js b/src/store/modules/kg.js index 44e0d76..85b8290 100644 --- a/src/store/modules/kg.js +++ b/src/store/modules/kg.js @@ -12,12 +12,37 @@ const state = getDefaultState() const mutations = { RESET_KG: (state) => { - state = getDefaultState() + state.type = 'node' + state.data = {} + // state = getDefaultState() + // console.log('mutation', state) }, SET_KG: (state, obj) => { state.type = obj.type state.data = obj.item }, + SET_VALUE: (state, obj) => { + for(let i=0; i { + let properties = state.data.properties + let index = -1 + for(let i=0; i -
- -
+ + + + + + + + + + - - - - + \ No newline at end of file diff --git a/src/views/manage/event/basic/index.vue b/src/views/manage/event/basic/index.vue index f5c8dce..337d786 100644 --- a/src/views/manage/event/basic/index.vue +++ b/src/views/manage/event/basic/index.vue @@ -52,15 +52,79 @@
-
{{curType}}
+
+ {{ curType }}: {{ curTypeName }} +
+
+ ID {{ curId }} +
+ + + + + + + + + + + 删除整个{{ this.curType }}
+ + + + + + 取 消 + 确 定 + +