7021f2fd创建于 2025年5月14日历史提交
<route lang="json5" type="page">
{
  layout: 'default',
  style: {
    navigationBarTitleText: '',
    navigationStyle: 'custom',
    disableScroll: true, // 微信禁止页面滚动
    'app-plus': {
      bounce: 'none', // 禁用 iOS 弹性效果
    },
  },
}
</route>

<template>
  <PageLayout backRouteName="onlineCard" :navTitle="navTitle">
    <wd-table :index="tableIndex" :data="dataList" @row-click="handleRow">
      <template v-for="(item, index) in columns" :key="item.prop">
        <wd-table-col
          :prop="item.prop"
          :label="item.label"
          :width="item.width"
          :fixed="item.fixed"
          :align="item.align"
          :sortable="item.sortable"
        >
          <template #value="{ row, index }">
            <onlineTableCell
              :columnsInfo="columnsInfo"
              :record="row"
              :column="item"
              @longpress.prevent="handleLongPress(row)"
            ></onlineTableCell>
          </template>
        </wd-table-col>
      </template>
    </wd-table>
    <wd-status-tip v-if="dataList.length == 0" image="content" tip="暂无内容" />
    <wd-pagination
      v-model="pageNo"
      :total="pageTotal"
      :page-size="pageSize"
      @change="handlePaginChange"
      show-icon
    ></wd-pagination>
    <view class="add u-iconfont u-icon-add" @click="handleGo"></view>
  </PageLayout>
  <BottomOperate
    v-if="bottomOperatePopup.show"
    v-bind="bottomOperatePopup"
    @close="() => (bottomOperatePopup.show = false)"
    @change="handleChange"
  ></BottomOperate>
</template>

<script lang="ts" setup>
import { http } from '@/utils/http'
import { useToast, useMessage, useNotify, dayjs } from 'wot-design-uni'
import { useRouter } from '@/plugin/uni-mini-router'
import { useUserStore } from '@/store/user'
import { useParamsStore } from '@/store/page-params'
import onlineTableCell from './components/onlineTableCell.vue'
import {ref} from "vue";
defineOptions({
  name: 'onlineTable',
  options: {
    styleIsolation: 'shared',
  },
})
const toast = useToast()
const router = useRouter()
const userStore = useUserStore()
const paramsStore = useParamsStore()
const globalData = getApp().globalData
const { systemInfo } = globalData
const { safeArea } = systemInfo

const columns = ref([])
const columnsInfo = ref({})
const tableIndex = ref(false)
const pageNo = ref(1)
const pageSize = ref(10)
const pageTotal = ref(1)
const navTitle = ref('online在线表单')
let pageParams: any = {}
let rowIndex: any = ref(0)
// 底部操作
const bottomOperatePopup = reactive({
  show: false,
  title: '操作',
  data: {},
  options: [
    { key: 'edit', icon: 'edit', label: '编辑' },
    { key: 'detail', icon: 'view', label: '查看' },
    { key: 'delete', icon: 'delete', label: '删除', color: 'red' },
  ],
})
const queryParams = () => {
  return {
    pageNo: pageNo.value,
    pageSize: pageSize.value,
    order: 'asc',
    column: 'id',
    hasQuery: true,
  }
}
const dataList = ref([])
const getColumns = () => {
  return new Promise<void>((resove, reject) => {
    const analysis = (data) => {
      const len = data.length
      const maxShowColumn = 3
      let space = 1
      if (len == 1) {
        space = 2
      }
      const width = safeArea.width / (len >= maxShowColumn ? maxShowColumn : len) - space
      columns.value = data.map((item) => {
        return {
          ...item,
          prop: item.dataIndex,
          align: item.align,
          label: item.title,
          width,
        }
      })
    }
    http
      .get(`/online/cgform/api/getColumns/${pageParams.id}`)
      .then((res: any) => {
        if (res.success) {
          if (res.result?.columns?.length) {
            columnsInfo.value = res.result
            setTimeout(() => {
              analysis(res.result.columns)
            }, 0);
          }
        } else {
          toast.warning(res.message)
        }
      })
      .catch((res) => {
        toast.error('加载列头失败~')
      })
  })
}
const getData = () => {
  http
    .get(`/online/cgform/api/getData/${pageParams.id}`, { ...queryParams() })
    .then((res: any) => {
      if (res.success) {
        dataList.value = res.result?.records ?? []
        pageTotal.value = res.result.total
      } else {
        toast.warning(res.message)
      }
    })
    .catch((res) => {
      toast.error('加载表格数据失败~')
    })
}
const handlePaginChange = ({ value }) => {
  pageNo.value = value
  getData()
}
//go 新增页
const handleGo = () => {
  router.push({
    name: 'onlineAdd',
    params: { desformCode: pageParams.tableName, desformName: pageParams.tableTxt },
  })
}
//go 编辑页
const handleEdit = (record) => {
  router.push({
    name: 'onlineEdit',
    params: {
      desformCode: pageParams.tableName,
      desformName: pageParams.tableTxt,
      dataId: record.id,
      backRouteName: 'onlineTable',
    },
  })
}
//go 编辑页
const handleView = (record) => {
  router.push({
    name: 'onlineDetail',
    params: { desformCode: pageParams.tableName, desformName: pageParams.tableTxt, id: record.id },
  })
}
//长按操作
const handleLongPress = (item) => {
  bottomOperatePopup.show = true
  bottomOperatePopup.data = item
}
//操作切换
const handleChange = ({ option, data }) => {
  if (option.key === 'edit') {
    handleEdit(data)
  } else if (option.key === 'delete') {
    uni.showModal({
      title: '提示',
      content: '确定要删除吗?',
      cancelText: '取消',
      confirmText: '确定',
      success: (res) => {
        if (res.confirm) {
          http.delete(`/online/cgform/api/form/${pageParams.id}/${data.id}`).then((res) => {
            toast.success('删除成功~')
            getData()
          })
        }
      },
      fail: (err) => {
        console.log(err)
      },
    })
  } else if (option.key === 'detail') {
    handleView(data)
  }
}
const handleRow = ({ rowIndex }) => {
  handleEdit(dataList.value[rowIndex])
}
const init = () => {
  pageParams = paramsStore.getPageParams('onlineTable')?.data ?? {}
  console.log('pageParams:', pageParams)
  getColumns()
  getData()
}
init()

onMounted(() => {
  //标题
  navTitle.value = pageParams?.tableTxt ||  'online在线表单';
  // 监听刷新列表事件
  uni.$on('refreshList', () => {
    getData()
  })
})
</script>

<style lang="scss" scoped>
//
.add {
  height: 70upx;
  width: 70upx;
  text-align: center;
  line-height: 70upx;
  background-color: #fff;
  border-radius: 50%;
  position: fixed;
  bottom: 80upx;
  right: 30upx;
  box-shadow: 0 0 5px 2px rgba(0, 0, 0, 0.1);
  color: #666;
}
:deep(.wd-table__content) {
  .wot-theme-light {
    // width: 100%;
    // height: 100%;
  }
}

:deep(.wd-table) {
  --wot-table-font-size: 14px;
  .wd-table__body {
    --wot-table-color: var(--color-grey);
  }
}
</style>