mirror of
https://github.com/kuaifan/dootask.git
synced 2026-02-28 12:50:48 +00:00
feat: 新增部门功能
This commit is contained in:
parent
70ec88e57d
commit
cbadf25623
@ -8,6 +8,7 @@ use App\Models\Project;
|
||||
use App\Models\UmengAlias;
|
||||
use App\Models\User;
|
||||
use App\Models\UserDelete;
|
||||
use App\Models\UserDepartment;
|
||||
use App\Models\UserEmailVerification;
|
||||
use App\Models\UserTransfer;
|
||||
use App\Models\WebSocket;
|
||||
@ -1111,4 +1112,123 @@ class UsersController extends AbstractController
|
||||
}
|
||||
return Base::retSuccess('success', $user);
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {get} api/users/department/list 20. 部门列表(限管理员)
|
||||
*
|
||||
* @apiDescription 需要token身份
|
||||
* @apiVersion 1.0.0
|
||||
* @apiGroup users
|
||||
* @apiName department__list
|
||||
*
|
||||
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||
* @apiSuccess {Object} data 返回数据
|
||||
*/
|
||||
public function department__list()
|
||||
{
|
||||
User::auth('admin');
|
||||
//
|
||||
return Base::retSuccess('success', UserDepartment::orderBy('id')->get());
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {get} api/users/department/add 21. 新建、修改部门(限管理员)
|
||||
*
|
||||
* @apiDescription 需要token身份
|
||||
* @apiVersion 1.0.0
|
||||
* @apiGroup users
|
||||
* @apiName department__add
|
||||
*
|
||||
* @apiParam {Number} [id] 部门id,留空为创建部门
|
||||
* @apiParam {String} name 部门名称
|
||||
* @apiParam {Number} [parent_id] 上级部门ID
|
||||
* @apiParam {Number} owner_userid 部门负责人ID
|
||||
*
|
||||
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||
* @apiSuccess {Object} data 返回数据
|
||||
*/
|
||||
public function department__add()
|
||||
{
|
||||
User::auth('admin');
|
||||
//
|
||||
$id = intval(Request::input('id'));
|
||||
$name = trim(Request::input('name'));
|
||||
$parent_id = intval(Request::input('parent_id'));
|
||||
$owner_userid = intval(Request::input('owner_userid'));
|
||||
//
|
||||
if (mb_strlen($name) < 2 || mb_strlen($name) > 20) {
|
||||
return Base::retError('部门名称长度限制2-20个字');
|
||||
}
|
||||
//
|
||||
if ($id > 0) {
|
||||
$userDepartment = UserDepartment::find($id);
|
||||
if (empty($userDepartment)) {
|
||||
return Base::retError('部门不存在或已被删除');
|
||||
}
|
||||
} else {
|
||||
if (UserDepartment::count() > 200) {
|
||||
return Base::retError('最多只能创建200个部门');
|
||||
}
|
||||
$userDepartment = UserDepartment::createInstance();
|
||||
}
|
||||
//
|
||||
if ($parent_id > 0) {
|
||||
$parentDepartment = UserDepartment::find($parent_id);
|
||||
if (empty($parentDepartment)) {
|
||||
return Base::retError('上级部门不存在或已被删除');
|
||||
}
|
||||
if ($parentDepartment->parent_id > 0) {
|
||||
return Base::retError('上级部门层级错误');
|
||||
}
|
||||
if (UserDepartment::whereParentId($parent_id)->count() > 20) {
|
||||
return Base::retError('每个部门最多只能创建20个子部门');
|
||||
}
|
||||
if ($id > 0 && UserDepartment::whereParentId($id)->exists()) {
|
||||
return Base::retError('含有子部门无法修改上级部门');
|
||||
}
|
||||
}
|
||||
if (empty($owner_userid) || !User::whereUserid($owner_userid)->exists()) {
|
||||
return Base::retError('请选择正确的部门负责人');
|
||||
}
|
||||
//
|
||||
$userDepartment->updateInstance([
|
||||
'name' => $name,
|
||||
'parent_id' => $parent_id,
|
||||
'owner_userid' => $owner_userid,
|
||||
]);
|
||||
$userDepartment->saveDepartment();
|
||||
//
|
||||
return Base::retSuccess($parent_id > 0 ? '保存成功' : '新建成功');
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {get} api/users/department/del 22. 删除部门(限管理员)
|
||||
*
|
||||
* @apiDescription 需要token身份
|
||||
* @apiVersion 1.0.0
|
||||
* @apiGroup users
|
||||
* @apiName department__del
|
||||
*
|
||||
* @apiParam {Number} id 部门id
|
||||
*
|
||||
* @apiSuccess {Number} ret 返回状态码(1正确、0错误)
|
||||
* @apiSuccess {String} msg 返回信息(错误描述)
|
||||
* @apiSuccess {Object} data 返回数据
|
||||
*/
|
||||
public function department__del()
|
||||
{
|
||||
User::auth('admin');
|
||||
//
|
||||
$id = intval(Request::input('id'));
|
||||
//
|
||||
$userDepartment = UserDepartment::find($id);
|
||||
if (empty($userDepartment)) {
|
||||
return Base::retError('部门不存在或已被删除');
|
||||
}
|
||||
$userDepartment->deleteDepartment();
|
||||
//
|
||||
return Base::retSuccess('删除成功');
|
||||
}
|
||||
}
|
||||
|
||||
51
app/Models/UserDepartment.php
Normal file
51
app/Models/UserDepartment.php
Normal file
@ -0,0 +1,51 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
/**
|
||||
* App\Models\UserDepartment
|
||||
*
|
||||
* @property int $id
|
||||
* @property string|null $name 部门名称
|
||||
* @property int|null $dialog_id 聊天会话ID
|
||||
* @property int|null $parent_id 上级部门
|
||||
* @property int|null $owner_userid 部门负责人
|
||||
* @property \Illuminate\Support\Carbon|null $created_at
|
||||
* @property \Illuminate\Support\Carbon|null $updated_at
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment newModelQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment newQuery()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment query()
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment whereCreatedAt($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment whereDialogId($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment whereId($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment whereName($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment whereOwnerUserid($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment whereParentId($value)
|
||||
* @method static \Illuminate\Database\Eloquent\Builder|UserDepartment whereUpdatedAt($value)
|
||||
* @mixin \Eloquent
|
||||
*/
|
||||
class UserDepartment extends AbstractModel
|
||||
{
|
||||
|
||||
/**
|
||||
* 保存部门
|
||||
* @return bool
|
||||
*/
|
||||
public function saveDepartment() {
|
||||
// todo 聊天室相关
|
||||
return $this->save();
|
||||
}
|
||||
|
||||
/**
|
||||
* 删除部门
|
||||
* @return void
|
||||
*/
|
||||
public function deleteDepartment() {
|
||||
$list = self::whereParentId($this->id)->get();
|
||||
foreach ($list as $item) {
|
||||
$item->deleteDepartment();
|
||||
}
|
||||
// todo 移动成员
|
||||
$this->delete();
|
||||
}
|
||||
}
|
||||
@ -0,0 +1,35 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class CreateUserDepartmentsTable extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::create('user_departments', function (Blueprint $table) {
|
||||
$table->bigIncrements('id');
|
||||
$table->string('name', 100)->nullable()->default('')->comment('部门名称');
|
||||
$table->bigInteger('dialog_id')->nullable()->default(0)->comment('聊天会话ID');
|
||||
$table->bigInteger('parent_id')->nullable()->default(0)->comment('上级部门');
|
||||
$table->bigInteger('owner_userid')->nullable()->default(0)->comment('部门负责人');
|
||||
$table->timestamps();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::dropIfExists('user_departments');
|
||||
}
|
||||
}
|
||||
@ -325,7 +325,7 @@
|
||||
<DrawerOverlay
|
||||
v-model="allUserShow"
|
||||
placement="right"
|
||||
:size="1200">
|
||||
:size="1380">
|
||||
<TeamManagement v-if="allUserShow"/>
|
||||
</DrawerOverlay>
|
||||
|
||||
|
||||
@ -6,88 +6,163 @@
|
||||
<Loading v-if="loadIng > 0"/>
|
||||
</div>
|
||||
</div>
|
||||
<div class="search-container lr">
|
||||
<ul>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("关键词")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Input v-model="keys.key" :placeholder="$L('邮箱、昵称、职位')" clearable/>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("身份")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Select v-model="keys.identity" :placeholder="$L('全部')">
|
||||
<Option value="">{{$L('全部')}}</Option>
|
||||
<Option value="admin">{{$L('管理员')}}</Option>
|
||||
<Option value="noadmin">{{$L('非管理员')}}</Option>
|
||||
</Select>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("在职状态")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Select v-model="keys.disable" :placeholder="$L('在职')">
|
||||
<Option value="">{{$L('在职')}}</Option>
|
||||
<Option value="yes">{{$L('离职')}}</Option>
|
||||
<Option value="all">{{$L('全部')}}</Option>
|
||||
</Select>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("邮箱认证")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Select v-model="keys.email_verity" :placeholder="$L('全部')">
|
||||
<Option value="">{{$L('全部')}}</Option>
|
||||
<Option value="yes">{{$L('已邮箱认证')}}</Option>
|
||||
<Option value="no">{{$L('未邮箱认证')}}</Option>
|
||||
</Select>
|
||||
</div>
|
||||
</li>
|
||||
<li class="search-button">
|
||||
<Tooltip
|
||||
theme="light"
|
||||
placement="bottom"
|
||||
transfer-class-name="search-button-clear"
|
||||
transfer>
|
||||
<Button :loading="loadIng > 0" type="primary" icon="ios-search" @click="onSearch">{{$L('搜索')}}</Button>
|
||||
<div slot="content">
|
||||
<Button v-if="keyIs" type="text" @click="keyIs=false">{{$L('取消筛选')}}</Button>
|
||||
<Button v-else :loading="loadIng > 0" type="text" @click="getLists">{{$L('刷新')}}</Button>
|
||||
</div>
|
||||
</Tooltip>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="table-page-box">
|
||||
<Table
|
||||
:columns="columns"
|
||||
:data="list"
|
||||
:loading="loadIng > 0"
|
||||
:no-data-text="$L(noText)"
|
||||
stripe/>
|
||||
<Page
|
||||
:total="total"
|
||||
:current="page"
|
||||
:page-size="pageSize"
|
||||
:disabled="loadIng > 0"
|
||||
:simple="windowSmall"
|
||||
:page-size-opts="[10,20,30,50,100]"
|
||||
show-elevator
|
||||
show-sizer
|
||||
show-total
|
||||
@on-change="setPage"
|
||||
@on-page-size-change="setPageSize"/>
|
||||
<div class="management-box">
|
||||
<div class="management-department">
|
||||
<ul>
|
||||
<li class="level-1">
|
||||
<i class="taskfont department-icon"></i>
|
||||
<div class="department-title">{{$L('默认部门')}}</div>
|
||||
<EDropdown
|
||||
size="medium"
|
||||
trigger="click"
|
||||
@command="onOpDepartment">
|
||||
<i class="taskfont department-menu"></i>
|
||||
<EDropdownMenu slot="dropdown">
|
||||
<EDropdownItem command="add_0">
|
||||
<div>{{$L('添加子部门')}}</div>
|
||||
</EDropdownItem>
|
||||
</EDropdownMenu>
|
||||
</EDropdown>
|
||||
</li>
|
||||
<li v-for="item in departmentList" :key="item.id" :class="`level-${item.level}`">
|
||||
<UserAvatar :userid="item.owner_userid" :size="20" class="department-icon">
|
||||
<p><strong>{{$L('部门负责人')}}</strong></p>
|
||||
</UserAvatar>
|
||||
<div class="department-title">{{item.name}}</div>
|
||||
<EDropdown
|
||||
size="medium"
|
||||
trigger="click"
|
||||
@command="onOpDepartment">
|
||||
<i class="taskfont department-menu"></i>
|
||||
<EDropdownMenu slot="dropdown">
|
||||
<EDropdownItem v-if="item.level <= 2" :command="`add_${item.id}`">
|
||||
<div>{{$L('添加子部门')}}</div>
|
||||
</EDropdownItem>
|
||||
<EDropdownItem :command="`edit_${item.id}`">
|
||||
<div>{{$L('编辑')}}</div>
|
||||
</EDropdownItem>
|
||||
<EDropdownItem :command="`del_${item.id}`">
|
||||
<div style="color:#f00">{{$L('删除')}}</div>
|
||||
</EDropdownItem>
|
||||
</EDropdownMenu>
|
||||
</EDropdown>
|
||||
</li>
|
||||
</ul>
|
||||
<div class="department-buttons">
|
||||
<Button type="primary" icon="md-add" @click="onShowDepartment(null)">{{$L('新建部门')}}</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="management-user">
|
||||
<div class="search-container lr">
|
||||
<ul>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("关键词")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Input v-model="keys.key" :placeholder="$L('邮箱、昵称、职位')" clearable/>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("身份")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Select v-model="keys.identity" :placeholder="$L('全部')">
|
||||
<Option value="">{{$L('全部')}}</Option>
|
||||
<Option value="admin">{{$L('管理员')}}</Option>
|
||||
<Option value="noadmin">{{$L('非管理员')}}</Option>
|
||||
</Select>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("在职状态")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Select v-model="keys.disable" :placeholder="$L('在职')">
|
||||
<Option value="">{{$L('在职')}}</Option>
|
||||
<Option value="yes">{{$L('离职')}}</Option>
|
||||
<Option value="all">{{$L('全部')}}</Option>
|
||||
</Select>
|
||||
</div>
|
||||
</li>
|
||||
<li>
|
||||
<div class="search-label">
|
||||
{{$L("邮箱认证")}}
|
||||
</div>
|
||||
<div class="search-content">
|
||||
<Select v-model="keys.email_verity" :placeholder="$L('全部')">
|
||||
<Option value="">{{$L('全部')}}</Option>
|
||||
<Option value="yes">{{$L('已邮箱认证')}}</Option>
|
||||
<Option value="no">{{$L('未邮箱认证')}}</Option>
|
||||
</Select>
|
||||
</div>
|
||||
</li>
|
||||
<li class="search-button">
|
||||
<Tooltip
|
||||
theme="light"
|
||||
placement="bottom"
|
||||
transfer-class-name="search-button-clear"
|
||||
transfer>
|
||||
<Button :loading="loadIng > 0" type="primary" icon="ios-search" @click="onSearch">{{$L('搜索')}}</Button>
|
||||
<div slot="content">
|
||||
<Button v-if="keyIs" type="text" @click="keyIs=false">{{$L('取消筛选')}}</Button>
|
||||
<Button v-else :loading="loadIng > 0" type="text" @click="getLists">{{$L('刷新')}}</Button>
|
||||
</div>
|
||||
</Tooltip>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="table-page-box">
|
||||
<Table
|
||||
:columns="columns"
|
||||
:data="list"
|
||||
:loading="loadIng > 0"
|
||||
:no-data-text="$L(noText)"
|
||||
stripe/>
|
||||
<Page
|
||||
:total="total"
|
||||
:current="page"
|
||||
:page-size="pageSize"
|
||||
:disabled="loadIng > 0"
|
||||
:simple="windowSmall"
|
||||
:page-size-opts="[10,20,30,50,100]"
|
||||
show-elevator
|
||||
show-sizer
|
||||
show-total
|
||||
@on-change="setPage"
|
||||
@on-page-size-change="setPageSize"/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!--新建部门、修改部门-->
|
||||
<Modal
|
||||
v-model="departmentShow"
|
||||
:title="$L(departmentData.id > 0 ? '修改部门' : '新建部门')"
|
||||
:mask-closable="false">
|
||||
<Form ref="addProject" :model="departmentData" label-width="auto" @submit.native.prevent>
|
||||
<FormItem prop="name" :label="$L('部门名称')">
|
||||
<Input type="text" v-model="departmentData.name" :placeholder="$L('请输入部门名称')"></Input>
|
||||
</FormItem>
|
||||
<FormItem prop="parent_id" :label="$L('上级部门')">
|
||||
<Select v-model="departmentData.parent_id" :disabled="departmentParentDisabled" :placeholder="$L('请选择上级部门')">
|
||||
<Option :value="0">{{ $L('默认部门') }}</Option>
|
||||
<Option v-for="(item, index) in departmentList" v-if="item.parent_id == 0 && item.id != departmentData.id" :value="item.id" :key="index" :label="item.name"> {{ item.name }}</Option>
|
||||
</Select>
|
||||
<div v-if="departmentParentDisabled" class="form-tip" style="margin-bottom:-16px">{{$L('含有子部门无法修改上级部门')}}</div>
|
||||
</FormItem>
|
||||
<FormItem prop="owner_userid" :label="$L('部门负责人')">
|
||||
<UserInput v-model="departmentData.owner_userid" :multiple-max="1" :placeholder="$L('请选择部门负责人')"/>
|
||||
</FormItem>
|
||||
</Form>
|
||||
<div slot="footer" class="adaption">
|
||||
<Button type="default" @click="departmentShow=false">{{$L('取消')}}</Button>
|
||||
<Button type="primary" :loading="departmentLoading > 0" @click="onSaveDepartment">{{$L(departmentData.id > 0 ? '保存' : '新建')}}</Button>
|
||||
</div>
|
||||
</Modal>
|
||||
|
||||
<!--操作离职-->
|
||||
<Modal
|
||||
v-model="disableShow"
|
||||
@ -128,7 +203,6 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {mapState} from "vuex";
|
||||
import UserInput from "../../../components/UserInput";
|
||||
|
||||
export default {
|
||||
@ -152,10 +226,21 @@ export default {
|
||||
disableShow: false,
|
||||
disableLoading: 0,
|
||||
disableData: {},
|
||||
|
||||
departmentShow: false,
|
||||
departmentLoading: 0,
|
||||
departmentData: {
|
||||
id: 0,
|
||||
name: '',
|
||||
parent_id: 0,
|
||||
owner_userid: []
|
||||
},
|
||||
departmentList: [],
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
this.getLists();
|
||||
this.getDepartmentLists();
|
||||
},
|
||||
watch: {
|
||||
keyIs(v) {
|
||||
@ -165,6 +250,11 @@ export default {
|
||||
}
|
||||
}
|
||||
},
|
||||
computed: {
|
||||
departmentParentDisabled() {
|
||||
return !!(this.departmentData.id > 0 && this.departmentList.find(({parent_id}) => parent_id == this.departmentData.id));
|
||||
},
|
||||
},
|
||||
methods: {
|
||||
initLanguage() {
|
||||
this.columns = [
|
||||
@ -541,6 +631,95 @@ export default {
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
|
||||
getDepartmentLists() {
|
||||
this.departmentLoading++;
|
||||
this.$store.dispatch("call", {
|
||||
url: 'users/department/list',
|
||||
}).then(({data}) => {
|
||||
this.departmentList = []
|
||||
this.generateDepartmentList(data, 0, 1)
|
||||
}).finally(_ => {
|
||||
this.departmentLoading--;
|
||||
})
|
||||
},
|
||||
|
||||
generateDepartmentList(data, parent_id, level) {
|
||||
data.some(item => {
|
||||
if (item.parent_id == parent_id) {
|
||||
this.departmentList.push(Object.assign(item, {
|
||||
level: level + 1
|
||||
}))
|
||||
this.generateDepartmentList(data, item.id, level + 1)
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
onShowDepartment(data) {
|
||||
this.departmentData = Object.assign({
|
||||
id: 0,
|
||||
name: '',
|
||||
parent_id: 0,
|
||||
owner_userid: []
|
||||
}, data || {})
|
||||
this.departmentShow = true
|
||||
},
|
||||
|
||||
onSaveDepartment() {
|
||||
this.departmentLoading++;
|
||||
this.$store.dispatch("call", {
|
||||
url: 'users/department/add',
|
||||
data: Object.assign(this.departmentData, {
|
||||
owner_userid: this.departmentData.owner_userid[0],
|
||||
}),
|
||||
}).then(({msg}) => {
|
||||
$A.messageSuccess(msg)
|
||||
this.getDepartmentLists()
|
||||
this.departmentShow = false
|
||||
}).catch(({msg}) => {
|
||||
$A.modalError(msg);
|
||||
}).finally(_ => {
|
||||
this.departmentLoading--;
|
||||
})
|
||||
},
|
||||
|
||||
onOpDepartment(val) {
|
||||
if ($A.leftExists(val, 'add_')) {
|
||||
this.onShowDepartment({
|
||||
parent_id: parseInt(val.substr(4))
|
||||
})
|
||||
} else if ($A.leftExists(val, 'edit_')) {
|
||||
const editItem = this.departmentList.find(({id}) => id === parseInt(val.substr(5)))
|
||||
if (editItem) {
|
||||
this.onShowDepartment(editItem)
|
||||
}
|
||||
} else if ($A.leftExists(val, 'del_')) {
|
||||
const delItem = this.departmentList.find(({id}) => id === parseInt(val.substr(4)))
|
||||
if (delItem) {
|
||||
$A.modalConfirm({
|
||||
title: this.$L('删除部门'),
|
||||
content: `<div>${this.$L(`你确定要删除【${delItem.name}】部门吗?`)}</div><div style="color:#f00;font-weight:600">${this.$L(`注意:此操作不可恢复,部门下的成员将向上移动。`)}</div>`,
|
||||
language: false,
|
||||
loading: true,
|
||||
onOk: () => {
|
||||
return new Promise((resolve, reject) => {
|
||||
this.$store.dispatch("call", {
|
||||
url: 'users/department/del',
|
||||
data: {
|
||||
id: delItem.id
|
||||
},
|
||||
}).then(({msg}) => {
|
||||
resolve(msg);
|
||||
this.getDepartmentLists();
|
||||
}).catch(({msg}) => {
|
||||
reject(msg);
|
||||
})
|
||||
})
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -31,6 +31,77 @@
|
||||
}
|
||||
}
|
||||
|
||||
.management-box {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
height: 0;
|
||||
.management-department {
|
||||
width: 239px;
|
||||
border-right: 1px solid #efefef;
|
||||
flex-shrink: 0;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
> ul {
|
||||
flex: 1;
|
||||
overflow: auto;
|
||||
> li {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
height: 40px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
cursor: pointer;
|
||||
&:hover,
|
||||
&.active {
|
||||
background-color: #ecf5ff;
|
||||
}
|
||||
&.level-1 {
|
||||
font-weight: 500;
|
||||
}
|
||||
&.level-2 {
|
||||
margin-left: 24px;
|
||||
}
|
||||
&.level-3 {
|
||||
margin-left: 48px;
|
||||
}
|
||||
&.level-4 {
|
||||
margin-left: 72px;
|
||||
}
|
||||
.department-icon {
|
||||
padding: 8px;
|
||||
font-size: 16px;
|
||||
}
|
||||
.department-title {
|
||||
flex: 1;
|
||||
flex-shrink: 0;
|
||||
overflow: hidden;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.department-menu {
|
||||
display: inline-block;
|
||||
padding: 12px;
|
||||
font-size: 16px;
|
||||
transform: rotate(-90deg);
|
||||
}
|
||||
}
|
||||
}
|
||||
.department-buttons {
|
||||
margin-top: 20px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
.management-user {
|
||||
flex: 1;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding-left: 20px;
|
||||
}
|
||||
}
|
||||
|
||||
.team-email {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user