部门管理、岗位管理接口对接

This commit is contained in:
Mrtangl 2022-06-21 18:31:59 +08:00
parent 918b92444a
commit cb5fae0849
10 changed files with 375 additions and 94 deletions

View File

@ -1,9 +0,0 @@
{
"tabWidth": 4,
"semi": false,
"singleQuote": true,
"printWidth": 100,
"trailingComma": "none",
"arrowParens": "avoid",
"bracketSpacing": true
}

View File

@ -40,5 +40,5 @@ export function apiFileRename(params: { id: number; name: string }) {
// 配置 // 配置
export function apiConfig() { export function apiConfig() {
return request.get('/index/config') return request.get('/common/index/config')
} }

View File

@ -1,4 +1,36 @@
import request from '@/utils/request' import request from '@/utils/request'
/** 部门 S **/
// 部门列表
export function apiDeptLists(params: any) {
return request.get('/system/dept/list', { params })
}
// 添加部门
export function apiDeptAdd(params: any) {
return request.post('/system/dept/add', params)
}
// 编辑部门
export function apiDeptEdit(params: any) {
return request.post('/system/dept/edit', params)
}
// 删除部门
export function apiDeptDelete(params: any) {
return request.post('/system/dept/del', params)
}
// 部门详情
export function apiDeptDetail(params: any) {
return request.get('/system/dept/detail', { params })
}
// 所有部门
export function apiDeptAll(params: any) {
return request.get('/system/dept/all', { params })
}
/** 部门 E **/
/** 岗位 S **/ /** 岗位 S **/
// 岗位列表 // 岗位列表
export function apiPostLists(params: any) { export function apiPostLists(params: any) {

View File

@ -2,20 +2,20 @@ import request from '@/utils/request'
// 获取备案信息 // 获取备案信息
export function apiGetCopyright() { export function apiGetCopyright() {
return request.get('/setting/getCopyright') return request.get('/setting/basics/getCopyright')
} }
// 设置备案信息 // 设置备案信息
export function apiSetCopyright(params: any) { export function apiSetCopyright(params: any) {
return request.post('/setting/setCopyright', { ...params }) return request.post('/setting/basics/setCopyright', { ...params })
} }
// 获取网站信息 // 获取网站信息
export function apiGetWebsite() { export function apiGetWebsite() {
return request.get('/setting/getWebsite') return request.get('/setting/basics/getWebsite')
} }
// 设置网站信息 // 设置网站信息
export function apiSetWebsite(params: any) { export function apiSetWebsite(params: any) {
return request.post('/setting/setWebsite', { ...params }) return request.post('/setting/basics/setWebsite', { ...params })
} }
// 获取政策协议 // 获取政策协议

View File

@ -2,5 +2,5 @@ import request from '@/utils/request'
// 工作台主页 // 工作台主页
export function apiWorkbench() { export function apiWorkbench() {
return request.get('/index/console') return request.get('/common/index/console')
} }

View File

@ -38,7 +38,7 @@ export function deepClone(target: any) {
*/ */
export function filterObject(target: any, filters: any[]) { export function filterObject(target: any, filters: any[]) {
const _target = deepClone(target) const _target = deepClone(target)
filters.map(key => delete _target[key]) filters.map((key) => delete _target[key])
return _target return _target
} }
@ -125,15 +125,12 @@ export const timeFormat = (dateTime: number, fmt = 'yyyy-mm-dd') => {
'd+': date.getDate().toString(), // 日 'd+': date.getDate().toString(), // 日
'h+': date.getHours().toString(), // 时 'h+': date.getHours().toString(), // 时
'M+': date.getMinutes().toString(), // 分 'M+': date.getMinutes().toString(), // 分
's+': date.getSeconds().toString() // 秒 's+': date.getSeconds().toString(), // 秒
} }
for (const k in opt) { for (const k in opt) {
ret = new RegExp('(' + k + ')').exec(fmt) ret = new RegExp('(' + k + ')').exec(fmt)
if (ret) { if (ret) {
fmt = fmt.replace( fmt = fmt.replace(ret[1], ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0'))
ret[1],
ret[1].length == 1 ? opt[k] : opt[k].padStart(ret[1].length, '0')
)
} }
} }
return fmt return fmt
@ -162,9 +159,10 @@ export const timeFormat = (dateTime: number, fmt = 'yyyy-mm-dd') => {
* @return { Array } * @return { Array }
*/ */
export function flatten(tree = [], arr = [], childrenKey = 'children') { export function flatten(tree = [], arr = [], childrenKey = 'children') {
tree.forEach(item => { tree.forEach((item) => {
const children = item[childrenKey] const children = item[childrenKey]
children ? flatten(children, arr, childrenKey) : arr.push(item) arr.push(item)
if (children) flatten(children, arr, childrenKey)
}) })
return arr return arr
} }

View File

@ -20,39 +20,41 @@
</el-option> </el-option>
</el-select> --> </el-select> -->
<el-cascader <el-cascader
v-model="formData.pid"
:options="leaderList" :options="leaderList"
:props="{ :props="{
value: 'id', value: 'id',
label: 'name', label: 'name',
checkStrictly: true checkStrictly: true,
}" }"
clearable clearable
:disabled="formData.pid === 0 && id"
/> />
</el-form-item> </el-form-item>
<!-- 部门名称 --> <!-- 部门名称 -->
<el-form-item label="部门名称" prop="name"> <el-form-item label="部门名称" prop="name">
<el-input placeholder="请输入部门名称"></el-input> <el-input v-model="formData.name" placeholder="请输入部门名称"></el-input>
</el-form-item> </el-form-item>
<!-- 负责人 --> <!-- 负责人 -->
<el-form-item label="负责人" prop="leader"> <el-form-item label="负责人" prop="duty">
<el-input placeholder="请输入负责人姓名"></el-input> <el-input v-model="formData.duty" placeholder="请输入负责人姓名"></el-input>
</el-form-item> </el-form-item>
<!-- 联系电话 --> <!-- 联系电话 -->
<el-form-item label="联系电话" prop="mobile"> <el-form-item label="联系电话" prop="mobile">
<el-input placeholder="请输入联系电话" type="tel"></el-input> <el-input v-model="formData.mobile" placeholder="请输入联系电话" type="tel"></el-input>
</el-form-item> </el-form-item>
<!-- 岗位排序 --> <!-- 岗位排序 -->
<el-form-item label="排序" prop="sort"> <el-form-item label="排序" prop="sort">
<el-input placeholder="请输入排序" type="number"></el-input> <el-input v-model="formData.sort" placeholder="请输入排序" type="number"></el-input>
<div class="muted">默认为0 数值越大越排前</div> <div class="muted">默认为0 数值越大越排前</div>
</el-form-item> </el-form-item>
<!-- 管理员状态 --> <!-- 管理员状态 -->
<el-form-item label="部门状态"> <el-form-item label="部门状态">
<el-switch :active-value="1" :inactive-value="0" /> <el-switch v-model="formData.isStop" :active-value="0" :inactive-value="1" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@ -64,7 +66,117 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import FooterBtns from '@/components/footer-btns/index.vue' import { computed, defineComponent, onMounted, reactive, Ref, ref, toRefs } from 'vue'
import { ElForm } from 'element-plus'
import { useAdmin } from '@/core/hooks/app'
import FooterBtns from '@/components/footer-btns/index.vue'
import { apiDeptAdd, apiDeptEdit, apiDeptDetail, apiDeptLists } from '@/api/organize'
const { router, route } = useAdmin()
const id = computed(() => route.query?.id)
const formRefs: Ref<typeof ElForm | null> = ref(null)
//
const leaderList: Ref<any[]> = ref([])
const { formData, rules } = toRefs(
reactive({
formData: {
pid: '',
name: '',
duty: '',
mobile: '',
sort: 0,
isStop: 0,
},
rules: {
pid: [
{
required: true,
message: '请选择上级部门',
trigger: ['change'],
},
],
name: [
{
required: true,
message: '请输入部门名称',
trigger: ['blur'],
},
],
},
})
)
//
const getList = () => {
apiDeptLists({}).then((res: any) => {
console.log(res, 'res')
leaderList.value = isDisabled(res)
// leaderList.value = res
})
}
//
// ,
//
const isDisabled = (treeArr: any) => {
let newTree = treeArr.map((item: any) => {
const children = item.children || []
if (children.length) isDisabled(children)
if (item.id == id.value || item.isStop == 1) {
item.disabled = true
} else {
item.disabled = false
}
return item
})
return newTree
}
//
const getDetail = () => {
if (!id.value) {
return
}
apiDeptDetail({
id: id.value,
}).then((res: any) => {
formData.value = res
})
}
//
const onSubmit = () => {
formRefs.value?.validate((valid: boolean) => {
if (!valid) {
return
}
// pidnumber
// pid
// pid
if (Array.isArray(formData.value.pid)) {
formData.value.pid = formData.value.pid[formData.value.pid.length - 1]
}
const promise = id.value
? apiDeptEdit({
...formData.value,
id: id.value,
})
: apiDeptAdd(formData.value)
promise.then(() => {
setTimeout(() => router.go(-1), 500)
})
})
}
onMounted(() => {
getDetail()
getList()
})
</script> </script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

View File

@ -3,24 +3,20 @@
<el-card shadow="never"> <el-card shadow="never">
<el-form class="ls-form" :model="formData" label-width="80px" size="small" inline> <el-form class="ls-form" :model="formData" label-width="80px" size="small" inline>
<el-form-item label="部门名称"> <el-form-item label="部门名称">
<el-input class="ls-input" /> <el-input v-model="formData.name" class="ls-input" />
</el-form-item> </el-form-item>
<el-form-item label="部门状态:"> <el-form-item label="部门状态:">
<el-select placeholder="全部"> <el-select v-model="formData.isStop" placeholder="全部">
<el-option <el-option label="全部" value=""></el-option>
v-for="item in statusList" <el-option label="正常" :value="0"></el-option>
:key="item.val" <el-option label="停用" :value="1"></el-option>
:label="item.name"
:value="item.val"
>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item> <el-form-item>
<div class="m-l-20"> <div class="m-l-20">
<el-button type="primary" @click="getLists">查询</el-button> <el-button type="primary" @click="getDeptLists">查询</el-button>
<el-button @click="reGetLists">重置</el-button> <el-button @click="reGetLists">重置</el-button>
</div> </div>
</el-form-item> </el-form-item>
@ -35,24 +31,20 @@
全部展开/折叠 全部展开/折叠
</el-button> </el-button>
<el-table class="m-t-15" size="small" row-key="id" :expand-row-keys="openIdArr"> <el-table :data="lists" class="m-t-15" size="small" row-key="id" :expand-row-keys="openIdArr">
<el-table-column label="部门名称" prop="name" min-width="100"></el-table-column> <el-table-column label="部门名称" prop="name" min-width="100"></el-table-column>
<el-table-column label="部门状态" prop="status_desc" min-width="100"> <el-table-column label="部门状态" prop="isStop" min-width="100">
<template #default="{ row }"> <template #default="{ row }">
<el-tag class="ml-2" :type="row.status ? '' : 'danger'" <el-tag class="ml-2" :type="row.isStop ? 'danger' : ''">
>{{ row.status_desc }} {{ row.isStop == 0 ? '正常' : '停用' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="排序" prop="sort" min-width="100"></el-table-column> <el-table-column label="排序" prop="sort" min-width="100"></el-table-column>
<el-table-column <el-table-column label="添加时间" prop="createTime" min-width="100"></el-table-column>
label="添加时间"
prop="create_time"
min-width="100"
></el-table-column>
<el-table-column label="操作" width="100" fixed="right"> <el-table-column label="操作" width="100" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
@ -61,18 +53,14 @@
:to="{ :to="{
path: '/organize/department/edit', path: '/organize/department/edit',
query: { query: {
id: row.id id: row.id,
} },
}" }"
> >
<el-button type="text">编辑</el-button> <el-button type="text">编辑</el-button>
</router-link> </router-link>
<popup <popup class="m-r-10 inline" @confirm="handleDelete(row.id)" v-show="row.pid">
class="m-r-10 inline"
@confirm="handleDelete(row.id)"
v-show="row.pid"
>
<template #trigger> <template #trigger>
<el-button type="text">删除</el-button> <el-button type="text">删除</el-button>
</template> </template>
@ -84,6 +72,61 @@
</div> </div>
</template> </template>
<script lang="ts" setup></script> <script lang="ts" setup>
import { onMounted, reactive, ref } from 'vue'
import Popup from '@/components/popup/index.vue'
import { flatten } from '@/utils/util'
import { apiDeptLists, apiDeptDelete } from '@/api/organize'
//
const formData = reactive({
name: '',
isStop: '',
})
//
let openIdArr = ref<any>([])
//
let lists = ref<any>([])
//
const getDeptLists = async () => {
lists.value = await apiDeptLists({
...formData,
})
}
//
const reGetLists = () => {
formData.name = ''
formData.isStop = ''
getDeptLists()
}
//
const handleDelete = (id: number) => {
apiDeptDelete({ id }).then(() => {
getDeptLists()
})
}
// /
const openOrFold = () => {
// console.log('')
if (openIdArr.value.length) {
openIdArr.value = []
} else {
let allArr = flatten(lists.value, [], 'children')
openIdArr.value = allArr.map((item) => item.id + '')
}
}
onMounted(async () => {
await getDeptLists()
openOrFold()
})
</script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>

View File

@ -4,7 +4,7 @@
<el-page-header :content="id ? '编辑岗位' : '新增岗位'" @back="$router.back()" /> <el-page-header :content="id ? '编辑岗位' : '新增岗位'" @back="$router.back()" />
</el-card> </el-card>
<el-card v-loading="loading" shadow="never" class="m-t-15"> <el-card shadow="never" class="m-t-15">
<el-form <el-form
ref="formRefs" ref="formRefs"
:rules="rules" :rules="rules"
@ -13,29 +13,35 @@
label-width="150px" label-width="150px"
size="small" size="small"
> >
<!-- 岗位名称 -->
<el-form-item label="岗位名称" prop="name"> <el-form-item label="岗位名称" prop="name">
<el-input placeholder="请输入岗位名称"></el-input> <el-input v-model="formData.name" placeholder="请输入岗位名称"></el-input>
</el-form-item> </el-form-item>
<!-- 岗位编码 -->
<el-form-item label="岗位编码" prop="code"> <el-form-item label="岗位编码" prop="code">
<el-input placeholder="请输入岗位编码"></el-input> <el-input v-model="formData.code" placeholder="请输入岗位编码"></el-input>
</el-form-item> </el-form-item>
<!-- 岗位排序 -->
<el-form-item label="排序" prop="sort"> <el-form-item label="排序" prop="sort">
<el-input placeholder="请输入排序" type="number"></el-input> <el-input v-model="formData.sort" placeholder="请输入排序" type="number"></el-input>
<div class="muted">默认为0 数值越大越排前</div> <div class="muted">默认为0 数值越大越排前</div>
</el-form-item> </el-form-item>
<el-form-item label="备注" prop="remark"> <!-- 备注 -->
<el-form-item label="备注" prop="remarks">
<el-input <el-input
v-model="formData.remarks"
placeholder="请输入备注" placeholder="请输入备注"
type="textarea" type="textarea"
:autosize="{ minRows: 4, maxRows: 6 }" :autosize="{ minRows: 4, maxRows: 6 }"
></el-input> ></el-input>
</el-form-item> </el-form-item>
<!-- 管理员状态 -->
<el-form-item label="岗位状态"> <el-form-item label="岗位状态">
<el-switch :active-value="1" :inactive-value="0" /> <el-switch v-model="formData.isStop" :active-value="0" :inactive-value="1" />
</el-form-item> </el-form-item>
</el-form> </el-form>
</el-card> </el-card>
@ -47,13 +53,85 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import FooterBtns from '@/components/footer-btns/index.vue' import { computed, defineComponent, onMounted, reactive, Ref, ref, toRefs } from 'vue'
import FooterBtns from '@/components/footer-btns/index.vue'
import { apiPostAdd, apiPostEdit, apiPostDetail } from '@/api/organize'
import { ElForm } from 'element-plus'
import { useAdmin } from '@/core/hooks/app'
const { router, route } = useAdmin()
const id = computed(() => route.query?.id)
const formRefs: Ref<typeof ElForm | null> = ref(null)
//
const { formData, rules } = toRefs(
reactive({
formData: {
name: '',
code: '',
sort: 0,
remarks: '',
isStop: 0,
},
rules: {
code: [
{
required: true,
message: '请输入岗位编码',
trigger: ['blur'],
},
],
name: [
{
required: true,
message: '请输入岗位名称',
trigger: ['blur'],
},
],
},
})
)
//
const getDetail = () => {
if (!id.value) {
return
}
apiPostDetail({
id: id.value,
}).then((res: any) => {
formData.value = res
})
}
//
const onSubmit = () => {
formRefs.value?.validate((valid: boolean) => {
if (!valid) {
return
}
const promise = id.value
? apiPostEdit({
...formData.value,
id: id.value,
})
: apiPostAdd(formData.value)
promise.then(() => {
setTimeout(() => router.go(-1), 500)
})
})
}
onMounted(() => {
getDetail()
})
</script> </script>
<style lang="scss" scoped> <style lang="scss" scoped>
.post-edit { .post-edit {
:deep(.el-textarea) { :deep(.el-textarea) {
width: 280px; width: 280px;
}
} }
}
</style> </style>

View File

@ -3,22 +3,18 @@
<el-card shadow="never"> <el-card shadow="never">
<el-form class="ls-form" :model="formData" label-width="80px" size="small" inline> <el-form class="ls-form" :model="formData" label-width="80px" size="small" inline>
<el-form-item label="岗位编码"> <el-form-item label="岗位编码">
<el-input class="ls-input" /> <el-input v-model="formData.code" class="ls-input" />
</el-form-item> </el-form-item>
<el-form-item label="岗位名称"> <el-form-item label="岗位名称">
<el-input class="ls-input" /> <el-input v-model="formData.name" class="ls-input" />
</el-form-item> </el-form-item>
<el-form-item label="岗位状态:"> <el-form-item label="岗位状态:">
<el-select placeholder="全部"> <el-select v-model="formData.isStop" placeholder="全部">
<el-option <el-option label="全部" value=""></el-option>
v-for="item in statusList" <el-option label="正常" :value="0"></el-option>
:key="item.val" <el-option label="停用" :value="1"></el-option>
:label="item.name"
:value="item.val"
>
</el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
@ -33,27 +29,26 @@
<el-card shadow="never" class="m-t-15"> <el-card shadow="never" class="m-t-15">
<router-link to="/organize/post/edit"> <router-link to="/organize/post/edit">
<el-button v-perm="['system:post:add']" type="primary" size="small"> <el-button v-perm="['system:post:add']" type="primary" size="small"> 新增岗位 </el-button>
新增岗位
</el-button>
</router-link> </router-link>
<el-table size="small" row-key="id" class="m-t-15"> <el-table :data="pager.lists" size="small" row-key="id" class="m-t-15">
<el-table-column label="岗位编码" prop="code" min-width="100"></el-table-column> <el-table-column label="岗位编码" prop="code" min-width="100"></el-table-column>
<el-table-column label="岗位名称" prop="name" min-width="100"></el-table-column> <el-table-column label="岗位名称" prop="name" min-width="100"></el-table-column>
<el-table-column label="岗位状态" prop="status_desc" min-width="100">
<el-table-column label="岗位状态" prop="isStop" min-width="100">
<template #default="{ row }"> <template #default="{ row }">
<el-tag class="ml-2" :type="row.status ? '' : 'danger'"> <el-tag class="ml-2" :type="row.isStop ? 'danger' : ''">
{{ row.status_desc }} {{ row.isStop == 0 ? '正常' : '停用' }}
</el-tag> </el-tag>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="排序" prop="sort" min-width="100"></el-table-column> <el-table-column label="排序" prop="sort" min-width="100"></el-table-column>
<el-table-column
label="添加时间" <el-table-column label="添加时间" prop="createTime" min-width="100"></el-table-column>
prop="create_time"
min-width="100"
></el-table-column>
<el-table-column label="操作" min-width="100" fixed="right"> <el-table-column label="操作" min-width="100" fixed="right">
<template #default="{ row }"> <template #default="{ row }">
<router-link <router-link
@ -61,12 +56,13 @@
:to="{ :to="{
path: '/organize/post/edit', path: '/organize/post/edit',
query: { query: {
id: row.id id: row.id,
} },
}" }"
> >
<el-button type="text">编辑</el-button> <el-button type="text">编辑</el-button>
</router-link> </router-link>
<popup class="m-r-10 inline" @confirm="handleDelete(row.id)"> <popup class="m-r-10 inline" @confirm="handleDelete(row.id)">
<template #trigger> <template #trigger>
<el-button type="text">删除</el-button> <el-button type="text">删除</el-button>
@ -79,6 +75,37 @@
</div> </div>
</template> </template>
<script lang="ts" setup></script> <script lang="ts" setup>
import { onMounted, reactive, ref } from 'vue'
import Popup from '@/components/popup/index.vue'
import { usePages } from '@/core/hooks/pages'
import { apiPostLists, apiPostDelete } from '@/api/organize'
//
const formData = reactive({
code: '', //
name: '', //
isStop: '', // 0=,1=,=
})
//
const { pager, requestApi, resetParams, resetPage } = usePages({
callback: apiPostLists,
params: formData,
})
//
const handleDelete = (id: number) => {
apiPostDelete({
id,
}).then(() => {
requestApi()
})
}
onMounted(() => {
requestApi()
})
</script>
<style lang="scss" scoped></style> <style lang="scss" scoped></style>