tableRef.js 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. import axios from 'axios'
  2. import { ref, watch, onActivated, onMounted } from 'vue'
  3. import { getApp } from '@/app'
  4. import { UN_REQ_NUM } from '@/constant'
  5. import { throttle } from '@/util'
  6. const getOperState = (attr) => {
  7. const operState = ref({
  8. state: {
  9. show: false,
  10. id: 0,
  11. ...JSON.parse(JSON.stringify(attr))
  12. },
  13. _readyUpdate(item) {
  14. operState.value.state.id = item.id
  15. operState.value.state.show = true
  16. Object.keys(attr).forEach(key => {
  17. operState.value.state[key] = attr[key]
  18. })
  19. Object.keys(attr).forEach(key => {
  20. if (item[key] !== void 0) {
  21. operState.value.state[key] = item[key]
  22. }
  23. })
  24. },
  25. readyInsert() {
  26. operState.value.reset()
  27. operState.value.state.show = true
  28. },
  29. reset() {
  30. Object.keys(attr).forEach(key => {
  31. operState.value.state[key] = attr[key]
  32. })
  33. operState.value.state.show = false
  34. operState.value.state.id = void 0
  35. },
  36. quit() {
  37. operState.value.reset()
  38. }
  39. })
  40. console.log('getOperState',operState)
  41. return operState
  42. }
  43. const getSearchState = (attr) => {
  44. const searchState = ref({
  45. state: { ...JSON.parse(JSON.stringify(attr)) },
  46. reset() {
  47. Object.keys(attr).forEach(key => {
  48. searchState.value.state[key] = attr[key]
  49. })
  50. }
  51. })
  52. return searchState
  53. }
  54. const getDataListState = (isSelect) => {
  55. const listStateState = ref({
  56. state: [],
  57. })
  58. if (isSelect) {
  59. listStateState.value.selectRows = []
  60. listStateState.value.changeSelectRows = (data) => {
  61. listStateState.value.selectRows = data
  62. }
  63. }
  64. return listStateState
  65. }
  66. const getPagState = () => {
  67. const pagState = ref({
  68. state: {
  69. currPage: 1,
  70. size: 12,
  71. total: 0
  72. },
  73. sizeChange(attr) {
  74. pagState.value.state.size = attr
  75. },
  76. currentChange(attr) {
  77. pagState.value.state.currPage = attr
  78. }
  79. })
  80. return pagState
  81. }
  82. const referListData = async (ret, getUrl, pagAttr = {}) => {
  83. let params = {
  84. pageNum: ret.pag.value.state.currPage,
  85. pageSize: ret.pag.value.state.size
  86. }
  87. if (ret.search) {
  88. Object.keys(ret.search.value.state).forEach(key => {
  89. if (UN_REQ_NUM !== ret.search.value.state[key]) {
  90. if (typeof ret.search.value.state[key] === 'string') {
  91. params[key] = ret.search.value.state[key].trim()
  92. } else {
  93. params[key] = ret.search.value.state[key]
  94. }
  95. }
  96. })
  97. }
  98. try {
  99. let res = await axios.get(getUrl, { params })
  100. ret.pag.value.state.total = pagAttr['totalNum'] ? res.data[pagAttr['totalNum']] : res.data.total
  101. ret.dataList.value.state = res.data.records = 'list'in pagAttr ? pagAttr['list'] ? res.data[pagAttr['list']] : res.data : res.data.records
  102. } catch {
  103. ret.dataList.value.state = []
  104. ret.pag.value.state.total = 0
  105. }
  106. }
  107. export default ({operAttr, searchAttr, pagAttr, isSelect = true, getUrl, updateUrl, insertUrl, delUrl, delMsg, delAttr } = {}) => {
  108. let ret = {
  109. dataList: getDataListState(isSelect),
  110. pag: getPagState()
  111. }
  112. let watchItems = [
  113. () => ret.pag.value.state.currPage,
  114. () => ret.pag.value.state.size,
  115. ]
  116. if (operAttr) {
  117. const oper = getOperState(operAttr)
  118. oper.value.readyUpdate = function(...args) {
  119. oper.value._readyUpdate(...args)
  120. oper.value.state.__oldData = ret.dataList.value.state.find(({id}) => id === oper.value.state.id)
  121. }
  122. updateUrl && (
  123. oper.value.update = async (data) => {
  124. let target = data || oper.value.state
  125. let updateIndex = ret.dataList.value.state.findIndex(({id}) => id === target.id)
  126. let item = { ...ret.dataList.value.state[updateIndex] }
  127. if (item) {
  128. Object.keys(operAttr).forEach(key => item[key] = target[key])
  129. }
  130. await axios.post(updateUrl, data || item)
  131. ret.dataList.value.state[updateIndex] = item
  132. oper.value.reset()
  133. ret.dataList.value.refer()
  134. }
  135. )
  136. insertUrl && (
  137. oper.value.insert = async (data) => {
  138. let target = data || oper.value.state
  139. console.log(oper.value.state)
  140. let item = {}
  141. Object.keys(operAttr).forEach(key => item[key] = target[key])
  142. await axios.post(insertUrl, data || item)
  143. ret.dataList.value.state.push(item)
  144. oper.value.reset()
  145. ret.dataList.value.refer()
  146. }
  147. )
  148. ret.oper = oper
  149. }
  150. if (searchAttr) {
  151. const search = getSearchState(searchAttr)
  152. search.value.submit = () => {
  153. ret.dataList.value.refer()
  154. }
  155. ret.search = search
  156. watchItems.push(search.value.state)
  157. }
  158. if (updateUrl || delUrl) {
  159. if (delUrl) {
  160. ret.dataList.value._delete = async (data) => {
  161. let reqData = {}
  162. if (delAttr) {
  163. for (let [k, v] of Object.entries(delAttr)) {
  164. reqData[k] = data[v]
  165. }
  166. console.log(delAttr, data, reqData)
  167. } else {
  168. reqData.id = data.id
  169. }
  170. await axios.post(delUrl, reqData)
  171. }
  172. } else {
  173. ret.dataList.value._delete = async (data) => {
  174. data.isDelete = 1
  175. await axios.post(updateUrl, data)
  176. }
  177. }
  178. ret.dataList.value.delete = async (data) => {
  179. if (await getApp().$confirm(delMsg || '确定要删除此数据吗?', '提示')) {
  180. await ret.dataList.value._delete(data)
  181. getApp().$message({message: '删除成功', type: 'success'});
  182. ret.dataList.value.refer()
  183. }
  184. }
  185. if (isSelect) {
  186. ret.dataList.value.deleteSelect = async () => {
  187. const rows = ret.dataList.value.selectRows
  188. if (rows.length === 0) {
  189. getApp().$message.error('请勾选数据后再删除数据!', '提示')
  190. } else if (await getApp().$confirm(`确定要删除这${rows.length}条数据吗?`, '提示')) {
  191. await Promise.all(rows.map(item => ret.dataList.value._delete(item)))
  192. getApp().$message({message: '删除成功', type: 'success'});
  193. ret.dataList.value.refer()
  194. }
  195. }
  196. }
  197. }
  198. ret.dataList.value.refer = throttle(
  199. () => {
  200. referListData(ret, getUrl, pagAttr)
  201. },
  202. 100
  203. )
  204. // 刷新数据
  205. watch( watchItems, ret.dataList.value.refer )
  206. // 激活再刷新一次
  207. onActivated(() => referListData(ret, getUrl, pagAttr))
  208. onMounted(() => referListData(ret, getUrl, pagAttr))
  209. console.log('getTableState',ret)
  210. return ret
  211. }