123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138 |
- <template>
- <el-form label-position="left" label-width="100px">
- <!-- 开发模式下显示该字段 -->
- <el-form-item v-if="is_dev" :label="$t('pages.role.is_default')">
- <el-radio-group v-model="form.is_default">
- <el-radio label="0">{{ $t('common.yes') }}</el-radio>
- <el-radio label="1">{{ $t('common.no') }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item :label="$t('pages.role.is_admin_role')">
- <el-radio-group v-model="form.is_admin_role">
- <el-radio label="1">{{ $t('common.yes') }}</el-radio>
- <el-radio label="0">{{ $t('common.no') }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item :label="$t('pages.role.name')">
- <el-input v-model="form.name" :placeholder="$t('pages.role.namePh')"></el-input>
- </el-form-item>
- <el-form-item :label="$t('pages.role.code')">
- <el-input v-model="form.code" :placeholder="$t('pages.role.codePh')"></el-input>
- </el-form-item>
- <el-form-item :label="$t('pages.role.is_use')">
- <el-radio-group v-model="form.is_use">
- <el-radio label="0">{{ $t('common.is_use_abled') }}</el-radio>
- <el-radio label="1">{{ $t('common.is_use_disabled') }}</el-radio>
- </el-radio-group>
- </el-form-item>
- <el-form-item :label="$t('pages.role.brief')">
- <el-input v-model="form.brief" type="textarea" :rows="3"></el-input>
- </el-form-item>
- <el-form-item :label="$t('pages.role.menu')">
- <template v-if="form.is_admin_role === '1'">
- <el-tree ref="roleTree" :data="getMenus()" node-key="code" default-expand-all show-checkbox @check-change="seletNode">
- <template #default="{ data }">
- <span>{{ data.name }}</span>
- </template>
- </el-tree>
- </template>
- <template v-else-if="form.is_admin_role === '0'">
- <el-tree ref="roleTree" :data="getUserMenus()" node-key="code" default-expand-all show-checkbox @check-change="seletNode">
- <template #default="{ data }">
- <span>{{ data.name }}</span>
- </template>
- </el-tree>
- </template>
- <template v-else>
- 请先选择是否是管理员!
- </template>
- </el-form-item>
- <el-row justify="center" style="text-align: center">
- <el-col :span="6">
- <el-button @click="onSubmit" type="primary">{{ $t('common.save') }}</el-button>
- </el-col>
- </el-row>
- </el-form>
- </template>
- <script setup>
- const form = inject('form')
- const menuList = inject('menuList')
- const userMenusList = inject('userMenusList')
- const onSubmit = inject('onSubmit')
- const roleTree = ref()
- const is_dev = import.meta.env.MODE === 'development'
- const getMenus = () => {
- const list = toRaw(menuList.value)
- const result = dealMenu(list)
- return result
- }
- const getUserMenus = () => {
- const list = toRaw(userMenusList.value)
- const result = dealMenu(list)
- return result
- }
- onMounted(() => {
- const treeSelected = toRaw(form.value.menu)
- for (const key of treeSelected) {
- roleTree.value.setChecked(key, true)
- }
- const selected = roleTree.value.getCheckedKeys()
- if (!selected.includes('home')) roleTree.value.setChecked('home', true)
- })
- /**
- * 处理目录:将目录,目录,子页面,权限统一转成 {name,code}形式,code为唯一值
- * 目录,目录,子页面:
- * route_name是唯一的,所以使用route_name作为code
- * 权限:
- * code并不是唯一,但是加上route_name就是唯一的
- * @param {Array} list 目录列表
- * @param {Array} route_names 将上级的route_name放入此数组中,在转为权限数据时,拼接成code
- */
- const dealMenu = (list, route_names = []) => {
- const result = []
- for (const i of list) {
- const { name, config = [], children = [], route_name } = i
- const thisRouteNameArr = [...route_names, route_name]
- const obj = { name, code: thisRouteNameArr.join('.') }
- if (route_name === 'home') obj.disabled = true
- const nextList = []
- // 先处理该页面配置
- if (config && config.length >= 0) {
- // 如果有配置: 目录,子页面两种情况,都统一处理
- for (const c of config) {
- const codeRouteNameArr = [...thisRouteNameArr]
- codeRouteNameArr.push(c.code)
- const cobj = { name: c.zh, code: codeRouteNameArr.join('.') }
- nextList.push(cobj)
- }
- }
- // 再处理目录/子页面
- if (children && children.length > 0) {
- const nextRouteNames = [...thisRouteNameArr]
- const midResult = dealMenu(children, nextRouteNames)
- nextList.push(...midResult)
- }
- obj.children = nextList
- result.push(obj)
- }
- return result
- }
- /**
- * 选择节点
- */
- const seletNode = () => {
- if (!form.value.menu) {
- form.value.menu = []
- }
- const selected = roleTree.value.getCheckedNodes(false, true)
- const result = []
- for (const s of selected) {
- const rs = toRaw(s)
- result.push(rs.code)
- }
- form.value.menu = result
- }
- </script>
- <style scoped></style>
|