classStudent.tsx 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254
  1. import { defineComponent, onMounted, reactive, watch } from 'vue';
  2. import styles from '../index.module.less';
  3. import {
  4. NButton,
  5. NDataTable,
  6. NForm,
  7. NFormItem,
  8. NImage,
  9. NSelect,
  10. NSpace,
  11. useMessage
  12. } from 'naive-ui';
  13. import SearchInput from '@/components/searchInput';
  14. import CSelect from '@/components/CSelect';
  15. import Pagination from '@/components/pagination';
  16. import { classGroupDetail, getStudentList } from '../api';
  17. import add from './images/add.png';
  18. import { useRoute, useRouter } from 'vue-router';
  19. import TheEmpty from '/src/components/TheEmpty';
  20. export default defineComponent({
  21. name: 'student-studentList',
  22. props: {
  23. upgradeFlag: {
  24. type: Number
  25. }
  26. },
  27. setup(props, { emit }) {
  28. const message = useMessage();
  29. const route = useRoute();
  30. const router = useRouter();
  31. const state = reactive({
  32. upgradeFlag: props.upgradeFlag == 0 ? true : false, // 是否为历史班
  33. searchForm: { keyword: '', gender: null as any },
  34. loading: false,
  35. pagination: {
  36. page: 1,
  37. rows: 10,
  38. pageTotal: 4
  39. },
  40. tableList: [] as any
  41. });
  42. watch(
  43. () => props.upgradeFlag,
  44. () => {
  45. state.upgradeFlag = props.upgradeFlag == 0 ? true : false;
  46. }
  47. );
  48. const search = () => {
  49. state.pagination.page = 1;
  50. getList();
  51. console.log('search', state);
  52. };
  53. const onReset = () => {
  54. state.searchForm = { keyword: '', gender: null as any };
  55. search();
  56. };
  57. const getList = async () => {
  58. state.loading = true;
  59. try {
  60. const res = await getStudentList({
  61. classGroupId: route.query.id,
  62. ...state.searchForm,
  63. ...state.pagination
  64. });
  65. state.tableList = res.data.rows;
  66. state.pagination.pageTotal = res.data.total;
  67. state.loading = false;
  68. } catch (e) {
  69. state.loading = false;
  70. console.log(e);
  71. }
  72. };
  73. onMounted(() => {
  74. getList();
  75. });
  76. const copyTo = (text: string) => {
  77. const input = document.createElement('input');
  78. input.value = text;
  79. document.body.appendChild(input);
  80. input.select();
  81. input.setSelectionRange(0, input.value.length);
  82. document.execCommand('Copy');
  83. document.body.removeChild(input);
  84. message.success('复制成功');
  85. };
  86. const gotoDetail = (row: any) => {
  87. router.push({
  88. path: '/classStudentDetail',
  89. query: {
  90. ...route.query,
  91. studentId: row.id,
  92. studentName: row.nickname,
  93. upgradeFlag: state.upgradeFlag ? 0 : 1
  94. }
  95. });
  96. };
  97. const columns = () => {
  98. return [
  99. {
  100. title: '学生姓名',
  101. key: 'nickname',
  102. render: (row: any) => {
  103. return (
  104. <div
  105. style={{ userSelect: 'all', cursor: 'pointer' }}
  106. onClick={() => copyTo(row.nickname)}>
  107. {row.nickname}
  108. </div>
  109. );
  110. }
  111. },
  112. {
  113. title: '手机号',
  114. key: 'phone',
  115. render: (row: any) => {
  116. return (
  117. <div
  118. style={{ userSelect: 'all', cursor: 'pointer' }}
  119. onClick={() => copyTo(row.phone)}>
  120. {row.phone}
  121. </div>
  122. );
  123. }
  124. },
  125. {
  126. title: '性别',
  127. key: 'gender',
  128. render(row: any) {
  129. return (
  130. <>
  131. {row.gender + '' != 'null'
  132. ? row.gender == '0'
  133. ? '女'
  134. : '男'
  135. : '--'}
  136. </>
  137. );
  138. }
  139. },
  140. // {
  141. // title: '学生类型',
  142. // key: 'studentType',
  143. // render(row: any) {
  144. // return <>{row.studentType == 'member' ? '会员' : '普通'}</>;
  145. // }
  146. // },
  147. {
  148. title: '操作',
  149. key: 'id',
  150. render(row: any) {
  151. return (
  152. <NButton text type="primary" onClick={() => gotoDetail(row)}>
  153. 详情
  154. </NButton>
  155. );
  156. }
  157. }
  158. ];
  159. };
  160. return () => (
  161. <div>
  162. <div class={styles.searchList}>
  163. <NForm label-placement="left" inline>
  164. <NFormItem>
  165. <SearchInput
  166. {...{ placeholder: '请输入学生姓名' }}
  167. class={styles.searchInput}
  168. searchWord={state.searchForm.keyword}
  169. onChangeValue={(val: string) =>
  170. (state.searchForm.keyword = val)
  171. }></SearchInput>
  172. </NFormItem>
  173. <NFormItem>
  174. <CSelect
  175. {...({
  176. options: [
  177. {
  178. label: '选择性别',
  179. value: null
  180. },
  181. {
  182. label: '男',
  183. value: '1'
  184. },
  185. {
  186. label: '女',
  187. value: '0'
  188. }
  189. ],
  190. placeholder: '性别',
  191. clearable: true,
  192. inline: true
  193. } as any)}
  194. v-model:value={state.searchForm.gender}></CSelect>
  195. </NFormItem>
  196. <NFormItem>
  197. <NSpace justify="end">
  198. <NButton type="primary" class="searchBtn" onClick={search}>
  199. 搜索
  200. </NButton>
  201. <NButton
  202. type="primary"
  203. ghost
  204. class="resetBtn"
  205. onClick={onReset}>
  206. 重置
  207. </NButton>
  208. </NSpace>
  209. </NFormItem>
  210. </NForm>
  211. </div>
  212. {/* <NButton
  213. class={styles.addBtn}
  214. type="primary"
  215. v-slots={{
  216. icon: () => (
  217. <>
  218. <NImage class={styles.addBtnIcon} src={add}></NImage>
  219. </>
  220. )
  221. }}>
  222. 新增学生
  223. </NButton> */}
  224. <div class={styles.tableWrap}>
  225. <NDataTable
  226. v-slots={{
  227. empty: () => <TheEmpty></TheEmpty>
  228. }}
  229. class={styles.classTable}
  230. loading={state.loading}
  231. columns={columns()}
  232. data={state.tableList}></NDataTable>
  233. <Pagination
  234. v-model:page={state.pagination.page}
  235. v-model:pageSize={state.pagination.rows}
  236. v-model:pageTotal={state.pagination.pageTotal}
  237. onList={getList}
  238. sync
  239. />
  240. </div>
  241. </div>
  242. );
  243. }
  244. });