| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455 |
- <template>
- <div>
- <div class="gva-search-box">
- <el-form ref="searchForm" :inline="true" :model="searchInfo">
- <el-form-item label="路径">
- <el-input v-model="searchInfo.path" placeholder="路径" />
- </el-form-item>
- <el-form-item label="描述">
- <el-input v-model="searchInfo.description" placeholder="描述" />
- </el-form-item>
- <el-form-item label="API组">
- <el-input v-model="searchInfo.apiGroup" placeholder="api组" />
- </el-form-item>
- <el-form-item label="请求">
- <el-select v-model="searchInfo.method" clearable placeholder="请选择">
- <el-option
- v-for="item in methodOptions"
- :key="item.value"
- :label="`${item.label}(${item.value})`"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item>
- <el-button size="small" type="primary" icon="search" @click="onSubmit"
- >查询</el-button
- >
- <el-button size="small" icon="refresh" @click="onReset"
- >重置</el-button
- >
- </el-form-item>
- </el-form>
- </div>
- <div class="gva-table-box">
- <div class="gva-btn-list">
- <el-button
- size="small"
- type="primary"
- icon="plus"
- @click="openDialog('addApi')"
- >新增</el-button
- >
- <el-popover v-model="deleteVisible" placement="top" width="160">
- <p>确定要删除吗?</p>
- <div style="text-align: right; margin-top: 8px">
- <el-button
- size="small"
- type="primary"
- link
- @click="deleteVisible = false"
- >取消</el-button
- >
- <el-button size="small" type="primary" @click="onDelete"
- >确定</el-button
- >
- </div>
- <template #reference>
- <el-button
- icon="delete"
- size="small"
- :disabled="!apis.length"
- style="margin-left: 10px"
- @click="deleteVisible = true"
- >删除</el-button
- >
- </template>
- </el-popover>
- </div>
- <el-table
- :data="tableData"
- @sort-change="sortChange"
- @selection-change="handleSelectionChange"
- >
- <el-table-column type="selection" width="55" />
- <el-table-column
- align="left"
- label="id"
- min-width="60"
- prop="ID"
- sortable="custom"
- />
- <el-table-column
- align="left"
- label="API路径"
- min-width="150"
- prop="path"
- sortable="custom"
- />
- <el-table-column
- align="left"
- label="API分组"
- min-width="150"
- prop="apiGroup"
- sortable="custom"
- />
- <el-table-column
- align="left"
- label="API简介"
- min-width="150"
- prop="description"
- sortable="custom"
- />
- <el-table-column
- align="left"
- label="请求"
- min-width="150"
- prop="method"
- sortable="custom"
- >
- <template #default="scope">
- <div>
- {{ scope.row.method }} / {{ methodFiletr(scope.row.method) }}
- </div>
- </template>
- </el-table-column>
- <el-table-column align="left" fixed="right" label="操作" width="200">
- <template #default="scope">
- <el-button
- icon="edit"
- size="small"
- type="primary"
- link
- @click="editApiFunc(scope.row)"
- >编辑</el-button
- >
- <el-button
- icon="delete"
- size="small"
- type="primary"
- link
- @click="deleteApiFunc(scope.row)"
- >删除</el-button
- >
- </template>
- </el-table-column>
- </el-table>
- <div class="gva-pagination">
- <el-pagination
- :current-page="page"
- :page-size="pageSize"
- :page-sizes="[10, 30, 50, 100]"
- :total="total"
- layout="total, sizes, prev, pager, next, jumper"
- @current-change="handleCurrentChange"
- @size-change="handleSizeChange"
- />
- </div>
- </div>
- <el-dialog
- v-model="dialogFormVisible"
- :before-close="closeDialog"
- :title="dialogTitle"
- >
- <warning-bar title="新增API,需要在角色管理内配置权限才可使用" />
- <el-form ref="apiForm" :model="form" :rules="rules" label-width="80px">
- <el-form-item label="路径" prop="path">
- <el-input v-model="form.path" autocomplete="off" />
- </el-form-item>
- <el-form-item label="请求" prop="method">
- <el-select
- v-model="form.method"
- placeholder="请选择"
- style="width: 100%"
- >
- <el-option
- v-for="item in methodOptions"
- :key="item.value"
- :label="`${item.label}(${item.value})`"
- :value="item.value"
- />
- </el-select>
- </el-form-item>
- <el-form-item label="api分组" prop="apiGroup">
- <el-input v-model="form.apiGroup" autocomplete="off" />
- </el-form-item>
- <el-form-item label="api简介" prop="description">
- <el-input v-model="form.description" autocomplete="off" />
- </el-form-item>
- </el-form>
- <template #footer>
- <div class="dialog-footer">
- <el-button size="small" @click="closeDialog">取 消</el-button>
- <el-button size="small" type="primary" @click="enterDialog"
- >确 定</el-button
- >
- </div>
- </template>
- </el-dialog>
- </div>
- </template>
- <script>
- export default {
- name: "Api",
- };
- </script>
- <script setup>
- import {
- getApiById,
- getApiList,
- createApi,
- updateApi,
- deleteApi,
- deleteApisByIds,
- } from "@/api/api";
- import { toSQLLine } from "@/utils/stringFun";
- import warningBar from "@/components/warningBar/warningBar.vue";
- import { ref } from "vue";
- import { ElMessage, ElMessageBox } from "element-plus";
- const methodFiletr = (value) => {
- const target = methodOptions.value.filter((item) => item.value === value)[0];
- return target && `${target.label}`;
- };
- const apis = ref([]);
- const form = ref({
- path: "",
- apiGroup: "",
- method: "",
- description: "",
- });
- const methodOptions = ref([
- {
- value: "POST",
- label: "创建",
- type: "success",
- },
- {
- value: "GET",
- label: "查看",
- type: "",
- },
- {
- value: "PUT",
- label: "更新",
- type: "warning",
- },
- {
- value: "DELETE",
- label: "删除",
- type: "danger",
- },
- ]);
- const type = ref("");
- const rules = ref({
- path: [{ required: true, message: "请输入api路径", trigger: "blur" }],
- apiGroup: [{ required: true, message: "请输入组名称", trigger: "blur" }],
- method: [{ required: true, message: "请选择请求方式", trigger: "blur" }],
- description: [{ required: true, message: "请输入api介绍", trigger: "blur" }],
- });
- const page = ref(1);
- const total = ref(0);
- const pageSize = ref(10);
- const tableData = ref([]);
- const searchInfo = ref({});
- const onReset = () => {
- searchInfo.value = {};
- };
- // 搜索
- const onSubmit = () => {
- page.value = 1;
- pageSize.value = 10;
- getTableData();
- };
- // 分页
- const handleSizeChange = (val) => {
- pageSize.value = val;
- getTableData();
- };
- const handleCurrentChange = (val) => {
- page.value = val;
- getTableData();
- };
- // 排序
- const sortChange = ({ prop, order }) => {
- if (prop) {
- if (prop === "ID") {
- prop = "id";
- }
- searchInfo.value.orderKey = toSQLLine(prop);
- searchInfo.value.desc = order === "descending";
- }
- getTableData();
- };
- // 查询
- const getTableData = async () => {
- const table = await getApiList({
- page: page.value,
- pageSize: pageSize.value,
- ...searchInfo.value,
- });
- if (table.code === 0) {
- tableData.value = table.data.list;
- total.value = table.data.total;
- page.value = table.data.page;
- pageSize.value = table.data.pageSize;
- }
- };
- getTableData();
- // 批量操作
- const handleSelectionChange = (val) => {
- apis.value = val;
- };
- const deleteVisible = ref(false);
- const onDelete = async () => {
- const ids = apis.value.map((item) => item.ID);
- const res = await deleteApisByIds({ ids });
- if (res.code === 0) {
- ElMessage({
- type: "success",
- message: res.msg,
- });
- if (tableData.value.length === ids.length && page.value > 1) {
- page.value--;
- }
- deleteVisible.value = false;
- getTableData();
- }
- };
- // 弹窗相关
- const apiForm = ref(null);
- const initForm = () => {
- apiForm.value.resetFields();
- form.value = {
- path: "",
- apiGroup: "",
- method: "",
- description: "",
- };
- };
- const dialogTitle = ref("新增Api");
- const dialogFormVisible = ref(false);
- const openDialog = (key) => {
- switch (key) {
- case "addApi":
- dialogTitle.value = "新增Api";
- break;
- case "edit":
- dialogTitle.value = "编辑Api";
- break;
- default:
- break;
- }
- type.value = key;
- dialogFormVisible.value = true;
- };
- const closeDialog = () => {
- initForm();
- dialogFormVisible.value = false;
- };
- const editApiFunc = async (row) => {
- const res = await getApiById({ id: row.ID });
- form.value = res.data.api;
- openDialog("edit");
- };
- const enterDialog = async () => {
- apiForm.value.validate(async (valid) => {
- if (valid) {
- switch (type.value) {
- case "addApi":
- {
- const res = await createApi(form.value);
- if (res.code === 0) {
- ElMessage({
- type: "success",
- message: "添加成功",
- showClose: true,
- });
- }
- getTableData();
- closeDialog();
- }
- break;
- case "edit":
- {
- const res = await updateApi(form.value);
- if (res.code === 0) {
- ElMessage({
- type: "success",
- message: "编辑成功",
- showClose: true,
- });
- }
- getTableData();
- closeDialog();
- }
- break;
- default:
- // eslint-disable-next-line no-lone-blocks
- {
- ElMessage({
- type: "error",
- message: "未知操作",
- showClose: true,
- });
- }
- break;
- }
- }
- });
- };
- const deleteApiFunc = async (row) => {
- ElMessageBox.confirm("此操作将永久删除所有角色下该api, 是否继续?", "提示", {
- confirmButtonText: "确定",
- cancelButtonText: "取消",
- type: "warning",
- }).then(async () => {
- const res = await deleteApi(row);
- if (res.code === 0) {
- ElMessage({
- type: "success",
- message: "删除成功!",
- });
- if (tableData.value.length === 1 && page.value > 1) {
- page.value--;
- }
- getTableData();
- }
- });
- };
- </script>
- <style scoped lang="scss">
- .button-box {
- padding: 10px 20px;
- .el-button {
- float: right;
- }
- }
- .warning {
- color: #dc143c;
- }
- </style>
|