tangbin пре 1 година
родитељ
комит
0246f8066b

+ 1 - 1
src/i18n/lang/zh-CN.ts

@@ -3,7 +3,7 @@ export default {
     app: {
       //产品信息
       name: "佳缘科技",
-      productName: "佳缘科技后台管理系统",
+      productName: "佳缘科技管理系统",
       productNameMini: "佳缘",
       copyright: "scjydz.com"
     },

+ 1 - 1
src/router/base.ts

@@ -11,7 +11,7 @@ const routes: Array<RouteRecordRaw> = [
   {
     path: "/",
     component: Layout,
-    redirect: "/home",
+    redirect: "/notice/notice-user",
     meta: { title: "ui.router.pageWorkbench", icon: "icon-desktop" },
     children: [
       {

+ 0 - 177
src/views/demo/charts.vue

@@ -1,177 +0,0 @@
-<template>
-  <div class="box">
-    <figure>
-      <v-chart :option="bar" :autoresize="true" />
-    </figure>
-    <figure>
-      <v-chart :option="pie" :autoresize="true" />
-    </figure>
-    <figure>
-      <v-chart :option="polar" :autoresize="true" />
-    </figure>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import { ref, provide } from "vue";
-import { use } from "echarts/core";
-import { CanvasRenderer } from "echarts/renderers";
-import { BarChart, LineChart, PieChart, MapChart, RadarChart, ScatterChart, EffectScatterChart, LinesChart } from "echarts/charts";
-import { GridComponent, PolarComponent, GeoComponent, TooltipComponent, LegendComponent, TitleComponent, VisualMapComponent, DatasetComponent, ToolboxComponent, DataZoomComponent } from "echarts/components";
-import VChart, { THEME_KEY } from "vue-echarts";
-
-use([BarChart, LineChart, PieChart, MapChart, RadarChart, ScatterChart, EffectScatterChart, LinesChart, GridComponent, PolarComponent, GeoComponent, TooltipComponent, LegendComponent, TitleComponent, VisualMapComponent, DatasetComponent, CanvasRenderer, ToolboxComponent, DataZoomComponent]);
-
-provide(THEME_KEY, "westeros");
-
-const random = () => {
-  return Math.round(300 + Math.random() * 700) / 10;
-};
-
-const getPolarData = () => {
-  const data = [];
-  for (let i = 0; i <= 360; i++) {
-    const t = (i / 180) * Math.PI;
-    const r = Math.sin(2 * t) * Math.cos(2 * t);
-    data.push([r, i]);
-  }
-  return data;
-};
-
-const pie = ref({
-  title: {
-    text: "Traffic Sources",
-    left: "center"
-  },
-  tooltip: {
-    trigger: "item",
-    formatter: "{a} <br/>{b} : {c} ({d}%)"
-  },
-  legend: {
-    orient: "vertical",
-    left: "left",
-    data: ["Direct", "Email", "Ad Networks", "Video Ads", "Search Engines"]
-  },
-  series: [
-    {
-      name: "Traffic Sources",
-      type: "pie",
-      radius: "55%",
-      center: ["50%", "60%"],
-      data: [
-        { value: 335, name: "Direct" },
-        { value: 310, name: "Email" },
-        { value: 234, name: "Ad Networks" },
-        { value: 135, name: "Video Ads" },
-        { value: 1548, name: "Search Engines" }
-      ],
-      emphasis: {
-        itemStyle: {
-          shadowBlur: 10,
-          shadowOffsetX: 0,
-          shadowColor: "rgba(0, 0, 0, 0.5)"
-        }
-      }
-    }
-  ]
-});
-const bar = ref({
-  textStyle: {
-    fontFamily: 'Inter, "Helvetica Neue", Arial, sans-serif'
-  },
-  dataset: {
-    dimensions: ["Product", "2015", "2016", "2017"],
-    source: [
-      {
-        Product: "Matcha Latte",
-        2015: random(),
-        2016: random(),
-        2017: random()
-      },
-      {
-        Product: "Milk Tea",
-        2015: random(),
-        2016: random(),
-        2017: random()
-      },
-      {
-        Product: "Cheese Cocoa",
-        2015: random(),
-        2016: random(),
-        2017: random()
-      },
-      {
-        Product: "Walnut Brownie",
-        2015: random(),
-        2016: random(),
-        2017: random()
-      }
-    ]
-  },
-  xAxis: { type: "category" },
-  yAxis: {},
-  // Declare several bar series, each will be mapped
-  // to a column of dataset.source by default.
-  series: [{ type: "bar" }, { type: "bar" }, { type: "bar" }]
-});
-const polar = ref({
-  textStyle: {
-    fontFamily: 'Inter, "Helvetica Neue", Arial, sans-serif'
-  },
-  title: {
-    text: "Dual Numeric Axis"
-  },
-  legend: {
-    data: ["line"]
-  },
-  polar: {
-    center: ["50%", "54%"]
-  },
-  tooltip: {
-    trigger: "axis",
-    axisPointer: {
-      type: "cross"
-    }
-  },
-  angleAxis: {
-    type: "value",
-    startAngle: 0
-  },
-  radiusAxis: {
-    min: 0
-  },
-  series: [
-    {
-      coordinateSystem: "polar",
-      name: "line",
-      type: "line",
-      showSymbol: false,
-      data: getPolarData()
-    }
-  ],
-  animationDuration: 2000
-});
-</script>
-
-<style lang="less" scoped>
-.box {
-  display: flex;
-  flex-direction: column;
-  justify-content: center;
-  figure {
-    display: inline-block;
-    position: relative;
-    margin: 2em auto;
-    border: 1px solid rgba(0, 0, 0, 0.1);
-    border-radius: 8px;
-    box-shadow: 0 0 45px rgba(0, 0, 0, 0.2);
-    padding: 30px;
-
-    .echarts {
-      width: 40vw;
-      min-width: 400px;
-      height: 300px;
-    }
-  }
-}
-</style>

+ 0 - 95
src/views/demo/excel-add-or-update.vue

@@ -1,95 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" :label-width="$i18n.locale === 'en-US' ? '120px' : '80px'">
-      <el-form-item :label="$t('excel.realName')" prop="realName">
-        <el-input v-model="dataForm.realName"></el-input>
-      </el-form-item>
-      <el-form-item :label="$t('excel.identity')" prop="userIdentity">
-        <el-input v-model="dataForm.userIdentity"></el-input>
-      </el-form-item>
-      <el-form-item :label="$t('excel.address')" prop="address">
-        <el-input v-model="dataForm.address"></el-input>
-      </el-form-item>
-      <el-form-item :label="$t('excel.joinDate')" prop="joinDate">
-        <el-date-picker type="date" value-format="YYYY-MM-DD" v-model="dataForm.joinDate"></el-date-picker>
-      </el-form-item>
-      <el-form-item :label="$t('excel.className')" prop="className">
-        <el-input v-model="dataForm.className"></el-input>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  realName: "",
-  userIdentity: "",
-  address: "",
-  joinDate: "",
-  className: ""
-});
-
-const rules = ref({
-  realName: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  userIdentity: [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = (id?: number) => {
-  visible.value = true;
-  dataForm.id = "";
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-
-  if (id) {
-    getInfo(id);
-  }
-};
-
-// 获取信息
-const getInfo = (id: number) => {
-  baseService.get("/demo/excel/" + id).then((res) => {
-    Object.assign(dataForm, res.data);
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    (!dataForm.id ? baseService.post : baseService.put)("/demo/excel", dataForm).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList");
-        }
-      });
-    });
-  });
-};
-
-defineExpose({
-  init
-});
-</script>

+ 0 - 48
src/views/demo/excel-import.vue

@@ -1,48 +0,0 @@
-<template>
-  <el-dialog v-model="visible" title="Excel导入" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-upload name="file" :action="url" :file-list="fileList" drag :on-success="successHandle" class="text-center">
-      <el-icon><upload /></el-icon>
-      <div class="el-upload__text" v-html="$t('upload.text')"></div>
-    </el-upload>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { ref } from "vue";
-import app from "@/constants/app";
-import { getToken } from "@/utils/cache";
-import { IObject } from "@/types/interface";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const url = ref("");
-const fileList = ref([]);
-
-const init = () => {
-  visible.value = true;
-  url.value = `${app.api}/demo/excel/import?token=${getToken()}`;
-  fileList.value = [];
-};
-
-// 上传成功
-const successHandle = (res: IObject) => {
-  if (res.code !== 0) {
-    return ElMessage.error(res.msg);
-  }
-  ElMessage.success({
-    message: t("prompt.success"),
-    duration: 500,
-    onClose: () => {
-      visible.value = false;
-      emit("refreshDataList");
-    }
-  });
-};
-
-defineExpose({
-  init
-});
-</script>

+ 0 - 76
src/views/demo/excel.vue

@@ -1,76 +0,0 @@
-<template>
-  <div class="mod-demo__excel">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.realName" :placeholder="$t('excel.realName')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input v-model="state.dataForm.userIdentity" :placeholder="$t('excel.identity')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="warning" @click="importHandle()">{{ $t("excel.import") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="info" @click="state.exportHandle()">{{ $t("export") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="realName" :label="$t('excel.realName')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="userIdentity" :label="$t('excel.identity')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="address" :label="$t('excel.address')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="joinDate" :label="$t('excel.joinDate')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="className" :label="$t('excel.className')" header-align="center" align="center"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
-        <template v-slot="scope">
-          <el-button type="primary" link @click="addOrUpdateHandle(scope.row.id)">{{ $t("update") }}</el-button>
-          <el-button type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-    <import ref="importRef" @refreshDataList="state.getDataList"></import>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update ref="addOrUpdateRef" @refreshDataList="state.getDataList"></add-or-update>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, ref, toRefs } from "vue";
-import Import from "./excel-import.vue";
-import AddOrUpdate from "./excel-add-or-update.vue";
-
-const view = reactive({
-  getDataListURL: "/demo/excel/page",
-  getDataListIsPage: true,
-  exportURL: "/demo/excel/export",
-  deleteURL: "/demo/excel",
-  deleteIsBatch: true,
-  dataForm: {
-    realName: "",
-    userIdentity: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-const importRef = ref();
-const importHandle = () => {
-  importRef.value.init();
-};
-
-const addOrUpdateRef = ref();
-const addOrUpdateHandle = (id?: number) => {
-  addOrUpdateRef.value.init(id);
-};
-</script>

+ 0 - 90
src/views/demo/news-add-or-update.vue

@@ -1,90 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
-      <el-form-item prop="title" :label="$t('news.title')">
-        <el-input v-model="dataForm.title" :placeholder="$t('news.title')"></el-input>
-      </el-form-item>
-      <el-form-item prop="content" :label="$t('news.content')">
-        <WangEditor v-model="dataForm.content"></WangEditor>
-      </el-form-item>
-      <el-form-item prop="pubDate" :label="$t('news.pubDate')">
-        <el-date-picker v-model="dataForm.pubDate" type="datetime" format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss" :placeholder="$t('news.pubDate')"></el-date-picker>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import WangEditor from "@/components/wang-editor/index.vue";
-
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  title: "",
-  content: "",
-  pubDate: ""
-});
-
-const rules = ref({
-  title: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  content: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  pubDate: [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = (id?: number) => {
-  visible.value = true;
-  dataForm.id = "";
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-
-  if (id) {
-    getInfo(id);
-  }
-};
-
-const getInfo = (id: number) => {
-  baseService.get(`/demo/news/${id}`).then((res) => {
-    Object.assign(dataForm, res.data);
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    (!dataForm.id ? baseService.post : baseService.put)("/demo/news", dataForm, {
-      "content-type": "application/x-www-form-urlencoded"
-    }).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList");
-        }
-      });
-    });
-  });
-};
-defineExpose({
-  init
-});
-</script>

+ 0 - 79
src/views/demo/news.vue

@@ -1,79 +0,0 @@
-<template>
-  <div class="mod-demo__news">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.title" :placeholder="$t('news.title')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-date-picker v-model="state.daterange" type="daterange" value-format="YYYY-MM-DD" :range-separator="$t('datePicker.range')" :start-placeholder="$t('datePicker.start')" :end-placeholder="$t('datePicker.end')"> </el-date-picker>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" @sort-change="state.dataListSortChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="title" :label="$t('news.title')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="pubDate" :label="$t('news.pubDate')" sortable="custom" header-align="center" align="center" width="180"></el-table-column>
-      <el-table-column prop="createDate" :label="$t('news.createDate')" sortable="custom" header-align="center" align="center" width="180"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
-        <template v-slot="scope">
-          <el-button type="primary" link @click="addOrUpdateHandle(scope.row.id)">{{ $t("update") }}</el-button>
-          <el-button type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update :key="addKey" ref="addOrUpdateRef" @refreshDataList="state.getDataList"></add-or-update>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { nextTick, reactive, ref, toRefs, watch } from "vue";
-import AddOrUpdate from "./news-add-or-update.vue";
-
-const view = reactive({
-  getDataListURL: "/demo/news/page",
-  getDataListIsPage: true,
-  deleteURL: "/demo/news",
-  deleteIsBatch: true,
-  daterange: null,
-  dataForm: {
-    title: "",
-    startDate: null as number | null,
-    endDate: null as number | null
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-watch(
-  () => state.daterange,
-  (val: number[] | null) => {
-    if (val === null) {
-      state.dataForm.startDate = null;
-      state.dataForm.endDate = null;
-    } else {
-      state.dataForm.startDate = val[0];
-      state.dataForm.endDate = val[1];
-    }
-  }
-);
-
-const addOrUpdateRef = ref();
-const addKey = ref(0);
-const addOrUpdateHandle = (id?: number) => {
-  addKey.value++;
-  nextTick(() => {
-    addOrUpdateRef.value.init(id);
-  });
-};
-</script>

+ 0 - 118
src/views/demo/product-add-or-update.vue

@@ -1,118 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" :label-width="$i18n.locale === 'en-US' ? '120px' : '80px'">
-      <el-form-item label="产品名称" prop="name">
-        <el-input v-model="dataForm.name" placeholder="产品名称"></el-input>
-      </el-form-item>
-      <el-form-item label="产品介绍" prop="content">
-        <el-input v-model="dataForm.content" placeholder="产品介绍"></el-input>
-      </el-form-item>
-    </el-form>
-    <vxe-toolbar perfect>
-      <template v-slot:buttons>
-        <vxe-button icon="fa fa-plus" status="perfect" @click="insertEvent(-1)">新增</vxe-button>
-        <vxe-button icon="fa fa-trash-o" status="perfect" @click="removeEvent">删除</vxe-button>
-      </template>
-    </vxe-toolbar>
-    <vxe-table border show-overflow ref="xTable" class="my_table_insert" max-height="400" :data="tableData" :edit-config="{ trigger: 'click', mode: 'cell', icon: 'fa fa-pencil' }">
-      <vxe-column type="checkbox" width="60"></vxe-column>
-      <vxe-column field="paramName" title="参数名" sortable :edit-render="{ name: 'input', defaultValue: '' }"></vxe-column>
-      <vxe-column field="paramValue" title="参数值" :edit-render="{ name: 'input' }"></vxe-column>
-    </vxe-table>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const tableData = ref([]);
-const xTable = ref();
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  name: "",
-  content: "",
-  subList: []
-});
-
-const rules = ref({
-  name: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  content: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  updater: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  updateDate: [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = (id?: number) => {
-  visible.value = true;
-  dataForm.id = "";
-  tableData.value = [];
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-
-  if (id) {
-    getInfo(id);
-  }
-};
-
-const insertEvent = async (row: number) => {
-  let record = {
-    num: "1"
-  };
-  let { row: newRow } = await xTable.value.insertAt(record, row);
-  await xTable.value.setActiveCell(newRow, "paramName");
-};
-
-const removeEvent = () => {
-  const selectRecords = xTable.value.getCheckboxRecords();
-  if (selectRecords.length) {
-    xTable.value.removeCheckboxRow();
-  } else {
-    ElMessage.error("请至少选择一条数据");
-  }
-};
-
-// 获取信息
-const getInfo = (id: number) => {
-  baseService.get(`/demo/product/${id}`).then((res) => {
-    Object.assign(dataForm, res.data);
-    tableData.value = res.data.subList;
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    dataForm.subList = xTable.value.getTableData().tableData;
-    (!dataForm.id ? baseService.post : baseService.put)("/demo/product", dataForm).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList");
-        }
-      });
-    });
-  });
-};
-defineExpose({
-  init
-});
-</script>

+ 0 - 57
src/views/demo/product.vue

@@ -1,57 +0,0 @@
-<template>
-  <div class="mod-demo__product">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.id" placeholder="id" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button v-if="state.hasPermission('demo:product:save')" type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button v-if="state.hasPermission('demo:product:delete')" type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="id" label="id" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="name" label="产品名称" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="content" label="产品介绍" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="createDate" label="创建时间" header-align="center" align="center"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
-        <template v-slot="scope">
-          <el-button v-if="state.hasPermission('demo:product:update')" type="primary" link @click="addOrUpdateHandle(scope.row.id)">{{ $t("update") }}</el-button>
-          <el-button v-if="state.hasPermission('demo:product:delete')" type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update ref="addOrUpdateRef" @refreshDataList="state.getDataList"></add-or-update>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, ref, toRefs } from "vue";
-import AddOrUpdate from "./product-add-or-update.vue";
-
-const view = reactive({
-  getDataListURL: "/demo/product/page",
-  getDataListIsPage: true,
-  deleteURL: "/demo/product",
-  deleteIsBatch: true,
-  dataForm: {
-    id: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-const addOrUpdateRef = ref();
-const addOrUpdateHandle = (id?: number) => {
-  addOrUpdateRef.value.init(id);
-};
-</script>

+ 0 - 66
src/views/devtools/project.vue

@@ -1,66 +0,0 @@
-<template>
-  <div>
-    <el-space style="justify-content: space-between; width: 100%; border-bottom: 1px solid #ebeef5; margin-top: -10px; margin-bottom: 15px; padding-bottom: 10px">
-      <span>项目名和包名修改</span>
-    </el-space>
-  </div>
-  <div style="width: 600px">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" label-width="120px">
-      <el-form-item label="原项目路径" prop="projectPath">
-        <el-input v-model="dataForm.projectPath" placeholder="待修改的项目所在路径"></el-input>
-      </el-form-item>
-      <el-form-item label="原项目名称" prop="projectName">
-        <el-input v-model="dataForm.projectName" placeholder="待修改的项目名称"></el-input>
-      </el-form-item>
-      <el-form-item label="新项目名称" prop="newProjectName">
-        <el-input v-model="dataForm.newProjectName" placeholder="新项目名称"></el-input>
-      </el-form-item>
-      <el-form-item label="新项目包名" prop="newProjectPackage">
-        <el-input v-model="dataForm.newProjectPackage" placeholder="新项目包名"></el-input>
-      </el-form-item>
-      <el-form-item label="新项目标识" prop="newProjectCode">
-        <el-input v-model="dataForm.newProjectCode" placeholder="用于替换wjp标识"></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="dataFormSubmitHandle()">生成新项目</el-button>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import { getToken } from "@/utils/cache";
-import app from "@/constants/app";
-import qs from "qs";
-
-const dataFormRef = ref();
-const dataForm = reactive({
-  projectPath: "D:\\wjp\\wjp-security",
-  projectName: "wjp-security",
-  newProjectName: "wjp-project40",
-  newProjectPackage: "com.wjp",
-  newProjectCode: "wjp"
-});
-
-const rules = ref({
-  projectPath: [{ required: true, message: "必填项不能为空", trigger: "blur" }],
-  projectName: [{ required: true, message: "必填项不能为空", trigger: "blur" }],
-  newProjectName: [{ required: true, message: "必填项不能为空", trigger: "blur" }],
-  newProjectPackage: [{ required: true, message: "必填项不能为空", trigger: "blur" }],
-  newProjectCode: [{ required: true, message: "必填项不能为空", trigger: "blur" }]
-});
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-
-    location.href = `${app.api}/devtools/project?${qs.stringify({
-      ...dataForm,
-      token: getToken()
-    })}`;
-  });
-};
-</script>

+ 0 - 5
src/views/form-generator/form.vue

@@ -1,5 +0,0 @@
-<template>
-  <div class="gen">
-    <VFormDesigner></VFormDesigner>
-  </div>
-</template>

+ 0 - 64
src/views/message/mail-log.vue

@@ -1,64 +0,0 @@
-<template>
-  <div class="mod-message__mail-log">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.templateId" :placeholder="$t('mail.templateId')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input v-model="state.dataForm.mailTo" :placeholder="$t('mail.mailTo')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-select v-model="state.dataForm.status" :placeholder="$t('mail.status')" clearable>
-          <el-option :label="$t('mail.status1')" :value="1"></el-option>
-          <el-option :label="$t('mail.status0')" :value="0"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" @sort-change="state.dataListSortChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="templateId" :label="$t('mail.templateId')" sortable="custom" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="mailFrom" :label="$t('mail.mailFrom')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="mailTo" :label="$t('mail.mailTo')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="mailCc" :label="$t('mail.mailCc')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="subject" :label="$t('mail.subject')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="status" :label="$t('mail.status')" sortable="custom" header-align="center" align="center">
-        <template v-slot="scope">
-          <el-tag v-if="scope.row.status === 1" size="small">{{ $t("mail.status1") }}</el-tag>
-          <el-tag v-else size="small" type="danger">{{ $t("mail.status0") }}</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column prop="createDate" :label="$t('mail.createDate')" sortable="custom" header-align="center" align="center" width="180"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
-        <template v-slot="scope">
-          <el-button type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, toRefs } from "vue";
-
-const view = reactive({
-  getDataListURL: "/sys/maillog/page",
-  getDataListIsPage: true,
-  deleteURL: "/sys/maillog",
-  deleteIsBatch: true,
-  dataForm: {
-    templateId: "",
-    mailTo: "",
-    status: null
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-</script>

+ 0 - 92
src/views/message/mail-template-add-or-update.vue

@@ -1,92 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
-      <el-form-item prop="name" :label="$t('mail.name')">
-        <el-input v-model="dataForm.name" :placeholder="$t('mail.name')"></el-input>
-      </el-form-item>
-      <el-form-item prop="subject" :label="$t('mail.subject')">
-        <el-input v-model="dataForm.subject" :placeholder="$t('mail.subject')"></el-input>
-      </el-form-item>
-      <el-form-item prop="content" :label="$t('mail.content')">
-        <WangEditor v-model="dataForm.content"></WangEditor>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import "quill/dist/quill.snow.css";
-import WangEditor from "@/components/wang-editor/index.vue";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  name: "",
-  subject: "",
-  content: ""
-});
-
-const rules = ref({
-  name: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  subject: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  content: [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = (id?: number) => {
-  visible.value = true;
-  dataForm.id = "";
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-
-  if (id) {
-    getInfo(id);
-  }
-};
-
-// 获取信息
-const getInfo = (id: number) => {
-  baseService.get(`/sys/mailtemplate/${id}`).then((res) => {
-    Object.assign(dataForm, res.data);
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    (!dataForm.id ? baseService.post : baseService.put)("/sys/mailtemplate", dataForm, {
-      "content-type": "application/x-www-form-urlencoded"
-    }).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList");
-        }
-      });
-    });
-  });
-};
-
-defineExpose({
-  init
-});
-</script>

+ 0 - 89
src/views/message/mail-template-config.vue

@@ -1,89 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="$t('mail.config')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
-      <el-form-item prop="smtp" :label="$t('mail.config')">
-        <el-input v-model="dataForm.smtp" :placeholder="$t('mail.config')"></el-input>
-      </el-form-item>
-      <el-form-item prop="port" :label="$t('mail.port')">
-        <el-input v-model="dataForm.port" :placeholder="$t('mail.port')"></el-input>
-      </el-form-item>
-      <el-form-item prop="username" :label="$t('mail.username')">
-        <el-input v-model="dataForm.username" :placeholder="$t('mail.username')"></el-input>
-      </el-form-item>
-      <el-form-item prop="password" :label="$t('mail.password')">
-        <el-input v-model="dataForm.password" :placeholder="$t('mail.password')"></el-input>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  smtp: "",
-  port: "",
-  username: "",
-  password: ""
-});
-
-const rules = ref({
-  smtp: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  port: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  username: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  password: [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = () => {
-  visible.value = true;
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-
-  getInfo();
-};
-
-// 获取信息
-const getInfo = () => {
-  baseService.get("/sys/mailtemplate/config").then((res) => {
-    Object.assign(dataForm, res.data);
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    baseService.post("/sys/mailtemplate/saveConfig", dataForm).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList");
-        }
-      });
-    });
-  });
-};
-
-defineExpose({
-  init
-});
-</script>

+ 0 - 86
src/views/message/mail-template-send.vue

@@ -1,86 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="$t('mail.send')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
-      <el-form-item prop="mailTo" :label="$t('mail.mailTo')">
-        <el-input v-model="dataForm.mailTo" :placeholder="$t('mail.mailTo')"></el-input>
-      </el-form-item>
-      <el-form-item prop="mailCc" :label="$t('mail.mailCc')">
-        <el-input v-model="dataForm.mailCc" :placeholder="$t('mail.mailCc')"></el-input>
-      </el-form-item>
-      <el-form-item prop="params" :label="$t('mail.params')">
-        <el-input v-model="dataForm.params" :placeholder="t('mail.paramsTips')"></el-input>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { isEmail } from "@/utils/utils";
-import { IObject } from "@/types/interface";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  mailTo: "",
-  mailCc: "",
-  params: ""
-});
-
-const validateEmail = (rule: IObject, value: string, callback: (e?: Error) => any) => {
-  if (!isEmail(value)) {
-    return callback(new Error(t("validate.format", { attr: t("user.email") })));
-  }
-  callback();
-};
-
-const rules = ref({
-  mailTo: [
-    { required: true, message: t("validate.required"), trigger: "blur" },
-    { validator: validateEmail, trigger: "blur" }
-  ]
-});
-
-const init = () => {
-  visible.value = true;
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    baseService
-      .post("/sys/mailtemplate/send", dataForm, {
-        "content-type": "application/x-www-form-urlencoded"
-      })
-      .then((res) => {
-        ElMessage.success({
-          message: t("prompt.success"),
-          duration: 500,
-          onClose: () => {
-            visible.value = false;
-            emit("refreshDataList");
-          }
-        });
-      });
-  });
-};
-
-defineExpose({
-  init,
-  dataForm
-});
-</script>

+ 0 - 84
src/views/message/mail-template.vue

@@ -1,84 +0,0 @@
-<template>
-  <div class="mod-message__mail-template">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.name" :placeholder="$t('mail.name')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="configHandle()">{{ $t("mail.config") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" @sort-change="state.dataListSortChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="name" :label="$t('mail.name')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="subject" :label="$t('mail.subject')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="createDate" :label="$t('mail.createDate')" sortable="custom" header-align="center" align="center" width="180"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="180">
-        <template v-slot="scope">
-          <el-button type="primary" link @click="addOrUpdateHandle(scope.row.id)">{{ $t("update") }}</el-button>
-          <el-button type="primary" link @click="sendHandle(scope.row.id)">{{ $t("mail.send") }}</el-button>
-          <el-button type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update ref="addOrUpdateRef" @refreshDataList="state.getDataList"></add-or-update>
-    <!-- 弹窗, 邮件配置 -->
-    <config ref="configRef"></config>
-    <!-- 弹窗, 发送邮件 -->
-    <send :key="sendKey" ref="sendRef" @refreshDataList="state.getDataList"></send>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { nextTick, reactive, ref, toRefs } from "vue";
-import AddOrUpdate from "./mail-template-add-or-update.vue";
-import Config from "./mail-template-config.vue";
-import Send from "./mail-template-send.vue";
-
-const configRef = ref();
-const sendRef = ref();
-const sendKey = ref(0);
-
-const view = reactive({
-  getDataListURL: "/sys/mailtemplate/page",
-  getDataListIsPage: true,
-  deleteURL: "/sys/mailtemplate",
-  deleteIsBatch: true,
-  dataForm: {
-    name: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-// 邮件配置
-const configHandle = () => {
-  configRef.value.init();
-};
-
-// 发送邮件
-const sendHandle = (id: string) => {
-  sendKey.value++;
-  nextTick(() => {
-    sendRef.value.dataForm.id = id;
-    sendRef.value.init();
-  });
-};
-
-const addOrUpdateRef = ref();
-const addOrUpdateHandle = (id?: number) => {
-  addOrUpdateRef.value.init(id);
-};
-</script>

+ 0 - 154
src/views/message/sms-add-or-update.vue

@@ -1,154 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
-      <el-form-item prop="smsCode" :label="$t('sms.smsCode')">
-        <el-input v-model="dataForm.smsCode" :placeholder="$t('sms.smsCode')"></el-input>
-      </el-form-item>
-      <el-form-item prop="remark" :label="$t('sms.remark')">
-        <el-input v-model="dataForm.remark" :placeholder="$t('sms.remark')"></el-input>
-      </el-form-item>
-      <el-divider></el-divider>
-      <el-form-item :label="$t('sms.platform')">
-        <el-radio-group v-model="dataForm.platform">
-          <el-radio :label="1">{{ $t("sms.platform1") }}</el-radio>
-          <el-radio :label="2">{{ $t("sms.platform2") }}</el-radio>
-          <el-radio :label="3">{{ $t("sms.platform3") }}</el-radio>
-        </el-radio-group>
-      </el-form-item>
-      <template v-if="dataForm.platform === 1">
-        <el-form-item prop="config.aliyunAccessKeyId" :label="$t('sms.aliyunAccessKeyId')">
-          <el-input v-model="dataForm.config.aliyunAccessKeyId" :placeholder="$t('sms.aliyunAccessKeyIdTips')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.aliyunAccessKeySecret" :label="$t('sms.aliyunAccessKeySecret')">
-          <el-input v-model="dataForm.config.aliyunAccessKeySecret" :placeholder="$t('sms.aliyunAccessKeySecretTips')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.aliyunSignName" :label="$t('sms.aliyunSignName')">
-          <el-input v-model="dataForm.config.aliyunSignName" :placeholder="$t('sms.aliyunSignName')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.aliyunTemplateCode" :label="$t('sms.aliyunTemplateCode')">
-          <el-input v-model="dataForm.config.aliyunTemplateCode" :placeholder="$t('sms.aliyunTemplateCodeTips')"></el-input>
-        </el-form-item>
-      </template>
-      <template v-else-if="dataForm.platform === 2">
-        <el-form-item prop="config.qcloudAppId" :label="$t('sms.qcloudAppId')">
-          <el-input v-model="dataForm.config.qcloudAppId" :placeholder="$t('sms.qcloudAppIdTips')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.qcloudAppKey" :label="$t('sms.qcloudAppKey')">
-          <el-input v-model="dataForm.config.qcloudAppKey" :placeholder="$t('sms.qcloudAppKeyTips')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.qcloudSignName" :label="$t('sms.qcloudSignName')">
-          <el-input v-model="dataForm.config.qcloudSignName" :placeholder="$t('sms.qcloudSignName')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.qcloudTemplateId" :label="$t('sms.qcloudTemplateId')">
-          <el-input v-model="dataForm.config.qcloudTemplateId" :placeholder="$t('sms.qcloudTemplateIdTips')"></el-input>
-        </el-form-item>
-      </template>
-      <template v-else-if="dataForm.platform === 3">
-        <el-form-item prop="config.qiniuAccessKey" :label="$t('sms.qiniuAccessKey')">
-          <el-input v-model="dataForm.config.qiniuAccessKey" :placeholder="$t('sms.qiniuAccessKeyTips')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.qiniuSecretKey" :label="$t('sms.qiniuSecretKey')">
-          <el-input v-model="dataForm.config.qiniuSecretKey" :placeholder="$t('sms.qiniuSecretKeyTips')"></el-input>
-        </el-form-item>
-        <el-form-item prop="config.qiniuTemplateId" :label="$t('sms.qiniuTemplateId')">
-          <el-input v-model="dataForm.config.qiniuTemplateId" :placeholder="$t('sms.qiniuTemplateIdTips')"></el-input>
-        </el-form-item>
-      </template>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  smsCode: "",
-  remark: "",
-  platform: 1,
-  config: {
-    aliyunAccessKeyId: "",
-    aliyunAccessKeySecret: "",
-    aliyunSignName: "",
-    aliyunTemplateCode: "",
-    qcloudAppId: "",
-    qcloudAppKey: "",
-    qcloudSignName: "",
-    qcloudTemplateId: "",
-    qiniuAccessKey: "",
-    qiniuSecretKey: "",
-    qiniuTemplateId: ""
-  }
-});
-
-const rules = ref({
-  smsCode: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.aliyunAccessKeyId": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.aliyunAccessKeySecret": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.aliyunSignName": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.aliyunTemplateCode": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.qcloudAppId": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.qcloudAppKey": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.qcloudSignName": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.qcloudTemplateId": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.qiniuAccessKey": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.qiniuSecretKey": [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  "config.qiniuTemplateId": [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = (id?: number) => {
-  visible.value = true;
-  dataForm.id = "";
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-
-  if (id) {
-    getInfo(id);
-  }
-};
-
-// 获取信息
-const getInfo = (id: number) => {
-  baseService.get(`/sys/sms/${id}`).then((res) => {
-    Object.assign(dataForm, res.data);
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    (!dataForm.id ? baseService.post : baseService.put)("/sys/sms", dataForm).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList");
-        }
-      });
-    });
-  });
-};
-
-defineExpose({
-  init
-});
-</script>

+ 0 - 65
src/views/message/sms-log.vue

@@ -1,65 +0,0 @@
-<template>
-  <div class="mod-demo__syssmslog">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.smsCode" :placeholder="$t('sms.smsCode')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input v-model="state.dataForm.mobile" :placeholder="$t('sms.mobile')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-select v-model="state.dataForm.status" :placeholder="$t('sms.status')" clearable>
-          <el-option :label="$t('sms.status1')" :value="1"></el-option>
-          <el-option :label="$t('sms.status0')" :value="0"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button v-if="state.hasPermission('sys:smslog:all')" type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="smsCode" :label="$t('sms.smsCode')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="mobile" :label="$t('sms.mobile')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="params1" :label="$t('sms.params1')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="params2" :label="$t('sms.params2')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="params3" :label="$t('sms.params3')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="params4" :label="$t('sms.params4')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="status" :label="$t('sms.status')" header-align="center" align="center">
-        <template v-slot="scope">
-          <el-tag v-if="scope.row.status === 1" size="small">{{ $t("sms.status1") }}</el-tag>
-          <el-tag v-else size="small" type="danger">{{ $t("sms.status0") }}</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column prop="createDate" :label="$t('sms.createDate')" header-align="center" align="center" width="170"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
-        <template v-slot="scope">
-          <el-button v-if="state.hasPermission('sys:smslog:all')" type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, toRefs } from "vue";
-
-const view = reactive({
-  getDataListURL: "/sys/smslog/page",
-  getDataListIsPage: true,
-  deleteURL: "/sys/smslog",
-  deleteIsBatch: true,
-  dataForm: {
-    mobile: "",
-    status: "",
-    smsCode: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-</script>

+ 0 - 86
src/views/message/sms-send.vue

@@ -1,86 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="$t('sms.send')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
-      <el-form-item prop="mobile" :label="$t('sms.mobile')">
-        <el-input v-model="dataForm.mobile" :placeholder="$t('sms.mobile')"></el-input>
-      </el-form-item>
-      <el-form-item prop="params" :label="$t('sms.params')">
-        <el-input v-model="dataForm.params" :placeholder="$t('sms.paramsTips')"></el-input>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { isMobile } from "@/utils/utils";
-import { IObject } from "@/types/interface";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  smsCode: "",
-  mobile: "",
-  params: ""
-});
-
-const validateMobile = (rule: IObject, value: string, callback: (e?: Error) => any) => {
-  if (!isMobile(value)) {
-    return callback(new Error(t("validate.format", { attr: t("user.mobile") })));
-  }
-  callback();
-};
-const rules = ref({
-  mobile: [
-    { required: true, message: t("validate.required"), trigger: "blur" },
-    { validator: validateMobile, trigger: "blur" }
-  ]
-});
-
-const init = () => {
-  visible.value = true;
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    baseService
-      .post("/sys/sms/send", dataForm, {
-        "content-type": "application/x-www-form-urlencoded"
-      })
-      .then((res) => {
-        ElMessage.success({
-          message: t("prompt.success"),
-          duration: 500,
-          onClose: () => {
-            visible.value = false;
-            emit("refreshDataList");
-          }
-        });
-      });
-  });
-};
-
-defineExpose({
-  init,
-  dataForm
-});
-</script>

+ 0 - 82
src/views/message/sms.vue

@@ -1,82 +0,0 @@
-<template>
-  <div class="mod-message__sms">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-select v-model="state.dataForm.platform" :placeholder="$t('sms.platform')" clearable>
-          <el-option :label="$t('sms.platform1')" :value="1"></el-option>
-          <el-option :label="$t('sms.platform2')" :value="2"></el-option>
-          <el-option :label="$t('sms.platform3')" :value="3"></el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" @sort-change="state.dataListSortChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="smsCode" :label="$t('sms.smsCode')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="platform" :label="$t('sms.platform')" header-align="center" align="center">
-        <template v-slot="scope">
-          <el-tag v-if="scope.row.platform === 1" size="small">{{ $t("sms.platform1") }}</el-tag>
-          <el-tag v-else-if="scope.row.platform === 2" size="small">{{ $t("sms.platform2") }}</el-tag>
-          <el-tag v-else-if="scope.row.platform === 3" size="small">{{ $t("sms.platform3") }}</el-tag>
-        </template>
-      </el-table-column>
-      <el-table-column prop="remark" label="备注" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="createDate" :label="$t('sms.createDate')" sortable="custom" header-align="center" align="center" width="180"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="180">
-        <template v-slot="scope">
-          <el-button type="primary" link @click="sendHandle(scope.row)">{{ $t("sms.send") }}</el-button>
-          <el-button type="primary" link @click="addOrUpdateHandle(scope.row.id)">{{ $t("update") }}</el-button>
-          <el-button type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update ref="addOrUpdateRef" @refreshDataList="state.getDataList"></add-or-update>
-    <!-- 弹窗, 发送短信 -->
-    <send ref="sendRef" @refreshDataList="state.getDataList"></send>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, ref, toRefs } from "vue";
-import AddOrUpdate from "./sms-add-or-update.vue";
-import Send from "./sms-send.vue";
-import { IObject } from "@/types/interface";
-
-const sendRef = ref();
-
-const view = reactive({
-  getDataListURL: "/sys/sms/page",
-  getDataListIsPage: true,
-  deleteURL: "/sys/sms",
-  deleteIsBatch: true,
-  dataForm: {
-    mobile: "",
-    status: null,
-    platform: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-// 发送短信
-const sendHandle = (row: IObject) => {
-  sendRef.value.dataForm.smsCode = row.smsCode;
-  sendRef.value.init();
-};
-
-const addOrUpdateRef = ref();
-const addOrUpdateHandle = (id?: number) => {
-  addOrUpdateRef.value.init(id);
-};
-</script>

+ 0 - 102
src/views/mp/account-add-or-update.vue

@@ -1,102 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="140px">
-      <el-form-item label="名称" prop="name">
-        <el-input v-model="dataForm.name" placeholder="名称"></el-input>
-      </el-form-item>
-      <el-form-item label="AppID" prop="appId">
-        <el-input v-model="dataForm.appId" placeholder="AppID"></el-input>
-      </el-form-item>
-      <el-form-item label="AppSecret" prop="appSecret">
-        <el-input v-model="dataForm.appSecret" placeholder="AppSecret"></el-input>
-      </el-form-item>
-      <el-form-item label="Token" prop="token">
-        <el-input v-model="dataForm.token" placeholder="Token"></el-input>
-      </el-form-item>
-      <el-form-item label="EncodingAESKey" prop="aesKey">
-        <el-input v-model="dataForm.aesKey" placeholder="EncodingAESKey"></el-input>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  name: "",
-  appId: "",
-  appSecret: "",
-  token: "",
-  aesKey: "",
-  creator: "",
-  createDate: "",
-  updater: "",
-  updateDate: ""
-});
-
-const rules = ref({
-  name: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  appId: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  appSecret: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  token: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  aesKey: [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = (id?: number) => {
-  visible.value = true;
-  dataForm.id = "";
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-
-  if (id) {
-    getInfo(id);
-  }
-};
-
-// 获取信息
-const getInfo = (id: number) => {
-  baseService.get("/mp/account/" + id).then((res) => {
-    Object.assign(dataForm, res.data);
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    (!dataForm.id ? baseService.post : baseService.put)("/mp/account", dataForm).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList");
-        }
-      });
-    });
-  });
-};
-
-defineExpose({
-  init
-});
-</script>

+ 0 - 74
src/views/mp/account.vue

@@ -1,74 +0,0 @@
-<template>
-  <div class="mod-mp__account">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.name" placeholder="名称" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input v-model="state.dataForm.appId" placeholder="AppID" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="danger" @click="state.deleteHandle()">{{ $t("deleteBatch") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="name" label="名称" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="appId" label="AppID" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="appSecret" label="AppSecret" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="token" label="Token" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="aesKey" label="EncodingAESKey" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="createDate" label="创建时间" header-align="center" align="center"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="180">
-        <template v-slot="scope">
-          <el-button type="primary" link @click="addOrUpdateHandle(scope.row.id)">{{ $t("update") }}</el-button>
-          <el-button type="primary" link @click="mpHandle(scope.row.appId)">接入</el-button>
-          <el-button type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update ref="addOrUpdateRef" @refreshDataList="state.getDataList"></add-or-update>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, ref, toRefs } from "vue";
-import AddOrUpdate from "./account-add-or-update.vue";
-import app from "@/constants/app";
-import { ElMessageBox } from "element-plus";
-import { useI18n } from "vue-i18n";
-const { t } = useI18n();
-
-const view = reactive({
-  getDataListURL: "/mp/account/page",
-  getDataListIsPage: true,
-  deleteURL: "/mp/account",
-  deleteIsBatch: true,
-  dataForm: {
-    name: "",
-    appId: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-const mpHandle = (appId: any) => {
-  ElMessageBox.alert(app.api + "/mp/portal/" + appId, "公众号配置的URL", {
-    confirmButtonText: t("confirm")
-  });
-};
-
-const addOrUpdateRef = ref();
-const addOrUpdateHandle = (id?: number) => {
-  addOrUpdateRef.value.init(id);
-};
-</script>

+ 0 - 627
src/views/mp/menu.vue

@@ -1,627 +0,0 @@
-<template>
-  <el-row>
-    <el-col :span="4" class="mp_tree">
-      <el-input placeholder="输入关键字进行过滤" v-model="filterText"></el-input>
-      <el-tree :data="data" :props="defaultProps" node-key="appId" check-on-click-node="true" highlight-current="true" :filter-node-method="filterNode" ref="tree" class="filter-tree" @node-click="handleNodeClick"> </el-tree>
-    </el-col>
-    <el-col :span="8" class="menu_setting_area">
-      <div class="content">
-        <div id="app-menu">
-          <!-- 预览窗 -->
-          <div class="weixin-preview">
-            <div class="weixin-hd">
-              <div class="weixin-title"></div>
-            </div>
-            <div class="weixin-bd">
-              <ul class="weixin-menu" id="weixin-menu">
-                <li v-for="(btn, i) in menu.button" :key="btn" class="menu-item" :class="{ current: selectedMenuIndex === i && selectedMenuLevel() === 1 }" @click="selectedMenu(i, $event)">
-                  <div class="menu-item-title">
-                    <i class="icon_menu_dot"></i>
-                    <span>{{ btn.name }}</span>
-                  </div>
-                  <ul class="weixin-sub-menu" v-show="selectedMenuIndex === i">
-                    <li v-for="(sub, i2) in btn.sub_button" :key="sub" class="menu-sub-item" :class="{ current: selectedSubMenuIndex === i2 && selectedMenuLevel() === 2 }" @click.stop="selectedSubMenu(i2, $event)">
-                      <div class="menu-item-title">
-                        <span>{{ sub.name }}</span>
-                      </div>
-                    </li>
-                    <li v-if="btn.sub_button.length < 5" class="menu-sub-item" @click.stop="addMenu(2)">
-                      <div class="menu-item-title">
-                        <i class="icon14_menu_add"></i>
-                      </div>
-                    </li>
-                    <i class="menu-arrow arrow_out"></i>
-                    <i class="menu-arrow arrow_in"></i>
-                  </ul>
-                </li>
-                <li class="menu-item" v-if="menu.button.length < 3" @click="addMenu(1)"><i class="icon14_menu_add"></i></li>
-              </ul>
-            </div>
-          </div>
-          <!-- 主菜单 -->
-          <div class="weixin-menu-detail" v-if="selectedMenuLevel() === 1">
-            <div class="menu-input-group" style="border-bottom: 2px #e8e8e8 solid">
-              <div class="menu-name">{{ menu.button[selectedMenuIndex].name }}</div>
-              <div class="menu-del" @click="delMenu">删除菜单</div>
-            </div>
-            <div class="menu-input-group">
-              <div class="menu-label">菜单名称</div>
-              <div class="menu-input">
-                <el-input type="text" name="name" placeholder="请输入菜单名称" v-model="menu.button[selectedMenuIndex].name" @input="checkMenuName(menu.button[selectedMenuIndex].name)" />
-                <p class="menu-tips" style="color: #e15f63" v-show="menuNameBounds">字数超过上限</p>
-                <p class="menu-tips">字数不超过4个汉字或8个字母</p>
-              </div>
-            </div>
-            <template v-if="menu.button[selectedMenuIndex].sub_button.length === 0">
-              <div class="menu-input-group">
-                <div class="menu-label">菜单内容</div>
-                <div class="menu-input">
-                  <el-select v-model="menu.button[selectedMenuIndex].type" name="type" style="width: 100%">
-                    <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
-                  </el-select>
-                </div>
-              </div>
-              <div class="menu-content" v-if="selectedMenuType() === 1">
-                <div class="menu-input-group">
-                  <p class="menu-tips">订阅者点击该子菜单会跳到以下链接</p>
-                  <div class="menu-label">页面地址</div>
-                  <div class="menu-input">
-                    <input type="text" placeholder="" class="menu-input-text" v-model="menu.button[selectedMenuIndex].url" />
-                    <p class="menu-tips cursor" @click="selectNewsUrl">从公众号图文消息中选择</p>
-                  </div>
-                </div>
-              </div>
-              <div class="menu-msg-content" v-else-if="selectedMenuType() === 2" v-loading="materialLoading">
-                <div class="menu-msg-head"><i class="icon_msg_sender"></i>图文消息</div>
-                <div class="menu-msg-panel">
-                  <div class="menu-msg-select" v-if="!menu.button[selectedMenuIndex].media_id" @click="selectMaterialId">
-                    <i class="icon36_common add_gray"></i>
-                    <strong>从素材库中选择</strong>
-                  </div>
-                  <div class="menu-msg-select" v-else>
-                    <div class="menu-msg-title"><i class="icon_msg_sender"></i>{{ material.title }}</div>
-                    <a :href="material.url" target="_blank" class="el-button el-button--mini">查看</a>
-                    <el-button size="small" type="danger" @click="delMaterialId">删除</el-button>
-                  </div>
-                </div>
-              </div>
-              <div class="menu-content" v-else-if="selectedMenuType() === 3">
-                <div class="menu-input-group">
-                  <p class="menu-tips">用于消息接口推送,不超过128字节</p>
-                  <div class="menu-label">菜单KEY值</div>
-                  <div class="menu-input">
-                    <input type="text" placeholder="" class="menu-input-text" v-model="menu.button[selectedMenuIndex].key" />
-                  </div>
-                </div>
-              </div>
-              <div class="menu-content" v-else-if="selectedMenuType() === 4">
-                <div class="menu-input-group">
-                  <p class="menu-tips">订阅者点击该子菜单会跳到以下小程序</p>
-                  <div class="menu-label">小程序APPID</div>
-                  <div class="menu-input">
-                    <input type="text" placeholder="小程序的appid(仅认证公众号可配置)" class="menu-input-text" v-model="menu.button[selectedMenuIndex].appid" />
-                  </div>
-                </div>
-                <div class="menu-input-group">
-                  <div class="menu-label">小程序路径</div>
-                  <div class="menu-input">
-                    <input type="text" placeholder="小程序的页面路径 pages/Index/index" class="menu-input-text" v-model="menu.button[selectedMenuIndex].pagepath" />
-                  </div>
-                </div>
-                <div class="menu-input-group">
-                  <div class="menu-label">备用网页</div>
-                  <div class="menu-input">
-                    <input type="text" placeholder="" class="menu-input-text" v-model="menu.button[selectedMenuIndex].url" />
-                    <p class="menu-tips">旧版微信客户端无法支持小程序,用户点击菜单时将会打开备用网页。</p>
-                  </div>
-                </div>
-              </div>
-            </template>
-          </div>
-          <!-- 子菜单 -->
-          <div class="weixin-menu-detail" v-if="selectedMenuLevel() === 2">
-            <div class="menu-input-group" style="border-bottom: 2px #e8e8e8 solid">
-              <div class="menu-name">{{ menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].name }}</div>
-              <div class="menu-del" @click="delMenu">删除子菜单</div>
-            </div>
-            <div class="menu-input-group">
-              <div class="menu-label">子菜单名称</div>
-              <div class="menu-input">
-                <el-input type="text" placeholder="请输入子菜单名称" v-model="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].name" @input="checkMenuName(menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].name)" />
-                <p class="menu-tips" style="color: #e15f63" v-show="menuNameBounds">字数超过上限</p>
-                <p class="menu-tips">字数不超过8个汉字或16个字母</p>
-              </div>
-            </div>
-            <div class="menu-input-group">
-              <div class="menu-label">子菜单内容</div>
-              <div class="menu-input">
-                <el-select v-model="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].type" name="type" style="width: 100%">
-                  <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
-                </el-select>
-              </div>
-            </div>
-            <div class="menu-content" v-if="selectedMenuType() === 1">
-              <div class="menu-input-group">
-                <p class="menu-tips">订阅者点击该子菜单会跳到以下链接</p>
-                <div class="menu-label">页面地址</div>
-                <div class="menu-input">
-                  <input type="text" placeholder="" class="menu-input-text" v-model="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].url" />
-                  <p class="menu-tips cursor" @click="selectNewsUrl">从公众号图文消息中选择</p>
-                </div>
-              </div>
-            </div>
-            <div class="menu-msg-content" v-else-if="selectedMenuType() == 2" v-loading="materialLoading">
-              <div class="menu-msg-head"><i class="icon_msg_sender"></i>图文消息</div>
-              <div class="menu-msg-panel">
-                <div class="menu-msg-select" v-if="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].media_id == '' || menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].media_id == undefined" @click="selectMaterialId">
-                  <i class="icon36_common add_gray"></i>
-                  <strong>从素材库中选择</strong>
-                </div>
-                <div class="menu-msg-select" v-else>
-                  <i class="icon_msg_sender"></i>{{ material.title }}
-                  <a :href="material.url" target="_blank" class="el-button el-button--mini">查看</a>
-                  <el-button size="small" type="danger" @click="delMaterialId">删除</el-button>
-                </div>
-              </div>
-            </div>
-            <div class="menu-content" v-else-if="selectedMenuType() === 3">
-              <div class="menu-input-group">
-                <p class="menu-tips">用于消息接口推送,不超过128字节</p>
-                <div class="menu-label">菜单KEY值</div>
-                <div class="menu-input">
-                  <input type="text" placeholder="" class="menu-input-text" v-model="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].key" />
-                </div>
-              </div>
-            </div>
-            <div class="menu-content" v-else-if="selectedMenuType() === 4">
-              <div class="menu-input-group">
-                <p class="menu-tips">订阅者点击该子菜单会跳到以下小程序</p>
-                <div class="menu-label">小程序APPID</div>
-                <div class="menu-input">
-                  <input type="text" placeholder="小程序的appid(仅认证公众号可配置)" class="menu-input-text" v-model="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].appid" />
-                </div>
-              </div>
-              <div class="menu-input-group">
-                <div class="menu-label">小程序路径</div>
-                <div class="menu-input">
-                  <input type="text" placeholder="小程序的页面路径 pages/Index/index" class="menu-input-text" v-model="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].pagepath" />
-                </div>
-              </div>
-              <div class="menu-input-group">
-                <div class="menu-label">备用网页</div>
-                <div class="menu-input">
-                  <input type="text" placeholder="" class="menu-input-text" v-model="menu.button[selectedMenuIndex].sub_button[selectedSubMenuIndex].url" />
-                  <p class="menu-tips">旧版微信客户端无法支持小程序,用户点击菜单时将会打开备用网页。</p>
-                </div>
-              </div>
-            </div>
-          </div>
-          <div class="weixin-btn-group" style="padding-top: 20px">
-            <el-button type="primary" @click="onMenuSubmit">发布菜单</el-button>
-            <el-button type="danger" @click="onMenuClear">清空菜单</el-button>
-          </div>
-          <el-dialog title="选择图文" v-model="newsDialog">
-            <el-table :data="newsList" stripe>
-              <el-table-column label="图文标题" prop="content.articles[0].title"></el-table-column>
-              <el-table-column label="操作">
-                <template v-slot="{ row }">
-                  <el-button type="primary" size="small" @click="setNewsUrl(row)">选择</el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-dialog>
-          <el-dialog title="选择素材" v-model="materialDialog">
-            <el-table :data="materialList" stripe>
-              <el-table-column label="素材名称">
-                <template v-slot="{ row }">
-                  <div v-for="(item, index) in row.content.articles" :key="item">({{ index + 1 }}).{{ item.title }}</div>
-                </template>
-              </el-table-column>
-              <el-table-column label="操作">
-                <template v-slot="{ row }">
-                  <el-button type="primary" size="small" @click="setMaterialId(row)">选择</el-button>
-                </template>
-              </el-table-column>
-            </el-table>
-          </el-dialog>
-        </div>
-      </div>
-    </el-col>
-  </el-row>
-</template>
-<style>
-@import "@/assets/mp/menu.css";
-</style>
-<script>
-import { defineComponent, reactive } from "vue";
-import baseService from "../../service/baseService";
-import { ElMessage, ElMessageBox } from "element-plus";
-export default defineComponent({
-  setup() {
-    return reactive({
-      filterText: "",
-      data: [],
-      appId: "",
-      defaultProps: {
-        children: "children",
-        label: "name"
-      },
-      options: [
-        {
-          value: "view",
-          label: "跳转网页(view)"
-        },
-        {
-          value: "media_id",
-          label: "发送消息(media_id)"
-        },
-        {
-          value: "miniprogram",
-          label: "打开指定小程序(miniprogram)"
-        },
-        {
-          value: "click",
-          label: "自定义点击事件(click)"
-        },
-        {
-          value: "scancode_push",
-          label: "扫码上传消息(scancode_push)"
-        },
-        {
-          value: "scancode_waitmsg",
-          label: "扫码提示下发(scancode_waitmsg)"
-        },
-        {
-          value: "pic_sysphoto",
-          label: "系统相机拍照(pic_sysphoto)"
-        },
-        {
-          value: "pic_photo_or_album",
-          label: "弹出拍照或者相册(pic_photo_or_album)"
-        },
-        {
-          value: "pic_weixin",
-          label: "弹出微信相册(pic_weixin)"
-        },
-        {
-          value: "location_select",
-          label: "弹出地理位置选择器(location_select)"
-        }
-      ],
-      menu: { button: [] }, //当前菜单
-      selectedMenuIndex: "", //当前选中菜单索引
-      selectedSubMenuIndex: "", //当前选中子菜单索引
-      menuNameBounds: false, //菜单长度是否过长
-      material: {
-        title: "",
-        url: "",
-        thumb_url: ""
-      },
-      materialLoading: false,
-      materialDialog: false,
-      materialList: [],
-      materialListOffset: 0,
-      materialListTotal: 0,
-      newsDialog: false,
-      newsList: [],
-      newsListOffset: 0,
-      newsListTotal: 0
-    });
-  },
-  created() {
-    this.init();
-  },
-  watch: {
-    filterText(val) {
-      this.$refs.tree.filter(val);
-    }
-  },
-  methods: {
-    filterNode(value, data) {
-      if (!value) return true;
-      return data.name.indexOf(value) !== -1;
-    },
-    handleNodeClick(data) {
-      this.appId = data.appId;
-      this.getMenu(this.appId);
-    },
-    getMenu(appId) {
-      baseService.get("/mp/menu/" + appId).then((res) => {
-        if (res.data == null) {
-          this.menu = JSON.parse('{"button":[]}');
-        } else {
-          this.menu = JSON.parse(res.data.menu);
-        }
-      });
-    },
-    init() {
-      baseService.get("/mp/account/page").then((res) => {
-        this.data = res.data.list;
-
-        // 选中第一个
-        if (res.data.total > 0) {
-          this.$nextTick(() => {
-            this.$refs.tree.setCurrentKey(this.data[0].appId);
-            this.appId = this.data[0].appId;
-            this.getMenu(this.appId);
-          });
-        }
-      });
-    },
-    //选中主菜单
-    selectedMenu(i) {
-      this.selectedSubMenuIndex = "";
-      this.selectedMenuIndex = i;
-      let selectedMenu = this.menu.button[this.selectedMenuIndex];
-      //清空选中media_id 防止再次请求
-      if (selectedMenu.media_id && this.selectedMenuType() === 2) {
-        this.getMaterial(selectedMenu.media_id);
-      }
-      //检查名称长度
-      this.checkMenuName(selectedMenu.name);
-    },
-    //选中子菜单
-    selectedSubMenu(i) {
-      this.selectedSubMenuIndex = i;
-      let selectedSubMenu = this.menu.button[this.selectedMenuIndex].sub_button[this.selectedSubMenuIndex];
-      if (selectedSubMenu.media_id && this.selectedMenuType() === 2) {
-        this.getMaterial(selectedSubMenu.media_id);
-      }
-      this.checkMenuName(selectedSubMenu.name);
-    },
-    //选中菜单级别
-    selectedMenuLevel() {
-      if (this.selectedMenuIndex !== "" && this.selectedSubMenuIndex === "") {
-        //主菜单
-        return 1;
-      } else if (this.selectedMenuIndex !== "" && this.selectedSubMenuIndex !== "") {
-        //子菜单
-        return 2;
-      } else {
-        //未选中任何菜单
-        return 0;
-      }
-    },
-    //获取菜单类型 1. view网页类型,2. media_id类型和view_limited类型 3. click点击类型,4.miniprogram表示小程序类型
-    selectedMenuType() {
-      if (this.selectedMenuLevel() === 1 && this.menu.button[this.selectedMenuIndex].sub_button.length === 0) {
-        //主菜单
-        switch (this.menu.button[this.selectedMenuIndex].type) {
-          case "view":
-            return 1;
-          case "media_id":
-            return 2;
-          case "view_limited":
-            return 2;
-          case "click":
-            return 3;
-          case "scancode_push":
-            return 3;
-          case "scancode_waitmsg":
-            return 3;
-          case "pic_sysphoto":
-            return 3;
-          case "pic_photo_or_album":
-            return 3;
-          case "pic_weixin":
-            return 3;
-          case "location_select":
-            return 3;
-          case "miniprogram":
-            return 4;
-        }
-      } else if (this.selectedMenuLevel() === 2) {
-        //子菜单
-        switch (this.menu.button[this.selectedMenuIndex].sub_button[this.selectedSubMenuIndex].type) {
-          case "view":
-            return 1;
-          case "media_id":
-            return 2;
-          case "view_limited":
-            return 2;
-          case "click":
-            return 3;
-          case "scancode_push":
-            return 3;
-          case "scancode_waitmsg":
-            return 3;
-          case "pic_sysphoto":
-            return 3;
-          case "pic_photo_or_album":
-            return 3;
-          case "pic_weixin":
-            return 3;
-          case "location_select":
-            return 3;
-          case "miniprogram":
-            return 4;
-        }
-      } else {
-        return 1;
-      }
-    },
-    //添加菜单
-    addMenu(level) {
-      if (level === 1 && this.menu.button.length < 3) {
-        this.menu.button.push({
-          type: "view",
-          name: "菜单名称",
-          sub_button: [],
-          url: ""
-        });
-        this.selectedMenuIndex = this.menu.button.length - 1;
-        this.selectedSubMenuIndex = "";
-      }
-      if (level === 2 && this.menu.button[this.selectedMenuIndex].sub_button.length < 5) {
-        this.menu.button[this.selectedMenuIndex].sub_button.push({
-          type: "view",
-          name: "子菜单名称",
-          url: ""
-        });
-        this.selectedSubMenuIndex = this.menu.button[this.selectedMenuIndex].sub_button.length - 1;
-      }
-    },
-    //删除菜单
-    async delMenu() {
-      if (this.selectedMenuLevel() === 1) {
-        try {
-          await ElMessageBox.confirm("删除后菜单下设置的内容将被删除", "提示");
-        } catch {
-          return;
-        }
-        if (this.selectedMenuIndex === 0) {
-          this.menu.button.splice(this.selectedMenuIndex, 1);
-          this.selectedMenuIndex = 0;
-        } else {
-          this.menu.button.splice(this.selectedMenuIndex, 1);
-          this.selectedMenuIndex -= 1;
-        }
-        if (this.menu.button.length === 0) {
-          this.selectedMenuIndex = "";
-        }
-      } else if (this.selectedMenuLevel() === 2) {
-        if (this.selectedSubMenuIndex === 0) {
-          this.menu.button[this.selectedMenuIndex].sub_button.splice(this.selectedSubMenuIndex, 1);
-          this.selectedSubMenuIndex = 0;
-        } else {
-          this.menu.button[this.selectedMenuIndex].sub_button.splice(this.selectedSubMenuIndex, 1);
-          this.selectedSubMenuIndex -= 1;
-        }
-        if (this.menu.button[this.selectedMenuIndex].sub_button.length === 0) {
-          this.selectedSubMenuIndex = "";
-        }
-      }
-    },
-    //检查菜单名称长度
-    checkMenuName(val) {
-      if (this.selectedMenuLevel() === 1 && this.getMenuNameLen(val) <= 8) {
-        this.menuNameBounds = false;
-      } else if (this.selectedMenuLevel() === 2 && this.getMenuNameLen(val) <= 16) {
-        this.menuNameBounds = false;
-      } else {
-        this.menuNameBounds = true;
-      }
-    },
-    //获取菜单名称长度
-    getMenuNameLen(val) {
-      var len = 0;
-      for (var i = 0; i < val.length; i++) {
-        var a = val.charAt(i);
-        a.match(/[^\x00-\xff]/gi) != null ? (len += 2) : (len += 1);
-      }
-      return len;
-    },
-    //选择公众号素材库素材
-    selectMaterialId() {
-      this.materialDialog = true;
-      this.getMaterialList();
-    },
-    //选择公众号图文链接
-    selectNewsUrl() {
-      this.newsDialog = true;
-      this.getNewsList();
-    },
-    //设置选择的素材id
-    setMaterialId(row) {
-      let { mediaId, content } = row;
-      if (this.selectedMenuLevel() === 1) {
-        this.menu.button[this.selectedMenuIndex]["media_id"] = mediaId;
-      } else if (this.selectedMenuLevel() === 2) {
-        this.menu.button[this.selectedMenuIndex].sub_button[this.selectedSubMenuIndex]["media_id"] = mediaId;
-      }
-      let { articles } = content;
-      let item = articles[0];
-      this.material.title = item.title;
-      this.material.url = item.url;
-      this.materialDialog = false;
-    },
-    //删除选择的素材id
-    delMaterialId() {
-      if (this.selectedMenuLevel() === 1) {
-        this.menu.button[this.selectedMenuIndex]["media_id"] = "";
-      } else if (this.selectedMenuLevel() === 2) {
-        this.menu.button[this.selectedMenuIndex].sub_button[this.selectedSubMenuIndex]["media_id"] = "";
-      }
-    },
-    //设置选择的图文链接
-    setNewsUrl(row) {
-      let { content } = row;
-      let { articles } = content;
-      if (this.selectedMenuLevel() === 1) {
-        this.menu.button[this.selectedMenuIndex]["url"] = articles[0].url;
-      } else if (this.selectedMenuLevel() === 2) {
-        this.menu.button[this.selectedMenuIndex].sub_button[this.selectedSubMenuIndex]["url"] = articles[0].url;
-      }
-      this.newsDialog = false;
-    },
-    //获取素材信息
-    getMaterial(mediaId) {
-      this.materialLoading = true;
-
-      baseService.get("/mp/material/get", { appId: this.appId, mediaId: mediaId }).then((res) => {
-        this.material.title = res.data.articles[0].title;
-        this.material.url = res.data.articles[0].url;
-      });
-      this.materialLoading = false;
-    },
-    getNewsList() {
-      if (this.newsListOffset > 0 && this.newsListOffset >= this.newsListOffset) {
-        return;
-      }
-
-      baseService.get("/mp/material/page", { appId: this.appId, type: "news", offset: this.newsListOffset, limit: 10 }).then((res) => {
-        this.newsList = this.newsList.concat(res.data.list);
-        this.newsListOffset += res.data.list.length;
-        this.newsListTotal = res.data.total;
-      });
-    },
-    getMaterialList() {
-      if (this.materialListOffset > 0 && this.materialListOffset >= this.materialListTotal) {
-        return;
-      }
-
-      baseService.get("/mp/material/page", { appId: this.appId, type: "news", offset: this.materialListOffset, limit: 10 }).then((res) => {
-        this.materialList = this.materialList.concat(res.data.list);
-        this.materialListOffset += res.data.list.length;
-        this.materialListTotal = res.data.total;
-      });
-    },
-    async onMenuSubmit() {
-      await ElMessageBox.confirm("确定后发布当前自定义菜单", "提示");
-
-      const dataForm = {};
-      dataForm.appId = this.appId;
-      dataForm.menu = JSON.stringify(this.menu);
-      baseService.post("/mp/menu/" + this.appId, dataForm).then((res) => {
-        ElMessage.success({
-          message: this.$t("prompt.success"),
-          duration: 500,
-          onClose: () => {
-            this.visible = false;
-          }
-        });
-        ElMessage.success("发布成功");
-        console.log(dataForm.menu);
-      });
-    },
-    async onMenuClear() {
-      try {
-        await ElMessageBox.confirm("确定后将清空后公众号自定义菜单", "提示");
-        baseService.delete("/mp/menu/" + this.appId).then((res) => {
-          ElMessage.success({
-            message: this.$t("prompt.success"),
-            duration: 500,
-            onClose: () => {
-              this.visible = false;
-            }
-          });
-        });
-        ElMessage.success("清空成功");
-        this.menu.button = [];
-      } catch (err) {
-        console.error(err);
-      }
-    }
-  }
-});
-</script>

+ 0 - 47
src/views/pay/alipaynotifylog.vue

@@ -1,47 +0,0 @@
-<template>
-  <div class="mod-pay__alipaynotifylog">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.outTradeNo" :placeholder="$t('order.outTradeNo')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input v-model="state.dataForm.notifyId" :placeholder="$t('order.notifyId')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input v-model="state.dataForm.tradeStatus" :placeholder="$t('order.tradeStatus')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="outTradeNo" :label="$t('order.orderId')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="totalAmount" :label="$t('order.totalAmount')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="buyerPayAmount" :label="$t('order.buyerPayAmount')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="notifyId" :label="$t('order.notifyId')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="tradeNo" :label="$t('order.tradeNo')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="tradeStatus" :label="$t('order.tradeStatus')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="createDate" :label="$t('createDate')" header-align="center" align="center"></el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, toRefs } from "vue";
-
-const view = reactive({
-  getDataListURL: "/pay/alipayNotifyLog/page",
-  getDataListIsPage: true,
-  deleteIsBatch: true,
-  dataForm: {
-    outTradeNo: "",
-    notifyId: "",
-    tradeStatus: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-</script>

+ 0 - 68
src/views/pay/order-add-or-update.vue

@@ -1,68 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="!dataForm.id ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" :label-width="$i18n.locale === 'en-US' ? '120px' : '80px'">
-      <el-form-item :label="$t('order.productId')" prop="productId">
-        <el-input v-model="dataForm.productId"></el-input>
-      </el-form-item>
-      <el-form-item :label="$t('order.productName')" prop="productName">
-        <el-input v-model="dataForm.productName"></el-input>
-      </el-form-item>
-      <el-form-item :label="$t('order.payAmount')" prop="payAmount">
-        <el-input v-model="dataForm.payAmount"></el-input>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-
-const emit = defineEmits(["refreshDataList"]);
-const { t } = useI18n();
-const visible = ref(false);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  orderId: "",
-  productId: "",
-  productName: "",
-  payAmount: "",
-  status: "",
-  userId: ""
-});
-
-const init = () => {
-  visible.value = true;
-
-  // 重置表单数据
-  if (dataFormRef.value) {
-    dataFormRef.value.resetFields();
-  }
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  baseService.post("/pay/order", dataForm).then((res) => {
-    ElMessage.success({
-      message: t("prompt.success"),
-      duration: 500,
-      onClose: () => {
-        visible.value = false;
-        emit("refreshDataList");
-      }
-    });
-  });
-};
-
-defineExpose({
-  init
-});
-</script>

+ 0 - 73
src/views/pay/order.vue

@@ -1,73 +0,0 @@
-<template>
-  <div class="mod-pay__order">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-input v-model="state.dataForm.orderId" :placeholder="$t('order.orderId')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <el-input v-model="state.dataForm.userId" :placeholder="$t('order.userId')" clearable></el-input>
-      </el-form-item>
-      <el-form-item>
-        <my-select v-model="state.dataForm.status" dict-type="order_status" :placeholder="$t('order.status')"></my-select>
-      </el-form-item>
-      <el-form-item>
-        <el-button @click="state.getDataList()">{{ $t("query") }}</el-button>
-      </el-form-item>
-      <el-form-item>
-        <el-button type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table v-loading="state.dataListLoading" :data="state.dataList" border @selection-change="state.dataListSelectionChangeHandle" style="width: 100%">
-      <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
-      <el-table-column prop="orderId" :label="$t('order.orderId')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="productName" :label="$t('order.productName')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="payAmount" :label="$t('order.payAmount')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="status" :label="$t('order.status')" header-align="center" align="center">
-        <template v-slot="scope">
-          {{ state.getDictLabel("order_status", scope.row.status) }}
-        </template>
-      </el-table-column>
-      <el-table-column prop="payAt" :label="$t('order.payAt')" header-align="center" align="center"></el-table-column>
-      <el-table-column prop="createDate" :label="$t('order.createDate')" header-align="center" align="center"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
-        <template v-slot="scope">
-          <el-button v-if="scope.row.status === 0" type="primary" link @click="payHandle(scope.row.orderId)">{{ $t("order.pay") }}</el-button>
-          <el-button v-if="scope.row.status === 0" type="primary" link @click="state.deleteHandle(scope.row.id)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <el-pagination :current-page="state.page" :page-sizes="[10, 20, 50, 100]" :page-size="state.limit" :total="state.total" layout="total, sizes, prev, pager, next, jumper" @size-change="state.pageSizeChangeHandle" @current-change="state.pageCurrentChangeHandle"> </el-pagination>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update ref="addOrUpdateRef" @refreshDataList="state.getDataList"></add-or-update>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, ref, toRefs } from "vue";
-import AddOrUpdate from "./order-add-or-update.vue";
-import app from "@/constants/app";
-
-const view = reactive({
-  getDataListURL: "/pay/order/page",
-  getDataListIsPage: true,
-  deleteURL: "/pay/order",
-  deleteIsBatch: true,
-  dataForm: {
-    orderId: "",
-    status: "",
-    userId: ""
-  }
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-const payHandle = (orderId: string) => {
-  window.open(`${app.api}/pay/alipay/webPay?orderId=` + orderId);
-};
-
-const addOrUpdateRef = ref();
-const addOrUpdateHandle = () => {
-  addOrUpdateRef.value.init();
-};
-</script>

+ 0 - 106
src/views/sys/region-add-or-update.vue

@@ -1,106 +0,0 @@
-<template>
-  <el-dialog v-model="visible" :title="insert ? $t('add') : $t('update')" :close-on-click-modal="false" :close-on-press-escape="false">
-    <el-form :model="dataForm" :rules="rules" ref="dataFormRef" @keyup.enter="dataFormSubmitHandle()" label-width="120px">
-      <el-form-item prop="parentName" label="上级区域">
-        <my-region-tree ref="regionListTree" v-model="dataForm.pid" placeholder="选择区域" v-model:parent-name="dataForm.parentName"></my-region-tree>
-      </el-form-item>
-      <el-form-item prop="name" :label="$t('region.name')">
-        <el-input v-model="dataForm.name" :placeholder="$t('region.name')"></el-input>
-      </el-form-item>
-      <el-form-item prop="id" :label="$t('region.id')">
-        <el-input v-model="dataForm.id" :disabled="!insert" :placeholder="$t('region.id')"></el-input>
-      </el-form-item>
-      <el-form-item prop="sort" :label="$t('region.sort')">
-        <el-input-number v-model="dataForm.sort" controls-position="right" :min="0" :label="$t('region.sort')"></el-input-number>
-      </el-form-item>
-    </el-form>
-    <template v-slot:footer>
-      <el-button @click="visible = false">{{ $t("cancel") }}</el-button>
-      <el-button type="primary" @click="dataFormSubmitHandle()">{{ $t("confirm") }}</el-button>
-    </template>
-  </el-dialog>
-</template>
-
-<script lang="ts" setup>
-import { reactive, ref } from "vue";
-import baseService from "@/service/baseService";
-import { useI18n } from "vue-i18n";
-import { ElMessage } from "element-plus";
-const { t } = useI18n();
-const emit = defineEmits(["refreshDataList"]);
-
-const visible = ref(false);
-const insert = ref(true);
-const dataFormRef = ref();
-
-const dataForm = reactive({
-  id: "",
-  name: "",
-  pid: "0",
-  parentName: "",
-  sort: 0
-});
-
-const rules = ref({
-  id: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  name: [{ required: true, message: t("validate.required"), trigger: "blur" }],
-  sort: [{ required: true, message: t("validate.required"), trigger: "blur" }]
-});
-
-const init = (id?: string) => {
-  insert.value = true;
-  visible.value = true;
-  dataForm.pid = "0";
-
-  if (id) {
-    insert.value = false;
-    getInfo(id);
-  } else {
-    // 重置表单数据
-    if (dataFormRef.value) {
-      dataFormRef.value.resetFields();
-    }
-  }
-};
-
-// 获取信息
-const getInfo = (id: string) => {
-  baseService.get(`/sys/region/${id}`).then((res) => {
-    Object.assign(dataForm, res.data);
-  });
-};
-
-// 表单提交
-const dataFormSubmitHandle = () => {
-  dataFormRef.value.validate((valid: boolean) => {
-    if (!valid) {
-      return false;
-    }
-    (insert.value ? baseService.post : baseService.put)("/sys/region", dataForm).then((res) => {
-      ElMessage.success({
-        message: t("prompt.success"),
-        duration: 500,
-        onClose: () => {
-          visible.value = false;
-          emit("refreshDataList", dataForm);
-        }
-      });
-    });
-  });
-};
-
-defineExpose({
-  init
-});
-</script>
-
-<style lang="less">
-.mod-sys__region {
-  .region-list {
-    .el-input__inner,
-    .el-input__suffix {
-      cursor: pointer;
-    }
-  }
-}
-</style>

+ 0 - 92
src/views/sys/region.vue

@@ -1,92 +0,0 @@
-<template>
-  <div class="mod-sys__region">
-    <el-form :inline="true" :model="state.dataForm" @keyup.enter="state.getDataList()">
-      <el-form-item>
-        <el-button v-if="state.hasPermission('sys:region:save')" type="primary" @click="addOrUpdateHandle()">{{ $t("add") }}</el-button>
-      </el-form-item>
-    </el-form>
-    <el-table ref="elTableRef" v-loading="state.dataListLoading" :data="state.dataList" row-key="id" border lazy :load="load" style="width: 100%" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
-      <el-table-column prop="name" :label="$t('region.name')" header-align="center" min-width="180">
-        <template v-slot="scope">
-          {{ scope.row.name }}
-        </template>
-      </el-table-column>
-      <el-table-column prop="id" :label="$t('region.id')" header-align="center" min-width="180">
-        <template v-slot="scope">
-          {{ scope.row.id }}
-        </template>
-      </el-table-column>
-      <el-table-column prop="treeLevel" :label="$t('region.type')" header-align="center" min-width="150">
-        <template v-slot="scope">
-          <span v-if="scope.row.treeLevel === 1">{{ $t("region.province") }}</span>
-          <span v-else-if="scope.row.treeLevel === 2">{{ $t("region.city") }}</span>
-          <span v-else>{{ $t("region.county") }}</span>
-        </template>
-      </el-table-column>
-      <el-table-column prop="sort" :label="$t('region.sort')" header-align="center" align="center" min-width="150"></el-table-column>
-      <el-table-column prop="updateDate" :label="$t('region.updateDate')" header-align="center" align="center" min-width="150"></el-table-column>
-      <el-table-column :label="$t('handle')" fixed="right" header-align="center" align="center" width="150">
-        <template v-slot="scope">
-          <el-button v-if="state.hasPermission('sys:region:update')" type="primary" link @click="addOrUpdateHandle(scope.row.id)">{{ $t("update") }}</el-button>
-          <el-button v-if="state.hasPermission('sys:region:delete')" type="primary" link @click="deleteRow(scope.row)">{{ $t("delete") }}</el-button>
-        </template>
-      </el-table-column>
-    </el-table>
-    <!-- 弹窗, 新增 / 修改 -->
-    <add-or-update ref="addOrUpdateRef" @refreshDataList="refreshData"></add-or-update>
-  </div>
-</template>
-
-<script lang="ts" setup>
-import useView from "@/hooks/useView";
-import { reactive, ref, toRefs } from "vue";
-import AddOrUpdate from "./region-add-or-update.vue";
-import baseService from "@/service/baseService";
-import { IObject, IFunction } from "@/types/interface";
-
-const elTableRef = ref();
-
-const view = reactive({
-  getDataListURL: "/sys/region/list",
-  deleteURL: "/sys/region",
-  nodeMaps: new Map()
-});
-
-const state = reactive({ ...useView(view), ...toRefs(view) });
-
-const load = (tree: IObject, treeNode: IObject, resolve: IFunction) => {
-  state.nodeMaps.set(tree.id, { tree, treeNode, resolve });
-  baseService.get(`/sys/region/list?pid=${tree.id}`).then((res) => {
-    resolve(res.data);
-  });
-};
-
-const deleteRow = (row: IObject) => {
-  const { id, pid } = row;
-  state.deleteHandle(id).then(() => {
-    elTableRef.value.store.states.lazyTreeNodeMap["pid"] = [];
-
-    const { tree, treeNode, resolve } = state.nodeMaps.get(pid) || {};
-    if (tree) {
-      load(tree, treeNode, resolve);
-    } else {
-      state.getDataList();
-    }
-  });
-};
-
-const refreshData = (row: IObject) => {
-  const { pid } = row;
-  const { tree, treeNode, resolve } = state.nodeMaps.get(pid) || {};
-  if (tree) {
-    load(tree, treeNode, resolve);
-  } else {
-    state.getDataList();
-  }
-};
-
-const addOrUpdateRef = ref();
-const addOrUpdateHandle = (id?: string) => {
-  addOrUpdateRef.value.init(id);
-};
-</script>