index.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  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 = 'xsk_id'
  11. const URL_CUT = '/xdjx/stxkgl_kcpj'
  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. 'xsk_kcpjmc': string; // 课程评价名称
  25. 'xsk_kcpjlx': string; // 评价类型
  26. 'xsk_cjr': string; // 创建人
  27. 'xsk_cjsj': string; // 创建时间
  28. 'xsxk_id': string; // 所属课程编号
  29. }
  30. // #endregion
  31. // #region (props)
  32. // #endregion
  33. // #region (query row)
  34. const queryForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  35. const handleQueryFormBtn_search = () => {
  36. queryApi()
  37. }
  38. const handleQueryFormBtn_clear = () => {
  39. queryForm_Data.value = {}
  40. }
  41. // #endregion
  42. // #region (table selection)
  43. const multipleSelection = ref<TYPE_TABLE_FIELD[]>([])
  44. const handleSelectionChange = (val: TYPE_TABLE_FIELD[]) => {
  45. multipleSelection.value = val
  46. }
  47. // #endregion
  48. // #region (table row)
  49. const handleTableRowBtn_import = async ({ file }: { file: File }) => {
  50. const res = await API_MAP['import']({ file })
  51. if (res.code === '1') {
  52. queryApi()
  53. ElMessage.success(res.msg)
  54. }
  55. }
  56. const handleTableRowBtn_export = () => {
  57. if(multipleSelection.value.length===0) return ElMessage.info('请先勾选导出文件');exportApi({[TABLE_KEY]:multipleSelection.value.map((item: TYPE_TABLE_FIELD)=>item[TABLE_KEY])?.join()})
  58. }
  59. const handleTableRowBtn_add = () => {
  60. whichDialogSubmit = 'add'
  61. dialogForm_Data.value = {}
  62. dialogVisible_addOrEdit.value = true
  63. }
  64. const handleTableRowBtn_delete = async () => {
  65. if(multipleSelection.value.length===0) return ElMessage.info('请先勾选文件');const resp = await deleteApi(multipleSelection.value.map((item: TYPE_TABLE_FIELD) => item[TABLE_KEY]));if(resp.code!=='1')return;ElMessage.success('删除成功');
  66. queryApi()
  67. }
  68. // #endregion
  69. // #region (table body)
  70. const tableData = ref<TYPE_TABLE_FIELD[]>([])
  71. const DetailName = '-STXKGL-XSKCPJB-DETAIL'
  72. const DetailParam = 'bid'
  73. const handleTableColBtn_edit = async (scope: { row: TYPE_TABLE_FIELD }) => {
  74. whichDialogSubmit = 'edit'
  75. const res = await detailApi(scope.row[TABLE_KEY])
  76. dialogForm_Data.value = (res.data.one_info)
  77. dialogVisible_addOrEdit.value = true
  78. }
  79. const handleTableColBtn_audit = (scope: { row: TYPE_TABLE_FIELD }) => {
  80. whichDialogSubmit = 'edit'
  81. dialogForm_Data.value = pick(scope.row, [`${TABLE_KEY}`, ...Object.keys(dialogForm_Rules_audit)])
  82. dialogVisible_audit.value = true
  83. }
  84. const handleTableColBtn_detail = (scope: { row: TYPE_TABLE_FIELD }) => {
  85. router.push({ name: DetailName, params: { aid: scope.row.xsxk_id, [DetailParam]: scope.row[TABLE_KEY] } })
  86. }
  87. const handleTableColBtn_delete = async (scope: { row: TYPE_TABLE_FIELD }) => {
  88. const resp = await deleteApi(scope.row[TABLE_KEY]);if(resp.code!=='1')return;ElMessage.success('删除成功');
  89. queryApi()
  90. }
  91. // #endregion
  92. // #region (pagination)
  93. const total = ref(0)
  94. const limit = ref(10)
  95. const currentPage = ref(1)
  96. function handleCurrentChange() {
  97. queryApi()
  98. }
  99. // #endregion
  100. // #region (dialog base)
  101. const dialogForm_Data = ref<Partial<TYPE_TABLE_FIELD> & { keyword?: string }>({})
  102. const handleDialogFormBtn_submit = async (formRefKey: string,extendData?:Partial<TYPE_TABLE_FIELD>) => {
  103. const isValid = await (instance?.refs[formRefKey] as FormInstance).validate((valid: boolean) => valid)
  104. if (isValid) {
  105. const resp = await API_MAP[whichDialogSubmit](<TYPE_TABLE_FIELD>({...dialogForm_Data.value,...extendData}))
  106. if(resp.code!=='1')return;ElMessage.success('操作成功');handleDialogFormBtn_cancel()
  107. queryApi()
  108. }
  109. }
  110. const handleDialogFormBtn_cancel = (formRefKey?: string) => {
  111. dialogVisible_addOrEdit.value = false
  112. dialogVisible_audit.value = false
  113. }
  114. // #endregion
  115. // #region (dialog add/edit)
  116. const dialogVisible_addOrEdit = ref<boolean>(false)
  117. const dialogForm_Ref_addOrEdit = ref<FormInstance>()
  118. const dialogForm_Rules_addOrEdit = reactive({
  119. 'xsk_kcpjmc': { required: true, message: '课程评价名称不能为空', trigger: 'submit' },
  120. 'xsk_kcpjlx': { required: true, message: '评价类型不能为空', trigger: 'submit' },
  121. 'xsk_cjr': { required: true, message: '创建人不能为空', trigger: 'submit' },
  122. 'xsk_cjsj': { required: true, message: '创建时间不能为空', trigger: 'submit' },
  123. 'xsxk_id': { required: true, message: '所属课程编号不能为空', trigger: 'submit' },
  124. })
  125. // #endregion
  126. // #region (dialog audit)
  127. const dialogVisible_audit = ref<boolean>(false)
  128. const dialogForm_Field_audit = reactive<{
  129. FLAG: keyof TYPE_TABLE_FIELD,
  130. REASON?: keyof TYPE_TABLE_FIELD
  131. }>({
  132. FLAG: 'xsk_id',
  133. REASON: 'xsk_id'
  134. })
  135. const dialogForm_Ref_audit = ref<FormInstance>()
  136. const dialogForm_Rules_audit = reactive<FormRules>({
  137. 'xsk_kcpjmc': { required: true, message: '课程评价名称不能为空', trigger: 'submit' },
  138. 'xsk_kcpjlx': { required: true, message: '评价类型不能为空', trigger: 'submit' },
  139. 'xsk_cjr': { required: true, message: '创建人不能为空', trigger: 'submit' },
  140. 'xsk_cjsj': { required: true, message: '创建时间不能为空', trigger: 'submit' },
  141. 'xsxk_id': { required: true, message: '所属课程编号不能为空', trigger: 'submit' },
  142. })
  143. // #endregion
  144. // #region (request api):
  145. function queryApi() {
  146. loading_table.value = true
  147. return request({
  148. url: URL_CUT + '/index',
  149. data: {
  150. ...queryForm_Data.value,
  151. limit: limit.value,
  152. page: currentPage.value
  153. }
  154. }).then((response: { data: { total_rows: string, page_data: TYPE_TABLE_FIELD[] } }) => {
  155. const { data } = response
  156. total.value = parseInt(data.total_rows)
  157. tableData.value = data.page_data
  158. return response
  159. }).then(() => {
  160. loading_table.value = false
  161. })
  162. }
  163. function addApi(data: TYPE_TABLE_FIELD) {
  164. return request({
  165. url: URL_CUT + '/add',
  166. data: {
  167. [URL_SUBMIT_KEY]: data,
  168. }
  169. })
  170. }
  171. function editApi(data: Partial<TYPE_TABLE_FIELD>) {
  172. return request({
  173. url: URL_CUT + '/edit',
  174. data: {
  175. [TABLE_KEY]: data[TABLE_KEY],
  176. [URL_SUBMIT_KEY]: pick(data, ['xsk_kcpjmc', 'xsk_kcpjlx', 'xsk_cjr', 'xsk_cjsj', 'xsxk_id',]),
  177. }
  178. })
  179. }
  180. function deleteApi(id: string | string[]) {
  181. return request({
  182. url: URL_CUT + '/delete',
  183. data: {
  184. [TABLE_KEY]: id,
  185. }
  186. })
  187. }
  188. function detailApi(id: string) {
  189. return request({
  190. url: URL_CUT + '/detail',
  191. data: {
  192. [TABLE_KEY]: id,
  193. }
  194. })
  195. }
  196. function importApi(data: { file: File }) {
  197. return request({
  198. $type: 'import',
  199. url: URL_CUT + '/import',
  200. data
  201. } as AxiosRequestConfig)
  202. }
  203. function exportApi(d) {
  204. return download(URL_CUT + '/index', {...queryForm_Data.value,...d})
  205. }
  206. const API_MAP = {
  207. query: queryApi,
  208. add: addApi,
  209. edit: editApi,
  210. delete: deleteApi,
  211. detail: detailApi,
  212. import: importApi,
  213. export: exportApi,
  214. }
  215. // #endregion
  216. // #region (page init)
  217. function init() {
  218. queryApi()
  219. }
  220. init()
  221. // #endregion
  222. </script>
  223. <template>
  224. <div class="card flex-grow flex flex-col">
  225. <el-form inline :model="queryForm_Data">
  226. <el-form-item label="关键字">
  227. <el-input v-model="queryForm_Data.keyword" clearable />
  228. </el-form-item>
  229. <!-- <el-form-item label="课程评价名称"><el-input v-model="queryForm_Data.xsk_kcpjmc" clearable /></el-form-item>
  230. <el-form-item label="评价类型"><el-select v-model="queryForm_Data.xsk_kcpjlx" clearable ><el-option label="打分评价" value="1" /><el-option label="等级评价" value="2" /></el-select></el-form-item>
  231. <el-form-item label="创建人"><el-input v-model="queryForm_Data.xsk_cjr" clearable /></el-form-item> -->
  232. <!-- <el-form-item label="创建时间"><el-date-picker type="datetime" v-model="queryForm_Data.xsk_cjsj" value-format="YYYY-MM-DD HH:mm:ss" clearable /></el-form-item> -->
  233. <!-- <el-form-item label="所属课程编号"><el-input v-model="queryForm_Data.xsxk_id" clearable /></el-form-item> -->
  234. <el-form-item>
  235. <el-button @click="handleQueryFormBtn_search" type="primary">搜索</el-button>
  236. <el-button @click="handleQueryFormBtn_clear" type="warning">清空</el-button>
  237. </el-form-item>
  238. </el-form>
  239. <div class="divider"></div>
  240. <div>
  241. <!-- <import-button @success="queryApi" :url="URL_CUT_REF"></import-button>
  242. <el-button @click="handleTableRowBtn_export" type="success">导出</el-button> -->
  243. <el-button @click="handleTableRowBtn_add" type="primary">新增</el-button>
  244. <el-button @click="handleTableRowBtn_delete" type="danger">删除</el-button>
  245. </div>
  246. <div class="divider"></div>
  247. <div class="flex-auto">
  248. <el-table :data="tableData" @selection-change="handleSelectionChange" v-loading="loading_table"
  249. element-loading-background="#ffffff70">
  250. <el-table-column type="selection"></el-table-column><el-table-column type="index" label="序号" width="60" :index="(i: number) => (currentPage - 1) * limit + i + 1" />
  251. <el-table-column prop="xsxk_kcmc" label="课程名称" width="auto" show-overflow-tooltip></el-table-column>
  252. <el-table-column prop="xsk_kcpjmc" label="课程评价名称" width="auto" show-overflow-tooltip></el-table-column>
  253. <el-table-column prop="xsk_kcpjlx" label="评价类型" width="auto" show-overflow-tooltip></el-table-column>
  254. <el-table-column prop="xsk_cjr" label="创建人" width="auto" show-overflow-tooltip></el-table-column>
  255. <el-table-column prop="xsk_cjsj" label="创建时间" width="auto" show-overflow-tooltip></el-table-column>
  256. <!-- <el-table-column prop="xsxk_id" label="所属课程编号" width="auto" show-overflow-tooltip></el-table-column> -->
  257. <el-table-column label="操作" fixed="right">
  258. <template #default="scope">
  259. <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_edit(scope)" type="primary" >编辑</el-button> -->
  260. <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_audit(scope)" type="primary" >审核</el-button> -->
  261. <el-button link :auto-insert-space="false" @click="handleTableColBtn_detail(scope)" type="primary" >详情
  262. </el-button>
  263. <!-- <el-button link :auto-insert-space="false" @click="handleTableColBtn_delete(scope)" type="primary" >删除</el-button> -->
  264. </template>
  265. </el-table-column>
  266. </el-table>
  267. </div>
  268. <div class="flex justify-end mt-10 py-4">
  269. <el-pagination :page-size="limit" v-model:current-page="currentPage" @current-change="handleCurrentChange"
  270. background layout="total, prev, pager, next" :total="total" />
  271. </div>
  272. </div>
  273. <el-dialog v-model="dialogVisible_addOrEdit" append-to-body destroy-on-close>
  274. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_addOrEdit" :rules="dialogForm_Rules_addOrEdit"
  275. label-width="120px">
  276. <el-form-item label="课程评价名称" prop="xsk_kcpjmc">
  277. <el-input v-model="dialogForm_Data.xsk_kcpjmc" clearable />
  278. </el-form-item>
  279. <el-form-item label="评价类型" prop="xsk_kcpjlx">
  280. <el-radio-group v-model="dialogForm_Data.xsk_kcpjlx">
  281. <el-radio label="1">打分评价</el-radio>
  282. <el-radio label="2">等级评价</el-radio>
  283. </el-radio-group>
  284. </el-form-item>
  285. <el-form-item label="创建人" prop="xsk_cjr">
  286. <el-input v-model="dialogForm_Data.xsk_cjr" clearable />
  287. </el-form-item>
  288. <el-form-item label="创建时间" prop="xsk_cjsj">
  289. <el-date-picker type="datetime" v-model="dialogForm_Data.xsk_cjsj" value-format="YYYY-MM-DD HH:mm:ss"
  290. clearable />
  291. </el-form-item>
  292. <el-form-item label="所属课程编号" prop="xsxk_id">
  293. <!-- <el-input v-model="dialogForm_Data.xsxk_id" clearable /> -->
  294. <remote-select url="/xdjx/stxkgl_kcxkgl/index" :fields="['xsxk_id','xsxk_kcmc']" v-model="dialogForm_Data.xsxk_id" ></remote-select>
  295. </el-form-item>
  296. <div class="flex justify-center">
  297. <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_addOrEdit')" type="primary">提交</el-button>
  298. <el-button @click="handleDialogFormBtn_cancel('dialogForm_Ref_addOrEdit')" type="default">取消</el-button>
  299. </div>
  300. </el-form>
  301. </el-dialog>
  302. <el-dialog v-model="dialogVisible_audit" append-to-body destroy-on-close>
  303. <el-form :model="dialogForm_Data" ref="dialogForm_Ref_audit" :rules="dialogForm_Rules_audit" label-width="120px">
  304. <el-form-item label="状态">
  305. <el-radio-group v-model="dialogForm_Data[dialogForm_Field_audit.FLAG]">
  306. <el-radio label="1">通过</el-radio>
  307. <el-radio label="2">未通过</el-radio>
  308. </el-radio-group>
  309. </el-form-item>
  310. <!-- <el-form-item label="原因" v-show="dialogForm_Data[dialogForm_Field_audit.FLAG] === '1'">
  311. <el-input type="textarea" v-model="dialogForm_Data[dialogForm_Field_audit.REASON]" :rows="5" />
  312. </el-form-item> -->
  313. <div class="flex justify-center">
  314. <el-button @click="handleDialogFormBtn_submit('dialogForm_Ref_audit')" type="primary">提交</el-button>
  315. <el-button @click="handleDialogFormBtn_cancel('dialogForm_Ref_audit')" type="default">取消</el-button>
  316. </div>
  317. </el-form>
  318. </el-dialog>
  319. </template>