index.tpl 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. <template>
  2. <ContentWrap>
  3. <!-- 搜索工作栏 -->
  4. <el-form :model="queryParams" ref="queryFormRef" class="-mb-15px" :inline="true" label-width="68px">
  5. {[range $index, $item := .Columns]}{[if eq $item.IsQuery "1"]}{[if eq $item.HtmlType "input"]}
  6. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  7. <el-input
  8. v-model="queryParams.{[$item.ColumnNameLower]}"
  9. placeholder="请输入{[$item.ColumnComment]}"
  10. clearable
  11. class="!w-240px"
  12. @keyup.enter="handleQuery"
  13. />
  14. </el-form-item>
  15. {[else if or (eq $item.HtmlType "select") (eq $item.HtmlType "switch") ]}
  16. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  17. <el-select class="!w-240px" v-model="queryParams.{[$item.ColumnNameLower]}" placeholder="{[$item.ColumnComment]}" clearable >
  18. <el-option
  19. v-for="dict in {[$item.ColumnNameLower]}Options"
  20. {[if eq $item.Source "2"]}
  21. :key="dict.id"
  22. :label="dict.label"
  23. :value="dict.id"
  24. {[else]}
  25. :key="dict.id"
  26. :label="dict.label"
  27. :value="dict.id"{[end]}
  28. />
  29. </el-select>
  30. </el-form-item>{[else if eq $item.HtmlType "treeSelect"]}
  31. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  32. <treeselect
  33. v-model="queryParams.{[$item.ColumnNameLower]}"
  34. :options="{[$item.ColumnNameLower]}Options"
  35. :normalizer="normalizer"
  36. :show-count="true"
  37. placeholder="选择{[$item.ColumnComment]}"
  38. />
  39. </el-form-item>{[else if eq $item.HtmlType "radio"]}
  40. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  41. <el-radio-group v-model="queryParams.{[$item.ColumnNameLower]}">
  42. <el-radio
  43. v-for="dict in {[$item.ColumnNameLower]}Options"
  44. :key="dict.id"
  45. :label="dict.id"
  46. >{{ dict.label }}
  47. </el-radio>
  48. </el-radio-group>
  49. </el-form-item>
  50. {[else if eq $item.HtmlType "textarea"]}
  51. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  52. <el-input v-model="queryParams.{[$item.ColumnNameLower]}" type="textarea" placeholder="请输入{[$item.ColumnComment]}" />
  53. </el-form-item>
  54. {[else if eq $item.HtmlType "datetime"]}
  55. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  56. <el-date-picker
  57. v-model="queryParams.createTime"
  58. :default-time="[new Date('1 00:00:00'), new Date('1 23:59:59')]"
  59. class="!w-240px"
  60. end-placeholder="结束日期"
  61. start-placeholder="开始日期"
  62. type="daterange"
  63. value-format="YYYY-MM-DD HH:mm:ss"
  64. />
  65. </el-form-item>
  66. {[else if eq $item.HtmlType "editor"]}
  67. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  68. <editor v-model="queryParams.{[$item.ColumnNameLower]}" :min-height="192"/>
  69. </el-form-item>
  70. {[else]}
  71. <el-form-item label="{[$item.ColumnComment]}" prop="{[$item.ColumnNameLower]}">
  72. <el-input
  73. v-model="queryParams.{[$item.ColumnNameLower]}"
  74. placeholder="请输入{[$item.ColumnComment]}"
  75. clearable
  76. @keyup.enter="handleQuery"
  77. />
  78. </el-form-item>{[end]}{[end]}{[end]}
  79. <el-form-item>
  80. <el-button @click="handleQuery">
  81. <Icon class="mr-5px" icon="ep:search" />
  82. 搜索
  83. </el-button>
  84. <el-button @click="resetQuery">
  85. <Icon class="mr-5px" icon="ep:refresh" />
  86. 重置
  87. </el-button>
  88. <el-button
  89. v-hasPermi="['{[.ModuleName]}:{[.ClassNameCamel]}:add']"
  90. plain
  91. type="primary"
  92. @click="openForm('create')"
  93. >
  94. <Icon class="mr-5px" icon="ep:plus" />
  95. 新增
  96. </el-button>
  97. <el-button
  98. v-hasPermi="['{[.ModuleName]}:{[.ClassNameCamel]}:export']"
  99. :loading="exportLoading"
  100. plain
  101. type="success"
  102. @click="handleExport"
  103. >
  104. <Icon class="mr-5px" icon="ep:download" />
  105. 导出
  106. </el-button>
  107. </el-form-item>
  108. </el-form>
  109. </ContentWrap>
  110. <!-- 列表 -->
  111. <ContentWrap>
  112. <el-table v-loading="loading" {[if eq .TplCategory "tree" ]} row-key="id" :tree-props="{children: 'children', hasChildren: 'hasChildren'}" {[end]}:data="list">
  113. <el-table-column type="selection" width="55" align="center" />{[range $index, $item := .Columns]}{[if eq $item.IsList "1"]}{[if eq $item.HtmlType "input"]}
  114. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" />{[else if eq $item.HtmlType "select"]}
  115. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" >
  116. <template #default="scope">
  117. {{$selectDictLabel({[$item.ColumnNameLower]}Options,scope.row.{[$item.ColumnNameLower]},"id","label")}}
  118. </template>
  119. </el-table-column>{[else if eq $item.HtmlType "treeSelect"]}
  120. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" >
  121. <template #default="scope">
  122. <show-tag :data="{[$item.ColumnNameLower]}Options" :value="scope.row.{[$item.ColumnNameLower]}" />
  123. </template>
  124. </el-table-column>{[else if eq $item.HtmlType "switch"]}
  125. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" >
  126. <template #default="scope">
  127. <show-tag :data="{[$item.ColumnNameLower]}Options" :value="scope.row.{[$item.ColumnNameLower]}" />
  128. </template>
  129. </el-table-column>{[else if eq $item.HtmlType "radio"]}
  130. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" >
  131. <template #default="scope">
  132. <show-tag :data="{[$item.ColumnNameLower]}Options" :value="scope.row.{[$item.ColumnNameLower]}" />
  133. </template>
  134. </el-table-column>{[else if eq $item.HtmlType "textarea"]}
  135. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" />{[else if eq $item.HtmlType "imageUpload"]}
  136. <el-table-column prop="icon" label="等级图标">
  137. <template #default="scope">
  138. <show-image :src="scope.row.{[$item.ColumnNameLower]}" />
  139. </template>
  140. </el-table-column>{[else if eq $item.HtmlType "datetime"]}
  141. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" width="180">
  142. <template #default="scope">
  143. <span>{{ $formatTime(scope.row.{[$item.ColumnNameLower]},'YYYY-MM-DD HH:mm:ss')}}</span>
  144. </template>
  145. </el-table-column>{[else if eq $item.HtmlType "editor"]}
  146. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" />{[else if eq $item.HtmlType "date"]}
  147. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" width="180">
  148. <template #default="scope">
  149. <span>{{ $formatTime(scope.row.{[$item.ColumnNameLower]},'YYYY-MM-DD')}}</span>
  150. </template>
  151. </el-table-column>{[else if eq $item.HtmlType "editor"]}
  152. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" /> {[else ]}
  153. <el-table-column label="{[$item.ColumnComment]}" align="center" prop="{[$item.ColumnNameLower]}" />{[end]}{[end]}{[end]}
  154. <el-table-column label="操作" fixed="right" width="150" align="center" class-name="small-padding fixed-width">
  155. <template #default="scope">
  156. <el-button
  157. size="mini"
  158. type="text"
  159. icon="el-icon-edit"
  160. @click="openForm('update', scope.row.id)"
  161. v-hasPermi="['{[.ModuleName]}:{[.ClassNameCamel]}:edit']"
  162. >修改</el-button>
  163. <el-button
  164. size="mini"
  165. type="text"
  166. icon="el-icon-delete"
  167. @click="handleDelete(scope.row)"
  168. v-hasPermi="['{[.ModuleName]}:{[.ClassNameCamel]}:remove']"
  169. >删除</el-button>
  170. </template>
  171. </el-table-column>
  172. </el-table>
  173. <!-- 分页 -->
  174. <Pagination
  175. v-model:limit="queryParams.pageSize"
  176. v-model:page="queryParams.pageNo"
  177. :total="total"
  178. @pagination="getList"
  179. />
  180. </ContentWrap>
  181. <!-- 表单弹窗:添加/修改 -->
  182. {[htmlSafe "<"]}{[.ClassNameUpper]}Form ref="formRef" @success="getList" />
  183. </template>
  184. {[htmlSafe "<script lang=\"ts\" setup>"]}
  185. import { DICT_TYPE, getIntDictOptions } from '@/utils/dict'
  186. import { dateFormatter } from '@/utils/formatTime'
  187. import download from '@/utils/download'
  188. import {[.ClassNameUpper]}Form from './{[.ClassNameUpper]}Form.vue'
  189. import * as {[.ClassNameUpper]}Api from '@/api/{[.ModuleName]}/{[toMiddle .ClassNameCamel]}'{[range $index, $item := .Columns]}{[if eq $item.Source "2"]}
  190. import * as {[toUpper $item.Menu]}Api from "@/api/{[$item.Module]}/{[toMiddle $item.Menu]}"{[end]}{[end]}
  191. defineOptions({ name: '{[.ClassNameUpper]}' })
  192. /**变量*/<!-- 变量 -->
  193. const message = useMessage() // 消息弹窗
  194. const { t } = useI18n() // 国际化
  195. const loading = ref(true) // 列表的加载中
  196. const total = ref(0) // 列表的总页数
  197. const list = ref([]) // 列表的数据
  198. const queryParams = reactive({
  199. pageNo: 1,
  200. pageSize: 10,{[range $index, $item := .Columns]}{[if eq $item.IsQuery "1"]}
  201. //{[$item.ColumnComment]}查询字段
  202. {[$item.ColumnNameLower]}: undefined,{[end]}{[end]}
  203. createTime: []
  204. }){[range $index, $item := .Columns]}{[if eq $item.Source "1"]}
  205. //{[$item.ColumnComment]}数据字典
  206. let {[$item.ColumnNameLower]}Options = []{[else if eq $item.Source "2"]}
  207. //{[$item.ColumnComment]}数据菜单
  208. let {[$item.ColumnNameLower]}Options = []{[else if eq $item.Source "3"]}
  209. //{[$item.ColumnComment]}本地数据
  210. {[if eq $item.GoType "string"]}
  211. let {[$item.ColumnNameLower]}Options = [ {[range $i, $it := $item.Data]}
  212. {id:'{[$it.Id]}',label:"{[$it.Label]}",color:"{[$it.Color]}"}{[if not (isLast $i (len $item.Data))]},{[end]}{[end]}]
  213. {[else]}
  214. let {[$item.ColumnNameLower]}Options = [ {[range $i, $it := $item.Data]}
  215. {id:{[$it.Id]},label:"{[$it.Label]}",color:"{[$it.Color]}"}{[if not (isLast $i (len $item.Data))]},{[end]}{[end]}]
  216. {[end]}{[end]}{[end]}
  217. /**窗体*/<!-- 窗体 -->
  218. const queryFormRef = ref() // 搜索的表单
  219. /** 添加/修改操作窗体 */
  220. const formRef = ref()
  221. const exportLoading = ref(false) // 导出的加载中
  222. {[range $index, $item := .Columns]}{[if eq $item.Source "2"]}
  223. //查询{[$item.ColumnComment]}菜单
  224. const getList{[$item.ColumnNameUpper]}= async () =>{
  225. const data = await {[toUpper $item.Menu]}Api.get{[toUpper $item.Menu]}List(){[if eq $item.HtmlType "select"]}
  226. {[$item.ColumnNameLower]}Options = data{[else if eq $item.HtmlType "treeSelect"]}
  227. // response.data.push({ id: 0, menuName: '顶级节点', children: [] });
  228. {[$item.ColumnNameLower]}List= Object.assign([],data)
  229. {[$item.ColumnNameLower]}List.push({ id: 0, menuName: '顶级节点', children: []})
  230. const root = { id: 0, label: '顶级节点', children: [] }
  231. root.children = this.handleTree(response.data, 'id')
  232. this.{[$item.ColumnNameLower]}Options.push(root){[end]}
  233. }{[end]}{[end]}
  234. /** 查询列表 */
  235. const getList = async () => {
  236. loading.value = true
  237. try {
  238. const data = await {[.ClassNameUpper]}Api.get{[.ClassNameUpper]}Page(queryParams)
  239. list.value = data.list
  240. total.value = data.total
  241. } finally {
  242. loading.value = false
  243. }
  244. }
  245. /** 搜索按钮操作 */
  246. const handleQuery = () => {
  247. queryParams.pageNo = 1
  248. getList()
  249. }
  250. /** 重置按钮操作 */
  251. const resetQuery = () => {
  252. queryFormRef.value.resetFields()
  253. handleQuery()
  254. }
  255. /** 删除按钮操作 */
  256. const handleDelete = async (row: number) => {
  257. try {
  258. // 删除的二次确认
  259. await message.delConfirm()
  260. // 发起删除
  261. await {[.ClassNameUpper]}Api.delete{[.ClassNameUpper]}([row.id])
  262. message.success(t('common.delSuccess'))
  263. // 刷新列表
  264. await getList()
  265. } catch {}
  266. }
  267. const openForm = (type: string, id?: number) => {
  268. formRef.value.open(type, id)
  269. }
  270. /** 导出按钮操作 */
  271. const handleExport = async () => {
  272. try {
  273. // 导出的二次确认
  274. await message.exportConfirm()
  275. // 发起导出
  276. exportLoading.value = true
  277. const data = await {[.ClassNameUpper]}Api.export{[.ClassNameUpper]}(queryParams)
  278. download.excel(data, '角色列表.xls')
  279. } catch {
  280. } finally {
  281. exportLoading.value = false
  282. }
  283. }
  284. /** 初始化 **/
  285. onMounted(() => {{[range $index, $item := .Columns]}{[if eq $item.Source "1"]}
  286. //获取{[$item.ColumnComment]}数据字典
  287. getDicts("{[$item.DictType]}").then(response => {
  288. {[$item.ColumnNameLower]}Options = response.data;
  289. }){[else if eq $item.Source "2"]}
  290. //获取{[$item.ColumnComment]}菜单
  291. getList{[$item.ColumnNameUpper]}()
  292. {[end]}{[end]}
  293. getList()
  294. })
  295. </script>