提交 de1a52c6 authored 作者: 王鹏飞's avatar 王鹏飞

chore: update

上级 bb2b1302
import httpRequest from '@/utils/axios'
// 获取列表
export function getProjectList(params?: { project_id?: string; project_type?: string; project_status?: string; title?: string; page?: number;['per-page']?: number }) {
export function getProjectList(params?: {
project_id?: string
project_type?: string
project_status?: string
title?: string
page?: number
['per-page']?: number
}) {
return httpRequest.get('/api/zws/v1/backend/project/list', { params })
}
// 搜索用户
export function searchUser(params: { q: string; }) {
export function searchUser(params: { q: string }) {
return httpRequest.get('/api/zws/v1/backend/common/search-user', { params })
}
......@@ -16,7 +23,15 @@ export function getProjectRoles() {
}
// 创建项目
export function createProject(data?: { title?: string; alias?: string; project_type: string; project_status: string; project_uri?: string; landing_page_uri?: string; members: string }) {
export function createProject(data?: {
title?: string
alias?: string
project_type: string
project_status: string
project_uri?: string
landing_page_uri?: string
members: string
}) {
return httpRequest.post('/api/zws/v1/backend/project/create', data)
}
......@@ -31,7 +46,15 @@ export function getProjectUserList(params?: { id?: string | string[] }) {
}
// 更新项目
export function updateProject(data?: { id: string | string[]; title?: string; alias?: string; project_type: string; project_status: string; project_uri?: string; landing_page_uri?: string; }) {
export function updateProject(data?: {
id: string | string[]
title?: string
alias?: string
project_type: string
project_status: string
project_uri?: string
landing_page_uri?: string
}) {
return httpRequest.post('/api/zws/v1/backend/project/update', data)
}
......@@ -41,16 +64,16 @@ export function getProjectMap() {
}
// 删除人员
export function deleteMember(data: { user_id: string; project_id: string; role_id: string; }) {
export function deleteMember(data: { user_id: string; project_id: string; role_id: string }) {
return httpRequest.post('/api/zws/v1/backend/project/member-delete', data)
}
// 新增人员
export function addMember(data?: { user_id: string; projects_id: string; roles: string; type?: string }) {
export function addMember(data: { user_id: string; projects_id: string; roles: string; type?: string }) {
return httpRequest.post('/api/zws/v1/backend/project/member-create', data)
}
// 删除项目
export function deleteProjectRequest(data: { id: string; }) {
export function deleteProject(data: { id: string }) {
return httpRequest.post('/api/zws/v1/backend/project/delete', data)
}
<script setup lang="ts">
import type { FormInstance, FormRules } from 'element-plus'
import type { User, Role } from '../types'
import { searchUser, getProjectRoles } from '../api'
import { ElMessage } from 'element-plus'
const emit = defineEmits(['update:modelValue', 'changeUser'])
// 用户搜索
interface UserInfo {
id: string
nickname: string
mobile: string
interface FormData {
user: User
role: Role[]
}
let userValue = $ref('')
const loading = ref(false)
let userListOption = $ref<UserInfo[]>()
const emit = defineEmits<{
(e: 'update:modelValue', modelValue: boolean): void
(e: 'changeUser', data: FormData): void
}>()
const formRef = $ref<FormInstance>()
const form: Partial<FormData> = reactive({ user: undefined, role: [] })
const rules = reactive<FormRules>({
user: { required: true, message: '请选择成员', trigger: 'change' },
role: { type: 'array', required: true, message: '请选择角色', trigger: 'change' }
})
let userList = $ref<User[]>()
let loading = $ref(false)
const remoteMethod = (q: string) => {
if (q) {
loading.value = true
searchUser({ q: q }).then((res: { data: UserInfo[] }) => {
loading.value = false
userListOption = res.data
})
}
if (!q) return
loading = true
searchUser({ q }).then(res => {
loading = false
userList = res.data
})
}
// 获取角色
interface ProjectRole {
id: string
name: string
let roleList = $ref<Role[]>()
function fetchRoles() {
getProjectRoles().then((res: { data: Role[] }) => {
roleList = res.data
})
}
let roleValue = $ref([])
let projectRoleOption = $ref<ProjectRole[]>()
getProjectRoles().then((res: { data: ProjectRole[] }) => {
projectRoleOption = res.data
onMounted(() => {
fetchRoles()
})
// 选择完成
const submit = function () {
if (Object.keys(roleValue).length && userValue) {
const data = {
userInfo: userListOption.find(item => item.id === userValue),
role: projectRoleOption.reduce((a: any, b) => {
if (roleValue.find((item: any) => item === b.id)) {
a.push(b)
}
return a
}, [])
}
emit('changeUser', data)
function submit() {
formRef?.validate(() => {
emit('changeUser', form as FormData)
emit('update:modelValue', false)
userValue = ''
roleValue = []
} else {
ElMessage('请选择')
}
})
}
</script>
<template>
<el-dialog title="添加项目成员" width="400px" :close-on-click-modal="false">
<el-form style="display: block; width: 80%; margin: 0 auto" class="demo-form-inline">
<el-form-item label="选择成员">
<el-dialog
title="添加项目成员"
width="500px"
:close-on-click-modal="false"
@update:modelValue="$emit('update:modelValue')">
<el-form :rules="rules" :model="form" hide-required-asterisk ref="formRef">
<el-form-item label="选择成员" prop="user">
<el-select
v-model="userValue"
v-model="form.user"
filterable
remote
reserve-keyword
placeholder="请输入"
:remote-method="remoteMethod"
:loading="loading"
>
value-key="id"
style="width: 100%">
<el-option
v-for="item in userListOption"
v-for="item in userList"
:key="item.id"
:label="item.mobile ? `${item.nickname}(${item.mobile}})` : item.nickname"
:value="item.id"
/>
:value="item" />
</el-select>
</el-form-item>
<el-form-item label="选择角色" v-show="userValue">
<el-select v-model="roleValue" multiple placeholder="请选择">
<el-option v-for="item in projectRoleOption" :key="item.id" :label="item.name" :value="item.id" />
<el-form-item label="选择角色" prop="role">
<el-select v-model="form.role" multiple placeholder="请选择" value-key="id" style="width: 100%">
<el-option v-for="item in roleList" :key="item.id" :label="item.name" :value="item" />
</el-select>
</el-form-item>
</el-form>
<template #footer>
<span class="dialog-footer">
<el-button @click="emit('update:modelValue', false)">取消</el-button>
<el-button type="primary" @click="submit"> 确定 </el-button>
</span>
<el-button auto-insert-space @click="$emit('update:modelValue', false)">取消</el-button>
<el-button auto-insert-space type="primary" @click="submit"> 确定 </el-button>
</template>
</el-dialog>
</template>
export interface ProjectItem {
id: string
title: string
alias: string
project_id: string
project_type: string
site_uri: string
summary: string
picture_uri: string
weight: string
project_uri: string
landing_page_uri: string
users: string
stakeholder_emails: string
application_notify: string
project_status: string
comment: string
status: string
operator: string
created_time: string
updated_time: string
english_name: string
leader_id: string
learn_length: string
project_type_name: string
project_status_name: string
}
// 用户信息
export interface User {
id: string
realname: string
nickname: string
username: string
mobile: string
avatar: string
email: string
}
// 角色信息
export interface Role {
id: string
name: string
desc: string
levels: RoleLevel[]
}
export interface RoleLevel {
level_id: string
level_name: string
level_tag: string
level_group_tag: string
}
<script setup lang="ts">
import type { User, Role } from '../types'
import AppList from '@/components/base/AppList.vue'
import { getProjectList, addMember, deleteProjectRequest } from '../api'
import { ElMessage } from 'element-plus'
import { getProjectList, addMember, deleteProject } from '../api'
import { ElMessage, ElMessageBox } from 'element-plus'
import { useMap } from '../composables/useMap'
const AddMember = defineAsyncComponent(() => import('../components/AddMember.vue'))
......@@ -10,18 +11,11 @@ const { types, status } = useMap()
const appList = $ref<InstanceType<typeof AppList> | null>(null)
const router = useRouter()
const listOptions = $computed(() => {
return {
remote: {
httpRequest: getProjectList,
params: {
project_id: '',
project_type: '',
project_status: '',
title: ''
}
params: { project_id: '', project_type: '', project_status: '', title: '' }
},
filters: [
{ type: 'input', prop: 'project_id', placeholder: '项目编号' },
......@@ -72,40 +66,34 @@ function handleSelectionChange(value: any) {
multipleSelection = value
}
let labelVisible = $ref(false)
let memberVisible = $ref(false)
const addProjectMember = function () {
labelVisible = true
multipleSelection = []
memberVisible = true
}
// 选择人员
let currentUser = $ref<{ user: User; role: Role[] }>()
// 多项目角色确认弹窗
let memberRoleVisible = $ref(false)
let changeMemberName = $ref('')
let paramsMember = $ref<{ user_id: string; projects_id: string; roles: string; type?: string }>()
const changeMember = function (e: any) {
paramsMember = {
user_id: e.userInfo.id,
projects_id: multipleSelection.reduce((a: any, b: any) => a.push(b.project_id) && a, []).toString(),
roles: e.role.reduce((a: any, b: any) => a.push(b.id) && a, []).toString()
let memberParams = $ref<{ user_id: string; projects_id: string; roles: string; type?: string }>()
const changeMember = function (data: { user: User; role: Role[] }) {
currentUser = data
memberParams = {
user_id: data.user.id,
projects_id: multipleSelection.map(item => item.project_id).join(','),
roles: data.role.map(item => item.id).join(',')
}
changeMemberName = e.userInfo.nickname
addMemberRequest()
}
const addMemberRequest = function (n?: string) {
let params = paramsMember
if (n) {
params = Object.assign(paramsMember, { type: n })
}
const addMemberRequest = function (type?: string) {
const params = Object.assign({}, memberParams, { type })
addMember(params).then((res: any) => {
if (res.code === 0) {
ElMessage({
message: '添加成功',
type: 'success'
})
router.go(0)
ElMessage({ message: '添加成功', type: 'success' })
}
if (res.code === 2) {
memberRoleVisible = true
......@@ -114,19 +102,18 @@ const addMemberRequest = function (n?: string) {
}
// 列表上的添加成员
const aloneAddMember = function (row: { project_id: string }) {
const handleAddMember = function (row: any) {
multipleSelection = [row]
labelVisible = true
memberVisible = true
}
// 删除项目
const deleteProject = function (row: { id: string }) {
deleteProjectRequest({ id: row.id }).then(() => {
ElMessage({
message: '删除成功',
type: 'success'
const handleDelete = function (row: any) {
ElMessageBox.confirm('确定要删除该项目吗?', '提示').then(() => {
deleteProject({ id: row.id }).then(() => {
ElMessage({ message: '删除成功', type: 'success' })
appList?.refetch()
})
appList?.refetch()
})
}
</script>
......@@ -149,21 +136,21 @@ const deleteProject = function (row: { id: string }) {
<el-button text style="--el-button-text-color: #3276fc">
<router-link :to="{ name: 'projectUpdate', params: { id: row.id } }">编辑</router-link>
</el-button>
<el-button text style="--el-button-text-color: #00bfbf" @click="aloneAddMember(row)">添加成员</el-button>
<el-button text style="--el-button-text-color: #d9001b" @click="deleteProject(row)">删除</el-button>
<el-button text style="--el-button-text-color: #00bfbf" @click="handleAddMember(row)">添加成员</el-button>
<el-button text style="--el-button-text-color: #d9001b" @click="handleDelete(row)">删除</el-button>
</template>
</AppList>
<AddMember @changeUser="changeMember" v-model="labelVisible"></AddMember>
<AddMember @changeUser="changeMember" v-model="memberVisible"></AddMember>
</AppCard>
<el-dialog v-model="memberRoleVisible" title="提示">
<el-form>
<el-form-item label="系统检测到:"> {{ changeMemberName }}在多个项目中已拥有角色 </el-form-item>
<el-form-item label="请选择">
<el-button @click="addMemberRequest('replace')">全部替换为新角色</el-button>
<el-button @click="addMemberRequest('insert')">在已有角色中新增角色</el-button>
<el-dialog v-model="memberRoleVisible" title="提示" width="500px">
<el-form label-suffix=":">
<el-form-item label="系统检测到"> {{ currentUser?.user.realname }} 在多个项目中已拥有角色 </el-form-item>
<el-form-item label="请选择">
<el-button type="primary" plain @click="addMemberRequest('replace')">全部替换为新角色</el-button>
<el-button type="primary" plain @click="addMemberRequest('insert')">在已有角色中新增角色</el-button>
</el-form-item>
<el-form-item label="或者:">
<el-button @click="memberRoleVisible = false">取消本次更新</el-button>
<el-form-item label="或选择">
<el-button type="warning" plain @click="memberRoleVisible = false">取消本次更新</el-button>
</el-form-item>
</el-form>
</el-dialog>
......
......@@ -22,7 +22,7 @@ const listOptions = $computed(() => {
filters: [
{ type: 'input', prop: 'user_name', placeholder: '请输入用户姓名' },
{ type: 'input', prop: 'mobile', placeholder: '请输入用户手机号' },
{ type: 'input', prop: 'email', placeholder: '请输入角色邮箱' },
{ type: 'input', prop: 'email', placeholder: '请输入用户邮箱' },
{ type: 'input', prop: 'role_name', placeholder: '请输入角色名称' }
],
columns: [
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论