123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391 |
- <template>
- <div>
- <cl-crud ref="crud" @load="onLoad" :on-refresh="onRefresh">
- <el-row type="flex">
- <cl-refresh-btn />
- <cl-add-btn />
- </el-row>
- <cl-table ref="table" v-bind="table" @row-click="onRowClick">
- <!-- 名称 -->
- <template #column-name="{ scope }">
- <span>{{ scope.row.name }}</span>
- <el-tag
- size="mini"
- effect="dark"
- type="danger"
- v-if="!scope.row.isShow"
- style="margin-left: 10px"
- >隐藏</el-tag
- >
- </template>
- <!-- 图标 -->
- <template #column-icon="{ scope }">
- <icon-svg :name="scope.row.icon" size="16px" style="margin-top: 5px"></icon-svg>
- </template>
- <!-- 权限 -->
- <template #column-perms="{ scope }">
- <el-tag
- v-for="(item, index) in scope.row.permList"
- :key="index"
- size="mini"
- effect="dark"
- style="margin: 2px; letter-spacing: 0.5px"
- >{{ item }}</el-tag
- >
- </template>
- <!-- 路由 -->
- <template #column-router="{ scope }">
- <el-link type="primary" :href="scope.row.router" v-if="scope.row.type == 1">{{
- scope.row.router
- }}</el-link>
- <span v-else>{{ scope.row.router }}</span>
- </template>
- <!-- 路由缓存 -->
- <template #column-keepAlive="{ scope }">
- <template v-if="scope.row.type == 1">
- <i class="el-icon-check" v-if="scope.row.keepAlive"></i>
- <i class="el-icon-close" v-else></i>
- </template>
- </template>
- <!-- 行新增 -->
- <template #slot-add="{ scope }">
- <el-button
- type="text"
- size="mini"
- @click="upsertAppend(scope.row)"
- v-if="scope.row.type != 2"
- >新增</el-button
- >
- </template>
- </cl-table>
- <!-- 编辑 -->
- <cl-upsert ref="upsert" v-bind="upsert" @open="onUpsertOpen"></cl-upsert>
- </cl-crud>
- </div>
- </template>
- <script>
- import { deepTree } from "cl-admin/utils";
- export default {
- data() {
- return {
- table: {
- props: {
- "row-key": "id"
- },
- "context-menu": [
- (row) => {
- return {
- label: "新增",
- hidden: row.type == 2,
- callback: (item, done) => {
- this.upsertAppend(row);
- done();
- }
- };
- },
- "update",
- "delete",
- (row) => {
- return {
- label: "权限",
- hidden: row.type != 1,
- callback: (item, done) => {
- this.setPermission(row);
- done();
- }
- };
- }
- ],
- columns: [
- {
- prop: "name",
- label: "名称",
- align: "left",
- width: 200
- },
- {
- prop: "icon",
- label: "图标",
- align: "center",
- width: 80
- },
- {
- prop: "type",
- label: "类型",
- align: "center",
- width: 100,
- dict: [
- {
- label: "目录",
- value: 0
- },
- {
- label: "菜单",
- value: 1
- },
- {
- label: "权限",
- value: 2
- }
- ]
- },
- {
- prop: "router",
- label: "节点路由",
- align: "center",
- "min-width": 160
- },
- {
- prop: "keepAlive",
- label: "路由缓存",
- align: "center",
- width: 100
- },
- {
- prop: "viewPath",
- label: "文件路径",
- align: "center",
- "min-width": 200,
- "show-overflow-tooltip": true
- },
- {
- prop: "perms",
- label: "权限",
- "header-align": "center",
- "min-width": 300
- },
- {
- prop: "orderNum",
- label: "排序号",
- align: "center",
- width: 90
- },
- {
- prop: "updateTime",
- label: "更新时间",
- align: "center",
- sortable: "custom",
- width: 150
- },
- {
- label: "操作",
- align: "center",
- type: "op",
- buttons: ["slot-add", "edit", "delete"]
- }
- ]
- },
- upsert: {
- props: {
- width: "800px"
- },
- items: [
- {
- prop: "type",
- value: 0,
- label: "节点类型",
- span: 24,
- component: {
- name: "el-radio-group",
- options: [
- {
- label: "目录",
- value: 0
- },
- {
- label: "菜单",
- value: 1
- },
- {
- label: "权限",
- value: 2
- }
- ],
- on: {
- change: (index) => {
- this.changeType(index);
- }
- }
- }
- },
- {
- prop: "name",
- label: "节点名称",
- span: 24,
- component: {
- name: "el-input",
- attrs: {
- placeholder: "请输入节点名称"
- }
- },
- rules: {
- required: true,
- message: "名称不能为空"
- }
- },
- {
- prop: "parentId",
- label: "上级节点",
- span: 24,
- component: {
- name: "cl-menu-tree"
- }
- },
- {
- prop: "router",
- label: "节点路由",
- span: 24,
- hidden: true,
- component: {
- name: "el-input",
- attrs: {
- placeholder: "请输入节点路由"
- }
- }
- },
- {
- prop: "keepAlive",
- value: true,
- label: "路由缓存",
- span: 24,
- component: {
- name: "el-radio-group",
- options: [
- {
- label: "开启",
- value: true
- },
- {
- label: "关闭",
- value: false
- }
- ]
- }
- },
- {
- prop: "isShow",
- label: "是否显示",
- span: 24,
- value: true,
- hidden: false,
- flex: false,
- component: {
- name: "el-switch"
- }
- },
- {
- prop: "viewPath",
- label: "文件路径",
- span: 24,
- hidden: true,
- component: {
- name: "cl-menu-file"
- }
- },
- {
- prop: "icon",
- label: "节点图标",
- span: 24,
- component: {
- name: "cl-menu-icons"
- }
- },
- {
- prop: "orderNum",
- label: "排序号",
- span: 24,
- component: {
- name: "el-input-number",
- props: {
- placeholder: "请填写排序号",
- min: 0,
- max: 99,
- "controls-position": "right"
- }
- }
- },
- {
- prop: "perms",
- label: "权限",
- span: 24,
- hidden: true,
- component: {
- name: "cl-menu-perms"
- }
- }
- ]
- }
- };
- },
- methods: {
- onLoad({ ctx, app }) {
- ctx.service(this.$service.system.menu)
- .set("dict", { api: { page: "list" } })
- .done();
- app.refresh();
- },
- onRefresh(params, { render }) {
- this.$service.system.menu.list().then((list) => {
- list.map((e) => {
- e.permList = e.perms ? e.perms.split(",") : [];
- });
- render(deepTree(list));
- });
- },
- onRowClick(row, column) {
- if (column.property && row.children) {
- this.$refs["table"].toggleRowExpansion(row);
- }
- },
- onUpsertOpen(isEdit, data) {
- this.changeType(data ? data.type : 0);
- },
- upsertAppend({ type, id }) {
- this.$refs["crud"].rowAppend({
- parentId: id,
- type: type + 1
- });
- },
- changeType(index) {
- const { toggleItem } = this.$refs["upsert"];
- toggleItem("router", index == 1);
- toggleItem("viewPath", index == 1);
- toggleItem("keepAlive", index == 1);
- toggleItem("icon", index != 2);
- toggleItem("perms", index == 2);
- toggleItem("isShow", index != 2);
- },
- setPermission({ id }) {
- this.$refs["crud"].rowAppend({
- parentId: id,
- type: 2
- });
- },
- toUrl(url) {
- this.$router.push(url);
- }
- }
- };
- </script>
|