2、工作说明
-
+
-
@@ -153,7 +172,10 @@
工作权限 |
-
+
|
@@ -162,6 +184,7 @@
|
@@ -170,6 +193,7 @@
|
@@ -301,7 +325,10 @@
所需技能能力 |
-
+
|
@@ -340,10 +367,11 @@ import EditList from "@/components/EditList/index.vue";
export default {
name: "JobShow",
- props: ["data"],
+ props: ["data", "comTitleEdit"],
data() {
return {
- jobData: this.data
+ jobData: this.data,
+ titleEdit: this.comTitleEdit
};
},
methods: {
@@ -352,22 +380,20 @@ export default {
this.jobData[bigDomain][domain] = newVal;
},
changeCheckGroup(newVal) {
- // console.log(newVal);
- // console.log(this.jobData.工作内容.工作环境与条件);
+ // console.log(newVal);
+ // console.log(this.jobData.工作内容.工作环境与条件);
},
getVal() {
- return this.jobData;
- }
+ return this.jobData;
+ },
},
components: {
EditText,
EditDiv,
- EditList
- }
+ EditList,
+ },
};
\ No newline at end of file
diff --git a/src/views/job/show.vue b/src/views/job/show.vue
index 2646701..8f62627 100644
--- a/src/views/job/show.vue
+++ b/src/views/job/show.vue
@@ -47,7 +47,7 @@
>
保存
@@ -87,7 +88,12 @@
-
+
@@ -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 @@
+
+
+
+ 提交修改
+
+
+
+ 用户名 |
+ {{ priorityData.username }} |
+ 身份证号 |
+ {{ priorityData.id_card }} |
+
+
+ 岗位 |
+ 读权限 |
+
+
+
+ |
+
+
+ 写权限 |
+
+
+
+ |
+
+
+ 人员 |
+ 读权限 |
+
+
+
+ |
+
+
+ 写权限 |
+
+
+
+ |
+
+
+ 事件 |
+ 读权限 |
+
+
+
+ |
+
+
+ 写权限 |
+
+
+
+ |
+
+
+
+
+
+
+
+
\ 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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