index.tsx 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  1. import SaveForm from '@/components/save-form'
  2. import Pagination from '@/components/pagination'
  3. import {DataTableRowKey, NButton, NDataTable, NFormItem, NInput, NModal, NSelect, NSpace, NTag, useDialog, useMessage} from 'naive-ui'
  4. import {defineComponent, onMounted, reactive, ref} from 'vue'
  5. import {rollCallSettingPage, rollCallSettingRemove, rollCallSettingStatus} from "@views/music-library/api";
  6. import Edit from "@views/music-library/calligraphy/modal/edit";
  7. export default defineComponent({
  8. name: 'music-calligraphy',
  9. setup(props, {emit}) {
  10. const dialog = useDialog()
  11. const message = useMessage()
  12. const state = reactive({
  13. loading: false,
  14. pagination: {
  15. page: 1,
  16. rows: 10,
  17. pageTotal: 0
  18. },
  19. searchForm: {
  20. keyword: null,
  21. status: null,
  22. },
  23. showEdit: false,
  24. editMode: 'add' as any,
  25. dataList: [] as any,
  26. rowData: null as any,
  27. })
  28. const columns = (): any => {
  29. return [
  30. {
  31. type: 'selection'
  32. },
  33. {
  34. title: '编号',
  35. key: 'id',
  36. },
  37. {
  38. title: '调号',
  39. key: 'name',
  40. },
  41. {
  42. title: '连接地址',
  43. key: 'url',
  44. },
  45. {
  46. title: '更新人',
  47. key: 'updateName',
  48. },
  49. {
  50. title: '更新时间',
  51. key: 'updateTime',
  52. },
  53. {
  54. title: '消息状态',
  55. key: 'status',
  56. render(row: any) {
  57. return (
  58. <NTag type={row.status ? 'primary' : 'default'}>{row.status ? '启用' : '停用'}</NTag>
  59. )
  60. }
  61. },
  62. {
  63. title: '操作',
  64. key: 'operation',
  65. fixed: 'right',
  66. width: '300px',
  67. render(row: any) {
  68. return (
  69. <NSpace>
  70. <NButton
  71. type="primary"
  72. size="small"
  73. text
  74. // v-auth="musicSheet/save1751241178962984962"
  75. onClick={() => {
  76. state.showEdit = true
  77. state.editMode = 'edit'
  78. state.rowData = row
  79. }}
  80. >
  81. 修改
  82. </NButton>
  83. <NButton
  84. type="primary"
  85. size="small"
  86. text
  87. // v-auth="musicSheet/statusList1751241653309407234"
  88. onClick={() => onChangeStatus(row)}
  89. >
  90. {row.status ? '停用' : '启用'}
  91. </NButton>
  92. <NButton
  93. type="primary"
  94. size="small"
  95. text
  96. disabled={!!row.status}
  97. onClick={() => onRmove(row)}
  98. // v-auth="musicSheet/remove1753457445635645442"
  99. >
  100. 删除
  101. </NButton>
  102. </NSpace>
  103. )
  104. }
  105. }
  106. ]
  107. }
  108. const checkedRowKeysRef = ref<DataTableRowKey[]>([])
  109. const handleCheck = (rowKeys: DataTableRowKey[]) => {
  110. checkedRowKeysRef.value = rowKeys
  111. }
  112. const onChangeStatus = (row: any) => {
  113. const statusStr = row.status ? '停用' : '启用'
  114. dialog.warning({
  115. title: '提示',
  116. content: `是否${statusStr}?`,
  117. positiveText: '确定',
  118. negativeText: '取消',
  119. onPositiveClick: async () => {
  120. try {
  121. await rollCallSettingStatus({
  122. ids: new Array(row.id),
  123. status: !row.status
  124. })
  125. getList()
  126. message.success(`${statusStr}成功`)
  127. } catch {
  128. }
  129. }
  130. })
  131. }
  132. const onBatchChangeStatus = (status: boolean) => {
  133. const length = checkedRowKeysRef.value.length
  134. if (length == 0) {
  135. message.warning('未选择数据')
  136. }
  137. const statusStr = !status ? '停用' : '启用'
  138. dialog.warning({
  139. title: '提示',
  140. content: `是否${statusStr}` + length + `条数据?`,
  141. positiveText: '确定',
  142. negativeText: '取消',
  143. onPositiveClick: async () => {
  144. try {
  145. await rollCallSettingStatus({
  146. ids: checkedRowKeysRef.value,
  147. status: status
  148. })
  149. getList()
  150. message.success(`${statusStr}成功`)
  151. } catch {
  152. }
  153. }
  154. })
  155. }
  156. const onRmove = (row: any): void => {
  157. dialog.warning({
  158. title: '提示',
  159. content: `删除"${row.name}",是否继续?`,
  160. positiveText: '确定',
  161. negativeText: '取消',
  162. onPositiveClick: async () => {
  163. try {
  164. await rollCallSettingRemove(row.id)
  165. getList()
  166. message.success('删除成功')
  167. } catch {
  168. }
  169. }
  170. })
  171. }
  172. const getList = async () => {
  173. try {
  174. state.loading = true
  175. const {data} = await rollCallSettingPage({...state.pagination, ...state.searchForm})
  176. state.pagination.pageTotal = Number(data.total)
  177. state.dataList = data.rows || []
  178. } catch {
  179. }
  180. state.loading = false
  181. }
  182. const saveForm = ref()
  183. const onSubmit = () => {
  184. state.pagination.page = 1
  185. getList()
  186. }
  187. const onSearch = () => {
  188. saveForm.value?.submit()
  189. }
  190. const onBtnReset = () => {
  191. saveForm.value?.reset()
  192. }
  193. onMounted(async () => {
  194. state.loading = true
  195. // getTagList()
  196. getList()
  197. })
  198. return () => (
  199. <div class="system-menu-container">
  200. <SaveForm
  201. ref={saveForm}
  202. model={state.searchForm}
  203. onSubmit={onSubmit}
  204. saveKey="music-calligraphy"
  205. onSetModel={(val: any) => (state.searchForm = val)}
  206. >
  207. <NFormItem label="关键词" path="keyword">
  208. <NInput
  209. placeholder="请输入编号/调号"
  210. v-model:value={state.searchForm.keyword}
  211. clearable
  212. />
  213. </NFormItem>
  214. <NFormItem label="状态" path="status">
  215. <NSelect
  216. placeholder="请选择多声轨渲染"
  217. v-model:value={state.searchForm.status}
  218. options={[
  219. {
  220. label: '是',
  221. value: true
  222. },
  223. {
  224. label: '否',
  225. value: false
  226. }
  227. ] as any}
  228. clearable
  229. />
  230. </NFormItem>
  231. <NFormItem>
  232. <NSpace>
  233. <NButton type="primary" onClick={onSearch}>
  234. 搜索
  235. </NButton>
  236. <NButton type="default" onClick={onBtnReset}>
  237. 重置
  238. </NButton>
  239. </NSpace>
  240. </NFormItem>
  241. </SaveForm>
  242. <div class={['section-container']}>
  243. <NSpace style={{paddingBottom: '12px'}}>
  244. <NButton
  245. type="primary"
  246. // v-auth="musicSheet/save1751241178962984962"
  247. onClick={() => {
  248. state.showEdit = true
  249. state.editMode = 'add'
  250. }}
  251. >
  252. 新增
  253. </NButton>
  254. <NButton
  255. disabled={checkedRowKeysRef.value.length == 0}
  256. // v-auth="musicSheet/statusList1751241653309407234"
  257. onClick={() => {
  258. onBatchChangeStatus(false)
  259. }}
  260. >
  261. 批量停用
  262. </NButton>
  263. <NButton
  264. disabled={checkedRowKeysRef.value.length == 0}
  265. // v-auth="musicSheet/statusList1751241653309407234"
  266. onClick={() => {
  267. onBatchChangeStatus(true)
  268. }}
  269. >
  270. 批量启用
  271. </NButton>
  272. </NSpace>
  273. <NDataTable
  274. loading={state.loading}
  275. columns={columns()}
  276. data={state.dataList}
  277. rowKey={(row: any) => row.id}
  278. onUpdateCheckedRowKeys={handleCheck}
  279. scrollX={'1200'}
  280. ></NDataTable>
  281. <Pagination
  282. v-model:page={state.pagination.page}
  283. v-model:pageSize={state.pagination.rows}
  284. v-model:pageTotal={state.pagination.pageTotal}
  285. onList={getList}
  286. sync
  287. saveKey="music-list"
  288. ></Pagination>
  289. </div>
  290. <NModal
  291. blockScroll={true}
  292. v-model:show={state.showEdit}
  293. preset="dialog"
  294. showIcon={false}
  295. title={state.editMode == 'add' ? '新增' : '修改'}
  296. style={{width: '500px'}}
  297. >
  298. <Edit
  299. rowData={state.rowData}
  300. editMode={state.editMode}
  301. onClose={() => (state.showEdit = false)}
  302. onGetList={getList}
  303. />
  304. </NModal>
  305. </div>
  306. )
  307. }
  308. })