11 changed files with 609 additions and 121 deletions
Binary file not shown.
@ -0,0 +1,297 @@ |
|||||
|
<template> |
||||
|
<el-dialog |
||||
|
v-el-draggable-dialog |
||||
|
width="800px" |
||||
|
:visible="showDialog" |
||||
|
:title="$t('AbpIdentity.ManageClaim')" |
||||
|
custom-class="modal-form" |
||||
|
:show-close="false" |
||||
|
:close-on-click-modal="true" |
||||
|
:close-on-press-escape="true" |
||||
|
@close="onFormClosed(false)" |
||||
|
> |
||||
|
<el-form |
||||
|
ref="roleClaimForm" |
||||
|
:model="editRoleClaim" |
||||
|
label-width="120px" |
||||
|
:rules="roleClaimRules" |
||||
|
> |
||||
|
<el-form-item |
||||
|
prop="claimType" |
||||
|
:label="$t('AbpIdentity.DisplayName:ClaimType')" |
||||
|
> |
||||
|
<el-select |
||||
|
v-model="editRoleClaim.claimType" |
||||
|
style="width: 100%" |
||||
|
@change="onClaimTypeChanged" |
||||
|
> |
||||
|
<el-option |
||||
|
v-for="claim in claimTypes" |
||||
|
:key="claim.id" |
||||
|
:label="claim.name" |
||||
|
:value="claim.name" |
||||
|
/> |
||||
|
</el-select> |
||||
|
</el-form-item> |
||||
|
<el-form-item |
||||
|
prop="claimValue" |
||||
|
:label="$t('AbpIdentity.DisplayName:ClaimValue')" |
||||
|
> |
||||
|
<el-input |
||||
|
v-if="hasStringValueType(editRoleClaim.claimType)" |
||||
|
v-model="editRoleClaim.claimValue" |
||||
|
type="text" |
||||
|
/> |
||||
|
<el-input |
||||
|
v-else-if="hasIntegerValueType(editRoleClaim.claimType)" |
||||
|
v-model="editRoleClaim.claimValue" |
||||
|
type="number" |
||||
|
/> |
||||
|
<el-switch |
||||
|
v-else-if="hasBooleanValueType(editRoleClaim.claimType)" |
||||
|
v-model="editRoleClaim.claimValue" |
||||
|
/> |
||||
|
<el-date-picker |
||||
|
v-else-if="hasDateTimeValueType(editRoleClaim.claimType)" |
||||
|
v-model="editRoleClaim.claimValue" |
||||
|
type="datetime" |
||||
|
style="width: 100%" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item |
||||
|
style="text-align: center;" |
||||
|
label-width="0px" |
||||
|
> |
||||
|
<el-button |
||||
|
type="primary" |
||||
|
style="width:180px" |
||||
|
@click="onSave" |
||||
|
> |
||||
|
{{ $t('AbpIdentity.AddClaim') }} |
||||
|
</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
<el-table |
||||
|
row-key="id" |
||||
|
:data="roleClaims" |
||||
|
border |
||||
|
fit |
||||
|
highlight-current-row |
||||
|
style="width: 100%;" |
||||
|
> |
||||
|
<el-table-column |
||||
|
:label="$t('AbpIdentity.DisplayName:ClaimType')" |
||||
|
prop="claimType" |
||||
|
sortable |
||||
|
width="150px" |
||||
|
align="center" |
||||
|
> |
||||
|
<template slot-scope="{row}"> |
||||
|
<span>{{ row.claimType }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
:label="$t('AbpIdentity.DisplayName:ClaimValue')" |
||||
|
prop="claimValue" |
||||
|
sortable |
||||
|
min-width="100%" |
||||
|
align="center" |
||||
|
> |
||||
|
<template slot-scope="{row}"> |
||||
|
<span>{{ claimValue(row.claimType, row.claimValue) }}</span> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
<el-table-column |
||||
|
:label="$t('operaActions')" |
||||
|
align="center" |
||||
|
width="150px" |
||||
|
> |
||||
|
<template slot-scope="{row}"> |
||||
|
<el-button |
||||
|
:disabled="!checkPermission(['AbpIdentity.Roles.ManageClaims'])" |
||||
|
size="mini" |
||||
|
type="danger" |
||||
|
@click="handleDeleteUserClaim(row)" |
||||
|
> |
||||
|
{{ $t('AbpIdentity.DeleteClaim') }} |
||||
|
</el-button> |
||||
|
</template> |
||||
|
</el-table-column> |
||||
|
</el-table> |
||||
|
</el-dialog> |
||||
|
</template> |
||||
|
|
||||
|
<script lang="ts"> |
||||
|
import { dateFormat } from '@/utils/index' |
||||
|
import { checkPermission } from '@/utils/permission' |
||||
|
import { Component, Vue, Prop, Watch } from 'vue-property-decorator' |
||||
|
import RoleApiService, { RoleClaim, RoleClaimCreateOrUpdate, RoleClaimDelete } from '@/api/roles' |
||||
|
import ClaimTypeApiService, { IdentityClaimType, IdentityClaimValueType } from '@/api/cliam-type' |
||||
|
import { Form } from 'element-ui' |
||||
|
|
||||
|
@Component({ |
||||
|
name: 'RoleClaimCreateOrUpdateForm', |
||||
|
methods: { |
||||
|
checkPermission |
||||
|
} |
||||
|
}) |
||||
|
export default class UserClaimCreateOrUpdateForm extends Vue { |
||||
|
@Prop({ default: '' }) |
||||
|
private roleId!: string |
||||
|
|
||||
|
@Prop({ default: false }) |
||||
|
private showDialog!: boolean |
||||
|
|
||||
|
private editRoleClaim = new RoleClaimCreateOrUpdate() |
||||
|
private roleClaims = new Array<RoleClaim>() |
||||
|
private claimTypes = new Array<IdentityClaimType>() |
||||
|
|
||||
|
private roleClaimRules = {} |
||||
|
|
||||
|
get cliamType() { |
||||
|
return (claimName: string) => { |
||||
|
const claimIndex = this.claimTypes.findIndex(cliam => cliam.name === claimName) |
||||
|
if (claimIndex >= 0) { |
||||
|
return this.claimTypes[claimIndex].valueType |
||||
|
} |
||||
|
return IdentityClaimValueType.String |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
get claimValue() { |
||||
|
return (type: string, value: string) => { |
||||
|
const valueType = this.cliamType(type) |
||||
|
switch (valueType) { |
||||
|
case IdentityClaimValueType.Int : |
||||
|
case IdentityClaimValueType.String : |
||||
|
return value |
||||
|
case IdentityClaimValueType.Boolean : |
||||
|
return value.toLowerCase() === 'true' |
||||
|
case IdentityClaimValueType.DateTime : |
||||
|
return dateFormat(new Date(value), 'YYYY-mm-dd HH:MM:SS') |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
get hasStringValueType() { |
||||
|
return (claimName: string) => { |
||||
|
return this.cliamType(claimName) === IdentityClaimValueType.String |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
get hasBooleanValueType() { |
||||
|
return (claimName: string) => { |
||||
|
return this.cliamType(claimName) === IdentityClaimValueType.Boolean |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
get hasDateTimeValueType() { |
||||
|
return (claimName: string) => { |
||||
|
return this.cliamType(claimName) === IdentityClaimValueType.DateTime |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
get hasIntegerValueType() { |
||||
|
return (claimName: string) => { |
||||
|
return this.cliamType(claimName) === IdentityClaimValueType.Int |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
@Watch('roleId') |
||||
|
private onUserIdChanged() { |
||||
|
this.handleGetRoleClaims() |
||||
|
} |
||||
|
|
||||
|
@Watch('showDialog', { immediate: true }) |
||||
|
private onShowDialogChanged() { |
||||
|
this.handleGetRoleClaims() |
||||
|
} |
||||
|
|
||||
|
mounted() { |
||||
|
this.handleGetClaimTypes() |
||||
|
this.handleGetRoleClaims() |
||||
|
this.roleClaimRules = { |
||||
|
claimType: [ |
||||
|
{ required: true, message: this.l('pleaseSelectBy', { key: this.l('AbpIdentity.DisplayName:ClaimType') }), trigger: 'blur' } |
||||
|
], |
||||
|
claimValue: [ |
||||
|
{ required: true, message: this.l('pleaseInputBy', { key: this.l('AbpIdentity.DisplayName:ClaimValue') }), trigger: 'blur' } |
||||
|
] |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private handleGetClaimTypes() { |
||||
|
ClaimTypeApiService.getActivedClaimTypes().then(res => { |
||||
|
this.claimTypes = res.items |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
private handleGetRoleClaims() { |
||||
|
if (this.showDialog && this.roleId) { |
||||
|
RoleApiService.getRoleClaims(this.roleId).then(res => { |
||||
|
this.roleClaims = res.items |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private handleDeleteUserClaim(claim: RoleClaim) { |
||||
|
this.$confirm(this.l('AbpIdentity.DeleteClaim'), |
||||
|
this.l('AbpUi.AreYouSure'), { |
||||
|
callback: (action) => { |
||||
|
if (action === 'confirm') { |
||||
|
const deleteClaim = new RoleClaimDelete() |
||||
|
deleteClaim.claimType = claim.claimType |
||||
|
deleteClaim.claimValue = claim.claimValue |
||||
|
RoleApiService.deleteRoleClaim(this.roleId, deleteClaim).then(() => { |
||||
|
this.$message.success(this.l('global.successful')) |
||||
|
const claimIndex = this.roleClaims.findIndex(uc => uc.id === claim.id) |
||||
|
this.roleClaims.splice(claimIndex, 1) |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
// TODO: 可以简化为一个组件,通过组件来实现用户/客户端等的声明类型 |
||||
|
private onClaimTypeChanged() { |
||||
|
const valueType = this.cliamType(this.editRoleClaim.claimType) |
||||
|
switch (valueType) { |
||||
|
case IdentityClaimValueType.Int : |
||||
|
this.editRoleClaim.claimValue = '0' |
||||
|
break |
||||
|
case IdentityClaimValueType.String : |
||||
|
this.editRoleClaim.claimValue = '' |
||||
|
break |
||||
|
case IdentityClaimValueType.Boolean : |
||||
|
this.editRoleClaim.claimValue = 'false' |
||||
|
break |
||||
|
case IdentityClaimValueType.DateTime : |
||||
|
this.editRoleClaim.claimValue = '' |
||||
|
break |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private onSave() { |
||||
|
const roleClaimForm = this.$refs.roleClaimForm as Form |
||||
|
roleClaimForm.validate(valid => { |
||||
|
if (valid) { |
||||
|
RoleApiService.addRoleClaim(this.roleId, this.editRoleClaim).then(() => { |
||||
|
this.$message.success(this.$t('global.successful').toString()) |
||||
|
roleClaimForm.resetFields() |
||||
|
this.handleGetRoleClaims() |
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
|
||||
|
private onFormClosed(changed: boolean) { |
||||
|
const roleClaimForm = this.$refs.roleClaimForm as Form |
||||
|
roleClaimForm.resetFields() |
||||
|
this.$emit('closed', changed) |
||||
|
} |
||||
|
|
||||
|
private l(name: string, values?: any[] | { [key: string]: any }) { |
||||
|
return this.$t(name, values).toString() |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
@ -0,0 +1,107 @@ |
|||||
|
<template> |
||||
|
<el-dialog |
||||
|
v-el-draggable-dialog |
||||
|
width="800px" |
||||
|
:visible="showDialog" |
||||
|
:title="$t('AbpIdentity.NewRole')" |
||||
|
custom-class="modal-form" |
||||
|
:show-close="false" |
||||
|
:close-on-click-modal="false" |
||||
|
:close-on-press-escape="false" |
||||
|
@close="onFormClosed(false)" |
||||
|
> |
||||
|
<el-form |
||||
|
ref="roleCreateForm" |
||||
|
label-width="120px" |
||||
|
:model="createRole" |
||||
|
> |
||||
|
<el-form-item |
||||
|
prop="name" |
||||
|
:label="$t('AbpIdentity.RoleName')" |
||||
|
> |
||||
|
<el-input |
||||
|
v-model="createRole.name" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item |
||||
|
prop="isDefault" |
||||
|
:label="$t('AbpIdentity.DisplayName:IsDefault')" |
||||
|
> |
||||
|
<el-switch |
||||
|
v-model="createRole.isDefault" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item |
||||
|
prop="isPublic" |
||||
|
:label="$t('AbpIdentity.DisplayName:IsPublic')" |
||||
|
> |
||||
|
<el-switch |
||||
|
v-model="createRole.isPublic" |
||||
|
/> |
||||
|
</el-form-item> |
||||
|
<el-form-item> |
||||
|
<el-button |
||||
|
class="cancel" |
||||
|
style="width:100px" |
||||
|
@click="onFormClosed(false)" |
||||
|
> |
||||
|
{{ $t('global.cancel') }} |
||||
|
</el-button> |
||||
|
<el-button |
||||
|
class="confirm" |
||||
|
type="primary" |
||||
|
style="width:100px" |
||||
|
@click="onSave" |
||||
|
> |
||||
|
{{ $t('global.confirm') }} |
||||
|
</el-button> |
||||
|
</el-form-item> |
||||
|
</el-form> |
||||
|
</el-dialog> |
||||
|
</template> |
||||
|
|
||||
|
<script lang="ts"> |
||||
|
import { Form } from 'element-ui' |
||||
|
import { Component, Vue, Prop } from 'vue-property-decorator' |
||||
|
import RoleApiService, { CreateRoleDto } from '@/api/roles' |
||||
|
|
||||
|
@Component({ |
||||
|
name: 'RoleCreateForm' |
||||
|
}) |
||||
|
export default class RoleCreateForm extends Vue { |
||||
|
@Prop({ default: false }) |
||||
|
private showDialog!: boolean |
||||
|
|
||||
|
private createRole = new CreateRoleDto() |
||||
|
|
||||
|
private onFormClosed(changed: boolean) { |
||||
|
const roleCreateForm = this.$refs.roleCreateForm as Form |
||||
|
roleCreateForm.resetFields() |
||||
|
this.$emit('closed', changed) |
||||
|
} |
||||
|
|
||||
|
private onSave() { |
||||
|
const roleCreateForm = this.$refs.roleCreateForm as Form |
||||
|
roleCreateForm.validate(valid => { |
||||
|
if (valid) { |
||||
|
RoleApiService.createRole(this.createRole).then(res => { |
||||
|
const message = this.$t('roles.createRoleSuccess', { name: res.name }).toString() |
||||
|
this.$message.success(message) |
||||
|
this.onFormClosed(true) |
||||
|
}) |
||||
|
} |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
</script> |
||||
|
|
||||
|
<style scoped> |
||||
|
.confirm { |
||||
|
position: absolute; |
||||
|
right: 10px; |
||||
|
} |
||||
|
.cancel { |
||||
|
position: absolute; |
||||
|
right: 120px; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue