index.vue.hbs 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. <script setup lang="ts">
  2. import { ref, getCurrentInstance, reactive } from "vue";
  3. import { useRouter } from "vue-router";
  4. import request, { download } from '~/utils/request';
  5. import { pick } from 'lodash-es';
  6. import { ElMessage } from 'element-plus'
  7. import type { FormInstance, FormRules } from 'element-plus'
  8. import type { AxiosRequestConfig } from 'axios'
  9. // #region (constant)
  10. const TABLE_KEY = '{{tableKey}}'
  11. const URL_CUT = '{{url}}'
  12. const URL_CUT_REF = ref(URL_CUT)
  13. const URL_SUBMIT_KEY = URL_CUT.split('/').join('_').slice(1)
  14. const instance = getCurrentInstance()
  15. const router = useRouter()
  16. // #endregion
  17. // #region (variable)
  18. const loading_table = ref(true)
  19. let whichDialogSubmit:'add'|'edit'
  20. // #endregion
  21. // #region (type)
  22. type TYPE_TABLE_FIELD = {
  23. [TABLE_KEY]: string;
  24. {{#each tableColFields}}
  25. '{{prop}}': string; // {{label}}
  26. {{/each}}
  27. }
  28. // #endregion
  29. // #region (props)
  30. {{#if props}}
  31. const props = defineProps<{
  32. {{#each props}}
  33. {{this}}: string,
  34. {{/each}}
  35. }>()
  36. {{/if}}
  37. // #endregion
  38. // #region (query row)
  39. const queryForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  40. {{#each queryFormBtnList}}
  41. const handleQueryFormBtn_{{name}} = {{{click}}}
  42. {{/each}}
  43. // #endregion
  44. // #region (table selection)
  45. const multipleSelection = ref<TYPE_TABLE_FIELD[]>([])
  46. const handleSelectionChange = (val:TYPE_TABLE_FIELD[]) => {
  47. multipleSelection.value = val
  48. }
  49. // #endregion
  50. // #region (table row)
  51. {{#each tableRowBtnList}}
  52. const handleTableRowBtn_{{name}} = {{{click}}}
  53. {{/each}}
  54. // #endregion
  55. // #region (table body)
  56. const tableData = ref<TYPE_TABLE_FIELD[]>([])
  57. const DetailName = '{{detailName}}'
  58. const DetailParam = '{{detailParam}}'
  59. {{#each tableColBtnList}}
  60. const handleTableColBtn_{{name}} = {{{click}}}
  61. {{/each}}
  62. // #endregion
  63. // #region (pagination)
  64. const total = ref(0)
  65. const limit = ref(10)
  66. const currentPage=ref(1)
  67. function handleCurrentChange(){
  68. queryApi()
  69. }
  70. // #endregion
  71. // #region (dialog base)
  72. const dialogForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  73. {{#each dialogFormBtnList}}
  74. const handleDialogFormBtn_{{name}} = {{{click}}}
  75. {{/each}}
  76. // #endregion
  77. // #region (dialog add/edit)
  78. const dialogVisible_addOrEdit = ref<boolean>(false)
  79. const dialogForm_Ref_addOrEdit= ref<FormInstance>()
  80. const dialogForm_Rules_addOrEdit = reactive({
  81. {{#each dialogFormFields}}
  82. '{{value}}':{required : true,message:'{{label}}不能为空',trigger:'submit'},
  83. {{/each}}
  84. })
  85. // #endregion
  86. // #region (dialog audit)
  87. const dialogVisible_audit = ref<boolean>(false)
  88. const dialogForm_Field_audit= reactive<{
  89. FLAG:keyof TYPE_TABLE_FIELD,
  90. REASON?:keyof TYPE_TABLE_FIELD
  91. }>({
  92. FLAG:'{{tableKey}}',
  93. // REASON:'{{tableKey}}'
  94. })
  95. const dialogForm_Ref_audit= ref<FormInstance>()
  96. const dialogForm_Rules_audit = reactive<FormRules>({
  97. {{#each dialogFormFields}}
  98. '{{value}}':{required : true ,message:'{{label}}不能为空',trigger:'submit'},
  99. {{/each}}
  100. })
  101. // #endregion
  102. // #region (request api):
  103. function queryApi(){
  104. loading_table.value = true
  105. return request({
  106. url: URL_CUT + '/index',
  107. data: {
  108. ...queryForm_Data.value,
  109. limit: limit.value,
  110. page: currentPage.value
  111. }
  112. }).then((response:{data:{total_rows:string,page_data:TYPE_TABLE_FIELD[]}}) => {
  113. const { data } = response
  114. total.value = parseInt(data.total_rows)
  115. tableData.value = data.page_data
  116. return response
  117. }).then(() => {
  118. loading_table.value = false
  119. })
  120. }
  121. function addApi(data:TYPE_TABLE_FIELD){
  122. return request({
  123. url: URL_CUT + '/add',
  124. data: {
  125. [URL_SUBMIT_KEY]:data,
  126. }
  127. })
  128. }
  129. function editApi(data:Partial<TYPE_TABLE_FIELD>){
  130. return request({
  131. url: URL_CUT + '/edit',
  132. data: {
  133. [TABLE_KEY]:data[TABLE_KEY],
  134. [URL_SUBMIT_KEY]:pick(data,[{{#each dialogFormFields}}'{{value}}',{{/each}}]),
  135. }
  136. })
  137. }
  138. function deleteApi(id:string|string[]){
  139. return request({
  140. url: URL_CUT + '/delete',
  141. data: {
  142. [TABLE_KEY]:id,
  143. }
  144. })
  145. }
  146. function detailApi(id:string){
  147. return request({
  148. url: URL_CUT + '/detail',
  149. data: {
  150. [TABLE_KEY]:id,
  151. }
  152. })
  153. }
  154. function importApi(data:{file:File}){
  155. return request({
  156. $type: 'import',
  157. url: URL_CUT + '/import',
  158. data
  159. } as AxiosRequestConfig)
  160. }
  161. function exportApi(){
  162. return download(URL_CUT + '/index', queryForm_Data.value)
  163. }
  164. const API_MAP = {
  165. query:queryApi,
  166. add:addApi,
  167. edit:editApi,
  168. delete:deleteApi,
  169. detail:detailApi,
  170. import:importApi,
  171. export:exportApi,
  172. }
  173. // #endregion
  174. // #region (page init)
  175. function init(){
  176. queryApi()
  177. }
  178. init()
  179. // #endregion
  180. </script>
  181. <template>
  182. <div class="card flex-grow flex flex-col">
  183. <el-form inline :model="queryForm_Data">
  184. <!-- <el-form-item label="关键字"><el-input v-model="queryForm_Data.keyword" ></el-input></el-form-item> -->
  185. {{#each queryFormFields}}
  186. <el-form-item label="{{label}}">{{> WhichFormItem form="queryForm_Data"}}</el-form-item>
  187. {{/each}}
  188. {{#if queryFormBtnList}}
  189. <el-form-item>
  190. {{#each queryFormBtnList}}
  191. <el-button @click="handleQueryFormBtn_{{name}}" type="{{type}}">{{ label }}</el-button>
  192. {{/each}}
  193. </el-form-item>
  194. {{/if}}
  195. </el-form>
  196. <div class="divider"></div>
  197. <div>
  198. {{#each tableRowBtnList}}
  199. {{#if (equals $import true)}}
  200. <import-button :url="URL_CUT_REF"></import-button>
  201. {{else}}
  202. <el-button @click="handleTableRowBtn_{{name}}" type="{{type}}">{{ label }}</el-button>
  203. {{/if}}
  204. {{/each}}
  205. </div>
  206. <div class="divider"></div>
  207. <div class="flex-auto">
  208. <el-table :data="tableData" @selection-change="handleSelectionChange" v-loading="loading_table"
  209. element-loading-background="#ffffff70">
  210. <el-table-column type="selection"></el-table-column>
  211. {{#each tableColFields}}
  212. <el-table-column prop="{{prop}}" label="{{label}}" width="auto" show-overflow-tooltip></el-table-column>
  213. {{/each}}
  214. {{#if tableColBtnList}}
  215. <el-table-column label="操作" fixed="right">
  216. <template #default="scope">
  217. {{#each tableColBtnList}}
  218. <el-button link :auto-insert-space="false" @click="handleTableColBtn_{{name}}(scope)" type="{{type}}" >{{
  219. label }}</el-button>
  220. {{/each}}
  221. </template>
  222. </el-table-column>
  223. {{/if}}
  224. </el-table>
  225. </div>
  226. <div class="flex justify-end mt-10 py-4">
  227. <el-pagination :page-size="limit" v-model:current-page="currentPage" @current-change="handleCurrentChange"
  228. background layout="total, prev, pager, next" :total="total" />
  229. </div>
  230. </div>
  231. <el-dialog v-model="dialogVisible_addOrEdit" append-to-body destroy-on-close>
  232. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit" label-width="120px">
  233. {{#each dialogFormFields}}
  234. <el-form-item label="{{label}}" prop="{{value}}">{{> WhichFormItem form="dialogForm_Data"}}</el-form-item>
  235. {{/each}}
  236. {{#if dialogFormBtnList}}
  237. <div class="flex justify-center">
  238. {{#each dialogFormBtnList}}
  239. <el-button @click="handleDialogFormBtn_{{name}}('dialogForm_Ref_addOrEdit')" type="{{type}}">{{ label }}</el-button>
  240. {{/each}}
  241. </div>
  242. {{/if}}
  243. </el-form>
  244. </el-dialog>
  245. <el-dialog v-model="dialogVisible_audit" append-to-body destroy-on-close>
  246. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_audit" :rules="dialogForm_Rules_audit" label-width="120px">
  247. <el-form-item label="状态">
  248. <el-radio-group v-model="dialogForm_Data[dialogForm_Field_audit.FLAG]">
  249. <el-radio label="1">通过</el-radio>
  250. <el-radio label="2">未通过</el-radio>
  251. </el-radio-group>
  252. </el-form-item>
  253. <!-- <el-form-item label="原因" v-show="dialogForm_Data[dialogForm_Field_audit.FLAG] === '1'">
  254. <el-input type="textarea" v-model="dialogForm_Data[dialogForm_Field_audit.REASON]" :rows="5" />
  255. </el-form-item> -->
  256. <div class="flex justify-center">
  257. {{#each dialogFormBtnList}}
  258. <el-button @click="handleDialogFormBtn_{{name}}('dialogForm_Ref_audit')" type="{{type}}">{{ label }}</el-button>
  259. {{/each}}
  260. </div>
  261. </el-form>
  262. </el-dialog>
  263. </template>