gerson
2024-09-08 18aeed6ed17a3aeacc157e0019159957aeaec556
意向分组;编辑时更新为未发布
已修改11个文件
427 ■■■■ 文件已修改
src/api/supervisorAdmin/index.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/supervisorAdmin/supervisorGroup.ts 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tree/leftTreeByMgr.ts 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/tree/leftTreeByMgr.vue 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/routerView/iframes.vue 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/types/mitt.d.ts 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/util.ts 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/login/component/account.vue 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/yw/lowCode/sqlAmis/SqlAmis.vue 305 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/yw/lowCode/sqlAmis/edit/SqlAmisEdit.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/yw/lowCode/sqlAmis/optDlg/OptDlg.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/supervisorAdmin/index.ts
@@ -80,11 +80,12 @@
/**
 * @summary description
 */
export const updatePublishStatus = async (params, req: any = request) => {
export const updatePublishStatus = async (params,extraData: ExtraConfig = {}, req: any = request) => {
    return req({
        url: '/admin/supervisor/update_amis_supervisor_publish',
        method: 'POST',
        data: params,
        ...extraData
    });
};
src/api/supervisorAdmin/supervisorGroup.ts
@@ -0,0 +1,44 @@
import request from '/@/utils/request';
/**
 * @summary description
 */
export const getSupervisorGroupList = async (req: any = request) => {
    return req({
        url: '/admin/supervisor/get_supervisor_group_list',
        method: 'POST',
    });
};
/**
 * @summary description
 */
export const deleteSupervisorGroup = async (params, req: any = request) => {
    return req({
        url: '/admin/supervisor/delete_supervisor_group',
        method: 'POST',
        data: params,
    });
};
/**
 * @summary description
 */
export const updateSupervisorGroup = async (params, req: any = request) => {
    return req({
        url: '/admin/supervisor/update_supervisor_group',
        method: 'POST',
        data: params,
    });
};
/**
 * @summary description
 */
export const addSupervisorGroup = async (params, req: any = request) => {
    return req({
        url: '/admin/supervisor/add_supervisor_group',
        method: 'POST',
        data: params,
    });
};
src/components/tree/leftTreeByMgr.ts
@@ -34,9 +34,9 @@
        type: Object,
        default: () => {
            return {
                children: 'Children',
                label: 'Name',
                id: 'ID',
                children: 'children',
                label: 'title',
                id: 'id',
            };
        },
    },
@@ -45,9 +45,9 @@
        type: Object,
        default: () => {
            return {
                children: 'Children',
                label: 'Name',
                id: 'ID',
                children: 'children',
                label: 'title',
                id: 'id',
            };
        },
    },
src/components/tree/leftTreeByMgr.vue
@@ -113,8 +113,8 @@
                :draggable="draggable || treeDraggable"
            >
                <template #default="{ node, data }">
                    <span class="custom-tree-node">
                        <span class="flex items-center" style="width: calc(100% - 20px)">
                    <span class="custom-tree-node overflow-hidden">
                        <span class="flex items-center flex-auto" >
                            <template v-if="showNodeIcon">
                                <SvgIcon v-if="nodeIcon" :name="nodeIcon(node, data)" :size="14" color="rgb(64,158,255)"> </SvgIcon>
                                <SvgIcon
@@ -136,7 +136,7 @@
                                </div>
                            </el-tooltip>
                        </span>
                        <span class="flex items-center">
                        <span class="flex items-center flex-0">
                            <slot name="listNodeSuffix" :data="data" :node="node"></slot>
                            <el-dropdown v-if="typeof showMoreOperate === 'function' ? showMoreOperate(node, data) : showMoreOperate">
@@ -170,12 +170,7 @@
                                    </el-dropdown-menu>
                                </template>
                            </el-dropdown>
                            <SvgIcon
                                v-if="suffixIcon"
                                :size="18"
                                :name="suffixIconFun(node, data).name"
                                :color="suffixIconFun(node, data).color"
                            ></SvgIcon>
                        </span>
                    </span>
                </template>
@@ -242,9 +237,7 @@
    flex: 1;
    display: flex;
    align-items: center;
    justify-content: space-between;
    font-size: 14px;
    width: calc(100% - 24px);
}
:deep(.el-tree-node__content) {
src/layout/routerView/iframes.vue
@@ -26,6 +26,7 @@
import { computed, watch, ref, nextTick } from 'vue';
import { useRoute } from 'vue-router';
import AmisPageOptDlg from '/@/views/project/yw/lowCode/sqlAmis/optDlg/OptDlg.vue';
import emitter from '/@/utils/mitt';
// 定义父组件传过来的值
const props = defineProps({
@@ -107,6 +108,12 @@
        window.frames[0].openOptAmisPageDlg = () => {
            amisPageShow.value = true;
        };
        window.frames[0].updatePublished = (id, published) => {
            emitter.emit('supervisor.publish', {
                id,
                published,
            });
        };
    }, 0);
};
src/types/mitt.d.ts
@@ -1,3 +1,5 @@
import type { SupervisorPublished } from '../views/project/yw/lowCode/sqlAmis/types';
/**
 * mitt 事件类型定义
 *
@@ -68,10 +70,15 @@
    };
    'fault.diagnosis.event.update': {
        ID?: string;
        OldCatalogID?:string;
        OldCatalogID?: string;
        CatalogID?: string;
    };
    'supervisor.publish': {
        id: string;
        published: SupervisorPublished;
    };
    //#endregion
};
src/utils/util.ts
@@ -168,9 +168,9 @@
export const convertListToTree = (
    data: any[],
    defaultProps = {
        ID: 'ID',
        Children: 'Children',
        ParentID: 'ParentID',
        ID: 'id',
        Children: 'children',
        ParentID: 'parent',
    }
) => {
    if (!data || data?.length === 0) return [];
@@ -210,7 +210,7 @@
    callback: (value: T, index?, array?, parent?) => any,
    parent: any = null,
    markParent = false,
    childrenKey = 'Children'
    childrenKey = 'children'
) => {
    if (!treeData || treeData.length === 0) return;
    if (!parent) parent = treeData;
src/views/login/component/account.vue
@@ -209,13 +209,14 @@
        const res = await PostLogin(params, {
            noAuth: true,
            loading: false,
        });
        Local.set(accessSessionKey,res.hswatersession)
        Local.set(accessSessionKey, res.hswatersession);
        await useUserInfo().setUserInfos({
            userName:ruleForm.value.account,
            phoneNumber:'',
            photo:profileMan
            userName: ruleForm.value.account,
            phoneNumber: '',
            photo: profileMan,
        }); //缓存用户信息
        state.loading.signIn = true;
        if (!themeConfig.value.isRequestRoutes) {
src/views/project/yw/lowCode/sqlAmis/SqlAmis.vue
@@ -1,5 +1,24 @@
<template>
    <HMContainer type="card" v-if="supervisorMgrShow">
    <AHMContainer type="card" v-if="supervisorMgrShow">
        <template #aside>
            <!-- 目录树 -->
            <LeftTreeByMgr
                v-loading="treeLoading"
                class="h100"
                ref="leftTreeRef"
                :treedata="listTreeData"
                title-name="分组列表"
                :show-more-operate="true"
                :show-add="true"
                :current-node-key="currentListID"
                :node-icon="() => 'ele-Document'"
                @click="handleClickNode"
                @tree-edit="openOperateModuleDialog"
                @tree-delete="deleteCurrentModule"
                @tree-add="openOperateModuleDialog"
            >
            </LeftTreeByMgr>
        </template>
        <template #header>
            <el-form ref="queryFormRef" :inline="true" :model="queryParams">
                <el-form-item label="标题" prop="title">
@@ -14,10 +33,6 @@
            </el-form>
        </template>
        <template #main>
            <!-- <div class="h-screen">
                <p>vue-json-editor</p>
                <JsonEditorVue v-model="jsonMsg"></JsonEditorVue>
            </div> -->
            <div class="h-full" ref="chatDragContainerRef">
                <el-table
                    v-loading="tableLoading"
@@ -40,10 +55,16 @@
                    <el-table-column prop="title" label="标题" width="300" fixed="left" show-overflow-tooltip> </el-table-column>
                    <el-table-column prop="prompt" label="提示词" show-overflow-tooltip> </el-table-column>
                    <el-table-column label="创建人" prop="creator" width="100" show-overflow-tooltip> </el-table-column>
                    <el-table-column label="创建时间" prop="create_time" width="105" show-overflow-tooltip> </el-table-column>
                    <el-table-column label="更新时间" prop="update_time" width="105" show-overflow-tooltip> </el-table-column>
                    <el-table-column label="发布状态" prop="published" width="85" show-overflow-tooltip>
                        <template #default="scope">
                            {{ supervisorPublishedMap[scope.row.published] }}
                        </template>
                    </el-table-column>
                    <el-table-column label="备注" prop="note" show-overflow-tooltip> </el-table-column>
                    <el-table-column label="操作" width="200" fixed="right" show-overflow-tooltip>
                        <template #default="scope">
@@ -117,48 +138,235 @@
            </div>
        </template>
        <OptDlg v-model="optDlgIsShow" :item="optDlgMapRow" @insert="insertOpt" @update="updateOpt"></OptDlg>
    </HMContainer>
    <SqlAmisEdit v-else :supervisor="sqlEditMapSupervisor" @backLastPage="backLastPage"></SqlAmisEdit>
        <OptDlg v-model="optDlgIsShow" :item="optDlgMapRow" @insert="insertOpt" @update="updateOpt" :groupId="currentListID"></OptDlg>
        <!-- 增加、修改数据对话框 -->
        <el-dialog
            :destroy-on-close="true"
            v-model="moduleDialogIsShow"
            width="400"
            :close-on-click-modal="false"
            @closed="closeModuleDialog"
        >
            <template #header>
                <div style="color: #fff">
                    <SvgIcon :name="moduleDialogHeaderIcon" :size="16" style="margin-right: 3px; display: inline; vertical-align: middle" />
                    <span> {{ moduleDialogTitle }} </span>
                </div>
            </template>
            <el-form :model="moduleDialogFormValue" ref="moduleDialogFormRef" :rules="moduleDialogFormRules" label-width="55">
                <el-form-item label="名称" prop="title">
                    <el-input placeholder="请输入名称" v-model="moduleDialogFormValue.title"></el-input>
                </el-form-item>
                <el-form-item label="父级" prop="parent" v-if="!isEditModuleDialog">
                    <el-tree-select
                        filterable
                        class="w100"
                        v-model="moduleDialogFormValue.parent"
                        :props="{
                            id: 'id',
                            label: 'title',
                            children: 'children',
                        }"
                        :data="parentSelectOptions"
                        node-key="id"
                        :clearable="true"
                        :accordion="false"
                        :expandNode="false"
                        :check-strictly="true"
                        placeholder="请选择父级"
                    >
                    </el-tree-select>
                </el-form-item>
            </el-form>
            <template #footer>
                <div>
                    <el-button @click="closeModuleDialog">取 消</el-button>
                    <el-button type="primary" @click="submitModuleFormValue">确 定</el-button>
                </div>
            </template>
        </el-dialog>
    </AHMContainer>
    <SqlAmisEdit v-else :supervisor="sqlEditMapSupervisor" @backLastPage="backLastPage" @updatePublished="updatePublishedById"></SqlAmisEdit>
</template>
<script setup lang="ts">
import { deleteCurrentRow } from '/@/utils/util';
import { useDraggable } from '@vueuse/core';
import { deleteCurrentRow, travelTree } from '/@/utils/util';
import { onMounted, ref } from 'vue';
import HMContainer from '/@/components/layout/HMContainer.vue';
import { computed, onMounted, ref } from 'vue';
import { usePageDisplay } from '/@/hooks/usePageDisplay';
import { useQueryTable } from '/@/hooks/useQueryTable';
// import { useTableSort } from '/@/hooks/useTableSort';
// import { useValidateUniqueness } from '/@/hooks/useValidateUniqueness';
import Chat from '/@/components/chat/Chat.vue';
import type { FormInstance, FormRules } from 'element-plus';
import { ElMessage, ElMessageBox } from 'element-plus';
import { nextTick } from 'vue';
import SqlAmisEdit from './edit/SqlAmisEdit.vue';
import OptDlg from './optDlg/OptDlg.vue';
import { SupervisorPublished, supervisorPublishedMap } from './types';
import * as supervisorAdminApi from '/@/api/supervisorAdmin';
import { checkSupervisorValidate, updatePublishStatus } from '/@/api/supervisorAdmin';
import JsonEditor from '/@/components/form/jsonEditor/JsonEditor.vue';
import amisLogo from '/@/assets/logo/amis-logo.png';
import Chat from '/@/components/chat/Chat.vue';
import emitter from '/@/utils/mitt';
import { deepClone } from '/@/utils/other';
import { gotoRoute } from '/@/utils/route';
import { useCompRef } from '/@/utils/types';
import { nextTick } from 'vue';
import { ElMessage } from 'element-plus';
import { convertListToTree } from '/@/utils/util';
import * as supervisorGroupApi from '/@/api/supervisorAdmin/supervisorGroup';
import LeftTreeByMgr from '/@/components/tree/leftTreeByMgr.vue';
import AHMContainer from '/@/components/layout/AHMContainer.vue';
import { useUpdateData } from '/@/hooks/useUpdateData';
//#region ====================== 左侧树数据,tree init ======================
const leftTreeRef = ref(null);
const treeLoading = ref(false);
const listData = ref([]);
const currentListID = computed(() => currentNode.value?.id);
const currentNode = ref(null);
const listTreeData = computed(() => {
    return convertListToTree(listData.value);
});
const updateRelatedType = (extendType) => {
    emitter.emit('basic.sys.type.update', {
        ExtendType: extendType,
    });
};
const handleClickNode = (data) => {
    nextTick(() => {
        leftTreeRef.value?.treeRef.setCurrentKey(data.id);
    });
    currentNode.value = data;
    getTableData();
};
const getListTreeData = async () => {
    const res = await supervisorGroupApi.getSupervisorGroupList();
    listData.value = res.values || [];
    const firstListTreeNode = listTreeData.value[0];
    if (firstListTreeNode) {
        handleClickNode(firstListTreeNode);
    } else {
        tableData.value = [];
        currentNode.value = null;
    }
};
//#endregion
//#region ====================== 删除左侧树系统模块数据 ======================
const deleteCurrentModule = (row: any) => {
    ElMessageBox.confirm(`确定删除页面分组:【${row.title}】?`, '提示', {
        confirmButtonText: '确定',
        cancelButtonText: '取消',
        type: 'warning',
    }).then(async () => {
        const res = await supervisorGroupApi.deleteSupervisorGroup({
            group_id: row.id,
        });
        ElMessage.success('删除成功!');
        const foundIndex = listData.value.findIndex((item) => row.id === item.id);
        listData.value.splice(foundIndex, 1);
    });
};
//#endregion
//#region ====================== 增加、删除系统模块操作, dialog init======================
const isEditModuleDialog = ref(false);
const moduleDialogTitle = computed(() => {
    return isEditModuleDialog.value ? '修改页面分组' : '添加页面分组';
});
const moduleDialogHeaderIcon = computed(() => {
    return isEditModuleDialog.value ? 'ele-Edit' : 'ele-Plus';
});
const moduleDialogFormValue = ref({
    Name: '',
    Code: '',
    Description: '',
}) as any;
const moduleDialogIsShow = ref(false);
const moduleDialogFormRef = ref<FormInstance>(null);
const moduleDialogFormRules = ref<FormRules>({
    title: [{ required: true, message: '请输入标题', trigger: 'blur' }],
});
const openOperateModuleDialog = (data?) => {
    if (data) {
        isEditModuleDialog.value = true;
        const { id, title } = data;
        moduleDialogFormValue.value = deepClone({ group_id: id, title });
    } else {
        isEditModuleDialog.value = false;
        moduleDialogFormValue.value = { title: '', parent: '' };
    }
    moduleDialogIsShow.value = true;
};
const closeModuleDialog = () => {
    moduleDialogIsShow.value = false;
    moduleDialogFormRef.value.clearValidate();
};
const parentSelectOptions = computed(() => {
    const cloneTreeData = deepClone(listTreeData.value);
    travelTree(cloneTreeData, (value, index, array, parent) => {
        if ((value as any).id === moduleDialogFormValue.value.id) {
            if (parent === array) {
                parent?.splice(index, 1);
            } else {
                parent?.Children?.splice(index, 1);
            }
        }
    });
    return cloneTreeData;
});
const submitModuleFormValue = async () => {
    const valid = await moduleDialogFormRef.value.validate().catch(() => {});
    if (!valid) return;
    if (isEditModuleDialog.value) {
        const res = await supervisorGroupApi.updateSupervisorGroup(moduleDialogFormValue.value);
        const foundIndex = listData.value.findIndex((item) => item.id === moduleDialogFormValue.value.id);
        if (foundIndex > -1) {
            listData.value[foundIndex] = {
                ...listData.value[foundIndex],
                title: moduleDialogFormValue.value.title,
            };
        }
        getListTreeData();
        moduleDialogIsShow.value = false;
        ElMessage.success('修改页面分组成功');
    } else {
        const res = await supervisorGroupApi.addSupervisorGroup(moduleDialogFormValue.value);
        listData.value.push({
            ...moduleDialogFormValue.value,
            id: res.group_id,
        });
        moduleDialogIsShow.value = false;
        ElMessage.success('添加页面分组成功');
    }
};
//#endregion
//#region ====================== 表格数据,table init ======================
const tableLoading = ref(false);
const tableData = ref([]);
const isDragStatus = ref(false);
const allTableData = ref(null);
const getTableData = async () => {
    tableLoading.value = true;
    const res = await supervisorAdminApi.getSupervisorList().finally(() => {
        tableLoading.value = false;
    });
    tableData.value = (res.values || []).map((item) => {
        item.create_time = item.create_time?.slice(0, 10);
        item.update_time = item.update_time?.slice(0, 10);
    if (!allTableData.value) {
        const res = await supervisorAdminApi.getSupervisorList();
        allTableData.value = (res.values || []).map((item) => {
            item.create_time = item.create_time?.slice(0, 10);
            item.update_time = item.update_time?.slice(0, 10);
        return item;
    });
            return item;
        });
    }
    tableData.value = allTableData.value.filter((item) => item.group_id === currentListID.value);
};
//#endregion
@@ -226,15 +434,34 @@
    tableData.value.unshift({ ...newData, published: SupervisorPublished.N });
};
//#endregion
const updatePublishedById = (id: string, published: SupervisorPublished) => {
    const row = tableData.value.find((item) => item.id === id);
    if (row) {
        row.published = published;
    }
};
//#region ====================== 改变发布状态 ======================
const publishStatusChange = async (published: SupervisorPublished, id, index) => {
    const res = await updatePublishStatus({
        id: id,
        publish: published,
    });
    const origin = published ? SupervisorPublished.N : SupervisorPublished.Y;
    displayTableData.value[index].published = res.publish ?? origin;
    published===SupervisorPublished.Y ? ElMessage.success('发布成功'):ElMessage.info('已取消发布')
    const res = await updatePublishStatus(
        {
            id: id,
            publish: published,
        },
        {
            loading: false,
        }
    );
    const origin = published === SupervisorPublished.Y ? SupervisorPublished.N : SupervisorPublished.Y;
    const final = res.publish ?? origin;
    if (final === origin) {
        ElMessage.warning('操作失败' + (res.fail_msg ? `:${res.fail_msg}` : ''));
        return;
    }
    tableData.value[index].published = final;
    published === SupervisorPublished.Y ? ElMessage.success('发布成功') : ElMessage.info('已取消发布');
};
//#endregion
@@ -293,8 +520,18 @@
    return res;
};
//#endregion
//#region ====================== 更新发布状态 ======================
useUpdateData({
    event: 'supervisor.publish',
    updateFun({ id, published }) {
        updatePublishedById(id, published);
    },
});
//#endregion
onMounted(() => {
    getTableData();
    getListTreeData();
});
</script>
<style scoped lang="scss"></style>
src/views/project/yw/lowCode/sqlAmis/edit/SqlAmisEdit.vue
@@ -77,9 +77,10 @@
import * as supervisorApi from '/@/api/supervisorAdmin';
import { updateSqlApi } from '/@/api/supervisorAdmin';
import { useCompRef } from '/@/utils/types';
import { SupervisorPublished } from '../types';
const props = defineProps(['supervisor']);
const emit = defineEmits(['backLastPage']);
const emit = defineEmits(['backLastPage', 'updatePublished']);
const log = console.log;
const jsonCode = ref(codeExample.jsonCode);
const dockCode = ref(codeExample.dockCode);
@@ -223,7 +224,9 @@
        {
            loading: false,
        }
    );
    ).then(() => {
        emit('updatePublished', props.supervisor.id, SupervisorPublished.N);
    });
};
const sqlCodeChange = debounce((val) => {
@@ -289,8 +292,6 @@
        rsTableRef.value.setCurrentRow(configList.value[0]);
        // dockRowChange(configList.value[0]);
    }
    if (checkRsUpdate(originConfig, configList.value)) {
        // 自动更新Rs
src/views/project/yw/lowCode/sqlAmis/optDlg/OptDlg.vue
@@ -81,7 +81,7 @@
import { useUserInfo } from '/@/stores/userInfo';
import { storeToRefs } from 'pinia';
const props = defineProps(['item']);
const props = defineProps(['item', 'groupId']);
const emit = defineEmits(['update', 'insert']);
//#region ====================== 增加、修改记录操作, dialog init======================
const isEditDialog = ref(false);
@@ -110,7 +110,7 @@
    } else {
        isEditDialog.value = false;
        dialogFormValue.value = { title: null, prompt: null, note: null, args: [] };
        dialogFormValue.value = { group: props.groupId, title: null, prompt: null, note: null, args: [] };
    }
};
const closeDialog = () => {