index.tsx 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376
  1. import { defineComponent, reactive, onMounted, ref, nextTick } from 'vue';
  2. import styles from './index.module.less';
  3. import {
  4. NButton,
  5. NDataTable,
  6. NForm,
  7. NFormItem,
  8. NImage,
  9. NModal,
  10. NSelect,
  11. NSpace,
  12. useDialog,
  13. useMessage
  14. } from 'naive-ui';
  15. import SearchInput from '@/components/searchInput';
  16. import CSelect from '@/components/CSelect';
  17. import Pagination from '@/components/pagination';
  18. import { classGroupList, deleteClass } from './api';
  19. import CreateClass from './modals/createClass';
  20. import RestStudentBox from './modals/restStudentBox';
  21. import TrainDetail from './modals/Gotoclass';
  22. import { getgradeNumList, classArray } from './contants';
  23. import add from '@/views/studentList/images/add.png';
  24. import ClassGuide from '@/custom-plugins/guide-page/class-guide';
  25. import { useRouter } from 'vue-router';
  26. import { rowDark } from 'naive-ui/es/legacy-grid/styles';
  27. import TheEmpty from '/src/components/TheEmpty';
  28. import TheTooltip from '/src/components/TheTooltip';
  29. export default defineComponent({
  30. name: 'class-classList',
  31. setup(props, { emit }) {
  32. const state = reactive({
  33. searchForm: {
  34. keyword: null as any,
  35. currentClass: null,
  36. currentGradeNum: null
  37. },
  38. orchestraType: null,
  39. courseTypeCode: null,
  40. loading: false,
  41. pagination: {
  42. page: 1,
  43. rows: 10,
  44. pageTotal: 6
  45. },
  46. gradeNumList: [] as any,
  47. tableList: [] as any,
  48. studentVisible: false,
  49. activeRow: null as any,
  50. showaddClass: false,
  51. goCourseVisiable: false,
  52. removeVisiable: false,
  53. removeRow: {} as any
  54. });
  55. const formRef = ref();
  56. const dialog = useDialog();
  57. const message = useMessage();
  58. const router = useRouter();
  59. const search = () => {
  60. state.pagination.page = 1;
  61. getList();
  62. console.log('search', state);
  63. };
  64. const showGuide = ref(false);
  65. state.gradeNumList = getgradeNumList();
  66. const onReset = () => {
  67. state.searchForm = {
  68. keyword: null as any,
  69. currentClass: null,
  70. currentGradeNum: null
  71. };
  72. getList();
  73. };
  74. const removeClass = async () => {
  75. try {
  76. await deleteClass({ ids: state.removeRow.id });
  77. getList();
  78. message.success(`删除成功`);
  79. state.removeVisiable = false;
  80. } catch (e) {
  81. console.log(e);
  82. }
  83. };
  84. const getList = async () => {
  85. // classGroupList
  86. state.loading = true;
  87. try {
  88. const res = await classGroupList({
  89. ...state.searchForm,
  90. ...state.pagination
  91. });
  92. state.tableList = res.data.rows;
  93. state.pagination.pageTotal = res.data.total;
  94. state.loading = false;
  95. setTimeout(() => {
  96. if (state.tableList.length > 0) {
  97. showGuide.value = true;
  98. }
  99. }, 500);
  100. } catch (e) {
  101. state.loading = false;
  102. console.log(e);
  103. }
  104. console.log('getList');
  105. };
  106. const columns = () => {
  107. return [
  108. {
  109. title: '班级名称',
  110. key: 'name'
  111. },
  112. {
  113. title: '学生人数',
  114. key: 'preStudentNum'
  115. },
  116. {
  117. title: '上次学习',
  118. key: 'lastStudy',
  119. render(row: any) {
  120. return <TheTooltip content={row.lastStudy ? row.lastStudy : '--'} />;
  121. }
  122. },
  123. {
  124. title: '操作',
  125. key: 'id',
  126. render(row: any, index: number) {
  127. return (
  128. <div>
  129. <NSpace>
  130. {index == 0 ? (
  131. <div id="class-0">
  132. <NButton
  133. type="primary"
  134. text
  135. onClick={() => {
  136. router.push({
  137. path: '/classDetail',
  138. query: { name: row.name, id: row.id }
  139. });
  140. }}>
  141. 详情
  142. </NButton>
  143. </div>
  144. ) : (
  145. <NButton
  146. type="primary"
  147. text
  148. onClick={() => {
  149. router.push({
  150. path: '/classDetail',
  151. query: { name: row.name, id: row.id }
  152. });
  153. }}>
  154. 详情
  155. </NButton>
  156. )}
  157. {index == 0 ? (
  158. <NButton
  159. type="primary"
  160. {...{ id: 'class-1' }}
  161. text
  162. onClick={() => {
  163. startResetStudent(row);
  164. }}>
  165. 学生调整
  166. </NButton>
  167. ) : (
  168. <NButton
  169. type="primary"
  170. text
  171. onClick={() => {
  172. startResetStudent(row);
  173. }}>
  174. 学生调整
  175. </NButton>
  176. )}
  177. {index == 0 ? (
  178. <NButton
  179. {...{ id: 'class-2' }}
  180. disabled={!(row.preStudentNum > 0)}
  181. type="primary"
  182. text
  183. onClick={() => classesBegin(row)}>
  184. 开始上课
  185. </NButton>
  186. ) : (
  187. <NButton
  188. disabled={!(row.preStudentNum > 0)}
  189. type="primary"
  190. text
  191. onClick={() => classesBegin(row)}>
  192. 开始上课
  193. </NButton>
  194. )}
  195. {!(row.preStudentNum > 0) ? (
  196. <p
  197. style={{ color: '#EA4132', cursor: 'pointer' }}
  198. onClick={() => {
  199. state.removeVisiable = true;
  200. state.removeRow = row;
  201. }}>
  202. 删除
  203. </p>
  204. ) : null}
  205. </NSpace>
  206. </div>
  207. );
  208. }
  209. }
  210. ];
  211. };
  212. const startResetStudent = (row: any) => {
  213. state.activeRow = row;
  214. state.studentVisible = true;
  215. };
  216. const classesBegin = (row: any) => {
  217. state.activeRow = row;
  218. state.goCourseVisiable = true;
  219. };
  220. onMounted(() => {
  221. getList();
  222. });
  223. return () => (
  224. <div class={styles.listWrap}>
  225. <div class={styles.searchList}>
  226. <NForm label-placement="left" inline ref={formRef}>
  227. <NFormItem>
  228. <SearchInput
  229. {...{ placeholder: '请输入班级名称' }}
  230. class={styles.searchInput}
  231. searchWord={state.searchForm.keyword}
  232. onChangeValue={(val: string) =>
  233. (state.searchForm.keyword = val)
  234. }></SearchInput>
  235. </NFormItem>
  236. <NFormItem>
  237. <CSelect
  238. {...({
  239. options: state.gradeNumList,
  240. placeholder: '选择年级',
  241. clearable: true,
  242. inline: true
  243. } as any)}
  244. v-model:value={state.searchForm.currentGradeNum}></CSelect>
  245. </NFormItem>
  246. <NFormItem>
  247. <CSelect
  248. {...({
  249. options: classArray,
  250. placeholder: '选择班级',
  251. clearable: true,
  252. inline: true
  253. } as any)}
  254. v-model:value={state.searchForm.currentClass}></CSelect>
  255. </NFormItem>
  256. <NFormItem>
  257. <NSpace justify="end">
  258. <NButton type="primary" class="searchBtn" onClick={search}>
  259. 搜索
  260. </NButton>
  261. <NButton
  262. type="primary"
  263. ghost
  264. class="resetBtn"
  265. onClick={onReset}>
  266. 重置
  267. </NButton>
  268. </NSpace>
  269. </NFormItem>
  270. </NForm>
  271. </div>
  272. <NButton
  273. class={styles.addBtn}
  274. type="primary"
  275. onClick={() => (state.showaddClass = true)}
  276. v-slots={{
  277. icon: () => (
  278. <>
  279. <NImage
  280. class={styles.addBtnIcon}
  281. previewDisabled
  282. src={add}></NImage>
  283. </>
  284. )
  285. }}>
  286. 创建班级
  287. </NButton>
  288. <div class={styles.tableWrap}>
  289. <NDataTable
  290. v-slots={{
  291. empty:()=><TheEmpty></TheEmpty>
  292. }}
  293. class={styles.classTable}
  294. loading={state.loading}
  295. columns={columns()}
  296. data={state.tableList}></NDataTable>
  297. <Pagination
  298. v-model:page={state.pagination.page}
  299. v-model:pageSize={state.pagination.rows}
  300. v-model:pageTotal={state.pagination.pageTotal}
  301. onList={getList}
  302. sync
  303. saveKey="orchestraRegistration-key"
  304. />
  305. </div>
  306. <NModal
  307. v-model:show={state.studentVisible}
  308. preset="card"
  309. class={['modalTitle background', styles.studentVisible]}
  310. title={'学员调整'}>
  311. <RestStudentBox
  312. activeRow={state.activeRow}
  313. onClose={() => (state.studentVisible = false)}
  314. onGetList={() => getList()}></RestStudentBox>
  315. </NModal>
  316. <NModal
  317. v-model:show={state.showaddClass}
  318. style={{ width: '500px' }}
  319. preset="card"
  320. class={['modalTitle background']}
  321. title={'创建班级'}>
  322. <CreateClass
  323. gradeNumList={state.gradeNumList}
  324. classArray={classArray}
  325. onGetList={() => getList()}
  326. onClose={() => (state.showaddClass = false)}
  327. />
  328. </NModal>
  329. <NModal
  330. v-model:show={state.goCourseVisiable}
  331. preset="card"
  332. class={['modalTitle background', styles.chioseModel]}
  333. title={'选择课件'}>
  334. <TrainDetail
  335. activeRow={state.activeRow}
  336. onClose={() => (state.goCourseVisiable = false)}></TrainDetail>
  337. </NModal>
  338. <NModal
  339. v-model:show={state.removeVisiable}
  340. preset="card"
  341. class={['modalTitle', styles.removeVisiable]}
  342. title={'删除班级'}>
  343. <div class={styles.studentRemove}>
  344. <p>
  345. 确定要删除班级么?
  346. <span>删除后该班级所有学生的年级、班级信息将会清空</span>
  347. ,重新加入班级后同步更新。
  348. </p>
  349. <NSpace class={styles.btnGroup} justify="center">
  350. <NButton round type="primary" onClick={removeClass}>
  351. 确定
  352. </NButton>
  353. <NButton round onClick={() => (state.removeVisiable = false)}>
  354. 取消
  355. </NButton>
  356. </NSpace>
  357. </div>
  358. </NModal>
  359. {showGuide.value ? <ClassGuide></ClassGuide> : null}
  360. </div>
  361. );
  362. }
  363. });