studentList.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977
  1. <template>
  2. <div class="m-container">
  3. <h2>
  4. <div class="squrt"></div>
  5. 学员列表
  6. </h2>
  7. <div class="m-core">
  8. <div
  9. class="newBand"
  10. v-permission="'studentManage/register'"
  11. @click="addStudent"
  12. >
  13. 新增学员
  14. </div>
  15. <div class="newBand" @click="onCreateQRCode">学员激活列表</div>
  16. <!-- 搜索标题 -->
  17. <save-form
  18. :inline="true"
  19. class="searchForm"
  20. @submit="onSearch"
  21. @reset="onReSet"
  22. :model.sync="searchForm"
  23. >
  24. <el-form-item>
  25. <el-input
  26. placeholder="学生姓名或电话"
  27. @keyup.enter.native="onSearch"
  28. v-model.trim="searchForm.search"
  29. ></el-input>
  30. </el-form-item>
  31. <el-form-item prop="organId">
  32. <el-select
  33. class="multiple"
  34. filterable
  35. v-model.trim="searchForm.organId"
  36. clearable
  37. placeholder="请选择分部"
  38. >
  39. <el-option
  40. v-for="(item, index) in selects.branchs"
  41. :key="index"
  42. :label="item.name"
  43. :value="item.id"
  44. ></el-option>
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item>
  48. <remote-search :commit="'setTeachers'" v-model="searchForm.teacherId" />
  49. <!-- <el-select
  50. placeholder="指导老师"
  51. v-model="searchForm.teacherId"
  52. clearable
  53. filterable
  54. >
  55. <el-option
  56. v-for="(item, index) in selects.teachers"
  57. :label="item.realName"
  58. :value="item.id"
  59. :key="index"
  60. ></el-option>
  61. </el-select> -->
  62. </el-form-item>
  63. <el-form-item prop="isActive">
  64. <el-select
  65. class="multiple"
  66. v-model.trim="searchForm.isActive"
  67. clearable
  68. placeholder="是否激活"
  69. >
  70. <el-option label="是" value="true"></el-option>
  71. <el-option label="否" value="false"></el-option>
  72. </el-select>
  73. </el-form-item>
  74. <el-form-item prop="hasCourse">
  75. <el-select
  76. class="multiple"
  77. v-model.trim="searchForm.operatingTag"
  78. clearable
  79. placeholder="是否运营"
  80. >
  81. <el-option label="是" :value="1"></el-option>
  82. <el-option label="否" :value="0"></el-option>
  83. </el-select>
  84. </el-form-item>
  85. <el-form-item prop="hasCourse">
  86. <el-select
  87. class="multiple"
  88. v-model.trim="searchForm.serviceTag"
  89. clearable
  90. placeholder="是否服务"
  91. >
  92. <el-option label="是" :value="1"></el-option>
  93. <el-option label="否" :value="0"></el-option>
  94. </el-select>
  95. </el-form-item>
  96. <el-form-item>
  97. <el-button native-type="submit" type="danger">搜索</el-button>
  98. <el-button native-type="reset" type="primary">重置</el-button>
  99. <el-button
  100. type="primary"
  101. v-permission="'export/studentHasCourse'"
  102. @click="downLoadStudent"
  103. >导出名单</el-button
  104. >
  105. </el-form-item>
  106. </save-form>
  107. <!-- 列表 -->
  108. <div class="tableWrap">
  109. <el-table
  110. :data="tableList"
  111. :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
  112. >
  113. <el-table-column
  114. align="center"
  115. prop="userId"
  116. label="学员编号"
  117. >
  118. <template slot-scope="scope">
  119. <copy-text>{{ scope.row.userId }}</copy-text>
  120. </template>
  121. </el-table-column>
  122. <el-table-column
  123. align="center"
  124. prop="username"
  125. label="学员姓名"
  126. >
  127. <template slot-scope="scope">
  128. <copy-text>{{ scope.row.username }}</copy-text>
  129. </template>
  130. </el-table-column>
  131. <el-table-column
  132. align="center"
  133. prop="organName"
  134. label="所属分部"
  135. >
  136. <template slot-scope="scope">
  137. <copy-text>{{ scope.row.organName }}</copy-text>
  138. </template>
  139. </el-table-column>
  140. <el-table-column
  141. align="center"
  142. prop="subjectName"
  143. label="声部"
  144. ></el-table-column>
  145. <el-table-column
  146. align="center"
  147. prop="teacherName"
  148. label="指导老师"
  149. >
  150. <template slot-scope="scope">
  151. <copy-text>{{ scope.row.teacherName }}</copy-text>
  152. </template>
  153. </el-table-column>
  154. <el-table-column align="center" label="性别">
  155. <template slot-scope="scope">{{
  156. scope.row.gender ? "男" : "女"
  157. }}</template>
  158. </el-table-column>
  159. <el-table-column
  160. align="center"
  161. prop="realName"
  162. label="家长姓名"
  163. ></el-table-column>
  164. <el-table-column
  165. align="center"
  166. width="120px"
  167. prop="parentsPhone"
  168. label="家长联系电话"
  169. ></el-table-column>
  170. <el-table-column align="center" >
  171. <template slot="header">
  172. <p style="position: relative">
  173. 是否激活
  174. <el-tooltip placement="top" popper-class="mTooltip">
  175. <div slot="content">
  176. 学员是否设置密码
  177. </div>
  178. <i
  179. class="el-icon-question"
  180. style="font-size: 18px; color: #f56c6c"
  181. ></i>
  182. </el-tooltip>
  183. </p>
  184. </template>
  185. <template slot-scope="scope">{{
  186. scope.row.isActive ? "是" : "否"
  187. }}</template>
  188. </el-table-column>
  189. <el-table-column align="center" label="未上课时">
  190. <template slot-scope="scope">{{
  191. scope.row.hasCourse ? "有" : "无"
  192. }}</template>
  193. </el-table-column>
  194. <!-- <el-table-column align="center" label="预约网管课">
  195. <template slot-scope="scope">{{ scope.row.isMake ? '是' : '否' }}</template>
  196. </el-table-column> -->
  197. <el-table-column align="center" label="是否有网管课">
  198. <template slot-scope="scope">{{
  199. scope.row.hasPracticeCourse ? "是" : "否"
  200. }}</template>
  201. </el-table-column>
  202. <el-table-column align="center" label="是否运营">
  203. <template slot-scope="scope">{{
  204. scope.row.operatingTag ? "是" : "否"
  205. }}</template>
  206. </el-table-column>
  207. <el-table-column align="center" label="是否服务">
  208. <template slot-scope="scope">{{
  209. scope.row.serviceTag ? "是" : "否"
  210. }}</template>
  211. </el-table-column>
  212. <el-table-column align="center" label="是否是新用户">
  213. <template slot="header">
  214. <p style="position: relative">
  215. 是否是新用户
  216. <el-tooltip placement="top" popper-class="mTooltip">
  217. <div slot="content">
  218. 没有有效的VIP课程或未参与2020年双十一活动的用户为新用户
  219. </div>
  220. <i
  221. class="el-icon-question"
  222. style="font-size: 18px; color: #f56c6c"
  223. ></i>
  224. </el-tooltip>
  225. </p>
  226. </template>
  227. <template slot-scope="scope">
  228. {{ scope.row.isNewUser ? "是" : "否" }}
  229. </template>
  230. </el-table-column>
  231. <el-table-column
  232. align="center"
  233. prop="courseBalance"
  234. label="课程余额(元)"
  235. >
  236. <template slot-scope="scope">
  237. <div>
  238. {{ scope.row.courseBalance | moneyFormat }}
  239. </div>
  240. </template>
  241. </el-table-column>
  242. <el-table-column
  243. align="center"
  244. fixed="right"
  245. width="250px"
  246. label="操作"
  247. >
  248. <template slot-scope="scope">
  249. <router-link
  250. v-permission="'/studentDetail'"
  251. class="el-button--text"
  252. :to="{
  253. path: `/business/studentDetail?userId=${scope.row.userId}`,
  254. query: { studentName: scope.row.username },
  255. }"
  256. >查看</router-link
  257. >
  258. <el-button
  259. type="text"
  260. style="padding-left: 10px;"
  261. v-permission="'studentManage/studentUpdate'"
  262. @click="resetStudent(scope.row)"
  263. >修改</el-button
  264. >
  265. <!-- api-auth/user/updatePassword2 -->
  266. <el-button
  267. v-permission="'api-auth/user/updatePassword2'"
  268. @click="resetPassWrod(scope.row)"
  269. type="text"
  270. >修改密码</el-button
  271. >
  272. <el-button
  273. type="text"
  274. @click="lookContracts(scope.row)"
  275. v-permission="'sysUserContracts/getLatest'"
  276. >下载协议</el-button
  277. >
  278. </template>
  279. </el-table-column>
  280. </el-table>
  281. <pagination
  282. sync
  283. :total.sync="pageInfo.total"
  284. :page.sync="pageInfo.page"
  285. :limit.sync="pageInfo.limit"
  286. :page-sizes="pageInfo.page_size"
  287. @pagination="getList"
  288. />
  289. </div>
  290. </div>
  291. <el-dialog
  292. :title="maskName"
  293. width="700px"
  294. label-position="right"
  295. class="studentInfo"
  296. @close="onMaskClose('studentForm')"
  297. :close-on-click-modal="false"
  298. :visible.sync="studentVisible"
  299. >
  300. <el-divider>基本信息</el-divider>
  301. <el-form
  302. :model="studentForm"
  303. :inline="true"
  304. label-width="130px"
  305. label-position="right"
  306. ref="studentForm"
  307. :rules="studentRules"
  308. >
  309. <el-form-item
  310. label="联系电话"
  311. prop="phone"
  312. :rules="[
  313. { required: true, message: '请输入手机号' },
  314. {
  315. pattern: /^1\d{10}$/,
  316. message: '请输入正确的手机号',
  317. trigger: 'blur',
  318. },
  319. ]"
  320. >
  321. <!-- @blur="checkPhone(studentForm.phone)" -->
  322. <el-input v-model.trim="studentForm.phone"></el-input>
  323. </el-form-item>
  324. <el-form-item label="所属分部" prop="organId">
  325. <el-select
  326. class="multiple"
  327. v-model.trim="studentForm.organId"
  328. filterable
  329. clearable
  330. placeholder="请选择分部"
  331. @change="changeStudentOrgan"
  332. >
  333. <el-option
  334. v-for="(item, index) in selects.branchs"
  335. :key="index"
  336. :label="item.name"
  337. :value="item.id"
  338. ></el-option>
  339. </el-select>
  340. </el-form-item>
  341. <el-form-item label="学生姓名" prop="name">
  342. <el-input v-model.trim="studentForm.name"></el-input>
  343. </el-form-item>
  344. <el-form-item label="学生性别" prop="sex">
  345. <el-select
  346. class="multiple"
  347. filterable
  348. v-model.trim="studentForm.sex"
  349. clearable
  350. placeholder="请选择性别"
  351. >
  352. <el-option :value="1" label="男"></el-option>
  353. <el-option :value="0" label="女"></el-option>
  354. </el-select>
  355. </el-form-item>
  356. <el-form-item label="学生声部" prop="subjectIdList">
  357. <el-select
  358. v-model.trim="studentForm.subjectIdList"
  359. filterable
  360. clearable
  361. placeholder="学员声部"
  362. >
  363. <el-option-group
  364. v-for="group in subjectList"
  365. :key="group.label"
  366. :label="group.label"
  367. >
  368. <el-option
  369. v-for="item in group.options"
  370. :key="item.value"
  371. :label="item.label"
  372. :value="item.value"
  373. ></el-option>
  374. </el-option-group>
  375. </el-select>
  376. </el-form-item>
  377. <el-form-item label="是否运营" prop="operatingTag">
  378. <el-select
  379. class="multiple"
  380. v-model.trim="studentForm.operatingTag"
  381. clearable
  382. >
  383. <el-option :value="1" label="是"></el-option>
  384. <el-option :value="0" label="否"></el-option>
  385. </el-select>
  386. </el-form-item>
  387. <el-form-item label="是否服务" prop="serviceTag">
  388. <el-select
  389. class="multiple"
  390. v-model.trim="studentForm.serviceTag"
  391. clearable
  392. >
  393. <el-option :value="1" label="是"></el-option>
  394. <el-option :value="0" label="否"></el-option>
  395. </el-select>
  396. </el-form-item>
  397. <el-form-item label="指导老师" prop="teacherId">
  398. <el-select
  399. class="multiple"
  400. v-model.trim="studentForm.teacherId"
  401. clearable
  402. filterable
  403. >
  404. <el-option
  405. v-for="(item, index) in maskTeacherList"
  406. :label="item.realName"
  407. :value="item.id"
  408. :key="index"
  409. ></el-option>
  410. </el-select>
  411. </el-form-item>
  412. <el-form-item label="家长姓名" prop="parseName">
  413. <el-input v-model.trim="studentForm.parseName"></el-input>
  414. </el-form-item>
  415. <el-form-item label="出生日期" prop="date">
  416. <el-date-picker
  417. v-model.trim="studentForm.date"
  418. style="width: 185px"
  419. value-format="yyyy-MM-dd"
  420. type="date"
  421. :picker-options="{
  422. firstDayOfWeek: 1,
  423. }"
  424. placeholder="选择日期"
  425. ></el-date-picker>
  426. </el-form-item>
  427. <el-form-item label="是否是新用户" prop="isNewUser">
  428. <template #label>
  429. <p style="position: relative; display: inline-block">
  430. 是否是新用户
  431. <el-tooltip placement="top" popper-class="mTooltip">
  432. <div slot="content">
  433. 没有有效的VIP课程或未参与2020年双十一活动的用户为新用户
  434. </div>
  435. <i
  436. class="el-icon-question"
  437. style="font-size: 18px; color: #f56c6c"
  438. ></i>
  439. </el-tooltip>
  440. </p>
  441. </template>
  442. <el-select
  443. class="multiple"
  444. v-model.trim="studentForm.isNewUser"
  445. clearable
  446. >
  447. <el-option :value="1" label="是"></el-option>
  448. <el-option :value="0" label="否"></el-option>
  449. </el-select>
  450. </el-form-item>
  451. </el-form>
  452. <div slot="footer" class="dialog-footer">
  453. <el-button @click="studentVisible = false">取 消</el-button>
  454. <el-button type="primary" v-if="isNew" @click="submitAddStudent"
  455. >确 定</el-button
  456. >
  457. <el-button type="primary" v-if="!isNew" @click="resetStudentSubmie"
  458. >确 定</el-button
  459. >
  460. </div>
  461. </el-dialog>
  462. <el-dialog :visible.sync="qrcodeStatus" center width="300px">
  463. <div class="right-code">
  464. <h2 class="title">学员激活列表</h2>
  465. <div id="qrcode" class="qrcode code" ref="qrCodeUrl"></div>
  466. <!-- <p class="code-url"
  467. v-if="codeUrl2">{{ codeUrl2 }}</p>-->
  468. </div>
  469. </el-dialog>
  470. <el-dialog
  471. title="修改密码"
  472. :visible.sync="passwrodVisiable"
  473. :before-close="closePassWord"
  474. width="400px"
  475. >
  476. <el-form :model="passwrodForm" ref="passwrodForm" :inline="true">
  477. <el-form-item
  478. label="手机号"
  479. prop="phone"
  480. label-width="120px"
  481. :rules="[
  482. { required: true, message: '手机号不能为空', trigger: 'blur' },
  483. {
  484. pattern: /^1\d{10}$/,
  485. message: '请输入正确的手机号',
  486. trigger: 'blur',
  487. },
  488. ]"
  489. >
  490. <el-input
  491. v-model.trim="passwrodForm.phone"
  492. minlength="11"
  493. maxlength="11"
  494. ></el-input>
  495. </el-form-item>
  496. <el-form-item
  497. label="输入密码"
  498. prop="password"
  499. label-width="120px"
  500. :rules="[
  501. { required: true, message: '密码不能为空', trigger: 'blur' },
  502. {
  503. pattern: /^[\w]{6,20}$/,
  504. message: '密码为6-20位',
  505. trigger: 'blur',
  506. },
  507. ]"
  508. >
  509. <el-input v-model.trim="passwrodForm.password"></el-input>
  510. </el-form-item>
  511. <el-form-item
  512. label="再次输入"
  513. prop="password2"
  514. label-width="120px"
  515. :rules="[
  516. { required: true, message: '密码不能为空', trigger: 'blur' },
  517. {
  518. pattern: /^[\w]{6,20}$/,
  519. message: '密码为6-20位',
  520. trigger: 'blur',
  521. },
  522. ]"
  523. >
  524. <el-input v-model.trim="passwrodForm.password2"></el-input>
  525. </el-form-item>
  526. </el-form>
  527. <span slot="footer" class="dialog-footer">
  528. <el-button @click="passwrodVisiable = false">取 消</el-button>
  529. <el-button type="primary" @click="submitResetPassWord">确 定</el-button>
  530. </span>
  531. </el-dialog>
  532. </div>
  533. </template>
  534. <script>
  535. import pagination from "@/components/Pagination/index";
  536. import {
  537. queryStudentList,
  538. getStudentInfoByPhone,
  539. registerStudent,
  540. updateStudent,
  541. studentHasCourse,
  542. getLatest,
  543. } from "@/api/studentManager";
  544. import cleanDeep from "clean-deep";
  545. import { vaildStudentUrl } from "@/utils/validate";
  546. import { getEmployeeOrgan, resetPassword2, getTeacher } from "@/api/buildTeam";
  547. import { subjectListTree } from "@/api/specialSetting";
  548. import QRCode from "qrcodejs2";
  549. import store from "@/store";
  550. import axios from "axios";
  551. import qs from "qs";
  552. import { getToken } from "@/utils/auth";
  553. import load from "@/utils/loading";
  554. import { permission } from "@/utils/directivePage";
  555. export default {
  556. name: "studentList",
  557. components: { pagination },
  558. data() {
  559. return {
  560. studentVisible: false,
  561. searchForm: {
  562. organId: null,
  563. search: null,
  564. studentName: null,
  565. isActive: null,
  566. hasCourse: null,
  567. // isMake: null,
  568. hasPracticeCourse: null,
  569. operatingTag: null,
  570. serviceTag: null,
  571. teacherId: null,
  572. },
  573. searchList: [],
  574. tableList: [],
  575. organList: [],
  576. teacherList: [],
  577. maskTeacherList: [],
  578. subjectList: [], // 声部列表
  579. pageInfo: {
  580. // 分页规则
  581. limit: 10, // 限制显示条数
  582. page: 1, // 当前页
  583. total: 0, // 总条数
  584. page_size: [10, 20, 40, 50], // 选择限制显示条数
  585. },
  586. studentForm: {
  587. phone: "",
  588. organId: "",
  589. name: "",
  590. sex: "",
  591. parseName: "",
  592. date: "",
  593. serviceTag: null,
  594. operatingTag: null,
  595. teacherId: null,
  596. subjectIdList: null,
  597. isNewUser: null,
  598. },
  599. studentRules: {
  600. name: [{ required: true, message: "请输入学生姓名" }],
  601. sex: [{ required: true, message: "请选择学生性别" }],
  602. date: [{ required: true, message: "请选择出生日期" }],
  603. organId: [{ required: true, message: "请选择分部" }],
  604. subjectIdList: [{ required: true, message: "请选择声部" }],
  605. serviceTag: [{ required: true, message: "请选择是否参与服务" }],
  606. isNewUser: [{ required: true, message: "请选择是否是新用户" }],
  607. operatingTag: [{ required: true, message: "请选择是否参与运营" }],
  608. teacherId: [{ required: true, message: "请选择指导老师" }],
  609. },
  610. isNew: false,
  611. active: null,
  612. maskName: "新增学员",
  613. qrcodeStatus: false,
  614. qrcodes: true,
  615. activeRow: null,
  616. passwrodVisiable: false,
  617. passwrodForm: {
  618. phone: "",
  619. password: "",
  620. password2: "",
  621. },
  622. activatedRow: null,
  623. };
  624. },
  625. mounted() {
  626. this.$store.dispatch("setBranchs");
  627. this.$store.dispatch("setTeachers");
  628. this.getList();
  629. },
  630. methods: {
  631. onSearch() {
  632. this.pageInfo.page = 1;
  633. this.getList();
  634. },
  635. onCreateQRCode() {
  636. // 生成报名二维码
  637. this.qrcodeStatus = true;
  638. // let id = this.$route.query.id
  639. // let teamName = this.$route.query.name
  640. setTimeout(() => {
  641. if (this.qrcodes) {
  642. this.qrcodes = false;
  643. this.qrcode = new QRCode("qrcode", {
  644. width: 250,
  645. height: 250,
  646. colorDark: "#000000",
  647. colorLight: "#ffffff",
  648. correctLevel: QRCode.CorrectLevel.H,
  649. });
  650. }
  651. // vaildStudentUrl() + `/#/sporadicLogin?id=${刷刷刷}`
  652. this.qrcode.clear();
  653. this.qrcode.makeCode(vaildStudentUrl() + `/#/queryStudentPer`);
  654. // this.codeUrl = vaildStudentUrl() + '/#/login?musicGroupId=' + id
  655. }, 500);
  656. },
  657. getList() {
  658. let params = this.searchForm;
  659. params.rows = this.pageInfo.limit;
  660. params.page = this.pageInfo.page;
  661. params.organId ? params.organId : (params.organId = null);
  662. queryStudentList(params).then((res) => {
  663. if (res.code == 200) {
  664. this.tableList = res.data.rows;
  665. this.pageInfo.total = res.data.total;
  666. }
  667. });
  668. },
  669. onReSet() {
  670. this.searchForm = {
  671. organId: null,
  672. search: null,
  673. studentName: null,
  674. isActive: null,
  675. hasCourse: null,
  676. // isMake: null,
  677. hasPracticeCourse: null,
  678. operatingTag: null,
  679. serviceTag: null,
  680. teacherId: null,
  681. };
  682. },
  683. downLoadStudent() {
  684. let url = "/api-web/export/studentHasCourse";
  685. let searchForm = this.searchForm;
  686. let data = {
  687. organId: searchForm.organId ? searchForm.organId : null,
  688. search: searchForm.search ? searchForm.search : null,
  689. isActive: searchForm.isActive ? searchForm.isActive : null,
  690. hasCourse: searchForm.hasCourse == "" ? null : searchForm.hasCourse,
  691. // isMake: searchForm.isMake ? searchForm.isMake : null,
  692. hasPracticeCourse: searchForm.hasPracticeCourse
  693. ? searchForm.hasPracticeCourse
  694. : null,
  695. operatingTag: searchForm.operatingTag ? searchForm.operatingTag : null,
  696. serviceTag: searchForm.serviceTag ? searchForm.serviceTag : null,
  697. teacherId: searchForm.teacherId ? searchForm.teacherId : null,
  698. };
  699. const options = {
  700. method: "POST",
  701. headers: {
  702. Authorization: getToken(),
  703. },
  704. url,
  705. data: qs.stringify(data),
  706. responseType: "blob",
  707. };
  708. this.$confirm("确定导出学员名单?", "提示", {
  709. confirmButtonText: "确定",
  710. cancelButtonText: "取消",
  711. type: "warning",
  712. })
  713. .then(() => {
  714. load.startLoading();
  715. axios(options)
  716. .then((res) => {
  717. let blob = new Blob([res.data], {
  718. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
  719. type: "application/vnd.ms-excel;charset=utf-8",
  720. // word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  721. });
  722. let text = new Response(blob).text();
  723. text.then((res) => {
  724. // 判断是否报错
  725. if (res.indexOf("code") != -1) {
  726. let json = JSON.parse(res);
  727. this.$message.error(json.msg);
  728. } else {
  729. let objectUrl = URL.createObjectURL(blob);
  730. let link = document.createElement("a");
  731. let nowTime = new Date();
  732. let ymd =
  733. nowTime.getFullYear() +
  734. (nowTime.getMonth() + 1) +
  735. nowTime.getDate();
  736. let fname = `导出学员名单` + ymd + ".xlsx"; //下载文件的名字
  737. link.href = objectUrl;
  738. link.setAttribute("download", fname);
  739. document.body.appendChild(link);
  740. link.click();
  741. }
  742. });
  743. load.endLoading();
  744. })
  745. .catch((error) => {
  746. this.$message.error("导出数据失败,请联系管理员");
  747. load.endLoading();
  748. });
  749. })
  750. .catch(() => {});
  751. },
  752. checkPhone(val) {
  753. var regu = /^1\d{10}$/;
  754. var re = new RegExp(regu);
  755. if (re.test(val)) {
  756. getStudentInfoByPhone({ mobile: this.studentForm.phone }).then(
  757. (res) => {
  758. if (res.code == 200) {
  759. if (res.data) {
  760. this.studentForm = {
  761. name: res.data.name,
  762. sex: res.data.gender,
  763. parseName: res.data.parentsName,
  764. // sound: parseInt(res.data.subjectIdList),
  765. phone: val,
  766. date: res.data.birthdate,
  767. };
  768. }
  769. }
  770. }
  771. );
  772. }
  773. },
  774. submitAddStudent() {
  775. const studentForm = this.studentForm;
  776. // 效验 然后组数据提交
  777. this.$refs["studentForm"].validate((item) => {
  778. if (item) {
  779. let obj = {
  780. phone: studentForm.phone,
  781. username: studentForm.name,
  782. gender: studentForm.sex,
  783. realName: studentForm.parseName,
  784. birthdate: studentForm.date,
  785. organId: studentForm.organId,
  786. serviceTag: studentForm.serviceTag,
  787. operatingTag: studentForm.operatingTag,
  788. teacherId: studentForm.teacherId,
  789. isNewUser: studentForm.isNewUser,
  790. subjectIdList: studentForm.subjectIdList,
  791. };
  792. registerStudent(obj).then((res) => {
  793. if (res.code == 200) {
  794. this.$message.success("添加成功");
  795. this.studentVisible = false;
  796. this.getList();
  797. }
  798. });
  799. }
  800. });
  801. },
  802. // 修改学生信息
  803. resetStudentSubmie() {
  804. const studentForm = this.studentForm;
  805. this.$refs["studentForm"].validate((item) => {
  806. if (item) {
  807. let obj = {
  808. phone: studentForm.phone,
  809. username: studentForm.name,
  810. gender: studentForm.sex,
  811. realName: studentForm.parseName,
  812. birthdate: studentForm.date,
  813. organId: studentForm.organId,
  814. id: this.active.userId,
  815. serviceTag: studentForm.serviceTag,
  816. operatingTag: studentForm.operatingTag,
  817. teacherId: studentForm.teacherId,
  818. isNewUser: studentForm.isNewUser,
  819. subjectIdList: studentForm.subjectIdList,
  820. };
  821. updateStudent(obj).then((res) => {
  822. if (res.code == 200) {
  823. this.$message.success("修改成功");
  824. this.studentVisible = false;
  825. this.getList();
  826. }
  827. });
  828. }
  829. });
  830. },
  831. async getSubjectList() {
  832. await subjectListTree({
  833. delFlag: "NO",
  834. tenantId: 1,
  835. rows: 9999,
  836. }).then((res) => {
  837. let result = res.data;
  838. if (res.code == 200) {
  839. let tempArray = [];
  840. result.rows.forEach((item, index) => {
  841. let subject = [];
  842. item.subjects.forEach((s) => {
  843. subject.push({
  844. value: s.id,
  845. label: s.name,
  846. });
  847. });
  848. tempArray[index] = {
  849. label: item.name,
  850. options: subject,
  851. };
  852. });
  853. this.subjectList = tempArray;
  854. }
  855. });
  856. },
  857. async addStudent() {
  858. await this.getSubjectList();
  859. this.isNew = true;
  860. this.studentVisible = true;
  861. this.maskName = "新增学员";
  862. },
  863. async resetStudent(row) {
  864. let organId = row.organId;
  865. await this.getSubjectList();
  866. await this.changeStudentOrgan(row.organId);
  867. this.isNew = false;
  868. this.active = row;
  869. this.studentVisible = true;
  870. this.maskName = "修改学员";
  871. this.$nextTick(() => {
  872. this.studentForm = {
  873. phone: row.parentsPhone || null,
  874. name: row.username || null,
  875. sex: row.gender,
  876. parseName: row.realName || null,
  877. date: row.birthdate || null,
  878. organId: row.organId || null,
  879. serviceTag: row.serviceTag,
  880. operatingTag: row.operatingTag,
  881. teacherId: row.teacherId || null,
  882. isNewUser: row.isNewUser,
  883. subjectIdList: Number(row.subjectIdList) || null,
  884. };
  885. });
  886. },
  887. onMaskClose(formName) {
  888. this.$refs[formName].resetFields();
  889. },
  890. resetPassWrod(row) {
  891. this.activatedRow = row;
  892. this.passwrodForm.phone = row.parentsPhone;
  893. this.passwrodVisiable = true;
  894. },
  895. closePassWord() {
  896. this.activatedRow = null;
  897. this.passwrodForm = {
  898. phone: "",
  899. password: "",
  900. password2: "",
  901. };
  902. this.$refs["passwrodForm"].resetFields();
  903. this.passwrodVisiable = false;
  904. },
  905. submitResetPassWord() {
  906. if (this.passwrodForm.password !== this.passwrodForm.password2) {
  907. this.$message.error("两次密码必须相同");
  908. return;
  909. }
  910. this.$refs["passwrodForm"].validate((res) => {
  911. if (res) {
  912. // 发请求
  913. resetPassword2({
  914. mobile: this.passwrodForm.phone,
  915. newPassword: this.passwrodForm.password,
  916. userId: this.activatedRow.userId,
  917. }).then((res) => {
  918. if (res.code == 200) {
  919. // 修改成功
  920. this.$message.success("修改成功");
  921. this.closePassWord();
  922. }
  923. });
  924. }
  925. });
  926. },
  927. async changeStudentOrgan(val) {
  928. this.studentForm.teacherId = null;
  929. await getTeacher({ organId: val }).then((res) => {
  930. if (res.code == 200) {
  931. this.maskTeacherList = res.data;
  932. }
  933. });
  934. },
  935. lookContracts(row) {
  936. getLatest({ userId: row.userId }).then((res) => {
  937. if (res.code == 200) {
  938. window.open(res.data.url);
  939. }
  940. });
  941. },
  942. },
  943. };
  944. </script>
  945. <style lang="scss" scoped>
  946. .newBand {
  947. display: inline-block;
  948. margin-right: 10px;
  949. }
  950. .right-code {
  951. // width: 50%;
  952. // float: left;
  953. .title {
  954. font-size: 18px;
  955. text-align: center;
  956. padding-bottom: 8px;
  957. }
  958. }
  959. /deep/.studentInfo {
  960. .el-dialog__body {
  961. padding-top: 0;
  962. padding-bottom: 0;
  963. }
  964. .multiple.el-select {
  965. width: 185px !important;
  966. }
  967. }
  968. </style>