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

chore: update

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