Browse Source

feat(sys): 优化角色删除权限控制并添加用户类型筛选功能

- 实现 isProtectedRole 方法来判断受保护角色(系统管理员、供应商、客户)
- 使用 isProtectedRole 方法控制角色删除按钮的显示逻辑
- 在用户管理界面添加类型筛选下拉框
- 新增用户类型字段(员工、供应商、客户)的显示和筛选功能
- 在新增用户页面添加类型选择功能
- 根据用户类型过滤可分配的角色列表
master
qiankanghui 4 days ago
parent
commit
ad3e292ca2
  1. 2
      src/views/modules/srmBaseInformation/srmPartFamily.vue
  2. 1649
      src/views/modules/srmBaseInformation/srmPartFamily1.vue
  3. 10
      src/views/modules/sys/role.vue
  4. 63
      src/views/modules/sys/user-add-or-update.vue
  5. 35
      src/views/modules/sys/user.vue

2
src/views/modules/srmBaseInformation/srmPartFamily.vue

@ -127,7 +127,7 @@
<el-link style="cursor: pointer" v-if="authDelete" @click="deletePartFamilyHandle(scope.row)"> | 删除</el-link> <el-link style="cursor: pointer" v-if="authDelete" @click="deletePartFamilyHandle(scope.row)"> | 删除</el-link>
<el-link style="cursor: pointer" @click="openSopList(scope.row)"> | SOP上传</el-link>
<!-- <el-link style="cursor: pointer" @click="openSopList(scope.row)"> | SOP上传</el-link>-->
</template> </template>

1649
src/views/modules/srmBaseInformation/srmPartFamily1.vue
File diff suppressed because it is too large
View File

10
src/views/modules/sys/role.vue

@ -51,13 +51,13 @@
<a v-if="!adminUser && scope.row.roleName === '系统管理员'" type="text" size="small" style="pointer-events:none;color: #8a979e">{{ buttons.edit || '修改' }}</a> <a v-if="!adminUser && scope.row.roleName === '系统管理员'" type="text" size="small" style="pointer-events:none;color: #8a979e">{{ buttons.edit || '修改' }}</a>
<a v-if="!adminUser && scope.row.roleName !== '系统管理员'" type="text" size="small" @click="addOrUpdateHandle(scope.row)">{{ buttons.edit || '修改' }}</a> <a v-if="!adminUser && scope.row.roleName !== '系统管理员'" type="text" size="small" @click="addOrUpdateHandle(scope.row)">{{ buttons.edit || '修改' }}</a>
<!-- <a v-if="adminUser" type="text" size="small" @click="addOrUpdateHandle(scope.row.userId)">{{ buttons.edit || '修改' }}</a>--> <!-- <a v-if="adminUser" type="text" size="small" @click="addOrUpdateHandle(scope.row.userId)">{{ buttons.edit || '修改' }}</a>-->
<a v-if="!adminUser && scope.row.roleName === '系统管理员'" type="text" size="small" style="pointer-events:none;color: #8a979e">{{ buttons.delete || '删除' }}</a>
<a v-if="!adminUser && scope.row.roleName !== '系统管理员'" type="text" size="small" @click="deleteHandle(scope.row.roleId)">{{ buttons.delete || '删除' }}</a>
<a v-if="!adminUser && isProtectedRole(scope.row.roleName)" type="text" size="small" style="pointer-events:none;color: #8a979e">{{ buttons.delete || '删除' }}</a>
<a v-if="!adminUser && !isProtectedRole(scope.row.roleName)" type="text" size="small" @click="deleteHandle(scope.row.roleId)">{{ buttons.delete || '删除' }}</a>
<!-- <a v-if="adminUser" type="text" size="small" @click="deleteHandle(scope.row.userId)">{{ buttons.delete || '删除' }}</a>--> <!-- <a v-if="adminUser" type="text" size="small" @click="deleteHandle(scope.row.userId)">{{ buttons.delete || '删除' }}</a>-->
<!-- <a v-if="!authUpdate && adminUser" type="text" size="small" @click="addOrUpdateHandle(scope.row)">{{buttons.edit||'修改'}}</a>--> <!-- <a v-if="!authUpdate && adminUser" type="text" size="small" @click="addOrUpdateHandle(scope.row)">{{buttons.edit||'修改'}}</a>-->
<!-- <a v-if="!authDelete && adminUser" type="text" size="small" @click="deleteHandle(scope.row.roleId)">{{buttons.delete|| '删除'}}</a>--> <!-- <a v-if="!authDelete && adminUser" type="text" size="small" @click="deleteHandle(scope.row.roleId)">{{buttons.delete|| '删除'}}</a>-->
<a v-if="adminUser" type="text" size="small" @click="addOrUpdateHandle(scope.row)">{{buttons.edit||'修改'}}</a> <a v-if="adminUser" type="text" size="small" @click="addOrUpdateHandle(scope.row)">{{buttons.edit||'修改'}}</a>
<a v-if="adminUser && scope.row.roleName !== '系统管理员'" type="text" size="small" @click="deleteHandle(scope.row.roleId)">{{buttons.delete|| '删除'}}</a>
<a v-if="adminUser && !isProtectedRole(scope.row.roleName)" type="text" size="small" @click="deleteHandle(scope.row.roleId)">{{buttons.delete|| '删除'}}</a>
</template> </template>
</el-table-column> </el-table-column>
@ -202,6 +202,10 @@ import row from "element-ui/packages/row";
} }
}, },
methods: { methods: {
// 系统内置角色,不允许删除(供应商/客户仍允许修改)
isProtectedRole (roleName) {
return roleName === '系统管理员' || roleName === '供应商' || roleName === '客户'
},
// 校验用户是否收藏 // 校验用户是否收藏
favoriteIsOk() { favoriteIsOk() {
let userFavorite = { let userFavorite = {

63
src/views/modules/sys/user-add-or-update.vue

@ -41,6 +41,16 @@
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
<el-form-item label="类型" class="is-required">
<el-select v-model="dataForm.type" placeholder="请选择类型" style="width: 150px;">
<el-option
v-for="i in typeOptions"
:key="i.value"
:label="i.label"
:value="i.value">
</el-option>
</el-select>
</el-form-item>
<!-- <el-form-item label="车间">--> <!-- <el-form-item label="车间">-->
<!-- <el-select v-model="dataForm.workShopId" placeholder="请选择" style="width: 150px;" clearable>--> <!-- <el-select v-model="dataForm.workShopId" placeholder="请选择" style="width: 150px;" clearable>-->
<!-- <el-option--> <!-- <el-option-->
@ -60,7 +70,7 @@
<el-form-item label="角色" size="mini" prop="roleIdList"> <el-form-item label="角色" size="mini" prop="roleIdList">
<el-checkbox-group v-model="dataForm.roleIdList"> <el-checkbox-group v-model="dataForm.roleIdList">
<el-checkbox <el-checkbox
v-for="role in roleList"
v-for="role in filteredRoleList"
:key="role.roleId" :key="role.roleId"
:label="role.roleId">{{role.roleName}} :label="role.roleId">{{role.roleName}}
</el-checkbox> </el-checkbox>
@ -117,6 +127,7 @@ export default {
roleIdList: [], roleIdList: [],
status: 1, status: 1,
site: '', site: '',
type: '',
userDisplay: '', userDisplay: '',
workShopId:'', workShopId:'',
supplierNo: '', supplierNo: '',
@ -140,6 +151,11 @@ export default {
}, },
workShopList:[], workShopList:[],
siteOptions: [], siteOptions: [],
typeOptions: [
{ label: '员工', value: 'EMPLOYEE' },
{ label: '供应商', value: 'SUPPLIER' },
{ label: '客户', value: 'CUSTOMER' }
],
showSupplierPicker: false, showSupplierPicker: false,
} }
}, },
@ -154,6 +170,41 @@ export default {
this.dataForm.supplierNo = '' this.dataForm.supplierNo = ''
} }
this.showSupplierPicker = hasSupplier this.showSupplierPicker = hasSupplier
},
// 切换类型时,移除不在当前类型可选范围内的已选角色;选供应商时默认勾选“供应商”角色
'dataForm.type'() {
const visibleIds = this.filteredRoleList.map(r => r.roleId)
let selected = Array.isArray(this.dataForm.roleIdList) ? this.dataForm.roleIdList.filter(id => visibleIds.includes(id)) : []
if (this.dataForm.type === 'SUPPLIER') {
// 默认将供应商角色选上
visibleIds.forEach(id => {
if (!selected.includes(id)) {
selected.push(id)
}
})
}
this.dataForm.roleIdList = selected
}
},
computed: {
// 根据“类型”过滤可选角色:员工不显示供应商/客户角色,供应商只显示供应商角色,客户只显示客户角色
filteredRoleList() {
const type = this.dataForm.type
const isSupplierRole = (role) => role.roleName && role.roleName.indexOf('供应商') !== -1
const isCustomerRole = (role) => role.roleName && role.roleName.indexOf('客户') !== -1
return this.roleList.filter(role => {
if (type === 'SUPPLIER') {
return isSupplierRole(role)
}
if (type === 'CUSTOMER') {
return isCustomerRole(role)
}
if (type === 'EMPLOYEE') {
return !isSupplierRole(role) && !isCustomerRole(role)
}
// 未选择类型时展示全部角色
return true
})
} }
}, },
methods: { methods: {
@ -219,9 +270,10 @@ export default {
init(id) { init(id) {
this.dataForm.id = id || 0 this.dataForm.id = id || 0
// 新增用户时,工厂默认设置为 1
// 新增用户时,工厂默认设置为 1,类型默认为员工
if (!id) { if (!id) {
this.dataForm.site = '1' this.dataForm.site = '1'
this.dataForm.type = 'EMPLOYEE'
} }
this.loadSiteOptions() this.loadSiteOptions()
this.getLanguageList(); this.getLanguageList();
@ -252,6 +304,7 @@ export default {
this.dataForm.status = data.user.status this.dataForm.status = data.user.status
this.dataForm.languageDefault = data.user.languageDefault this.dataForm.languageDefault = data.user.languageDefault
this.dataForm.site = data.user.site == null ? '' : data.user.site.toString() this.dataForm.site = data.user.site == null ? '' : data.user.site.toString()
this.dataForm.type = data.user.type == null ? '' : data.user.type
this.dataForm.userDisplay = data.user.userDisplay this.dataForm.userDisplay = data.user.userDisplay
this.dataForm.workShopId = data.user.workShopId this.dataForm.workShopId = data.user.workShopId
this.dataForm.supplierNo = data.user.supplierNo this.dataForm.supplierNo = data.user.supplierNo
@ -271,6 +324,10 @@ export default {
this.$message.warning('请选择工厂') this.$message.warning('请选择工厂')
return return
} }
if (!this.dataForm.type) {
this.$message.warning('请选择类型')
return
}
if (!this.dataForm.userDisplay || !String(this.dataForm.userDisplay).trim()) { if (!this.dataForm.userDisplay || !String(this.dataForm.userDisplay).trim()) {
this.$message.warning('用户名不能为空') this.$message.warning('用户名不能为空')
return return
@ -295,6 +352,7 @@ export default {
'roleIdList': this.dataForm.roleIdList, 'roleIdList': this.dataForm.roleIdList,
'languageDefault': this.dataForm.languageDefault, 'languageDefault': this.dataForm.languageDefault,
'site': this.dataForm.site, 'site': this.dataForm.site,
'type': this.dataForm.type,
'userDisplay': this.dataForm.userDisplay, 'userDisplay': this.dataForm.userDisplay,
'workShopId': this.dataForm.workShopId, 'workShopId': this.dataForm.workShopId,
'supplierNo': this.dataForm.supplierNo, 'supplierNo': this.dataForm.supplierNo,
@ -321,6 +379,7 @@ export default {
this.dataForm.roleIdList = [] this.dataForm.roleIdList = []
this.dataForm.status = 1 this.dataForm.status = 1
this.dataForm.site = '' this.dataForm.site = ''
this.dataForm.type = ''
this.dataForm.userDisplay = '' this.dataForm.userDisplay = ''
} }
}, },

35
src/views/modules/sys/user.vue

@ -7,6 +7,16 @@
<el-form-item> <el-form-item>
<el-input v-model="dataForm.userDisplay" placeholder="用户名" clearable></el-input> <el-input v-model="dataForm.userDisplay" placeholder="用户名" clearable></el-input>
</el-form-item> </el-form-item>
<el-form-item>
<el-select v-model="dataForm.type" placeholder="类型" clearable style="width: 150px;">
<el-option
v-for="i in typeOptions"
:key="i.value"
:label="i.label"
:value="i.value">
</el-option>
</el-select>
</el-form-item>
<el-form-item> <el-form-item>
<el-button @click="getDataList" type="primary">{{ buttons.search || '查询' }}</el-button> <el-button @click="getDataList" type="primary">{{ buttons.search || '查询' }}</el-button>
<el-button v-if="isAuth('sys:user:save')" type="primary" @click="addOrUpdateHandle()">{{ buttons.add || '新增' }}</el-button> <el-button v-if="isAuth('sys:user:save')" type="primary" @click="addOrUpdateHandle()">{{ buttons.add || '新增' }}</el-button>
@ -40,6 +50,15 @@
align="center" align="center"
:label="buttons.userDisplay||'用户名'"> :label="buttons.userDisplay||'用户名'">
</el-table-column> </el-table-column>
<el-table-column
prop="type"
header-align="center"
align="center"
:label="'类型'">
<template slot-scope="scope">
{{ typeLabel(scope.row.type) }}
</template>
</el-table-column>
<el-table-column <el-table-column
prop="email" prop="email"
header-align="center" header-align="center"
@ -692,8 +711,14 @@ export default {
}, },
dataForm: { dataForm: {
userName: '', userName: '',
userDisplay: ''
userDisplay: '',
type: ''
}, },
typeOptions: [
{ label: '员工', value: 'EMPLOYEE' },
{ label: '供应商', value: 'SUPPLIER' },
{ label: '客户', value: 'CUSTOMER' }
],
columnList: [ columnList: [
{ {
userId: this.$store.state.user.name, userId: this.$store.state.user.name,
@ -877,6 +902,11 @@ export default {
} }
}, },
methods: { methods: {
// 类型编码转中文展示
typeLabel (val) {
const item = this.typeOptions.find(t => t.value === val)
return item ? item.label : ''
},
// 校验用户是否收藏 // 校验用户是否收藏
favoriteIsOk () { favoriteIsOk () {
let userFavorite = { let userFavorite = {
@ -1530,7 +1560,8 @@ export default {
'page': this.pageIndex, 'page': this.pageIndex,
'limit': this.pageSize, 'limit': this.pageSize,
'username': this.dataForm.userName, 'username': this.dataForm.userName,
'userDisplay': this.dataForm.userDisplay
'userDisplay': this.dataForm.userDisplay,
'type': this.dataForm.type
}) })
}).then(({data}) => { }).then(({data}) => {
if (data && data.code === 0) { if (data && data.code === 0) {

Loading…
Cancel
Save