xy 2 years ago
parent 4b00c9bda0
commit f7bc528572

@ -4,7 +4,7 @@ export function departmentListNoAuth(params) {
return request({
url: '/api/admin/other/admin-department-list',
method: 'get',
params:params,
params,
isLoading: false
})
}
@ -14,7 +14,7 @@ export function adminListNoAuth(params) {
return request({
url: '/api/admin/other/admin-user-list',
method: 'get',
params:params,
params,
isLoading: false
})
}

@ -0,0 +1,37 @@
// 值班
import request from '@/utils/request'
// 导航栏
export function index(params) {
return request({
url: '/api/oa/on-duty-schedules/index',
method: 'get',
params
})
}
export function show(params, isLoading = true) {
return request({
method: 'get',
url: '/api/oa/on-duty-schedules/show',
params,
isLoading
})
}
export function save(data, isLoading = true) {
return request({
method: 'post',
url: '/api/oa/on-duty-schedules/save',
data,
isLoading
})
}
export function destroy(params, isLoading = true) {
return request({
method: 'get',
url: '/api/oa/on-duty-schedules/destroy',
params,
isLoading
})
}

@ -0,0 +1 @@
<svg t="1727677326624" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="6863" width="200" height="200"><path d="M746.4 243.1a31.8 31.8 0 0 0 0 45.3 32.8 32.8 0 0 0 45.4 0 31.8 31.8 0 0 0 0-45.3 29.2 29.2 0 0 0-45.4 0zM128.2 445.6a32.3 32.3 0 0 0 33 32.5 32.5 32.5 0 0 0 33-32.5 32.3 32.3 0 0 0-33-32.5 32.5 32.5 0 0 0-33 32.5zM518.1 0C231.8 0 0 228.6 0 511.1 0 748.4 170.7 999 467.9 1012.4v-59.7c-273.2-21-403.2-207.2-403.8-441.6 0-247.7 203.1-447.8 454-447.8s442.2 180.9 441.5 407.9h64.3C1025 210.4 804.5 0 518.1 0zM190.5 709a33 33 0 0 0 45.6 0 32.1 32.1 0 0 0 0-45.3 33 33 0 0 0-45.6 0 32.1 32.1 0 0 0 0 45.3z m396.6-199.6a59.6 59.6 0 0 0-37.2-37.2V185.1a21.6 21.6 0 0 0-43.2 0v286a32.3 32.3 0 0 0-10.8 5.2c-4.1 2.9-131.7-112.2-166.5-145a24.5 24.5 0 0 0-32.4-1.1 34.1 34.1 0 0 0-5.3 31.81c4.2 6.5 176.2 152.6 176.2 152.6a46.6 46.6 0 0 0-2.4 14 62.8 62.8 0 0 0 121.6 21.5 52.5 52.5 0 0 0 5.3-19.8 53.6 53.6 0 0 0-5.3-21.5zM382.8 806.5a32.5 32.5 0 1 0 33 32.4 32.4 32.4 0 0 0-33-32.4z m450.5 217.4l9.5-22-32.3-52.9 25.1-23.3a15.3 15.3 0 0 0 0-23.3h-74.9a16.1 16.1 0 0 0 0 23.3l24.7 23.4-31.7 52.9 16 21.9c-107.7-5.8-191-40-191-81.8 0-60.3 58.6-76.6 141.9-81.2a78.5 78.5 0 0 0 16.8-61.4 154.3 154.3 0 0 1-49.2-79 11.5 11.5 0 0 1-4.8 1.3A17.3 17.3 0 0 1 666 705v-33.7a17 17 0 0 1 16.8-16.3c7.2-75.5 58.1-133.4 121-133.4s114.4 59.2 121 134.5a17.7 17.7 0 0 1 23.8 15.7v33.1a17.3 17.3 0 0 1-18 16.8 16.1 16.1 0 0 1-10.1-3.5 147.3 147.3 0 0 1-63.5 89.9 85.4 85.4 0 0 0 18.5 52.9c86.3 3.4 148.7 18 148.7 81.8-0.3 41.2-83.1 75.4-190.9 81.1z" p-id="6864"></path></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

@ -0,0 +1 @@
<svg t="1727677637984" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="13246" width="200" height="200"><path d="M838.4 960H601.6l51.2-57.6h153.6c32 0 57.6-25.6 57.6-57.6s-25.6-57.6-57.6-57.6h-44.8l51.2-57.6h19.2c64 0 121.6 51.2 121.6 121.6s-44.8 108.8-115.2 108.8z m-25.6-326.4L512 960 211.2 633.6h6.4c-115.2-160-76.8-384 83.2-499.2s384-76.8 499.2 83.2c44.8 64 70.4 134.4 70.4 211.2 0 76.8-25.6 147.2-70.4 211.2h12.8z m-64-243.2c0-115.2-96-211.2-211.2-211.2h-57.6c-115.2 0-211.2 96-211.2 211.2V448c0 115.2 96 211.2 211.2 211.2h57.6c115.2 0 211.2-96 211.2-211.2v-57.6z m-179.2 64H512c-19.2 0-32-12.8-32-32V332.8c0-19.2 12.8-32 32-32s32 12.8 32 32v57.6H576c19.2 0 32 12.8 32 32-6.4 19.2-19.2 32-38.4 32z m-364.8 268.8l51.2 57.6h-44.8c-32 0-57.6 25.6-57.6 57.6s25.6 57.6 57.6 57.6h153.6l57.6 64H185.6c-64 0-121.6-51.2-121.6-121.6s51.2-121.6 121.6-121.6h19.2z" fill="currentColor" p-id="13247"></path></svg>

After

Width:  |  Height:  |  Size: 948 B

@ -1,8 +1,8 @@
import { departmentListNoAuth, adminListNoAuth } from "@/api/common"
import { index as userIndex } from '@/api/user'
import { index as departmentIndex } from '@/api/document'
const state = {
users: [],
departments: [],
departments: []
}
const mutations = {
SET_USERS: (state, users) => {
@ -10,20 +10,22 @@ const mutations = {
},
SET_DEPARTMENTS: (state, departments) => {
state.departments = departments
},
}
}
const actions = {
getUsers ({ commit }) {
adminListNoAuth().then(res => {
commit("SET_USERS", res.data)
getUsers({ commit }) {
userIndex({
rows: 999
}).then(res => {
commit('SET_USERS', res.data)
})
},
getDepartments ({ commit }) {
departmentListNoAuth().then(res => {
commit("SET_DEPARTMENTS", res.data)
getDepartments({ commit }) {
departmentIndex().then(res => {
commit('SET_DEPARTMENTS', res.data)
})
},
}
}
export default {

@ -63,3 +63,7 @@ div:focus {
.app-container {
padding: 20px;
}
#nprogress .bar {
background: var(--theme-color) !important;
}

@ -0,0 +1,116 @@
<template>
<div>
<vxe-modal
:value="isShow"
show-footer
title="特殊日期"
show-confirm-button
:width="600"
:height="400"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<el-form ref="elForm" :model="form" :rules="rules" label-position="top" label-width="100">
<el-form-item label="日期" prop="date" required>
<el-date-picker v-model="form.date" value-format="yyyy-MM-dd" />
</el-form-item>
<el-form-item label="值班人员" prop="user_id">
<el-select
v-model="form.user_id"
style="width: 100%;"
>
<el-option v-for="user in users" :key="user.id" :value="user.id" :label="user.name" />
</el-select>
</el-form-item>
<el-form-item label="带班领导" prop="leader_id">
<el-select
v-model="form.leader_id"
style="width: 100%;"
>
<el-option v-for="user in users" :key="user.id" :value="user.id" :label="user.name" />
</el-select>
</el-form-item>
<el-form-item label="带班领导人员状态" prop="leader_status">
<el-select v-model="form.leader_status">
<el-option :value="0" label="未值班" />
<el-option :value="1" label="已完成值班" />
</el-select>
</el-form-item>
<el-form-item label="值班人员状态" prop="status">
<el-select v-model="form.status">
<el-option :value="0" label="未值班" />
<el-option :value="1" label="已完成值班" />
</el-select>
</el-form-item>
<el-form-item label="说明" prop="remark">
<el-input v-model="form.remark" type="textarea" :autosize="{ minRows: 2 }" />
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" :loading="loading" @click="submit"></el-button>
</template>
</vxe-modal>
</div>
</template>
<script>
import { save } from '@/api/onDutySchedules'
export default {
props: {
isShow: {
type: Boolean,
default: false,
required: true
},
users: {
type: Boolean,
default: () => []
}
},
data() {
return {
loading: false,
form: {
date: '',
user_id: '',
leader_id: '',
leader_status: 1,
status: 1,
remark: ''
},
rules: {
date: [
{ required: true, message: '请选择日期' }
],
type: [
{ required: true, message: '请选择类型' }
]
}
}
},
computed: {},
methods: {
submit() {
this.$refs['elForm'].validate(async valid => {
if (valid) {
this.loading = true
try {
await save(this.form)
this.$message.success('新增成功')
this.$emit('refresh')
this.$emit('update:isShow', false)
this.loading = false
this.$refs['elForm'].resetFields()
} catch (err) {
this.loading = false
}
}
})
}
}
}
</script>
<style scoped lang="scss">
</style>

@ -0,0 +1,254 @@
<template>
<div>
<card-container>
<vxe-toolbar>
<template #buttons>
<el-button icon="el-icon-plus" type="primary" size="small" @click="isShowAdd = true">新增</el-button>
<el-button icon="el-icon-search" type="primary" plain size="small" @click="getList"></el-button>
</template>
</vxe-toolbar>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
:loading="loading"
keep-source
show-overflow
:column-config="{ resizable: true }"
:edit-rules="validRules"
:edit-config="{ trigger: 'manual', mode: 'row', showStatus: true, isHover: true, autoClear: false }"
:align="allAlign"
:data="tableData"
>
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="date" width="170" title="日期" :edit-render="{}">
<template #edit="{ row }">
<el-date-picker v-model="row.date" style="width: 100%;" value-format="yyyy-MM-dd" />
</template>
</vxe-column>
<vxe-column field="user_id" title="值班人员" min-width="160" :edit-render="{}">
<template #edit="{ row }">
<el-select
v-model="row.user_id"
style="width: 100%;"
>
<el-option v-for="user in users" :key="user.id" :value="user.id" :label="user.name" />
</el-select>
</template>
</vxe-column>
<vxe-column field="leader_id" title="带班领导" min-width="160" :edit-render="{}">
<template #edit="{ row }">
<el-select
v-model="row.leader_id"
style="width: 100%;"
>
<el-option v-for="user in users" :key="user.id" :value="user.id" :label="user.name" />
</el-select>
</template>
</vxe-column>
<vxe-column field="status" title="值班人员状态" width="120" :edit-render="{}" :formatter="({ cellValue }) => cellValue ? '已完成值班' : '未值班'">
<template #edit="{ row }">
<el-select v-model="row.status">
<el-option :value="0" label="未值班" />
<el-option :value="1" label="已完成值班" />
</el-select>
</template>
</vxe-column>
<vxe-column field="leader_status" title="带班领导人员状态" width="120" :edit-render="{}" :formatter="({ cellValue }) => cellValue ? '已完成值班' : '未值班'">
<template #edit="{ row }">
<el-select v-model="row.leader_status">
<el-option :value="0" label="未值班" />
<el-option :value="1" label="已完成值班" />
</el-select>
</template>
</vxe-column>
<vxe-column field="remark" min-width="180" title="备注" header-align="center" align="left" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="operate" title="操作" min-width="220">
<template #default="{ row }">
<template v-if="isActiveStatus(row)">
<el-button size="small" type="primary" @click="saveRowEvent(row)"></el-button>
<el-button size="small" type="primary" plain @click="cancelRowEvent(row)"></el-button>
</template>
<template v-else>
<el-button size="small" type="warning" @click="editRowEvent(row)"></el-button>
<el-button size="small" type="danger" @click="destroyRowEvent(row)"></el-button>
</template>
</template>
</vxe-column>
</vxe-table>
<el-pagination
style="margin-top: 10px;"
:current-page="select.page"
:page-sizes="[20, 30, 40, 50]"
:page-size="select.page_size"
layout="total, sizes, prev, pager, next, jumper"
:total="total"
@size-change="e => {
select.page_size = e;
select.page = 1;
getList();
}"
@current-change="e => {
select.page = e;
getList();
}"
/>
</card-container>
<add-be-on-duty ref="AddBeOnDuty" :users="users" :is-show.sync="isShowAdd" @refresh="getList" />
</div>
</template>
<script>
import { deepCopy } from '@/utils'
import { index, save, destroy } from '@/api/onDutySchedules'
import { index as userIndex } from '@/api/user'
import AddBeOnDuty from './components/AddBeOnDuty.vue'
export default {
components: {
AddBeOnDuty
},
data() {
return {
users: [],
isShowAdd: false,
loading: false,
select: {
page: 1,
page_size: 20
},
total: 0,
allAlign: null,
tableData: [],
validRules: {
date: [
{ required: true, message: '请选择日期' }
],
user_id: [
{ required: true, message: '请选择值班人员' }
],
leader_id: [
{ required: true, message: '请选择带班领导' }
]
},
form: {
id: '',
date: '',
user_id: '',
leader_id: '',
leader_status: '',
status: '',
remark: ''
}
}
},
computed: {
isActiveStatus() {
return function(row) {
if (this.$refs['table']) {
return this.$refs['table'].isEditByRow(row)
}
}
}
},
created() {
this.getUsers()
this.getList()
},
methods: {
editRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].setEditRow(row)
}
},
cancelRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].clearEdit().then(() => {
//
this.$refs['table'].revertData(row)
})
}
},
async getUsers() {
try {
const res = await userIndex({
rows: 999
})
this.users = res.data
} catch (err) {
console.error(err)
}
},
async getList() {
this.loading = true
try {
const res = await index(this.select)
this.tableData = res.data
this.total = res.total
this.loading = false
} catch (err) {
console.error(err)
this.loading = false
}
},
async saveRowEvent(row) {
try {
await this.$confirm('确认保存?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
await this.$refs['table'].clearEdit()
const form = deepCopy(this.form)
for (const key in form) {
form[key] = row[key]
}
if (!form.password) {
delete form.password
}
this.loading = true
await save(form)
await this.getList()
this.loading = false
} catch (err) {
this.loading = false
}
},
async destroyRowEvent(row) {
try {
await this.$confirm('确认删除?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
this.loading = true
if (row.id) {
await destroy({
id: row.id
})
await this.getList()
} else {
console.log(row)
this.tableData.splice(this.tableData.findIndex(i => i._X_ROW_KEY === row._X_ROW_KEY), 1)
}
this.loading = false
} catch (err) {
this.loading = false
}
}
}
}
</script>
<style scoped lang="scss">
.total {
color: #666;
text-align: right;
line-height: 3;
}
::v-deep .el-tag + .el-tag {
margin-left: 4px;
}
</style>

@ -0,0 +1,17 @@
<template>
<div>
</div>
</template>
<script>
export default {
data() {
return {}
},
computed: {},
methods: {}
}
</script>
<style scoped lang="scss">
</style>

@ -1,45 +1,103 @@
<template>
<div>
<card-container>
<vxe-toolbar>
<template #buttons>
<el-button icon="el-icon-plus" type="primary" size="small" @click="isShowAdd = true">新增</el-button>
<el-button icon="el-icon-search" type="primary" plain size="small" @click="getList"></el-button>
</template>
</vxe-toolbar>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
:loading="loading"
keep-source
show-overflow
:column-config="{ resizable: true }"
:edit-rules="validRules"
:edit-config="{ trigger: 'manual', mode: 'row', showStatus: true, isHover: true, autoClear: false }"
:data="tableData"
>
<vxe-column type="seq" width="64" align="center" />
<el-row :gutter="10">
<el-col :span="5">
<el-card shadow="always">
<el-input
v-model="filterText"
clearable
size="small"
placeholder="输入关键字进行过滤"
/>
<el-tree
ref="tree"
:indent="10"
style="margin-top: 8px;"
class="filter-tree"
:data="types"
:props="{
label: 'name',
}"
default-expand-all
:filter-node-method="filterNode"
/>
</el-card>
</el-col>
</vxe-table>
</card-container>
<el-col :span="19">
<card-container>
<vxe-toolbar>
<template #buttons>
<el-button icon="el-icon-plus" type="primary" size="small" @click="isShowAdd = true">新增</el-button>
<el-button icon="el-icon-search" type="primary" plain size="small" @click="getList"></el-button>
</template>
</vxe-toolbar>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
:loading="loading"
keep-source
show-overflow
:column-config="{ resizable: true }"
:edit-rules="validRules"
:edit-config="{ trigger: 'manual', mode: 'row', showStatus: true, isHover: true, autoClear: false }"
:data="tableData"
>
<vxe-column type="seq" width="64" align="center" />
</vxe-table>
</card-container>
</el-col>
</el-row>
</div>
</template>
<script>
import { menuIndex, index } from '@/api/document'
export default {
data() {
return {
filterText: '',
isShowAdd: false,
loading: false,
validRules: {
},
tableData: []
tableData: [],
types: []
}
},
computed: {},
watch: {
filterText(val) {
this.$refs.tree.filter(val)
}
},
created() {
this.getTypes()
this.getList()
},
methods: {
getList() {}
filterNode(value, data) {
if (!value) return true
return data.name.indexOf(value) !== -1
},
async getList() {
try {
const res = await menuIndex()
} catch (err) {
console.error(err)
}
},
async getTypes() {
try {
const res = await index()
this.types = res
} catch (err) {
console.error(err)
}
}
}
}
</script>

@ -67,17 +67,17 @@
}"
/>
</card-container>
<add-specialDays ref="addSpecialDays" :is-show.sync="isShowAdd" @refresh="getList" />
<add-specialDays ref="AddSpecialDays" :is-show.sync="isShowAdd" @refresh="getList" />
</div>
</template>
<script>
import { deepCopy } from '@/utils'
import { index, save, destroy } from '@/api/specialDays'
import addSpecialDays from './components/addSpecialDays.vue'
import AddSpecialDays from './components/AddSpecialDays.vue'
export default {
components: {
addSpecialDays
AddSpecialDays
},
data() {
return {

@ -49,7 +49,7 @@ export default {
border-radius: 100%;
border: none;
display: block;
background: #6687d2;
background: var(--theme-color);
position: relative;
transition: all .2s;
margin: auto;
@ -63,11 +63,11 @@ export default {
position: relative;
}
&:active {
background: #5176cb;
filter: brightness(0.88);
}
&::before {
content: "";
background: #7ab9ff;
background: var(--theme-color);
opacity: 0.45;
border-radius: 100%;
animation: scale 5s infinite linear;

@ -0,0 +1,127 @@
<template>
<div>
<vxe-modal
:value="isShow"
show-footer
title="公共文件柜栏目"
show-confirm-button
:width="600"
:height="400"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<el-form ref="elForm" :model="form" :rules="rules" label-position="top" label-width="100">
<el-form-item label="父级栏目" prop="pid" required>
<Treeselect
v-model="form.pid"
:options="formatList"
no-children-text="无子菜单"
:normalizer="node => ({
id: node.id,
label: node.name,
children: node.children,
isDefaultExpanded: true
})"
/>
</el-form-item>
<el-form-item label="名称" prop="name">
<el-input v-model="form.name" />
</el-form-item>
<el-form-item label="授权人员" prop="update_children_ids">
<el-select
style="width: 100%;"
multiple
:value="form.update_children_ids ? form.update_children_ids.split(',').map(i => Number(i)) : []"
@input="e => form.update_children_ids = e.toString()"
>
<el-option v-for="user in users" :key="user.id" :value="user.id" :label="user.name" />
</el-select>
</el-form-item>
<el-form-item label="排序" prop="myindex">
<el-input-number v-model="form.myindex" :controls="false" :precision="0" />
</el-form-item>
</el-form>
<template #footer>
<el-button type="primary" :loading="loading" @click="submit"></el-button>
</template>
</vxe-modal>
</div>
</template>
<script>
import { save } from '@/api/document'
export default {
props: {
list: {
type: Array,
default: () => []
},
isShow: {
type: Boolean,
default: false,
required: true
},
users: {
type: Array,
default: () => []
}
},
data() {
return {
loading: false,
form: {
pid: 0,
name: '',
update_children_ids: '',
myindex: ''
},
rules: {
pid: [
{ required: true, message: '请选择上级目录' }
],
name: [
{ required: true, message: '请输入名称' }
]
}
}
},
computed: {
formatList() {
return [
{
name: '#根目录',
id: 0
},
...this.list
]
}
},
methods: {
setPid(pid) {
this.form.pid = pid
},
submit() {
this.$refs['elForm'].validate(async valid => {
if (valid) {
this.loading = true
try {
await save(this.form)
this.$message.success('新增成功')
this.$emit('refresh')
this.$emit('update:isShow', false)
this.loading = false
this.$refs['elForm'].resetFields()
} catch (err) {
this.loading = false
}
}
})
}
}
}
</script>
<style scoped lang="scss">
</style>

@ -9,37 +9,194 @@
</vxe-toolbar>
<vxe-table
ref="table"
stripe
style="margin-top: 10px;"
:loading="loading"
keep-source
show-overflow
:row-config="{ useKey: 'id', isHover: true }"
:column-config="{ resizable: true }"
:edit-rules="validRules"
:edit-config="{ trigger: 'manual', mode: 'row', showStatus: true, isHover: true, autoClear: false }"
:edit-config="{ trigger: 'manual', mode: 'row', showStatus: true, autoClear: false, expandALl: true }"
:tree-config="{ rowField: 'id', parentField: 'pid' }"
:data="tableData"
>
<vxe-column type="seq" width="64" align="center" />
<vxe-column type="seq" width="58" align="center" />
<vxe-column tree-node field="name" width="170" title="名称" :edit-render="{ name: 'input', attrs: { type: 'text' } }" />
<vxe-column field="update_children" title="授权人员" min-width="160" :edit-render="{}">
<template #edit="{ row }">
<el-select
collapse-tags
style="width: 100%;"
multiple
:value="row.update_children_ids ? row.update_children_ids.split(',').map(i => Number(i)) : []"
@input="e => row.update_children_ids = e.toString()"
>
<el-option v-for="user in users" :key="user.id" :value="user.id" :label="user.name" />
</el-select>
</template>
</vxe-column>
<vxe-column field="myindex" width="180" title="排序" align="center" :edit-render="{ name: 'input', attrs: { type: 'number' } }" />
<vxe-column field="operate" title="操作" min-width="220">
<template #default="{ row }">
<template v-if="isActiveStatus(row)">
<el-button size="small" type="primary" @click="saveRowEvent(row)"></el-button>
<el-button size="small" type="primary" plain @click="cancelRowEvent(row)"></el-button>
</template>
<template v-else>
<el-button size="small" type="success" @click="$refs['AddDocument'].setPid(row.id),isShowAdd = true">子栏目</el-button>
<el-button size="small" type="warning" @click="editRowEvent(row)"></el-button>
<el-button size="small" type="danger" @click="destroyRowEvent(row)"></el-button>
</template>
</template>
</vxe-column>
</vxe-table>
</card-container>
<add-document ref="AddDocument" :users="users" :list="tableData" :is-show.sync="isShowAdd" @refresh="getList" />
</div>
</template>
<script>
import { deepCopy } from '@/utils'
import { index, save, destroy } from '@/api/document'
import { index as userIndex } from '@/api/user'
import AddDocument from './components/AddDocument.vue'
export default {
components: {
AddDocument
},
data() {
return {
users: [],
isShowAdd: false,
loading: false,
select: {
page: 1,
page_size: 20
},
allAlign: null,
tableData: [],
validRules: {
name: [
{ required: true, message: '请输入角色' }
]
},
tableData: []
form: {
id: '',
pid: '',
name: '',
myindex: '',
update_children_ids: ''
}
}
},
computed: {},
methods: {}
computed: {
isActiveStatus() {
return function(row) {
if (this.$refs['table']) {
return this.$refs['table'].isEditByRow(row)
}
}
}
},
created() {
this.getUsers()
this.getList()
},
methods: {
editRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].setEditRow(row)
}
},
cancelRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].clearEdit().then(() => {
//
this.$refs['table'].revertData(row)
})
}
},
async getUsers() {
try {
const res = await userIndex({
rows: 999
})
this.users = res.data
} catch (err) {
console.error(err)
}
},
async getList() {
this.loading = true
try {
const res = await index(this.select)
this.tableData = res
this.loading = false
this.$nextTick(() => {
this.$refs['table'].setAllTreeExpand(true)
})
} catch (err) {
console.error(err)
this.loading = false
}
},
async saveRowEvent(row) {
try {
await this.$confirm('确认保存?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
await this.$refs['table'].clearEdit()
const form = deepCopy(this.form)
for (const key in form) {
form[key] = row[key]
}
if (!form.password) {
delete form.password
}
this.loading = true
await save(form)
await this.getList()
this.loading = false
} catch (err) {
this.loading = false
}
},
async destroyRowEvent(row) {
try {
await this.$confirm('确认删除?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
this.loading = true
if (row.id) {
await destroy({
id: row.id
})
await this.getList()
} else {
console.log(row)
this.tableData.splice(this.tableData.findIndex(i => i._X_ROW_KEY === row._X_ROW_KEY), 1)
}
this.loading = false
} catch (err) {
this.loading = false
}
}
}
}
</script>
<style scoped lang="scss">
.total {
color: #666;
text-align: right;
line-height: 3;
}
::v-deep .el-tag + .el-tag {
margin-left: 4px;
}
</style>

@ -1,42 +1,46 @@
<template>
<div>
<vxe-modal :value="isShow"
show-footer
title="权限菜单"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)">
<vxe-modal
:value="isShow"
show-footer
title="权限菜单"
show-confirm-button
:width="600"
:height="600"
esc-closable
@input="e => $emit('update:isShow',e)"
>
<el-form ref="elForm" :model="form" :rules="rules" label-position="top" label-width="100">
<el-form-item label="父级菜单" prop="pid" required>
<Treeselect v-model="form.pid"
:options="formatList"
noChildrenText="无子菜单"
:normalizer="node => ({
id: node.id,
label: node.name,
children: node.children,
isDefaultExpanded: true
})"></Treeselect>
<Treeselect
v-model="form.pid"
:options="formatList"
no-children-text="无子菜单"
:normalizer="node => ({
id: node.id,
label: node.name,
children: node.children,
isDefaultExpanded: true
})"
/>
</el-form-item>
<el-form-item label="名称" prop="name" required>
<el-input v-model="form.name" clearable></el-input>
<el-input v-model="form.name" clearable />
</el-form-item>
<el-form-item label="图标" prop="icon">
<el-input v-model="form.icon" clearable></el-input>
<el-input v-model="form.icon" clearable />
</el-form-item>
<el-form-item label="路由路径" prop="path" required>
<el-input v-model="form.path" clearable></el-input>
<el-input v-model="form.path" clearable />
</el-form-item>
<el-form-item label="api前缀" prop="api_profix" required>
<el-input v-model="form.api_profix" clearable></el-input>
<el-input v-model="form.api_profix" clearable />
</el-form-item>
<el-form-item label="是否可见" prop="visible">
<el-switch v-model="form.visible" :active-value="1" :inactive-value="0" active-text="显示" inactive-text="隐藏"></el-switch>
<el-switch v-model="form.visible" :active-value="1" :inactive-value="0" active-text="" inactive-text="" />
</el-form-item>
<el-form-item label="排序" prop="sortnumber">
<el-input-number controls-position="right" :precision="0" v-model="form.sortnumber"></el-input-number>
<el-input-number v-model="form.sortnumber" controls-position="right" :precision="0" />
</el-form-item>
</el-form>
@ -48,7 +52,7 @@
</template>
<script>
import { save } from "@/api/menu"
import { save } from '@/api/menu'
export default {
props: {
list: {
@ -65,61 +69,61 @@ export default {
return {
loading: false,
form: {
name: "",
name: '',
pid: 0,
icon: "",
icon: '',
visible: 1,
path: "",
api_profix: "",
path: '',
api_profix: '',
sortnumber: 0
},
rules: {
name: [
{ required: true, message: "请输入名称" }
{ required: true, message: '请输入名称' }
],
path: [
{ required: true, message: "请输入路由路径" },
{ required: true, message: '请输入路由路径' }
],
api_profix: [
{ required: true, message: "请输入api前缀" }
{ required: true, message: '请输入api前缀' }
]
}
}
},
computed: {
formatList() {
return [
{
name: '#根目录',
id: 0
},
...this.list
]
}
},
methods: {
setPid (pid) {
this.form.pid = pid;
setPid(pid) {
this.form.pid = pid
},
submit () {
this.$refs["elForm"].validate(async valid => {
submit() {
this.$refs['elForm'].validate(async valid => {
if (valid) {
this.loading = true
try {
await save(this.form)
this.$message.success("新增成功")
this.$message.success('新增成功')
this.$emit('refresh')
this.$emit('update:isShow',false)
this.$emit('update:isShow', false)
this.loading = false
this.$refs["elForm"].resetFields()
this.$refs['elForm'].resetFields()
} catch (err) {
this.loading = false
}
}
})
}
},
computed: {
formatList () {
return [
{
name: "#根目录",
id: 0
},
...this.list
]
}
},
}
}
</script>

@ -8,8 +8,8 @@
</template>
</vxe-toolbar>
<vxe-table
style="margin-top: 10px;"
ref="table"
style="margin-top: 10px;"
:loading="loading"
keep-source
:row-config="{ useKey: 'id', isHover: true }"
@ -17,13 +17,14 @@
:edit-rules="validRules"
:edit-config="{ trigger: 'manual', mode: 'row', showStatus: true, autoClear: false, expandALl: true }"
:tree-config="{ rowField: 'id', parentField: 'pid' }"
:data="tableData">
<vxe-column type="seq" width="58" align="center"></vxe-column>
<vxe-column field="name" tree-node width="160" title="菜单" :edit-render="{ name: 'input', attrs: { type: 'text'} }"></vxe-column>
:data="tableData"
>
<vxe-column type="seq" width="58" align="center" />
<vxe-column field="name" tree-node width="160" title="菜单" :edit-render="{ name: 'input', attrs: { type: 'text'} }" />
<vxe-column field="path" title="路由地址" min-width="140" :edit-render="{ name: 'input', attrs: { type: 'text'} }">
<template #default="{ row }">
<template v-if="/#/g.test(row.path)">
<SvgIcon icon-class="folder" class-name="icon-folder"></SvgIcon>
<SvgIcon icon-class="folder" class-name="icon-folder" />
</template>
<template v-else>
<span>{{ row.path }}</span>
@ -33,20 +34,20 @@
<vxe-column field="api_profix" min-width="140" title="api前缀" :edit-render="{ name: 'input', attrs: { type: 'text'} }">
<template #default="{ row }">
<template v-if="/#/g.test(row.api_profix)">
<SvgIcon icon-class="folder" class-name="icon-folder"></SvgIcon>
<SvgIcon icon-class="folder" class-name="icon-folder" />
</template>
<template v-else>
<span>{{ row.api_profix }}</span>
</template>
</template>
</vxe-column>
<vxe-column field="visible" width="100" align="center" title="是否显示" :edit-render="{ name: 'select', options: [{ value: 1, label: '' },{ value: 0, label: '' }] }"></vxe-column>
<vxe-column field="visible" width="100" align="center" title="是否显示" :edit-render="{ name: 'select', options: [{ value: 1, label: '' },{ value: 0, label: '' }] }" />
<vxe-column field="icon" width="160" align="center" title="图标" :edit-render="{ name: 'input', attrs: { type: 'text'} }">
<template #default="{ row }">
<Icon :icon="row.icon"></Icon>
<Icon :icon="row.icon" />
</template>
</vxe-column>
<vxe-column field="sortnumber" width="80" title="排序" align="center" :edit-render="{ name: 'input', attrs: { type: 'number' } }"></vxe-column>
<vxe-column field="sortnumber" width="80" title="排序" align="center" :edit-render="{ name: 'input', attrs: { type: 'number' } }" />
<vxe-column field="operate" title="操作" min-width="240">
<template #default="{ row }">
<template v-if="isActiveStatus(row)">
@ -63,15 +64,15 @@
</vxe-table>
</CardContainer>
<add-menu :is-show.sync="isShowAdd" :list="tableData" ref="AddMenu" @refresh="getList"></add-menu>
<add-menu ref="AddMenu" :is-show.sync="isShowAdd" :list="tableData" @refresh="getList" />
</div>
</template>
<script>
import addMenu from "./components/AddMenu.vue"
import Icon from "@/layout/components/Navbar/Icon.vue"
import SvgIcon from "@/components/SvgIcon"
import { index, save, destroy } from "@/api/menu"
import addMenu from './components/AddMenu.vue'
import Icon from '@/layout/components/Navbar/Icon.vue'
import SvgIcon from '@/components/SvgIcon'
import { index, save, destroy } from '@/api/menu'
import { deepCopy } from '@/utils'
export default {
components: {
@ -88,35 +89,47 @@ export default {
tableData: [],
validRules: {
name: [
{ required: true, message: "请输入名称" }
{ required: true, message: '请输入名称' }
],
path: [
{ required: true, message: "请输入路由路径" },
{ required: true, message: '请输入路由路径' }
],
api_profix: [
{ required: true, message: "请输入api前缀" }
{ required: true, message: '请输入api前缀' }
]
},
form: {
id: "",
pid: "",
name: "",
url: "",
path: "",
api_profix: "",
icon: "",
id: '',
pid: '',
name: '',
url: '',
path: '',
api_profix: '',
icon: '',
visible: 1,
sortnumber: 0
},
}
}
},
computed: {
isActiveStatus() {
return function(row) {
if (this.$refs['table']) {
return this.$refs['table'].isEditByRow(row)
}
}
}
},
created() {
this.getList()
},
methods: {
editRowEvent (row) {
editRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].setEditRow(row)
}
},
cancelRowEvent (row) {
cancelRowEvent(row) {
if (this.$refs['table']) {
this.$refs['table'].clearEdit().then(() => {
//
@ -125,71 +138,59 @@ export default {
}
},
async getList () {
this.loading = true;
async getList() {
this.loading = true
try {
const res = await index()
this.tableData = res;
this.tableData = res
console.log(this.tableData)
this.loading = false;
this.loading = false
} catch (err) {
console.error(err)
this.loading = false;
this.loading = false
}
},
async saveRowEvent (row) {
async saveRowEvent(row) {
try {
await this.$confirm("确认保存?","提示",{
confirmButtonText: "确认",
cancelButtonText: "取消"
await this.$confirm('确认保存?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
await this.$refs['table'].clearEdit()
let form = deepCopy(this.form)
for (let key in form) {
const form = deepCopy(this.form)
for (const key in form) {
form[key] = row[key]
}
console.log(form)
this.loading = true;
this.loading = true
await save(form)
await this.getList();
this.loading = false;
await this.getList()
this.loading = false
} catch (err) {
this.loading = false;
this.loading = false
}
},
async destroyRowEvent (row) {
async destroyRowEvent(row) {
try {
await this.$confirm("确认删除?","提示",{
confirmButtonText: "确认",
cancelButtonText: "取消"
await this.$confirm('确认删除?', '提示', {
confirmButtonText: '确认',
cancelButtonText: '取消'
})
this.loading = true;
this.loading = true
if (row.id) {
await destroy({
id: row.id
})
await this.getList();
await this.getList()
} else {
this.tableData.splice(this.tableData.findIndex(i => i._X_ROW_KEY === row._X_ROW_KEY),1)
this.tableData.splice(this.tableData.findIndex(i => i._X_ROW_KEY === row._X_ROW_KEY), 1)
}
this.loading = false;
this.loading = false
} catch (err) {
this.loading = false;
}
},
},
computed: {
isActiveStatus () {
return function (row) {
if (this.$refs['table']) {
return this.$refs['table'].isEditByRow(row)
}
this.loading = false
}
}
},
created() {
this.getList()
}
}
</script>

@ -22,7 +22,7 @@
/>
<iframe
ref="program"
:src="module_uri"
:src="auth_uri"
frameborder="0"
/>
</div>
@ -43,14 +43,8 @@ export default {
auth_token: '',
module_name: ''
},
isLoading: true
}
},
methods: {
postMessage() {
if(this.props.auth_token && this.props.module_name) {
this.$refs['program'].contentWindow.postMessage(this.props)
}
auth_uri: '',
isLoading: false
}
},
computed: {
@ -59,21 +53,22 @@ export default {
watch: {
module_uri: {
handler: function(newVal) {
this.isLoading = true
// this.isLoading = true
this.props.module_name = this.module_name
this.props.auth_token = getToken()
this.$nextTick(() => {
this.$refs['program'].onload = this.postMessage
console.log(loadedModels)
if (loadedModels.indexOf(this.props.module_name) === -1) {
setTimeout(() => {
this.isLoading = false
}, 1500)
loadedModels.push(this.props.module_name)
} else {
this.isLoading = false
}
})
this.auth_uri = `${newVal}?auth_token=${getToken()}&module_name=${this.module_name}`
// this.$nextTick(() => {
// this.$refs['program'].onload = this.postMessage
// console.log(loadedModels)
// if (loadedModels.indexOf(this.props.module_name) === -1) {
// setTimeout(() => {
// this.isLoading = false
// }, 1500)
// loadedModels.push(this.props.module_name)
// } else {
// this.isLoading = false
// }
// })
},
immediate: true
}
@ -85,6 +80,13 @@ export default {
},
beforeDestroy() {
this.$refs['program'].onload = null
},
methods: {
postMessage() {
if (this.props.auth_token && this.props.module_name) {
this.$refs['program'].contentWindow.postMessage(this.props)
}
}
}
}
</script>

Loading…
Cancel
Save