diff --git a/.history/mock/api/post_20230912152251.js b/.history/mock/api/post_20230912152251.js new file mode 100644 index 0000000..b6c3e54 --- /dev/null +++ b/.history/mock/api/post_20230912152251.js @@ -0,0 +1,138 @@ +const posts = [ + { + title: '使用纯css优雅配置移动端rem布局', + author: '大脸怪', + category: 'Css', + description: '通常配置rem布局会使用js进行处理,比如750的设计稿会这样...', + content: '通常配置rem布局会使用js进行处理,比如750的设计稿会这样', + isRecommend: true, + isPublish: true, + createDate: '2021-11-04T04:03:36.000Z', + updateDate: '2021-11-04T04:03:36.000Z', + }, + { + title: 'Vue2&Vue3项目风格指南', + author: 'Ronnie', + category: 'Vue', + description: '总结的Vue2和Vue3的项目风格', + content: '### 1. 命名风格\n\n> 文件夹如果是由多个单词组成,应该始终是横线连接 ', + isRecommend: true, + isPublish: true, + createDate: '2021-10-25T08:57:47.000Z', + updateDate: '2022-02-28T04:02:39.000Z', + }, + { + title: '如何优雅的给图片添加水印', + author: '大脸怪', + category: 'JavaScript', + description: '优雅的给图片添加水印', + content: '我之前写过一篇文章记录了一次上传图片的优化史', + isRecommend: true, + isPublish: true, + createDate: '2021-06-24T18:46:19.000Z', + updateDate: '2021-09-23T07:51:22.000Z', + }, + + { + title: '前端缓存的理解', + author: '大脸怪', + category: 'Http', + description: '谈谈前端缓存的理解', + content: + '> 背景\n\n公司有个vue-cli3移动端web项目发版更新后发现部分用户手机在钉钉内置浏览器打开出现了缓存', + isRecommend: true, + isPublish: true, + createDate: '2021-06-10T18:51:19.000Z', + updateDate: '2021-09-17T09:33:24.000Z', + }, + { + title: 'Promise的五个静态方法', + author: '大脸怪', + category: 'JavaScript', + description: '简单介绍下在 Promise 类中,有5 种静态方法及它们的使用场景', + content: + '## 1. Promise.all\n\n并行执行多个 promise,并等待所有 promise 都准备就绪。再对它们进行处理。', + isRecommend: true, + isPublish: true, + createDate: '2021-02-22T22:37:06.000Z', + updateDate: '2021-09-17T09:33:24.000Z', + }, +] + +export default [ + { + url: '/api/posts', + method: 'get', + response: (data = {}) => { + const { title, pageNo, pageSize } = data.query + let pageData = [] + let total = 60 + const filterData = posts.filter( + (item) => item.title.includes(title) || (!title && title !== 0) + ) + if (filterData.length) { + if (pageSize) { + while (pageData.length < pageSize) { + pageData.push(filterData[Math.round(Math.random() * (filterData.length - 1))]) + } + } else { + pageData = filterData + } + pageData = pageData.map((item, index) => ({ + id: pageSize * (pageNo - 1) + index + 1, + ...item, + })) + } else { + total = 0 + } + return { + code: 0, + message: 'ok', + data: { + pageData, + total, + pageNo, + pageSize, + }, + } + }, + }, + { + url: '/api/post', + method: 'post', + response: ({ body }) => { + return { + code: 0, + message: 'ok', + data: body, + } + }, + }, + { + url: '/api/post/:id', + method: 'put', + response: ({ query, body }) => { + return { + code: 0, + message: 'ok', + data: { + id: query.id, + body, + }, + } + }, + }, + { + url: '/api/post/:id', + method: 'delete', + response: ({ query }) => { + return { + code: 0, + message: 'ok', + data: { + id: query.id, + }, + } + }, + }, +] diff --git a/.history/mock/api/post_20230912152547.js b/.history/mock/api/post_20230912152547.js new file mode 100644 index 0000000..80ffa1a --- /dev/null +++ b/.history/mock/api/post_20230912152547.js @@ -0,0 +1,144 @@ +const posts = [ + { + title: '使用纯css优雅配置移动端rem布局', + author: '大脸怪', + category: 'Css', + description: '通常配置rem布局会使用js进行处理,比如750的设计稿会这样...', + content: '通常配置rem布局会使用js进行处理,比如750的设计稿会这样', + isRecommend: true, + isPublish: true, + total_expanse: 100, + state: 'approve', + createDate: '2021-11-04T04:03:36.000Z', + updateDate: '2021-11-04T04:03:36.000Z', + }, + { + title: 'Vue2&Vue3项目风格指南', + author: 'Ronnie', + category: 'Vue', + description: '总结的Vue2和Vue3的项目风格', + content: '### 1. 命名风格\n\n> 文件夹如果是由多个单词组成,应该始终是横线连接 ', + isRecommend: true, + total_expanse: 100, + isPublish: true, + createDate: '2021-10-25T08:57:47.000Z', + updateDate: '2022-02-28T04:02:39.000Z', + }, + { + title: '如何优雅的给图片添加水印', + author: '大脸怪', + category: 'JavaScript', + description: '优雅的给图片添加水印', + content: '我之前写过一篇文章记录了一次上传图片的优化史', + isRecommend: true, + total_expanse: 100, + isPublish: true, + createDate: '2021-06-24T18:46:19.000Z', + updateDate: '2021-09-23T07:51:22.000Z', + }, + + { + title: '前端缓存的理解', + author: '大脸怪', + category: 'Http', + description: '谈谈前端缓存的理解', + content: + '> 背景\n\n公司有个vue-cli3移动端web项目发版更新后发现部分用户手机在钉钉内置浏览器打开出现了缓存', + isRecommend: true, + isPublish: true, + total_expanse: 100, + createDate: '2021-06-10T18:51:19.000Z', + updateDate: '2021-09-17T09:33:24.000Z', + }, + { + title: 'Promise的五个静态方法', + author: '大脸怪', + category: 'JavaScript', + description: '简单介绍下在 Promise 类中,有5 种静态方法及它们的使用场景', + content: + '## 1. Promise.all\n\n并行执行多个 promise,并等待所有 promise 都准备就绪。再对它们进行处理。', + isRecommend: true, + isPublish: true, + total_expanse: 100, + createDate: '2021-02-22T22:37:06.000Z', + updateDate: '2021-09-17T09:33:24.000Z', + }, +] + +export default [ + { + url: '/api/posts', + method: 'get', + response: (data = {}) => { + const { title, pageNo, pageSize } = data.query + let pageData = [] + let total = 60 + const filterData = posts.filter( + (item) => item.title.includes(title) || (!title && title !== 0) + ) + if (filterData.length) { + if (pageSize) { + while (pageData.length < pageSize) { + pageData.push(filterData[Math.round(Math.random() * (filterData.length - 1))]) + } + } else { + pageData = filterData + } + pageData = pageData.map((item, index) => ({ + id: pageSize * (pageNo - 1) + index + 1, + ...item, + })) + } else { + total = 0 + } + return { + code: 0, + message: 'ok', + data: { + pageData, + total, + pageNo, + pageSize, + }, + } + }, + }, + { + url: '/api/post', + method: 'post', + response: ({ body }) => { + return { + code: 0, + message: 'ok', + data: body, + } + }, + }, + { + url: '/api/post/:id', + method: 'put', + response: ({ query, body }) => { + return { + code: 0, + message: 'ok', + data: { + id: query.id, + body, + }, + } + }, + }, + { + url: '/api/post/:id', + method: 'delete', + response: ({ query }) => { + return { + code: 0, + message: 'ok', + data: { + id: query.id, + }, + } + }, + }, +] diff --git a/.history/src/components/table/CrudTable_20230912152251.vue b/.history/src/components/table/CrudTable_20230912152251.vue new file mode 100644 index 0000000..f2a36c0 --- /dev/null +++ b/.history/src/components/table/CrudTable_20230912152251.vue @@ -0,0 +1,149 @@ + + + diff --git a/.history/src/components/table/CrudTable_20230912152508.vue b/.history/src/components/table/CrudTable_20230912152508.vue new file mode 100644 index 0000000..4d2a39d --- /dev/null +++ b/.history/src/components/table/CrudTable_20230912152508.vue @@ -0,0 +1,190 @@ + + + diff --git a/.history/src/views/demo/table/index_20230912152251.vue b/.history/src/views/demo/table/index_20230912152251.vue new file mode 100644 index 0000000..897a821 --- /dev/null +++ b/.history/src/views/demo/table/index_20230912152251.vue @@ -0,0 +1,233 @@ + + + diff --git a/.history/src/views/demo/table/index_20230912152520.vue b/.history/src/views/demo/table/index_20230912152520.vue new file mode 100644 index 0000000..31404f5 --- /dev/null +++ b/.history/src/views/demo/table/index_20230912152520.vue @@ -0,0 +1,287 @@ + + + diff --git a/.vs/ProjectSettings.json b/.vs/ProjectSettings.json new file mode 100644 index 0000000..866f1e1 --- /dev/null +++ b/.vs/ProjectSettings.json @@ -0,0 +1,3 @@ +{ + "CurrentProjectSetting": null +} \ No newline at end of file diff --git a/.vs/VSWorkspaceState.json b/.vs/VSWorkspaceState.json new file mode 100644 index 0000000..b9b9a4a --- /dev/null +++ b/.vs/VSWorkspaceState.json @@ -0,0 +1,7 @@ +{ + "ExpandedNodes": [ + "" + ], + "SelectedNode": "\\C:\\Users\\P17 Gen1\\Source\\Repos\\vue-naive-admin", + "PreviewInSolutionExplorer": false +} \ No newline at end of file diff --git a/.vs/slnx.sqlite b/.vs/slnx.sqlite new file mode 100644 index 0000000..5aaa25e Binary files /dev/null and b/.vs/slnx.sqlite differ diff --git a/.vs/vue-naive-admin/v16/.suo b/.vs/vue-naive-admin/v16/.suo new file mode 100644 index 0000000..03f5896 Binary files /dev/null and b/.vs/vue-naive-admin/v16/.suo differ diff --git a/mock/api/post.js b/mock/api/post.js index b6c3e54..80ffa1a 100644 --- a/mock/api/post.js +++ b/mock/api/post.js @@ -7,6 +7,8 @@ const posts = [ content: '通常配置rem布局会使用js进行处理,比如750的设计稿会这样', isRecommend: true, isPublish: true, + total_expanse: 100, + state: 'approve', createDate: '2021-11-04T04:03:36.000Z', updateDate: '2021-11-04T04:03:36.000Z', }, @@ -17,6 +19,7 @@ const posts = [ description: '总结的Vue2和Vue3的项目风格', content: '### 1. 命名风格\n\n> 文件夹如果是由多个单词组成,应该始终是横线连接 ', isRecommend: true, + total_expanse: 100, isPublish: true, createDate: '2021-10-25T08:57:47.000Z', updateDate: '2022-02-28T04:02:39.000Z', @@ -28,6 +31,7 @@ const posts = [ description: '优雅的给图片添加水印', content: '我之前写过一篇文章记录了一次上传图片的优化史', isRecommend: true, + total_expanse: 100, isPublish: true, createDate: '2021-06-24T18:46:19.000Z', updateDate: '2021-09-23T07:51:22.000Z', @@ -42,6 +46,7 @@ const posts = [ '> 背景\n\n公司有个vue-cli3移动端web项目发版更新后发现部分用户手机在钉钉内置浏览器打开出现了缓存', isRecommend: true, isPublish: true, + total_expanse: 100, createDate: '2021-06-10T18:51:19.000Z', updateDate: '2021-09-17T09:33:24.000Z', }, @@ -54,6 +59,7 @@ const posts = [ '## 1. Promise.all\n\n并行执行多个 promise,并等待所有 promise 都准备就绪。再对它们进行处理。', isRecommend: true, isPublish: true, + total_expanse: 100, createDate: '2021-02-22T22:37:06.000Z', updateDate: '2021-09-17T09:33:24.000Z', }, diff --git a/src/components/table/CrudTable.vue b/src/components/table/CrudTable.vue index f2a36c0..4d2a39d 100644 --- a/src/components/table/CrudTable.vue +++ b/src/components/table/CrudTable.vue @@ -9,6 +9,7 @@ :scroll-x="scrollX" :columns="columns" :data="tableData" + :summary="getSummary" :row-key="(row) => row[rowKey]" :pagination="isPagination ? pagination : false" @update:checked-row-keys="onChecked" @@ -46,6 +47,21 @@ const props = defineProps({ type: Array, required: true, }, + //获取总结数据 + getSummary: { + type: Function, + required: false, + }, + //总结栏所需列名 + sumaryCol: { + type: String, + default: 'total_expanse', + }, + //总结数据 + summaryRef: { + type: Object, + default: null, + }, /** queryBar中的参数 */ queryItems: { type: Object, @@ -53,6 +69,7 @@ const props = defineProps({ return {} }, }, + /** 补充参数(可选) */ extraParams: { type: Object, @@ -75,11 +92,35 @@ const props = defineProps({ }, }) -const emit = defineEmits(['update:queryItems', 'onChecked', 'onDataChange']) +const emit = defineEmits(['update:queryItems', 'onChecked', 'onDataChange', 'setSum']) const loading = ref(false) const initQuery = { ...props.queryItems } const tableData = ref([]) -const pagination = reactive({ page: 1, pageSize: 10 }) +const pagination = reactive({ page: 1, pageSize: 1 }) + +const getSummary = (pageData) => { + // console.log(props.summaryRef) + // // eslint-disable-next-line vue/no-mutating-props + const sum = pageData.reduce( + (prevValue, row) => Number(prevValue) + Number(row[props.sumaryCol]), + 0 + ) + emit('setSum', sum) + console.log(props.sumaryCol) + return { + title: { + value: h( + 'div', + { style: 'top:10%' }, + 'Total: ' + Number(sum).toFixed(2) + // eslint-disable-next-line vue/no-mutating-props + // props.summaryRef.value = num + // return num + ), + colSpan: 10, + }, + } +} async function handleQuery() { try { diff --git a/src/views/demo/table/index.vue b/src/views/demo/table/index.vue index 897a821..31404f5 100644 --- a/src/views/demo/table/index.vue +++ b/src/views/demo/table/index.vue @@ -12,7 +12,19 @@ - + + + + + @@ -104,6 +119,10 @@ const queryItems = ref({}) /** 补充参数(可选) */ const extraParams = ref({}) +//总结数 +const sumRef = ref(0) +const current_ms = ref('total_expanse') + onActivated(() => { $table.value?.handleSearch() }) @@ -193,6 +212,41 @@ const columns = [ }, ] +//tabs栏 +const tabsOptions = ref([ + { + name: 'tab1', + value: 'tab1', + text: 'tab1', + }, + { + name: 'tab2', + value: 'tab2', + text: 'tab2', + }, + { + name: 'tab3', + value: 'tab3', + text: 'tab3', + }, + { + name: 'tab4', + value: 'tab4', + text: 'tab4', + }, +]) +//设置总结需要传的函数 +function setSum(val) { + sumRef.value = val + console.log(sumRef.value) +} + +//根据tabs选择状态搜索 +function selecetChap(val) { + queryItems.value.state = val + $table.value?.handleSearch() +} + // 选中事件 function onChecked(rowKeys) { if (rowKeys.length) $message.info(`选中${rowKeys.join(' ')}`)