期刊引用+分类管理(集团分类+期刊)

This commit is contained in:
2024-09-26 13:52:24 +08:00
parent f679d3e7cb
commit b306198109
14 changed files with 3009 additions and 43 deletions

View File

@@ -0,0 +1,19 @@
import OrgTree from './org-tree'
const install = Vue => {
if (install.installed) {
return
}
install.installed = true
Vue.component(OrgTree.name, OrgTree)
}
OrgTree.install = install
if (typeof window !== 'undefined' && window.Vue) {
window.Vue.use(OrgTree)
}
export default OrgTree

View File

@@ -0,0 +1,177 @@
// 判断是否叶子节点
const isLeaf = (data, prop) => {
return !(Array.isArray(data[prop]) && data[prop].length > 0)
}
// console.info('Thank you for using vue-tree-color \nIf you have any questions about this plug-in, please contact me in the following ways \nWeChat: yanjiahui12345 \nWeChat official number: Web_Miao')
// 创建 node 节点
export const renderNode = (h, data, context) => {
const { props } = context
const cls = ['org-tree-node']
const childNodes = []
const children = data[props.props.children]
if (isLeaf(data, props.props.children)) {
cls.push('is-leaf')
} else if (props.collapsable && !data[props.props.expand]) {
cls.push('collapsed')
}
childNodes.push(renderLabel(h, data, context))
if (!props.collapsable || data[props.props.expand]) {
childNodes.push(renderChildren(h, children, context))
}
return h('div', {
domProps: {
className: cls.join(' ')
}
}, childNodes)
}
// 创建展开折叠按钮
export const renderBtn = (h, data, { props, listeners }) => {
const expandHandler = listeners['on-expand']
const expandMouseover = listeners['on-expand-mouseover']
const expandMouseout = listeners['on-expand-mouseout']
let cls = ['org-tree-node-btn']
if (data[props.props.expand]) {
cls.push('expanded')
}
return h('span', {
domProps: {
className: cls.join(' ')
},
on: {
'click': e => expandHandler && expandHandler(e, data),
'mouseover': e => expandMouseover && expandMouseover(e, data),
'mouseout': e => expandMouseout && expandMouseout(e, data)
}
})
}
// 创建 label 节点
export const renderLabel = (h, data, context) => {
const { props, listeners } = context
const label = data[props.props.label]
const renderContent = props.renderContent
// event handlers
const clickHandler = listeners['on-node-click']
const mouseOverHandler = listeners['on-node-mouseover']
const mouseOutHandler = listeners['on-node-mouseout']
const childNodes = []
if (typeof renderContent === 'function') {
let vnode = renderContent(h, data)
vnode && childNodes.push(vnode)
} else {
childNodes.push(label)
}
if (props.collapsable && !isLeaf(data, props.props.children)) {
childNodes.push(renderBtn(h, data, context))
}
const cls = ['org-tree-node-label-inner']
let { labelWidth, labelClassName, selectedClassName, selectedKey, judge, NodeClass } = props
if (typeof labelWidth === 'number') {
labelWidth += 'px'
}
if (typeof labelClassName === 'function') {
labelClassName = labelClassName(data)
}
labelClassName && cls.push(labelClassName)
// add selected class and key from props
if (typeof selectedClassName === 'function') {
selectedClassName = selectedClassName(data)
}
selectedClassName && selectedKey && data[selectedKey] && cls.push(selectedClassName)
return h('div',
{
domProps: {
className: 'org-tree-node-label'
}
},
[
h('div',
{
domProps: {
className: ChangeTheColor(data, judge, NodeClass, props) + " org-tree-node-label-inner"
},
style: {
width: labelWidth
},
on: {
click: e => clickHandler && clickHandler(e, data),
mouseover: e => mouseOverHandler && mouseOverHandler(e, data),
mouseout: e => mouseOutHandler && mouseOutHandler(e, data)
}
}, childNodes)
]
)
}
function ChangeTheColor(e, judge, NodeClass, props) {
if (e.selected==0 && props.isSelect) {
return 'noselect-org'
} else {
if (judge !== "" && judge !== undefined && judge !== null && judge.swtich !== false) {
for (var k in judge) {
var a = (eval("e." + k))
if (NodeClass) {
for (let c = 0; c < NodeClass.length; c++) {
if (a === NodeClass[c])
return NodeClass[c]
else if (NodeClass.length - 1 == c)
return ""
}
} else {
return ""
}
}
} else {
return ""
}
}
}
// 创建 node 子节点
export const renderChildren = (h, list, context) => {
if (Array.isArray(list) && list.length) {
const children = list.map(item => {
return renderNode(h, item, context)
})
return h('div', {
domProps: {
className: 'org-tree-node-children'
}
}, children)
}
return ''
}
export const render = (h, context) => {
const { props } = context
return renderNode(h, props.data, context)
}
export default render

View File

@@ -0,0 +1,550 @@
<template>
<div class="org-tree-container outBox">
<!-- @mousewheel.prevent="hMouseWheel" -->
<div class="org-tree" :class="{ horizontal, collapsable,isSelect }" v-drag id="ddd">
<org-tree-node
:data="data"
:props="props"
:horizontal="horizontal"
:label-width="labelWidth"
:collapsable="collapsable"
:isSelect="isSelect"
:render-content="renderContent"
:selectedKey="2"
selectedClassName="select-org"
:label-class-name="labelClassName"
@on-expand="(e, data) => $emit('on-expand', e, data)"
@on-expand-mouseover="(e, data) => $emit('on-expand-mouseover', e, data)"
@on-expand-mouseout="(e, data) => $emit('on-expand-mouseout', e, data)"
@on-node-click="
(e, data) => {
$emit('on-node-click', e, data);
}
"
@on-node-mouseover="(e, data) => $emit('on-node-mouseover', e, data)"
@on-node-mouseout="(e, data) => $emit('on-node-mouseout', e, data)"
>
</org-tree-node>
</div>
</div>
</template>
<script>
import render from './node';
export default {
name: 'OrgTree',
components: {
OrgTreeNode: {
render,
functional: true
}
},
props: {
data: {
type: Object,
required: true
},
props: {
type: Object,
default: () => ({
label: 'label',
expand: 'expand',
children: 'children'
})
},
horizontal: Boolean,
collapsable: Boolean,
isSelect: Boolean,
renderContent: Function,
labelWidth: [String, Number],
labelClassName: [Function, String]
},
directives: {
drag: {
// 以下代码大家可以自己提出去封装一下
inserted: function (el) {
// el.style.cursor = 'move'
var firstTime = '';
var lastTime = '';
el.onmousedown = function (e) {
let disx = e.pageX - el.offsetLeft;
let disy = e.pageY - el.offsetTop;
document.getElementById('ddd').setAttribute('data-flag', false);
firstTime = new Date().getTime();
document.onmousemove = function (e) {
let x = e.pageX - disx;
let y = e.pageY - disy;
let maxX = document.body.clientWidth - parseInt(window.getComputedStyle(el).width);
let maxY = document.body.clientHeight - parseInt(window.getComputedStyle(el).height);
// el.style.left = x + 'px'
// el.style.top = y + 'px'
if (x < 0) {
x = 0;
} else if (x > maxX) {
x = maxX;
}
if (y < 0) {
y = 0;
} else if (y > maxY) {
y = maxY;
}
let et = e || window.event;
et.preventDefault();
};
document.onmouseup = function () {
lastTime = new Date().getTime();
if (lastTime - firstTime < 150) {
document.getElementById('ddd').setAttribute('data-flag', true);
}
document.onmousemove = document.onmouseup = null;
};
};
}
}
},
methods: {
hMouseWheel(ev) {
// 缩放功能
var ev = ev || window.event;
var down = true; // 定义一个标志,当滚轮向下滚时,执行一些操作
down = ev.wheelDelta ? ev.wheelDelta < 0 : ev.detail > 0;
var scal = 1;
var oDiv = document.getElementById('ddd');
if (down) {
// 鼠标滚轮向下放大
// scal = (parseFloat(scal) + 0.01).toFixed(2);
scal = scal;
oDiv.style.transform = 'scale(' + scal + ')'; //scale()在这里要使用拼接的方式才能生效
oDiv.style.transformOrigin = '0 0';
} else {
// 鼠标滚轮向上缩小
if (scal == 0.01) {
scal = 0.01;
return;
} else {
// scal = (parseFloat(scal) - 0.01).toFixed(2);
scal = scal - 0.3;
}
oDiv.style.transform = 'scale(' + scal + ')'; //scale()在这里要使用拼接的方式才能生效。
oDiv.style.transformOrigin = '0 0';
}
if (ev.preventDefault) {
/*FF 和 Chrome*/
ev.preventDefault(); // 阻止默认事件
}
return false;
}
}
};
</script>
<style lang="less" scoped>
.outBox {
height: 100%;
width: 100%;
position: relative;
overflow: hidden;
}
#ddd {
height: 100%;
// width:100%;
position: absolute;
overflow: hidden;
// left: 20%; // 打开tree在中间位置弊端是添加节点整个tree不会自动向左移动造成左边留白
}
.org-tree-container {
display: inline-block;
padding: 15px;
background-color: #fff;
}
.org-tree {
display: table;
text-align: center;
}
.org-tree:before,
.org-tree:after {
content: '';
display: table;
}
.org-tree:after {
clear: both;
}
.org-tree-node,
.org-tree-node-children {
position: relative;
margin: 0;
padding: 0;
list-style-type: none;
}
.org-tree-node:before,
.org-tree-node-children:before,
.org-tree-node:after,
.org-tree-node-children:after {
transition: all 0.35s;
}
.org-tree-node-label {
position: relative;
display: inline-block;
}
.org-tree-node-label .org-tree-node-label-inner {
cursor: pointer;
text-align: center;
border-radius: 3px;
box-shadow: 0 1px 5px rgba(0, 0, 0, 0.15);
// tree节点不换行
// padding: 6px 20px;
// white-space: nowrap;
// tree节点换行
padding: 2px 10px;
width: auto;
word-wrap: break-word;
}
.org-tree-node-btn {
position: absolute;
top: 100%;
font-size: 12px;
left: 50%;
width: 20px;
height: 20px;
z-index: 10;
margin-left: -11px;
margin-top: 9px;
background-color: #fff;
border: 1px solid #ccc;
border-radius: 50%;
box-shadow: 0 0 2px rgba(0, 0, 0, 0.15);
cursor: pointer;
transition: all 0.35s ease;
}
.org-tree-node-btn:hover {
background-color: #e7e8e9;
transform: scale(1.15);
}
.org-tree-node-btn:before,
.org-tree-node-btn:after {
content: '';
position: absolute;
}
.org-tree-node-btn:before {
top: 50%;
left: 4px;
right: 4px;
height: 0;
border-top: 1px solid #ccc;
}
.org-tree-node-btn:after {
top: 4px;
left: 50%;
bottom: 4px;
width: 0;
border-left: 1px solid #ccc;
}
.org-tree-node-btn.expanded:after {
border: none;
}
.org-tree-node {
padding-top: 20px;
display: table-cell;
vertical-align: top;
}
.org-tree-node.is-leaf,
.org-tree-node.collapsed {
padding-left: 10px;
padding-right: 10px;
}
.org-tree-node:before,
.org-tree-node:after {
content: '';
position: absolute;
top: 0;
left: 0;
width: 50%;
height: 19px;
}
.org-tree-node:after {
left: 50%;
border-left: 1px solid #ddd;
}
.org-tree-node:not(:first-child):before,
.org-tree-node:not(:last-child):after {
border-top: 1px solid #ddd;
}
.collapsable .org-tree-node.collapsed {
padding-bottom: 30px;
}
.collapsable .org-tree-node.collapsed .org-tree-node-label:after {
content: '';
position: absolute;
top: 100%;
left: 0;
width: 50%;
height: 20px;
border-right: 1px solid #ddd;
}
.org-tree > .org-tree-node {
padding-top: 0;
}
.org-tree > .org-tree-node:after {
border-left: 0;
}
.org-tree-node-children {
padding-top: 20px;
display: table;
}
.org-tree-node-children:before {
content: '';
position: absolute;
top: 0;
left: 50%;
width: 0;
height: 20px;
border-left: 1px solid #ddd;
}
.org-tree-node-children:after {
content: '';
display: table;
clear: both;
}
.horizontal .org-tree-node {
display: table-cell;
float: none;
padding-top: 0;
padding-left: 20px;
}
.horizontal .org-tree-node.is-leaf,
.horizontal .org-tree-node.collapsed {
padding-top: 4px;
padding-bottom: 4px;
}
.horizontal .org-tree-node:before,
.horizontal .org-tree-node:after {
width: 19px;
height: 50%;
}
.horizontal .org-tree-node:after {
top: 50%;
left: 0;
border-left: 0;
}
.horizontal .org-tree-node:only-child:before {
top: 1px;
border-bottom: 1px solid #ddd;
}
.horizontal .org-tree-node:not(:first-child):before,
.horizontal .org-tree-node:not(:last-child):after {
border-top: 0;
border-left: 1px solid #ddd;
}
.horizontal .org-tree-node:not(:only-child):after {
border-top: 1px solid #ddd;
}
.horizontal .org-tree-node .org-tree-node-inner {
display: table;
}
.horizontal .org-tree-node-label {
display: table-cell;
vertical-align: middle;
}
.horizontal.collapsable .org-tree-node.collapsed {
padding-right: 30px;
}
.horizontal.collapsable .org-tree-node.collapsed .org-tree-node-label:after {
top: 0;
left: 100%;
width: 20px;
height: 50%;
border-right: 0;
border-bottom: 1px solid #ddd;
}
.horizontal .org-tree-node-btn {
top: 50%;
left: 100%;
margin-top: -11px;
margin-left: 9px;
}
.horizontal > .org-tree-node:only-child:before {
border-bottom: 0;
}
.horizontal .org-tree-node-children {
display: table-cell;
padding-top: 0;
padding-left: 20px;
}
.horizontal .org-tree-node-children:before {
top: 50%;
left: 0;
width: 20px;
height: 0;
border-left: 0;
border-top: 1px solid #ddd;
}
.horizontal .org-tree-node-children:after {
display: none;
}
.horizontal .org-tree-node-children > .org-tree-node {
display: block;
}
/* 1 */
.org-tree-node > .org-tree-node-label > .org-tree-node-label-inner {
background-color: #4c97de;
color: #fff;
}
/* 2 */
.org-tree-node-children > .org-tree-node > .org-tree-node-label > .org-tree-node-label-inner {
background-color: #36a4fd;
color: #fff;
font-size: 14px;
}
/* 3 */
.org-tree-node-children > .org-tree-node > .org-tree-node-children > .org-tree-node > .org-tree-node-label > .org-tree-node-label-inner {
background-color: #c2d4ff;
color: #4665b0;
font-size: 12px;
}
/* 4 */
.org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-label
> .org-tree-node-label-inner {
background-color: #9dd4e9;
color: #4794b1;
font-size: 12px;
}
/* 第5层 */
.org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-label
> .org-tree-node-label-inner {
background-color: #9ac4f7;
color: #1a75dd;
font-size: 12px;
}
/* 第6层 */
.org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-label
> .org-tree-node-label-inner {
background-color: #eccefe;
color: #653ab5;
font-size: 12px;
}
/* 第7层 */
.org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-label
> .org-tree-node-label-inner {
background-color: #ffe4b4;
color: #dea540;
font-size: 12px;
}
/* 第8层 */
.org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-label
> .org-tree-node-label-inner {
background-color: #c8efef;
color: #76bebe;
font-size: 12px;
}
/* 第9层 */
.org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-label
> .org-tree-node-label-inner {
background-color: #e6d7f3;
color: #bd99dd;
font-size: 12px;
}
/* 第10层 */
.org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-children
> .org-tree-node
> .org-tree-node-label
> .org-tree-node-label-inner {
background-color: #f4f7fe;
font-size: 12px;
color: #9eb1dd;
}
.noselect-org{
background-color: #f0f0f0 !important;
color: #aaa !important;
}
/* 每层多.org-tree-node-children>.org-tree-node */
/* 节点.org-tree-node-label>.org-tree-node-label-inner*/
</style>