index.vue 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <template>
  2. <div>
  3. <PlusPage
  4. :columns="tableConfig"
  5. :request="getList"
  6. :before-search-submit="handleBeforeSearch"
  7. :is-card="true"
  8. :table="{
  9. onSortChange: handleSortChange,
  10. isSelection: true,
  11. actionBar: { buttons, type: 'button', width: 240 },
  12. adaptive: { offsetBottom: 50 }
  13. }"
  14. :defaultPageInfo="{ page: 1, pageSize: 10 }"
  15. :defaultPageSizeList="[10, 20, 50, 100]"
  16. >
  17. <template #toolbar>
  18. <ExportView
  19. title="导出"
  20. url="''"
  21. file-name="订单列表"
  22. :query-params="{}"
  23. />
  24. </template>
  25. </PlusPage>
  26. </div>
  27. </template>
  28. <script lang="ts" setup>
  29. import { computed, defineOptions, ref } from "vue";
  30. import {
  31. type PageInfo,
  32. type PlusColumn,
  33. PlusPage,
  34. useTable
  35. } from "plus-pro-components";
  36. import { cloneDeep } from "lodash-es";
  37. import { number } from "echarts";
  38. import ExportView from "@/components/ExportView/index.vue";
  39. defineOptions({
  40. name: "PageTable"
  41. });
  42. interface TableRow {
  43. id: number;
  44. name: string;
  45. status: string;
  46. tag: string;
  47. time: Date;
  48. }
  49. const getList = async (
  50. query: PageInfo & {
  51. status?: string;
  52. name?: string;
  53. }
  54. ) => {
  55. const { page = 1, pageSize = 20, status, name } = query || {};
  56. const total = 100;
  57. const List = Array.from({ length: total }).map((_, index) => {
  58. return {
  59. id: index,
  60. name: index === 0 ? "name".repeat(99) : index + "name",
  61. status: String(index % 3),
  62. tag:
  63. index === 1
  64. ? "success"
  65. : index === 2
  66. ? "warning"
  67. : index === 3
  68. ? "info"
  69. : "danger",
  70. progress: 10,
  71. rate: index > 3 ? 2 : 3.5,
  72. switch: index % 2 === 0,
  73. img: "https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg",
  74. time: new Date(),
  75. timeRange: new Date(),
  76. custom: "custom" + index
  77. };
  78. });
  79. const mockList = List.filter(item => {
  80. if (status && status !== item.status) {
  81. return false;
  82. }
  83. return !(name && name !== item.name);
  84. });
  85. const pageList = mockList.filter(
  86. (_, index) => index < pageSize * page && index >= pageSize * (page - 1)
  87. );
  88. // 等待2s
  89. await new Promise(resolve => {
  90. setTimeout(() => {
  91. resolve("");
  92. }, 500);
  93. });
  94. return { data: pageList, success: true, total: mockList.length };
  95. };
  96. // 搜索之前函数
  97. const handleBeforeSearch = (values: any) => {
  98. const params = cloneDeep(values);
  99. Reflect.set(params, "name1", Reflect.get(values, "name"));
  100. Reflect.deleteProperty(params, "name");
  101. console.log(params);
  102. // 返回新的参数
  103. return params;
  104. };
  105. const handleSortChange = (val: object) => {
  106. console.log("handleSortChange", val);
  107. };
  108. const choiceDate = ref(null);
  109. const disabledDate = (time: any) => {
  110. // 如何选择了一个日期
  111. if (choiceDate.value) {
  112. // 7天的时间戳
  113. const one = 30 * 24 * 3600 * 1000;
  114. // 当前日期 - one = 7天之前
  115. const minTime = choiceDate.value - one;
  116. // 当前日期 + one = 7天之后
  117. const maxTime = choiceDate.value + one;
  118. return (
  119. time.getTime() < minTime || time.getTime() > maxTime
  120. // 限制不能选择今天及以后
  121. // || time.getTime() + 1 * 24 * 3600 * 1000 > Date.now()
  122. );
  123. } else {
  124. // 如果没有选择日期,就要限制不能选择今天及以后
  125. // return time.getTime() + 1 * 24 * 3600 * 1000 > Date.now();
  126. }
  127. };
  128. const calendarChange = (obj: any) => {
  129. console.log(obj);
  130. const minDate = obj[0];
  131. const maxDate = obj[1];
  132. // 把选择的第一个日期赋值给一个变量。
  133. choiceDate.value = minDate.getTime();
  134. // 如何你选择了两个日期了,就把那个变量置空
  135. if (maxDate) choiceDate.value = null;
  136. };
  137. const { buttons } = useTable<TableRow[]>();
  138. const tableConfig: PlusColumn[] = [
  139. {
  140. label: "名称",
  141. tooltip: "名称最多显示6个字符",
  142. prop: "name",
  143. tableColumnProps: {
  144. showOverflowTooltip: true
  145. }
  146. },
  147. {
  148. label: "状态",
  149. prop: "status",
  150. valueType: "select",
  151. options: [
  152. {
  153. label: "未解决",
  154. value: "0",
  155. color: "red"
  156. },
  157. {
  158. label: "已解决",
  159. value: "1",
  160. color: "blue"
  161. },
  162. {
  163. label: "解决中",
  164. value: "2",
  165. color: "yellow"
  166. },
  167. {
  168. label: "失败",
  169. value: "3",
  170. color: "red"
  171. }
  172. ]
  173. },
  174. {
  175. label: "标签",
  176. prop: "tag",
  177. valueType: "tag",
  178. fieldProps: (value: string) => {
  179. return { type: value };
  180. }
  181. },
  182. {
  183. label: "执行进度",
  184. prop: "progress",
  185. valueType: "progress",
  186. fieldProps: (value: number) => {
  187. return value === 0
  188. ? { status: "exception" }
  189. : value > 5
  190. ? { status: "warning" }
  191. : value > 3
  192. ? { status: "success" }
  193. : { status: "exception" };
  194. }
  195. },
  196. {
  197. label: "评分",
  198. prop: "rate",
  199. valueType: "rate",
  200. hideInSearch: true,
  201. editable: true,
  202. minWidth: 130
  203. },
  204. {
  205. label: "开关",
  206. prop: "switch",
  207. hideInSearch: true,
  208. valueType: "switch",
  209. editable: true,
  210. maxWidth: 100,
  211. minWidth: 40
  212. },
  213. {
  214. label: "时间",
  215. prop: "time",
  216. valueType: "date-picker",
  217. hideInForm: true,
  218. fieldProps: {
  219. valueFormat: "YYYY-mm-DD HH:mm:ss"
  220. },
  221. tableColumnProps: {
  222. sortable: true
  223. },
  224. minWidth: "180px"
  225. },
  226. {
  227. label: "时间段",
  228. prop: "timeRange",
  229. valueType: "date-picker",
  230. fieldProps: {
  231. type: "datetimerange",
  232. startPlaceholder: "请选择开始时间",
  233. endPlaceholder: "请选择结束时间",
  234. valueFormat: "YYYY-mm-DD HH:mm:ss",
  235. disabledDate: disabledDate,
  236. onCalendarChange: calendarChange
  237. },
  238. hideInForm: true,
  239. tableColumnProps: {
  240. sortable: false
  241. },
  242. minWidth: "180px"
  243. }
  244. ];
  245. buttons.value = [
  246. {
  247. // 查看
  248. text: "查看",
  249. code: "view",
  250. props: (row: any) => ({
  251. type: "info",
  252. disabled: row.status === "1"
  253. }),
  254. show: (row: any) => row.status === "1"
  255. },
  256. {
  257. // 修改
  258. text: "修改",
  259. code: "edit",
  260. // props v0.1.16 版本新增函数类型
  261. props: (row: any) => ({
  262. type: "primary",
  263. disabled: row.status === "1"
  264. }),
  265. show: computed(() => true)
  266. },
  267. {
  268. // 删除
  269. text: "删除",
  270. code: "delete",
  271. // props v0.1.16 版本新增计算属性支持
  272. props: computed(() => ({ type: "danger" })),
  273. confirm: {
  274. options: {
  275. draggable: true,
  276. message: "确定删除此数据吗?"
  277. }
  278. }
  279. }
  280. ];
  281. </script>