紫风天下行 1 年之前
父节点
当前提交
0585fb9eb1
共有 9 个文件被更改,包括 1063 次插入1 次删除
  1. 2 1
      package.json
  2. 3 0
      src/App.vue
  3. 97 0
      src/api/company.js
  4. 89 0
      src/view/abc/abc.vue
  5. 468 0
      src/view/company/company.vue
  6. 103 0
      src/view/company/companyForm.vue
  7. 107 0
      src/view/demo/demo1.vue
  8. 191 0
      src/view/demo/demo2.vue
  9. 3 0
      vite.config.js

+ 2 - 1
package.json

@@ -19,7 +19,7 @@
         "axios": "^1.4.0",
         "core-js": "^3.31.1",
         "echarts": "5.4.3",
-        "element-plus": "^2.3.8",
+        "element-plus": "^2.4.4",
         "highlight.js": "^11.8.0",
         "marked": "4.3.0",
         "mitt": "^3.0.1",
@@ -31,6 +31,7 @@
         "spark-md5": "^3.0.2",
         "tailwindcss": "^3.3.3",
         "vue": "^3.3.4",
+        "vue-contextmenu": "^1.5.11",
         "vue-router": "^4.2.4"
     },
     "devDependencies": {

+ 3 - 0
src/App.vue

@@ -30,4 +30,7 @@ defineOptions({
 .el-button{
   font-weight: 400 !important;
 }
+.el-main{
+  --el-main-padding: 0 20px !important;
+}
 </style>

+ 97 - 0
src/api/company.js

@@ -0,0 +1,97 @@
+import service from '@/utils/request'
+
+// @Tags Company
+// @Summary 创建company表
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body model.Company true "创建company表"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"创建成功"}"
+// @Router /company/createCompany [post]
+export const createCompany = (data) => {
+  return service({
+    url: '/company/createCompany',
+    method: 'post',
+    data
+  })
+}
+
+// @Tags Company
+// @Summary 删除company表
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body model.Company true "删除company表"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
+// @Router /company/deleteCompany [delete]
+export const deleteCompany = (data) => {
+  return service({
+    url: '/company/deleteCompany',
+    method: 'delete',
+    data
+  })
+}
+
+// @Tags Company
+// @Summary 批量删除company表
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body request.IdsReq true "批量删除company表"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"删除成功"}"
+// @Router /company/deleteCompany [delete]
+export const deleteCompanyByIds = (data) => {
+  return service({
+    url: '/company/deleteCompanyByIds',
+    method: 'delete',
+    data
+  })
+}
+
+// @Tags Company
+// @Summary 更新company表
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data body model.Company true "更新company表"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"更新成功"}"
+// @Router /company/updateCompany [put]
+export const updateCompany = (data) => {
+  return service({
+    url: '/company/updateCompany',
+    method: 'put',
+    data
+  })
+}
+
+// @Tags Company
+// @Summary 用id查询company表
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data query model.Company true "用id查询company表"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"查询成功"}"
+// @Router /company/findCompany [get]
+export const findCompany = (params) => {
+  return service({
+    url: '/company/findCompany',
+    method: 'get',
+    params
+  })
+}
+
+// @Tags Company
+// @Summary 分页获取company表列表
+// @Security ApiKeyAuth
+// @accept application/json
+// @Produce application/json
+// @Param data query request.PageInfo true "分页获取company表列表"
+// @Success 200 {string} string "{"success":true,"data":{},"msg":"获取成功"}"
+// @Router /company/getCompanyList [get]
+export const getCompanyList = (params) => {
+  return service({
+    url: '/company/getCompanyList',
+    method: 'get',
+    params
+  })
+}

+ 89 - 0
src/view/abc/abc.vue

@@ -0,0 +1,89 @@
+<template>
+  <div class="JKWTree-container">
+
+    <div class="JKWTree-tree">
+      <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
+    </div>
+
+  </div>
+</template>
+<script setup>
+import { toRaw,ref } from 'vue';
+// import axios from "../utils/request.js"//引入封装的axios
+
+/* 配置数据字段的适配名 */
+const defaultProps = {
+  label: 'label',
+  children: 'children',
+}
+
+
+const treeData=ref([{
+  label: '一级 1',
+  children: [{
+    label: '二级 1-1',
+    children: [{
+      label: '三级 1-1-1'
+    }]
+  }]
+}, {
+  label: '一级 2',
+  children: [{
+    label: '二级 2-1',
+    children: [{
+      label: '三级 2-1-1'
+    }]
+  }, {
+    label: '二级 2-2',
+    children: [{
+      label: '三级 2-2-1'
+    }]
+  }]
+}, {
+  label: '一级 3',
+  children: [{
+    label: '二级 3-1',
+    children: [{
+      label: '三级 3-1-1'
+    }]
+  }, {
+    label: '二级 3-2',
+    children: [{
+      label: '三级 3-2-1'
+    }]
+  }]
+}])
+
+
+//当前节点的nodeId
+let nodeIdForNow=ref(0)
+/**节点点击节点事件 */
+const handleNodeClick = (node,check) => {
+  //存放当前节点的nodeId
+  console.log(node,check);
+
+}
+
+</script>
+<style scoped>
+.JKWTree-container {
+  display: flex;
+}
+
+.JKWTree-tree {
+  width: 300px;
+  background-color: #fff;
+  padding: 10px;
+  margin-right: 20px;
+}
+
+.JKWTree-tree h3 {
+  font-size: 15px;
+  font-weight: 700;
+  margin: 10px 0;
+}
+
+.JKWTree-content {
+  flex: 1;
+}
+</style>

+ 468 - 0
src/view/company/company.vue

@@ -0,0 +1,468 @@
+<template>
+  <div>
+
+    <el-container>
+      <el-aside width="200px">
+        <div class="JKWTree-tree">
+
+          <h3  > 组织列表</h3>
+          <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
+        </div>
+
+      </el-aside>
+      <el-container>
+<!--        <el-header>dd</el-header>-->
+        <el-main>
+
+          <div class="gva-search-box">
+            <el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
+              <el-form-item label="创建日期" prop="createdAt">
+                <template #label>
+        <span>
+          创建日期
+          <el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
+            <el-icon><QuestionFilled /></el-icon>
+          </el-tooltip>
+        </span>
+                </template>
+                <el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
+                —
+                <el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
+              </el-form-item>
+              <el-form-item>
+                <el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
+                <el-button icon="refresh" @click="onReset">重置</el-button>
+              </el-form-item>
+            </el-form>
+          </div>
+          <div class="gva-table-box">
+            <div class="gva-btn-list">
+              <el-button type="primary" icon="plus" @click="openDialog">新增</el-button>
+              <el-popover v-model:visible="deleteVisible" :disabled="!multipleSelection.length" placement="top" width="160">
+                <p>确定要删除吗?</p>
+                <div style="text-align: right; margin-top: 8px;">
+                  <el-button type="primary" link @click="deleteVisible = false">取消</el-button>
+                  <el-button type="primary" @click="onDelete">确定</el-button>
+                </div>
+                <template #reference>
+                  <el-button icon="delete" style="margin-left: 10px;" :disabled="!multipleSelection.length" @click="deleteVisible = true">删除</el-button>
+                </template>
+              </el-popover>
+            </div>
+            <el-table
+                ref="multipleTable"
+                style="width: 100%"
+                tooltip-effect="dark"
+                :data="tableData"
+                row-key="ID"
+                @selection-change="handleSelectionChange"
+            >
+              <el-table-column type="selection" width="55" />
+              <el-table-column align="left" label="日期" width="180">
+                <template #default="scope">{{ formatDate(scope.row.CreatedAt) }}</template>
+              </el-table-column>
+              <el-table-column align="left" label="address字段" prop="address" width="120" />
+              <el-table-column align="left" label="image字段" prop="image" width="120" />
+              <el-table-column align="left" label="name字段" prop="name" width="120" />
+              <el-table-column align="left" label="操作" min-width="120">
+                <template #default="scope">
+                  <el-button type="primary" link class="table-button" @click="getDetails(scope.row)">
+                    <el-icon style="margin-right: 5px"><InfoFilled /></el-icon>
+                    查看详情
+                  </el-button>
+                  <el-button type="primary" link icon="edit" class="table-button" @click="updateCompanyFunc(scope.row)">变更</el-button>
+                  <el-button type="primary" link icon="delete" @click="deleteRow(scope.row)">删除</el-button>
+                </template>
+              </el-table-column>
+            </el-table>
+            <div class="gva-pagination">
+              <el-pagination
+                  layout="total, sizes, prev, pager, next, jumper"
+                  :current-page="page"
+                  :page-size="pageSize"
+                  :page-sizes="[10, 30, 50, 100]"
+                  :total="total"
+                  @current-change="handleCurrentChange"
+                  @size-change="handleSizeChange"
+              />
+            </div>
+          </div>
+          <el-dialog v-model="dialogFormVisible" :before-close="closeDialog" :title="type==='create'?'添加':'修改'" destroy-on-close>
+            <el-scrollbar height="500px">
+              <el-form :model="formData" label-position="right" ref="elFormRef" :rules="rule" label-width="80px">
+                <el-form-item label="address字段:"  prop="address" >
+                  <el-input v-model="formData.address" :clearable="true"  placeholder="请输入address字段" />
+                </el-form-item>
+                <el-form-item label="image字段:"  prop="image" >
+                  <el-input v-model="formData.image" :clearable="true"  placeholder="请输入image字段" />
+                </el-form-item>
+                <el-form-item label="name字段:"  prop="name" >
+                  <el-input v-model="formData.name" :clearable="true"  placeholder="请输入name字段" />
+                </el-form-item>
+              </el-form>
+            </el-scrollbar>
+            <template #footer>
+              <div class="dialog-footer">
+                <el-button @click="closeDialog">取 消</el-button>
+                <el-button type="primary" @click="enterDialog">确 定</el-button>
+              </div>
+            </template>
+          </el-dialog>
+
+          <el-dialog v-model="detailShow" style="width: 800px" lock-scroll :before-close="closeDetailShow" title="查看详情" destroy-on-close>
+            <el-scrollbar height="550px">
+              <el-descriptions column="1" border>
+                <el-descriptions-item label="address字段">
+                  {{ formData.address }}
+                </el-descriptions-item>
+                <el-descriptions-item label="image字段">
+                  {{ formData.image }}
+                </el-descriptions-item>
+                <el-descriptions-item label="name字段">
+                  {{ formData.name }}
+                </el-descriptions-item>
+              </el-descriptions>
+            </el-scrollbar>
+          </el-dialog>
+
+        </el-main>
+
+      </el-container>
+    </el-container>
+
+
+
+
+
+  </div>
+</template>
+
+<script setup>
+import {
+  createCompany,
+  deleteCompany,
+  deleteCompanyByIds,
+  updateCompany,
+  findCompany,
+  getCompanyList
+} from '@/api/company'
+
+// 全量引入格式化工具 请按需保留
+import { getDictFunc, formatDate, formatBoolean, filterDict, ReturnArrImg, onDownloadFile } from '@/utils/format'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { ref, reactive } from 'vue'
+
+defineOptions({
+    name: 'Company'
+})
+
+const treeData=ref([{
+  label: '一级 1',
+  children: [{
+    label: '二级 1-1',
+    children: [{
+      label: '三级 1-1-1'
+    }]
+  }]
+}, {
+  label: '一级 2',
+  children: [{
+    label: '二级 2-1',
+    children: [{
+      label: '三级 2-1-1'
+    }]
+  }, {
+    label: '二级 2-2',
+    children: [{
+      label: '三级 2-2-1'
+    }]
+  }]
+}, {
+  label: '一级 3',
+  children: [{
+    label: '二级 3-1',
+    children: [{
+      label: '三级 3-1-1'
+    }]
+  }, {
+    label: '二级 3-2',
+    children: [{
+      label: '三级 3-2-1'
+    }]
+  }]
+}])
+const handleNodeClick = (node,check) => {
+  //存放当前节点的nodeId
+  console.log(node,check);
+
+}
+// 自动化生成的字典(可能为空)以及字段
+const formData = ref({
+        address: '',
+        image: '',
+        name: '',
+        })
+
+
+// 验证规则
+const rule = reactive({
+})
+
+const searchRule = reactive({
+  createdAt: [
+    { validator: (rule, value, callback) => {
+      if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
+        callback(new Error('请填写结束日期'))
+      } else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
+        callback(new Error('请填写开始日期'))
+      } else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
+        callback(new Error('开始日期应当早于结束日期'))
+      } else {
+        callback()
+      }
+    }, trigger: 'change' }
+  ],
+})
+
+const elFormRef = ref()
+const elSearchFormRef = ref()
+
+// =========== 表格控制部分 ===========
+const page = ref(1)
+const total = ref(0)
+const pageSize = ref(10)
+const tableData = ref([])
+const searchInfo = ref({})
+
+// 重置
+const onReset = () => {
+  searchInfo.value = {}
+  getTableData()
+}
+
+// 搜索
+const onSubmit = () => {
+  elSearchFormRef.value?.validate(async(valid) => {
+    if (!valid) return
+    page.value = 1
+    pageSize.value = 10
+    getTableData()
+  })
+}
+
+// 分页
+const handleSizeChange = (val) => {
+  pageSize.value = val
+  getTableData()
+}
+
+// 修改页面容量
+const handleCurrentChange = (val) => {
+  page.value = val
+  getTableData()
+}
+
+// 查询
+const getTableData = async() => {
+  const table = await getCompanyList({ page: page.value, pageSize: pageSize.value, ...searchInfo.value })
+  if (table.code === 0) {
+    tableData.value = table.data.list
+    total.value = table.data.total
+    page.value = table.data.page
+    pageSize.value = table.data.pageSize
+  }
+}
+
+getTableData()
+
+// ============== 表格控制部分结束 ===============
+
+// 获取需要的字典 可能为空 按需保留
+const setOptions = async () =>{
+}
+
+// 获取需要的字典 可能为空 按需保留
+setOptions()
+
+
+// 多选数据
+const multipleSelection = ref([])
+// 多选
+const handleSelectionChange = (val) => {
+    multipleSelection.value = val
+}
+
+// 删除行
+const deleteRow = (row) => {
+    ElMessageBox.confirm('确定要删除吗?', '提示', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+    }).then(() => {
+            deleteCompanyFunc(row)
+        })
+    }
+
+
+// 批量删除控制标记
+const deleteVisible = ref(false)
+
+// 多选删除
+const onDelete = async() => {
+      const ids = []
+      if (multipleSelection.value.length === 0) {
+        ElMessage({
+          type: 'warning',
+          message: '请选择要删除的数据'
+        })
+        return
+      }
+      multipleSelection.value &&
+        multipleSelection.value.map(item => {
+          ids.push(item.ID)
+        })
+      const res = await deleteCompanyByIds({ ids })
+      if (res.code === 0) {
+        ElMessage({
+          type: 'success',
+          message: '删除成功'
+        })
+        if (tableData.value.length === ids.length && page.value > 1) {
+          page.value--
+        }
+        deleteVisible.value = false
+        getTableData()
+      }
+    }
+
+// 行为控制标记(弹窗内部需要增还是改)
+const type = ref('')
+
+// 更新行
+const updateCompanyFunc = async(row) => {
+    const res = await findCompany({ ID: row.ID })
+    type.value = 'update'
+    if (res.code === 0) {
+        formData.value = res.data.recompany
+        dialogFormVisible.value = true
+    }
+}
+
+
+// 删除行
+const deleteCompanyFunc = async (row) => {
+    const res = await deleteCompany({ ID: row.ID })
+    if (res.code === 0) {
+        ElMessage({
+                type: 'success',
+                message: '删除成功'
+            })
+            if (tableData.value.length === 1 && page.value > 1) {
+            page.value--
+        }
+        getTableData()
+    }
+}
+
+// 弹窗控制标记
+const dialogFormVisible = ref(false)
+
+
+// 查看详情控制标记
+const detailShow = ref(false)
+
+
+// 打开详情弹窗
+const openDetailShow = () => {
+  detailShow.value = true
+}
+
+
+// 打开详情
+const getDetails = async (row) => {
+  // 打开弹窗
+  const res = await findCompany({ ID: row.ID })
+  if (res.code === 0) {
+    formData.value = res.data.recompany
+    openDetailShow()
+  }
+}
+
+
+// 关闭详情弹窗
+const closeDetailShow = () => {
+  detailShow.value = false
+  formData.value = {
+          address: '',
+          image: '',
+          name: '',
+          }
+}
+
+
+// 打开弹窗
+const openDialog = () => {
+    type.value = 'create'
+    dialogFormVisible.value = true
+}
+
+// 关闭弹窗
+const closeDialog = () => {
+    dialogFormVisible.value = false
+    formData.value = {
+        address: '',
+        image: '',
+        name: '',
+        }
+}
+// 弹窗确定
+const enterDialog = async () => {
+     elFormRef.value?.validate( async (valid) => {
+             if (!valid) return
+              let res
+              switch (type.value) {
+                case 'create':
+                  res = await createCompany(formData.value)
+                  break
+                case 'update':
+                  res = await updateCompany(formData.value)
+                  break
+                default:
+                  res = await createCompany(formData.value)
+                  break
+              }
+              if (res.code === 0) {
+                ElMessage({
+                  type: 'success',
+                  message: '创建/更改成功'
+                })
+                closeDialog()
+                getTableData()
+              }
+      })
+}
+
+</script>
+
+<style>
+.JKWTree-container {
+  display: flex;
+}
+
+.JKWTree-tree {
+  width: 300px;
+  background-color: #fff;
+  padding: 10px;
+  margin-right: 20px;
+}
+
+.JKWTree-tree h3 {
+  font-size: 15px;
+  font-weight: 700;
+  margin: 10px 0;
+}
+
+.JKWTree-content {
+  flex: 1;
+}
+</style>

+ 103 - 0
src/view/company/companyForm.vue

@@ -0,0 +1,103 @@
+<template>
+  <div>
+    <div class="gva-form-box">
+      <el-form :model="formData" ref="elFormRef" label-position="right" :rules="rule" label-width="80px">
+        <el-form-item label="address字段:" prop="address">
+          <el-input v-model="formData.address" :clearable="true" placeholder="请输入" />
+       </el-form-item>
+        <el-form-item label="image字段:" prop="image">
+          <el-input v-model="formData.image" :clearable="true" placeholder="请输入" />
+       </el-form-item>
+        <el-form-item label="name字段:" prop="name">
+          <el-input v-model="formData.name" :clearable="true" placeholder="请输入" />
+       </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="save">保存</el-button>
+          <el-button type="primary" @click="back">返回</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import {
+  createCompany,
+  updateCompany,
+  findCompany
+} from '@/api/company'
+
+defineOptions({
+    name: 'CompanyForm'
+})
+
+// 自动获取字典
+import { getDictFunc } from '@/utils/format'
+import { useRoute, useRouter } from "vue-router"
+import { ElMessage } from 'element-plus'
+import { ref, reactive } from 'vue'
+
+const route = useRoute()
+const router = useRouter()
+
+const type = ref('')
+const formData = ref({
+            address: '',
+            image: '',
+            name: '',
+        })
+// 验证规则
+const rule = reactive({
+})
+
+const elFormRef = ref()
+
+// 初始化方法
+const init = async () => {
+ // 建议通过url传参获取目标数据ID 调用 find方法进行查询数据操作 从而决定本页面是create还是update 以下为id作为url参数示例
+    if (route.query.id) {
+      const res = await findCompany({ ID: route.query.id })
+      if (res.code === 0) {
+        formData.value = res.data.recompany
+        type.value = 'update'
+      }
+    } else {
+      type.value = 'create'
+    }
+}
+
+init()
+// 保存按钮
+const save = async() => {
+      elFormRef.value?.validate( async (valid) => {
+         if (!valid) return
+            let res
+           switch (type.value) {
+             case 'create':
+               res = await createCompany(formData.value)
+               break
+             case 'update':
+               res = await updateCompany(formData.value)
+               break
+             default:
+               res = await createCompany(formData.value)
+               break
+           }
+           if (res.code === 0) {
+             ElMessage({
+               type: 'success',
+               message: '创建/更改成功'
+             })
+           }
+       })
+}
+
+// 返回按钮
+const back = () => {
+    router.go(-1)
+}
+
+</script>
+
+<style>
+</style>

+ 107 - 0
src/view/demo/demo1.vue

@@ -0,0 +1,107 @@
+<template>
+  <el-container style="height: 500px; border: 1px solid #eee">
+    <el-aside width="200px" style="background-color: rgb(238, 241, 246)">
+      <el-menu :default-openeds="['1', '3']">
+        <el-submenu index="1">
+          <template slot="title"><i class="el-icon-message"></i>导航一</template>
+          <el-menu-item-group>
+            <template slot="title">分组一</template>
+            <el-menu-item index="1-1">选项1</el-menu-item>
+            <el-menu-item index="1-2">选项2</el-menu-item>
+          </el-menu-item-group>
+          <el-menu-item-group title="分组2">
+            <el-menu-item index="1-3">选项3</el-menu-item>
+          </el-menu-item-group>
+          <el-submenu index="1-4">
+            <template slot="title">选项4</template>
+            <el-menu-item index="1-4-1">选项4-1</el-menu-item>
+          </el-submenu>
+        </el-submenu>
+        <el-submenu index="2">
+          <template slot="title"><i class="el-icon-menu"></i>导航二</template>
+          <el-menu-item-group>
+            <template slot="title">分组一</template>
+            <el-menu-item index="2-1">选项1</el-menu-item>
+            <el-menu-item index="2-2">选项2</el-menu-item>
+          </el-menu-item-group>
+          <el-menu-item-group title="分组2">
+            <el-menu-item index="2-3">选项3</el-menu-item>
+          </el-menu-item-group>
+          <el-submenu index="2-4">
+            <template slot="title">选项4</template>
+            <el-menu-item index="2-4-1">选项4-1</el-menu-item>
+          </el-submenu>
+        </el-submenu>
+        <el-submenu index="3">
+          <template slot="title"><i class="el-icon-setting"></i>导航三</template>
+          <el-menu-item-group>
+            <template slot="title">分组一</template>
+            <el-menu-item index="3-1">选项1</el-menu-item>
+            <el-menu-item index="3-2">选项2</el-menu-item>
+          </el-menu-item-group>
+          <el-menu-item-group title="分组2">
+            <el-menu-item index="3-3">选项3</el-menu-item>
+          </el-menu-item-group>
+          <el-submenu index="3-4">
+            <template slot="title">选项4</template>
+            <el-menu-item index="3-4-1">选项4-1</el-menu-item>
+          </el-submenu>
+        </el-submenu>
+      </el-menu>
+    </el-aside>
+
+    <el-container>
+      <el-header style="text-align: right; font-size: 12px">
+        <el-dropdown>
+          <i class="el-icon-setting" style="margin-right: 15px"></i>
+          <el-dropdown-menu slot="dropdown">
+            <el-dropdown-item>查看</el-dropdown-item>
+            <el-dropdown-item>新增</el-dropdown-item>
+            <el-dropdown-item>删除</el-dropdown-item>
+          </el-dropdown-menu>
+        </el-dropdown>
+        <span>王小虎</span>
+      </el-header>
+
+      <el-main>
+        <el-table :data="tableData">
+          <el-table-column prop="date" label="日期" width="140">
+          </el-table-column>
+          <el-table-column prop="name" label="姓名" width="120">
+          </el-table-column>
+          <el-table-column prop="address" label="地址">
+          </el-table-column>
+        </el-table>
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+<script setup>
+import { toRaw,ref } from 'vue';
+const item = ref({
+  date: '2016-05-02',
+  name: '王小虎',
+  address: '上海市普陀区金沙江路 1518 弄'
+});
+
+const tableData=ref([])
+
+
+const initData=()=>{
+  tableData.value=Array(20).fill(item.value)
+}
+
+initData()
+
+</script>
+<style>
+.el-header {
+  background-color: #B3C0D1;
+  color: #333;
+  line-height: 60px;
+}
+
+.el-aside {
+  color: #333;
+}
+</style>

+ 191 - 0
src/view/demo/demo2.vue

@@ -0,0 +1,191 @@
+<template>
+  <el-container style="height: 500px; border: 1px solid #eee">
+    <el-aside width="200px" style="background-color: rgb(238, 241, 246)">
+      <div class="JKWTree-tree">
+        <el-tree :data="treeData" :props="defaultProps" @node-click="handleNodeClick"></el-tree>
+      </div>
+    </el-aside>
+
+    <el-container>
+      <el-header style="text-align: right; font-size: 12px">
+        <div class="gva-search-box">
+          <el-form ref="elSearchFormRef" :inline="true" :model="searchInfo" class="demo-form-inline" :rules="searchRule" @keyup.enter="onSubmit">
+            <el-form-item label="创建日期" prop="createdAt">
+              <template #label>
+        <span>
+          创建日期
+          <el-tooltip content="搜索范围是开始日期(包含)至结束日期(不包含)">
+            <el-icon><QuestionFilled /></el-icon>
+          </el-tooltip>
+        </span>
+              </template>
+              <el-date-picker v-model="searchInfo.startCreatedAt" type="datetime" placeholder="开始日期" :disabled-date="time=> searchInfo.endCreatedAt ? time.getTime() > searchInfo.endCreatedAt.getTime() : false"></el-date-picker>
+              —
+              <el-date-picker v-model="searchInfo.endCreatedAt" type="datetime" placeholder="结束日期" :disabled-date="time=> searchInfo.startCreatedAt ? time.getTime() < searchInfo.startCreatedAt.getTime() : false"></el-date-picker>
+            </el-form-item>
+
+            <el-form-item label="SKC" prop="skc">
+              <el-input v-model="searchInfo.skc" type="text" />
+            </el-form-item>
+            <el-form-item label="skcNum" prop="skcNum">
+              <el-input v-model="searchInfo.skcNum" type="text" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="search" @click="onSubmit">查询</el-button>
+              <el-button icon="refresh" @click="onReset">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </div>
+
+      </el-header>
+
+      <el-main>
+        <el-table :data="tableData">
+          <el-table-column prop="date" label="日期" width="140">
+          </el-table-column>
+          <el-table-column prop="name" label="姓名" width="120">
+          </el-table-column>
+          <el-table-column prop="address" label="地址">
+          </el-table-column>
+        </el-table>
+      </el-main>
+    </el-container>
+  </el-container>
+</template>
+<script setup>
+import { ref, reactive } from 'vue'
+
+const handleNodeClick = (node,check) => {
+  //存放当前节点的nodeId
+  console.log(node,check);
+
+}
+
+const treeData=ref([{
+  label: '一级 1',
+  children: [{
+    label: '二级 1-1',
+    children: [{
+      label: '三级 1-1-1'
+    }]
+  }]
+}, {
+  label: '一级 2',
+  children: [{
+    label: '二级 2-1',
+    children: [{
+      label: '三级 2-1-1'
+    }]
+  }, {
+    label: '二级 2-2',
+    children: [{
+      label: '三级 2-2-1'
+    }]
+  }]
+}, {
+  label: '一级 3',
+  children: [{
+    label: '二级 3-1',
+    children: [{
+      label: '三级 3-1-1'
+    }]
+  }, {
+    label: '二级 3-2',
+    children: [{
+      label: '三级 3-2-1'
+    }]
+  }]
+}])
+
+const item = ref({
+  date: '2016-05-02',
+  name: '王小虎',
+  address: '上海市普陀区金沙江路 1518 弄'
+});
+
+const tableData=ref([])
+
+
+const initData=()=>{
+  tableData.value=Array(20).fill(item.value)
+}
+
+
+
+
+const searchRule = reactive({
+  createdAt: [
+    { validator: (rule, value, callback) => {
+        if (searchInfo.value.startCreatedAt && !searchInfo.value.endCreatedAt) {
+          callback(new Error('请填写结束日期'))
+        } else if (!searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt) {
+          callback(new Error('请填写开始日期'))
+        } else if (searchInfo.value.startCreatedAt && searchInfo.value.endCreatedAt && (searchInfo.value.startCreatedAt.getTime() === searchInfo.value.endCreatedAt.getTime() || searchInfo.value.startCreatedAt.getTime() > searchInfo.value.endCreatedAt.getTime())) {
+          callback(new Error('开始日期应当早于结束日期'))
+        } else {
+          callback()
+        }
+      }, trigger: 'change' }
+  ],
+})
+
+const elFormRef = ref()
+const elSearchFormRef = ref()
+
+// =========== 表格控制部分 ===========
+const page = ref(1)
+const total = ref(0)
+const pageSize = ref(10)
+
+const searchInfo = ref({})
+
+// 重置
+const onReset = () => {
+  searchInfo.value = {}
+  getTableData()
+}
+
+// 搜索
+const onSubmit = () => {
+  elSearchFormRef.value?.validate(async(valid) => {
+    if (!valid) return
+    page.value = 1
+    pageSize.value = 10
+    if (searchInfo.value.is_urgent === ""){
+      searchInfo.value.is_urgent=null
+    }
+    getTableData()
+  })
+}
+
+// 分页
+const handleSizeChange = (val) => {
+  pageSize.value = val
+  getTableData()
+}
+
+// 修改页面容量
+const handleCurrentChange = (val) => {
+  page.value = val
+  getTableData()
+}
+
+// 查询
+const getTableData = async() => {
+  initData()
+}
+
+getTableData()
+
+</script>
+<style>
+.el-header {
+  background-color: #B3C0D1;
+  color: #333;
+  line-height: 60px;
+}
+
+.el-aside {
+  color: #333;
+}
+</style>

+ 3 - 0
vite.config.js

@@ -11,6 +11,9 @@ import vuePlugin from '@vitejs/plugin-vue'
 import GvaPosition from './vitePlugin/gvaPosition'
 import GvaPositionServer from './vitePlugin/codeServer'
 import fullImportPlugin from './vitePlugin/fullImport/fullImport.js'
+
+
+
 // @see https://cn.vitejs.dev/config/
 export default ({
   command,