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

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,688 @@
<template>
<div id="app">
<!-- <el-button type="primary" @click="horizontal = !horizontal">切换tree方向</el-button> -->
<div style="overflow: hidden">
<span style="font-size: 14px;font-weight: 700; color: #333; margin: 0 10px 0 0">{{ this.$t('sidebar.GroupClassification') }} </span>
<!-- <span style="font-size: 14px; color: #606266; margin: 0 10px 0 0">{{ this.$t('sidebar.GroupClassification')}}: </span>
<el-select
v-model="dataForm.journal_id"
placeholder="Please select a journal"
@change="handleSelectJournal"
style="width: 220px; margin-right: 35px"
>
<el-option v-for="item in df_jour" :label="item.title" :key="item.journal_id" :value="item.journal_id"></el-option>
</el-select> -->
<div
@click="toggleExpand(data, true)"
style="float: right; line-height: 32px; color: #006699; font-size: 12px; font-weight: 700; margin-right: 20px"
>
{{ $t('GroupClassification.ExpandAll') }}
</div>
</div>
<org-tree
id="orgTreeNode"
:data="data"
:horizontal="horizontal"
collapsable
:render-content="renderContent"
@on-expand="onExpand"
@on-node-mouseover="onMouseover"
@on-node-mouseout="onMouseout"
@on-expand-mouseover="Mouseover"
@on-expand-mouseout="Mouseout"
@on-node-click="cccc"
>
</org-tree>
<div
class="floating"
v-show="isShowF && bd && this.currentTreeData.id != 'abc0'"
@mouseover="
() => {
isShowF = true;
}
"
@mouseout="
() => {
isShowF = false;
}
"
@mousewheel.prevent="mouseWheelDia"
>
<p @click="addOrEdit(0)">{{ $t('GroupClassification.add') }}</p>
<p @click="addOrEdit(1)">{{ $t('GroupClassification.edit') }}</p>
<p @click="del">{{ $t('GroupClassification.delete') }}</p>
<p @click="openJournal">{{ $t('GroupClassification.AssociatedJournal') }}</p>
</div>
<!-- 增加/编辑弹层 -->
<el-dialog
:title="isEdit == 0 ? $t('GroupClassification.add') : $t('GroupClassification.edit')"
v-if="dialogVisible"
:visible="dialogVisible"
@close="clearDialog"
show-close
:close-on-click-modal="false"
custom-class="addOrEditDia"
width="35%"
>
<div class="tips">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="demo-ruleForm" @submit.native.prevent label-width="120px">
<el-form-item :label="$t('GroupClassification.major_current')" v-if="isEdit == 0">
{{ this.currentTreeData.label }}
</el-form-item>
<el-form-item prop="major_title" :label="$t('GroupClassification.major_title')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.major_title"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
<el-form-item prop="nickname" :label="$t('GroupClassification.nickname')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.nickname"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
<el-form-item prop="major_sort" :label="$t('GroupClassification.sort')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.major_sort"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<div class="tip-left">
<el-button size="small" type="info" @click="dialogVisible = false">{{ $t('GroupClassification.cancel') }}</el-button>
<el-button size="small" type="primary" @click="confirm">{{ $t('GroupClassification.submit') }}</el-button>
</div>
</span>
</el-dialog>
<!-- 删除 -->
<el-dialog
:title="$t('GroupClassification.delete')"
v-if="dialogVisible2"
:visible="dialogVisible2"
@close="clearDialog"
custom-class="delDia"
width="35%"
>
<div class="tips">
<p style="text-align: left">{{ $t('GroupClassification.deleteInfo') }} {{ this.currentTreeData.label }} ?</p>
</div>
<span slot="footer" class="dialog-footer">
<div class="tip-left">
<el-button size="mini" type="info" @click="dialogVisible2 = false">{{ $t('GroupClassification.cancel') }}</el-button>
<el-button size="mini" type="primary" @click="confimdelete">{{ $t('GroupClassification.submit') }}</el-button>
</div>
</span>
</el-dialog>
<el-drawer
:title="this.currentTreeData.label + ' ' + $t('GroupClassification.AssociatedJournal')"
:visible.sync="drawer"
direction="rtl"
:before-close="handleClose"
size="50%"
>
<div style="padding: 0 20px; box-sizing: border-box">
<el-table
:data="AssociatedJournalList"
class="table"
ref="multipleTable"
header-cell-class-name="table-header"
empty-text="New messages (0)"
>
<el-table-column label="No." align="center" width="50">
<template slot-scope="scop">
{{ scop.$index + 1 }}
</template>
</el-table-column>
<el-table-column prop="title" label="title"></el-table-column>
<el-table-column prop="issn" width="160" label="issn"></el-table-column>
<el-table-column label=" " width="80" align="center">
<template slot-scope="scope">
<!-- <el-button plain type="primary" icon="el-icon-edit" @click="handleEdit(scope.row)">Edit Message</el-button> -->
<!-- <p @click="addOrEdit(0)" v-if="scope.row.selected==0">{{ $t('GroupClassification.bind') }}</p> -->
<p
@click="
changeBind({
...scope.row,
selected: 1
})
"
style="color: red; cursor: pointer"
>
{{ $t('GroupClassification.Unbind') }}
</p>
</template>
</el-table-column>
</el-table>
</div>
</el-drawer>
</div>
</template>
<script>
import OrgTree from '@/components/org-tree';
import bus from '@/components/common/bus';
export default {
name: 'app',
components: {
OrgTree
},
directives: {
focus: {
inserted: function (el) {
el.querySelector('input').focus();
}
}
},
data() {
return {
AssociatedJournalList: [],
drawer: false,
bd: true,
ruleForm: {
major_title: '',
nickname: ''
},
rules: {
major_title: [{ required: true, message: this.$t('GroupClassification.enter'), trigger: 'change' }]
// nickname: [{ required: true, message: this.$t('GroupClassification.enter'), trigger: 'change' }]
},
dialogVisible: false,
dialogVisible2: false,
isShowF: false,
data: {
id: 'abc0',
label: this.$t('sidebar.GroupClassification'),
leave: 1, // tree层级
children: []
},
horizontal: true,
collapsable: true,
isEdit: 0,
currentTreeData: {},
lastId: 11,
labelClassName: 'bg-white',
urlList: {
list: 'api/Major/getMajorList',
add: 'api/Major/addMajor',
edit: 'api/Major/editMajor',
delete: 'api/Major/delMajor',
AssociatedJournalList: 'api/Major/getJournalsForMajor',
bind: 'api/Major/addJournalMajor',
unbind: 'api/Major/delJournalMajor'
}
};
},
watch: {
dialogVisible: {
handler(newV, oldV) {
if (newV == false) {
this.ruleForm = {};
}
}
}
},
async created() {
const a = this.numFormatter(9999999999);
console.log(a);
await this.getDate();
},
async activated() {
await this.getDate();
},
methods: {
changeBind(b) {
var BindInfo = b.selected == 0 ? this.$t('GroupClassification.BindInfo') : this.$t('GroupClassification.UnBindInfo');
this.$confirm(`${this.$t('GroupClassification.JournalBindInfo')} ${b.title}${BindInfo}`, '提示', {
confirmButtonText: this.$t('GroupClassification.submit'),
dangerouslyUseHTMLString: true,
cancelButtonText: this.$t('GroupClassification.cancel'),
type: 'warning'
})
.then(() => {
var url = '';
if (b.selected == 1) {
url = this.urlList.unbind;
} else if (b.selected == 0) {
url = this.urlList.bind;
}
url;
console.log('url at line 278:', url);
this.$api
.post(url, {
journal_issn: b.issn,
major_id: this.currentTreeData.major_id
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
this.$nextTick(async () => {
setTimeout(async () => {
await this.getAssociatedJournalList();
}, 200);
});
})
.catch(() => {
// this.$message({
// type: 'info',
// message: this.$t('GroupClassification.cancel')
// });
});
},
handleClose() {
this.drawer = false;
},
getAssociatedJournalList() {
this.$api
.post(this.urlList.AssociatedJournalList, {
major_id: this.currentTreeData.major_id
})
.then(async (res) => {
if (res.code == 0) {
this.AssociatedJournalList = res.data.list;
console.log('this.AssociatedJournalList at line 234:', this.AssociatedJournalList);
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
openJournal() {
this.drawer = true;
// AssociatedJournalList
this.getAssociatedJournalList();
},
renameKeys(obj, oldKey, newKey) {
if (obj[oldKey]) {
obj[newKey] = obj[oldKey];
delete obj[oldKey];
}
for (let k in obj) {
if (typeof obj[k] === 'object') {
this.renameKeys(obj[k], oldKey, newKey);
}
}
},
// 获取数据
async getDate() {
this.$api
.post(this.urlList.list, {})
.then(async (res) => {
if (res.code == 0) {
this.data.children = res.data.majors;
await this.renameKeys(this.data.children, 'major_title', 'label');
await this.toggleExpand(this.data, true); // 调用全部展开
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
// 增加千分位
numFormatter(num) {
let res = num;
if (num && num !== null) {
res = num.toString().replace(/\d+/, (n) => {
return n.replace(/(\d)(?=(\d{3})+$)/g, ($1) => {
return $1 + ',';
});
});
}
return res;
},
cccc(a, b) {
// console.log(a);
// console.log(b);
},
mouseWheelDia() {
// bugfix 鼠标移入弹层滚动鼠标不能缩放bug
this.isShowF = false;
},
Mouseover() {
// 鼠标移入缩放icon
this.bd = false;
},
Mouseout() {
// 鼠标移出缩放icon
this.bd = true;
},
clearDialog() {
// 关闭添加/编辑/删除弹层
this.dialogVisible = false;
this.dialogVisible2 = false;
this.ruleForm.major_title = '';
},
addOrEdit(val) {
// 点击添加/编辑
// 新增val0编辑val1
this.dialogVisible = true;
this.isEdit = val;
// eslint-disable-next-line eqeqeq
if (val == 1) {
// 编辑回显
this.ruleForm = {
major_title: this.currentTreeData.label,
major_sort: this.currentTreeData.major_sort,
major_id: this.currentTreeData.major_id,
nickname: this.currentTreeData.nickname
};
} else {
this.ruleForm.pid = this.currentTreeData.major_id;
}
},
async confirm() {
// 添加/编辑的确定
this.$refs.ruleForm.validate(async (valid) => {
if (valid) {
if (this.isEdit == 1) {
// 编辑
// this.ruleForm.major_title =
// data.id = this.treeData.id;
// this.currentTreeData.label = data.label;
this.$api
.post(this.urlList.edit, {
major_title: this.ruleForm.major_title,
major_id: this.ruleForm.major_id,
major_sort: this.ruleForm.major_sort,
nickname: this.ruleForm.nickname
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
// 前端编辑数据
// loading.close();
} else {
this.$api
.post(this.urlList.add, {
major_title: this.ruleForm.major_title,
pid: this.ruleForm.pid,
major_sort: this.ruleForm.major_sort,
nickname: this.ruleForm.nickname
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
// 添加
// 前端添加数据,需要自己生成子级id,可以传数据的时候把最后一级id传过来,进行累加
// data.id = this.lastId++;
// // data.level = this.currentTreeData.level + 1;
// data.label = this.ruleForm.major_title;
// data.expand = true;
// const render = (formData) => {
// formData.some((item) => {
// if (item.id === this.currentTreeData.id) {
// if (item.children) {
// item.children.push(data);
// } else {
// this.$set(item, 'children', [data]);
// }
// } else if (item.children) {
// render(item.children);
// }
// });
// };
// const arr = [this.data];
// render(arr);
// this.data = arr[0];
// loading.close();
}
this.$nextTick(async () => {
setTimeout(async () => {
await this.getDate();
}, 200);
});
} else {
// loading.close();
}
});
},
del() {
this.dialogVisible2 = true;
},
async confimdelete() {
// 是否确定删除当前节点
// 前端删除 遍历原数据,删除匹配id数据
this.$api
.post(this.urlList.delete, {
major_id: this.currentTreeData.major_id
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
this.$nextTick(async () => {
setTimeout(async () => {
await this.getDate();
}, 200);
});
});
// const deleteData = (data) => {
// data.some((item, i) => {
// if (item.id === this.currentTreeData.id) {
// data.splice(i, 1);
// } else if (item.children) {
// deleteData(item.children);
// }
// });
// };
// const arr = [this.data];
// deleteData(arr);
// this.data = arr[0] ? arr[0] : {};
// this.dialogVisible2 = false;
// this.$message({
// type: 'success',
// message: '节点删除成功!'
// });
},
onMouseover(e, data) {
var collapse = localStorage.getItem('collapse');
var width = Number(e.clientX - (!collapse || collapse == 'false' ? 260 : 40));
// 鼠标移入树节点
this.currentTreeData = data; // 鼠标移入,该节点的所有数据
this.isShowF = true;
var floating = document.getElementsByClassName('floating')[0];
if (floating) {
floating.style.left = width + 'px';
floating.style.top = e.clientY - 80 + 'px';
}
},
onMouseout(e, data) {
// 鼠标移出树节点
this.isShowF = false;
},
renderContent(h, data) {
return data.label;
},
onExpand(e, data) {
// 节点展开收缩
// eslint-disable-next-line eqeqeq
if (data.leave == 1 && data.expand == true) {
// bugfix
var dom = document.getElementById('ddd');
(dom.style.top = '50%'), (dom.style.left = '8%');
}
if ('expand' in data) {
data.expand = !data.expand;
if (!data.expand && data.children) {
this.collapse(data.children);
}
} else {
this.$set(data, 'expand', true);
}
},
collapse(list) {
list.forEach((child) => {
if (child.expand) {
child.expand = false;
}
child.children && this.collapse(child.children);
});
},
toggleExpand(data, val) {
// 节点默认全部展开
var _this = this;
// console.log(data);
if (Array.isArray(data)) {
data.forEach(function (item) {
_this.$set(item, 'expand', val);
if (item.children) {
_this.toggleExpand(item.children, val);
}
});
} else {
this.$set(data, 'expand', val);
if (data.children) {
_this.toggleExpand(data.children, val);
}
}
}
}
};
</script>
<style lang="less" scoped>
.floating {
background: rgba(0, 0, 0, 0.7);
box-shadow: rgba(0, 0, 0, 0.2);
width: auto;
// height: 45px;
line-height: 24px;
// display: flex;
// justify-content: space-around;
position: absolute;
color: #fff;
border-radius: 5px;
box-sizing: border-box;
left: 0;
top: 0;
transition: all 0.3s;
z-index: 999;
font-size: 12px;
padding: 6px;
span {
cursor: pointer;
}
}
</style>
<style lang="less">
.addOrEditDia,
.delDia {
padding: 14px 18px 10px 18px;
border-radius: 4px !important;
.el-dialog__header {
display: flex;
justify-content: space-between;
padding: 20px 0 !important;
}
.el-dialog__body {
padding: 0;
padding-top: 20px;
// margin-top: 37px;
}
.el-dialog__footer {
padding: 27px 0 9px 0 !important;
}
.el-dialog__headerbtn {
position: static !important;
}
}
.bg-white {
background-color: white;
}
.bg-orange {
background-color: orange;
}
.bg-gold {
background-color: gold;
}
.bg-gray {
background-color: gray;
}
.bg-lightpink {
background-color: lightpink;
}
.bg-chocolate {
background-color: chocolate;
}
.bg-tomato {
background-color: tomato;
}
.outBox {
height: calc(100% - 100px) !important;
margin-top: 10px;
width: calc(100% - 40px) !important;
overflow: auto !important;
}
</style>

View File

@@ -0,0 +1,648 @@
<template>
<div id="app">
<!-- <el-button type="primary" @click="horizontal = !horizontal">切换tree方向</el-button> -->
<div style="overflow: hidden">
<span style="font-size: 14px;font-weight: 700; color: #606266; margin: 0 10px 0 0">{{ $t('GroupClassification.Journal') }}: </span>
<el-select
v-model="dataForm.journal_id"
placeholder="Please select a journal"
@change="handleSelectJournal"
style="width: 220px; margin-right: 35px"
>
<el-option v-for="item in df_jour" :label="item.title" :key="item.journal_id" :value="item.journal_id"></el-option>
</el-select>
<div
@click="toggleExpand(data, true)"
style="float: right; line-height: 32px; color: #006699; font-size: 12px; font-weight: 700; margin-right: 20px"
>
{{ $t('GroupClassification.ExpandAll') }}
</div>
</div>
<org-tree
id="orgTreeNode"
:data="data"
:horizontal="horizontal"
isSelect
collapsable
:render-content="renderContent"
@on-expand="onExpand"
@on-node-mouseover="onMouseover"
@on-node-mouseout="onMouseout"
@on-expand-mouseover="Mouseover"
@on-expand-mouseout="Mouseout"
@on-node-click="cccc"
>
</org-tree>
<!-- <div
class="floating"
v-show="isShowF && bd&&this.currentTreeData.id!='abc0'"
@mouseover="
() => {
isShowF = true;
}
"
@mouseout="
() => {
isShowF = false;
}
"
@mousewheel.prevent="mouseWheelDia"
>
<p @click="addOrEdit(0)">{{ $t('GroupClassification.bind') }}</p>
<p @click="addOrEdit(1)">{{ $t('GroupClassification.Unbind') }}</p>
</div> -->
<!-- 增加/编辑弹层 -->
<el-dialog
:title="isEdit == 0 ? $t('GroupClassification.add') : $t('GroupClassification.edit')"
v-if="dialogVisible"
:visible="dialogVisible"
@close="clearDialog"
show-close
:close-on-click-modal="false"
custom-class="addOrEditDia"
width="35%"
>
<div class="tips">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="demo-ruleForm" @submit.native.prevent label-width="120px">
<el-form-item :label="$t('GroupClassification.major_current')" v-if="isEdit == 0">
{{ this.currentTreeData.label }}
</el-form-item>
<el-form-item prop="major_title" :label="$t('GroupClassification.major_title')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.major_title"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
<el-form-item prop="nickname" :label="$t('GroupClassification.nickname')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.nickname"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
<el-form-item prop="major_sort" :label="$t('GroupClassification.sort')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.major_sort"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<div class="tip-left">
<el-button size="small" type="info" @click="dialogVisible = false">{{ $t('GroupClassification.cancel') }}</el-button>
<el-button size="small" type="primary" @click="confirm">{{ $t('GroupClassification.submit') }}</el-button>
</div>
</span>
</el-dialog>
<!-- 删除 -->
<el-dialog
:title="$t('GroupClassification.delete')"
v-if="dialogVisible2"
:visible="dialogVisible2"
@close="clearDialog"
custom-class="delDia"
width="35%"
>
<div class="tips">
<p style="text-align: left">{{ $t('GroupClassification.deleteInfo') }} {{ this.currentTreeData.label }} ?</p>
</div>
<span slot="footer" class="dialog-footer">
<div class="tip-left">
<el-button size="mini" type="info" @click="dialogVisible2 = false">{{ $t('GroupClassification.cancel') }}</el-button>
<el-button size="mini" type="primary" @click="confimdelete">{{ $t('GroupClassification.submit') }}</el-button>
</div>
</span>
</el-dialog>
</div>
</template>
<script>
import OrgTree from '@/components/org-tree';
import bus from '@/components/common/bus';
export default {
name: 'app',
components: {
OrgTree
},
directives: {
focus: {
inserted: function (el) {
el.querySelector('input').focus();
}
}
},
data() {
return {
dataForm: {},
edit_id: localStorage.getItem('U_id'),
currentJournal: {},
df_jour: [],
bd: true,
ruleForm: {
major_title: '',
nickname: ''
},
rules: {
major_title: [{ required: true, message: this.$t('GroupClassification.enter'), trigger: 'change' }]
// nickname: [{ required: true, message: this.$t('GroupClassification.enter'), trigger: 'change' }]
},
dialogVisible: false,
dialogVisible2: false,
isShowF: false,
data: {
id: 'abc0',
label: this.$t('sidebar.GroupClassification'),
leave: 1, // tree层级
children: []
},
horizontal: true,
collapsable: true,
isSelect: true,
isEdit: 0,
currentTreeData: {},
lastId: 11,
labelClassName: 'bg-white',
urlList: {
list: 'api/Major/getJournalMajorInAll',
bind: 'api/Major/addJournalMajor',
unbind: 'api/Major/delJournalMajor'
}
};
},
watch: {
dialogVisible: {
handler(newV, oldV) {
if (newV == false) {
this.ruleForm = {};
}
}
},
},
async created() {
const a = this.numFormatter(9999999999);
console.log(a);
await this.getSelect();
},
async activated() {
const a = this.numFormatter(9999999999);
console.log(a);
await this.getSelect();
},
methods: {
// 获取下拉值
async getSelect() {
var that = this;
this.$api
.post('/api/Journal/getAllJournal', {})
.then(async (res) => {
if (res.code == 0) {
this.df_jour = res.data.journals;
this.dataForm.journal_id = this.df_jour[0].journal_id;
this.currentJournal = this.df_jour[0];
this.$nextTick(async () => {
await that.getDate();
});
// this.getDate();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
async handleSelectJournal(e) {
var data = this.df_jour.find((v) => v.journal_id == e);
this.currentJournal = data;
console.log('this.currentJournal at line 221:', this.currentJournal);
await this.getDate();
this.$forceUpdate();
},
renameKeys(obj, oldKey, newKey) {
if (obj[oldKey]) {
obj[newKey] = obj[oldKey];
delete obj[oldKey];
}
for (let k in obj) {
if (typeof obj[k] === 'object') {
this.renameKeys(obj[k], oldKey, newKey);
}
}
},
// 获取数据
async getDate() {
console.log('getDate at line 251:', 'getDate');
this.$api
.post(this.urlList.list, { journal_issn: this.currentJournal.issn })
.then(async (res) => {
if (res.code == 0) {
this.data.children = res.data.majors;
await this.renameKeys(this.data.children, 'major_title', 'label');
await this.toggleExpand(this.data, true); // 调用全部展开
this.$forceUpdate();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
// 增加千分位
numFormatter(num) {
let res = num;
if (num && num !== null) {
res = num.toString().replace(/\d+/, (n) => {
return n.replace(/(\d)(?=(\d{3})+$)/g, ($1) => {
return $1 + ',';
});
});
}
return res;
},
async cccc(a, b) {
// console.log('a at line 274:', a);
console.log('b at line 270:', b);
// isShowF && bd
console.log('bd at line 272:', this.isShowF, this.bd);
if (this.isShowF && this.bd&&this.currentTreeData.id!='abc0') {
var BindInfo = b.selected == 0 ? this.$t('GroupClassification.BindInfo') : this.$t('GroupClassification.UnBindInfo');
this.$confirm(`${this.$t('GroupClassification.JournalBindInfo')} ${this.currentJournal.title}${BindInfo}`, '提示', {
confirmButtonText: this.$t('GroupClassification.submit'),
dangerouslyUseHTMLString: true,
cancelButtonText: this.$t('GroupClassification.cancel'),
type: 'warning'
})
.then(() => {
var url = '';
if (b.selected == 1) {
url = this.urlList.unbind;
} else if (b.selected == 0) {
url = this.urlList.bind;
}
url;
console.log('url at line 278:', url);
this.$api
.post(url, {
journal_issn: this.currentJournal.issn,
major_id: b.major_id
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
this.$nextTick(async () => {
setTimeout(async () => {
await this.getDate();
}, 200);
});
})
.catch(() => {
// this.$message({
// type: 'info',
// message: this.$t('GroupClassification.cancel')
// });
});
}
},
mouseWheelDia() {
// bugfix 鼠标移入弹层滚动鼠标不能缩放bug
this.isShowF = false;
},
Mouseover() {
// 鼠标移入缩放icon
this.bd = false;
},
Mouseout() {
// 鼠标移出缩放icon
this.bd = true;
},
clearDialog() {
// 关闭添加/编辑/删除弹层
this.dialogVisible = false;
this.dialogVisible2 = false;
this.ruleForm.major_title = '';
},
addOrEdit(val) {
// 点击添加/编辑
// 新增val0编辑val1
this.dialogVisible = true;
this.isEdit = val;
// eslint-disable-next-line eqeqeq
if (val == 1) {
// 编辑回显
this.ruleForm.major_title = this.currentTreeData.label;
this.ruleForm.major_sort = this.currentTreeData.major_sort;
this.ruleForm.major_id = this.currentTreeData.major_id;
this.ruleForm.nickname = this.currentTreeData.nickname;
} else {
this.ruleForm.pid = this.currentTreeData.major_id;
}
},
async confirm() {
// 添加/编辑的确定
this.$refs.ruleForm.validate(async (valid) => {
if (valid) {
if (this.isEdit == 1) {
// 编辑
// this.ruleForm.major_title =
// data.id = this.treeData.id;
// this.currentTreeData.label = data.label;
this.$api
.post(this.urlList.edit, {
major_title: this.ruleForm.major_title,
major_id: this.ruleForm.major_id,
major_sort: this.ruleForm.major_sort
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
// 前端编辑数据
// loading.close();
} else {
this.$api
.post(this.urlList.add, {
major_title: this.ruleForm.major_title,
pid: this.ruleForm.pid,
major_sort: this.ruleForm.major_sort
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
// 添加
// 前端添加数据,需要自己生成子级id,可以传数据的时候把最后一级id传过来,进行累加
// data.id = this.lastId++;
// // data.level = this.currentTreeData.level + 1;
// data.label = this.ruleForm.major_title;
// data.expand = true;
// const render = (formData) => {
// formData.some((item) => {
// if (item.id === this.currentTreeData.id) {
// if (item.children) {
// item.children.push(data);
// } else {
// this.$set(item, 'children', [data]);
// }
// } else if (item.children) {
// render(item.children);
// }
// });
// };
// const arr = [this.data];
// render(arr);
// this.data = arr[0];
// loading.close();
}
this.$nextTick(async () => {
await this.getDate();
});
} else {
// loading.close();
}
});
},
del() {
this.dialogVisible2 = true;
},
async confimdelete() {
// 是否确定删除当前节点
// 前端删除 遍历原数据,删除匹配id数据
this.$api
.post(this.urlList.delete, {
major_id: this.currentTreeData.major_id
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
this.$nextTick(async () => {
await this.getDate();
});
});
// const deleteData = (data) => {
// data.some((item, i) => {
// if (item.id === this.currentTreeData.id) {
// data.splice(i, 1);
// } else if (item.children) {
// deleteData(item.children);
// }
// });
// };
// const arr = [this.data];
// deleteData(arr);
// this.data = arr[0] ? arr[0] : {};
// this.dialogVisible2 = false;
// this.$message({
// type: 'success',
// message: '节点删除成功!'
// });
},
onMouseover(e, data) {
var collapse = localStorage.getItem('collapse');
var width = Number(e.clientX - (!collapse || collapse == 'false' ? 260 : 40));
// 鼠标移入树节点
this.currentTreeData = data; // 鼠标移入,该节点的所有数据
this.isShowF = true;
var floating = document.getElementsByClassName('floating')[0];
if (floating) {
floating.style.left = width + 'px';
floating.style.top = e.clientY - 80 + 'px';
}
},
onMouseout(e, data) {
// 鼠标移出树节点
this.isShowF = false;
},
renderContent(h, data) {
return data.label;
},
onExpand(e, data) {
// 节点展开收缩
// eslint-disable-next-line eqeqeq
if (data.leave == 1 && data.expand == true) {
// bugfix
var dom = document.getElementById('ddd');
(dom.style.top = '50%'), (dom.style.left = '8%');
}
if ('expand' in data) {
data.expand = !data.expand;
if (!data.expand && data.children) {
this.collapse(data.children);
}
} else {
this.$set(data, 'expand', true);
}
},
collapse(list) {
list.forEach((child) => {
if (child.expand) {
child.expand = false;
}
child.children && this.collapse(child.children);
});
},
toggleExpand(data, val) {
// 节点默认全部展开
var _this = this;
// console.log(data);
if (Array.isArray(data)) {
data.forEach(function (item) {
_this.$set(item, 'expand', val);
if (item.children) {
_this.toggleExpand(item.children, val);
}
});
} else {
this.$set(data, 'expand', val);
if (data.children) {
_this.toggleExpand(data.children, val);
}
}
}
}
};
</script>
<style lang="less" scoped>
.floating {
background: rgba(0, 0, 0, 0.7);
box-shadow: rgba(0, 0, 0, 0.2);
width: auto;
// height: 45px;
line-height: 24px;
// display: flex;
// justify-content: space-around;
position: absolute;
color: #fff;
border-radius: 5px;
box-sizing: border-box;
left: 0;
top: 0;
transition: all 0.3s;
z-index: 999;
font-size: 12px;
padding: 6px;
span {
cursor: pointer;
}
}
</style>
<style lang="less">
.addOrEditDia,
.delDia {
padding: 14px 18px 10px 18px;
border-radius: 4px !important;
.el-dialog__header {
display: flex;
justify-content: space-between;
padding: 20px 0 !important;
}
.el-dialog__body {
padding: 0;
padding-top: 20px;
// margin-top: 37px;
}
.el-dialog__footer {
padding: 27px 0 9px 0 !important;
}
.el-dialog__headerbtn {
position: static !important;
}
}
.bg-white {
background-color: white;
}
.bg-orange {
background-color: orange;
}
.bg-gold {
background-color: gold;
}
.bg-gray {
background-color: gray;
}
.bg-lightpink {
background-color: lightpink;
}
.bg-chocolate {
background-color: chocolate;
}
.bg-tomato {
background-color: tomato;
}
.outBox {
height: calc(100% - 100px) !important;
margin-top: 10px;
width: calc(100% - 40px) !important;
overflow: auto !important;
}
</style>

View File

@@ -0,0 +1,646 @@
<template>
<div id="app">
<!-- <el-button type="primary" @click="horizontal = !horizontal">切换tree方向</el-button> -->
<div style="overflow: hidden">
<span style="font-size: 14px;font-weight: 700; color: #606266; margin: 0 10px 0 0">{{ $t('GroupClassification.Journal') }}: </span>
<el-select
v-model="dataForm.journal_id"
placeholder="Please select a journal"
@change="handleSelectJournal"
style="width: 220px; margin-right: 35px"
>
<el-option v-for="item in df_jour" :label="item.title" :key="item.journal_id" :value="item.journal_id"></el-option>
</el-select>
<div
@click="toggleExpand(data, true)"
style="float: right; line-height: 32px; color: #006699; font-size: 12px; font-weight: 700; margin-right: 20px"
>
{{ $t('GroupClassification.ExpandAll') }}
</div>
</div>
<org-tree
id="orgTreeNode"
:data="data"
:horizontal="horizontal"
isSelect
collapsable
:render-content="renderContent"
@on-expand="onExpand"
@on-node-mouseover="onMouseover"
@on-node-mouseout="onMouseout"
@on-expand-mouseover="Mouseover"
@on-expand-mouseout="Mouseout"
@on-node-click="cccc"
>
</org-tree>
<!-- <div
class="floating"
v-show="isShowF && bd&&this.currentTreeData.id!='abc0'"
@mouseover="
() => {
isShowF = true;
}
"
@mouseout="
() => {
isShowF = false;
}
"
@mousewheel.prevent="mouseWheelDia"
>
<p @click="addOrEdit(0)">{{ $t('GroupClassification.bind') }}</p>
<p @click="addOrEdit(1)">{{ $t('GroupClassification.Unbind') }}</p>
</div> -->
<!-- 增加/编辑弹层 -->
<el-dialog
:title="isEdit == 0 ? $t('GroupClassification.add') : $t('GroupClassification.edit')"
v-if="dialogVisible"
:visible="dialogVisible"
@close="clearDialog"
show-close
:close-on-click-modal="false"
custom-class="addOrEditDia"
width="35%"
>
<div class="tips">
<el-form :model="ruleForm" :rules="rules" ref="ruleForm" class="demo-ruleForm" @submit.native.prevent label-width="120px">
<el-form-item :label="$t('GroupClassification.major_current')" v-if="isEdit == 0">
{{ this.currentTreeData.label }}
</el-form-item>
<el-form-item prop="major_title" :label="$t('GroupClassification.major_title')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.major_title"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
<el-form-item prop="nickname" :label="$t('GroupClassification.nickname')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.nickname"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
<el-form-item prop="major_sort" :label="$t('GroupClassification.sort')">
<el-input
v-focus
:placeholder="$t('GroupClassification.enter')"
clearable
v-model="ruleForm.major_sort"
@keyup.enter.native="confirm"
></el-input>
</el-form-item>
</el-form>
</div>
<span slot="footer" class="dialog-footer">
<div class="tip-left">
<el-button size="small" type="info" @click="dialogVisible = false">{{ $t('GroupClassification.cancel') }}</el-button>
<el-button size="small" type="primary" @click="confirm">{{ $t('GroupClassification.submit') }}</el-button>
</div>
</span>
</el-dialog>
<!-- 删除 -->
<el-dialog
:title="$t('GroupClassification.delete')"
v-if="dialogVisible2"
:visible="dialogVisible2"
@close="clearDialog"
custom-class="delDia"
width="35%"
>
<div class="tips">
<p style="text-align: left">{{ $t('GroupClassification.deleteInfo') }} {{ this.currentTreeData.label }} ?</p>
</div>
<span slot="footer" class="dialog-footer">
<div class="tip-left">
<el-button size="mini" type="info" @click="dialogVisible2 = false">{{ $t('GroupClassification.cancel') }}</el-button>
<el-button size="mini" type="primary" @click="confimdelete">{{ $t('GroupClassification.submit') }}</el-button>
</div>
</span>
</el-dialog>
</div>
</template>
<script>
import OrgTree from '@/components/org-tree';
import bus from '@/components/common/bus';
export default {
name: 'app',
components: {
OrgTree
},
directives: {
focus: {
inserted: function (el) {
el.querySelector('input').focus();
}
}
},
data() {
return {
dataForm: {},
edit_id: localStorage.getItem('U_id'),
currentJournal: {},
df_jour: [],
bd: true,
ruleForm: {
major_title: '',
nickname: ''
},
rules: {
major_title: [{ required: true, message: this.$t('GroupClassification.enter'), trigger: 'change' }]
// nickname: [{ required: true, message: this.$t('GroupClassification.enter'), trigger: 'change' }]
},
dialogVisible: false,
dialogVisible2: false,
isShowF: false,
data: {
id: 'abc0',
label: this.$t('sidebar.GroupClassification'),
leave: 1, // tree层级
children: []
},
horizontal: true,
collapsable: true,
isSelect: true,
isEdit: 0,
currentTreeData: {},
lastId: 11,
labelClassName: 'bg-white',
urlList: {
list: 'api/Major/getJournalMajorInAll',
bind: 'api/Major/addJournalMajor',
unbind: 'api/Major/delJournalMajor'
}
};
},
watch: {
dialogVisible: {
handler(newV, oldV) {
if (newV == false) {
this.ruleForm = {};
}
}
}
},
async created() {
const a = this.numFormatter(9999999999);
console.log(a);
await this.getSelect();
},
async activated() {
const a = this.numFormatter(9999999999);
console.log(a);
await this.getSelect();
},
methods: {
// 获取下拉值
async getSelect() {
this.$api
.post('/api/Journal/getJournalByeditor', {
user_id: this.edit_id
})
.then(async (res) => {
if (res.code == 0) {
this.df_jour = res.data.journals;
this.dataForm.journal_id = this.df_jour[0].journal_id;
this.currentJournal = this.df_jour[0];
await this.getDate();
// this.getDate();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
async handleSelectJournal(e) {
var data = this.df_jour.find((v) => v.journal_id == e);
this.currentJournal = data;
console.log('this.currentJournal at line 221:', this.currentJournal);
await this.getDate();
this.$forceUpdate();
},
renameKeys(obj, oldKey, newKey) {
if (obj[oldKey]) {
obj[newKey] = obj[oldKey];
delete obj[oldKey];
}
for (let k in obj) {
if (typeof obj[k] === 'object') {
this.renameKeys(obj[k], oldKey, newKey);
}
}
},
// 获取数据
async getDate() {
this.$api
.post(this.urlList.list, { journal_issn: this.currentJournal.issn })
.then(async (res) => {
if (res.code == 0) {
this.data.children = res.data.majors;
await this.renameKeys(this.data.children, 'major_title', 'label');
await this.toggleExpand(this.data, true); // 调用全部展开
this.$forceUpdate();
} else {
this.$message.error(res.msg);
}
})
.catch((err) => {
this.$message.error(err);
});
},
// 增加千分位
numFormatter(num) {
let res = num;
if (num && num !== null) {
res = num.toString().replace(/\d+/, (n) => {
return n.replace(/(\d)(?=(\d{3})+$)/g, ($1) => {
return $1 + ',';
});
});
}
return res;
},
async cccc(a, b) {
// console.log('a at line 274:', a);
console.log('b at line 270:', b);
// isShowF && bd
console.log('bd at line 272:', this.isShowF, this.bd);
if (this.isShowF && this.bd&&this.currentTreeData.id!='abc0') {
var BindInfo = b.selected == 0 ? this.$t('GroupClassification.BindInfo') : this.$t('GroupClassification.UnBindInfo');
this.$confirm(`${this.$t('GroupClassification.JournalBindInfo')} ${this.currentJournal.title}${BindInfo}`, '提示', {
confirmButtonText: this.$t('GroupClassification.submit'),
dangerouslyUseHTMLString: true,
cancelButtonText: this.$t('GroupClassification.cancel'),
type: 'warning'
})
.then(() => {
var url = '';
if (b.selected == 1) {
url = this.urlList.unbind;
} else if (b.selected == 0) {
url = this.urlList.bind;
}
url;
console.log('url at line 278:', url);
this.$api
.post(url, {
journal_issn: this.currentJournal.issn,
major_id: b.major_id
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
this.$nextTick(async () => {
setTimeout(async () => {
await this.getDate();
}, 200);
});
})
.catch(() => {
// this.$message({
// type: 'info',
// message: this.$t('GroupClassification.cancel')
// });
});
}
},
mouseWheelDia() {
// bugfix 鼠标移入弹层滚动鼠标不能缩放bug
this.isShowF = false;
},
Mouseover() {
// 鼠标移入缩放icon
this.bd = false;
},
Mouseout() {
// 鼠标移出缩放icon
this.bd = true;
},
clearDialog() {
// 关闭添加/编辑/删除弹层
this.dialogVisible = false;
this.dialogVisible2 = false;
this.ruleForm.major_title = '';
},
addOrEdit(val) {
// 点击添加/编辑
// 新增val0编辑val1
this.dialogVisible = true;
this.isEdit = val;
// eslint-disable-next-line eqeqeq
if (val == 1) {
// 编辑回显
this.ruleForm.major_title = this.currentTreeData.label;
this.ruleForm.major_sort = this.currentTreeData.major_sort;
this.ruleForm.major_id = this.currentTreeData.major_id;
this.ruleForm.nickname = this.currentTreeData.nickname;
} else {
this.ruleForm.pid = this.currentTreeData.major_id;
}
},
async confirm() {
// 添加/编辑的确定
this.$refs.ruleForm.validate(async (valid) => {
if (valid) {
if (this.isEdit == 1) {
// 编辑
// this.ruleForm.major_title =
// data.id = this.treeData.id;
// this.currentTreeData.label = data.label;
this.$api
.post(this.urlList.edit, {
major_title: this.ruleForm.major_title,
major_id: this.ruleForm.major_id,
major_sort: this.ruleForm.major_sort
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
// 前端编辑数据
// loading.close();
} else {
this.$api
.post(this.urlList.add, {
major_title: this.ruleForm.major_title,
pid: this.ruleForm.pid,
major_sort: this.ruleForm.major_sort
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
});
// 添加
// 前端添加数据,需要自己生成子级id,可以传数据的时候把最后一级id传过来,进行累加
// data.id = this.lastId++;
// // data.level = this.currentTreeData.level + 1;
// data.label = this.ruleForm.major_title;
// data.expand = true;
// const render = (formData) => {
// formData.some((item) => {
// if (item.id === this.currentTreeData.id) {
// if (item.children) {
// item.children.push(data);
// } else {
// this.$set(item, 'children', [data]);
// }
// } else if (item.children) {
// render(item.children);
// }
// });
// };
// const arr = [this.data];
// render(arr);
// this.data = arr[0];
// loading.close();
}
this.$nextTick(async () => {
await this.getDate();
});
} else {
// loading.close();
}
});
},
del() {
this.dialogVisible2 = true;
},
async confimdelete() {
// 是否确定删除当前节点
// 前端删除 遍历原数据,删除匹配id数据
this.$api
.post(this.urlList.delete, {
major_id: this.currentTreeData.major_id
})
.then(async (res) => {
if (res.code == 0) {
this.$message({
type: 'success',
message: res.msg
});
this.clearDialog();
} else {
this.$message({
type: 'error',
message: res.msg
});
}
this.$nextTick(async () => {
await this.getDate();
});
});
// const deleteData = (data) => {
// data.some((item, i) => {
// if (item.id === this.currentTreeData.id) {
// data.splice(i, 1);
// } else if (item.children) {
// deleteData(item.children);
// }
// });
// };
// const arr = [this.data];
// deleteData(arr);
// this.data = arr[0] ? arr[0] : {};
// this.dialogVisible2 = false;
// this.$message({
// type: 'success',
// message: '节点删除成功!'
// });
},
onMouseover(e, data) {
var collapse = localStorage.getItem('collapse');
var width = Number(e.clientX - (!collapse || collapse == 'false' ? 260 : 40));
// 鼠标移入树节点
this.currentTreeData = data; // 鼠标移入,该节点的所有数据
this.isShowF = true;
var floating = document.getElementsByClassName('floating')[0];
if(floating){
floating.style.left = width + 'px';
floating.style.top = e.clientY - 80 + 'px';
}
},
onMouseout(e, data) {
// 鼠标移出树节点
this.isShowF = false;
},
renderContent(h, data) {
return data.label;
},
onExpand(e, data) {
// 节点展开收缩
// eslint-disable-next-line eqeqeq
if (data.leave == 1 && data.expand == true) {
// bugfix
var dom = document.getElementById('ddd');
(dom.style.top = '50%'), (dom.style.left = '8%');
}
if ('expand' in data) {
data.expand = !data.expand;
if (!data.expand && data.children) {
this.collapse(data.children);
}
} else {
this.$set(data, 'expand', true);
}
},
collapse(list) {
list.forEach((child) => {
if (child.expand) {
child.expand = false;
}
child.children && this.collapse(child.children);
});
},
toggleExpand(data, val) {
// 节点默认全部展开
var _this = this;
// console.log(data);
if (Array.isArray(data)) {
data.forEach(function (item) {
_this.$set(item, 'expand', val);
if (item.children) {
_this.toggleExpand(item.children, val);
}
});
} else {
this.$set(data, 'expand', val);
if (data.children) {
_this.toggleExpand(data.children, val);
}
}
}
}
};
</script>
<style lang="less" scoped>
.floating {
background: rgba(0, 0, 0, 0.7);
box-shadow: rgba(0, 0, 0, 0.2);
width: auto;
// height: 45px;
line-height: 24px;
// display: flex;
// justify-content: space-around;
position: absolute;
color: #fff;
border-radius: 5px;
box-sizing: border-box;
left: 0;
top: 0;
transition: all 0.3s;
z-index: 999;
font-size: 12px;
padding: 6px;
span {
cursor: pointer;
}
}
</style>
<style lang="less">
.addOrEditDia,
.delDia {
padding: 14px 18px 10px 18px;
border-radius: 4px !important;
.el-dialog__header {
display: flex;
justify-content: space-between;
padding: 20px 0 !important;
}
.el-dialog__body {
padding: 0;
padding-top: 20px;
// margin-top: 37px;
}
.el-dialog__footer {
padding: 27px 0 9px 0 !important;
}
.el-dialog__headerbtn {
position: static !important;
}
}
.bg-white {
background-color: white;
}
.bg-orange {
background-color: orange;
}
.bg-gold {
background-color: gold;
}
.bg-gray {
background-color: gray;
}
.bg-lightpink {
background-color: lightpink;
}
.bg-chocolate {
background-color: chocolate;
}
.bg-tomato {
background-color: tomato;
}
.outBox {
height: calc(100% - 100px) !important;
margin-top: 10px;
width: calc(100% - 40px) !important;
overflow: auto !important;
}
</style>