studentList.vue 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973
  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`,
  254. query: { ...scope.row },
  255. }"
  256. >查看</router-link>
  257. <el-button
  258. type="text"
  259. style="padding-left: 10px;"
  260. v-permission="'studentManage/studentUpdate'"
  261. @click="resetStudent(scope.row)"
  262. >修改</el-button
  263. >
  264. <!-- api-auth/user/updatePassword2 -->
  265. <el-button
  266. v-permission="'api-auth/user/updatePassword2'"
  267. @click="resetPassWrod(scope.row)"
  268. type="text"
  269. >修改密码</el-button
  270. >
  271. <el-button
  272. v-if="scope.row.isSignedContract"
  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. <copy-text>{{passwrodForm.phone}}</copy-text>
  491. </el-form-item>
  492. <el-form-item
  493. label="输入密码"
  494. prop="password"
  495. label-width="120px"
  496. :rules="[
  497. { required: true, message: '密码不能为空', trigger: 'blur' },
  498. {
  499. pattern: /^[\w]{6,20}$/,
  500. message: '密码为6-20位',
  501. trigger: 'blur',
  502. },
  503. ]"
  504. >
  505. <el-input v-model.trim="passwrodForm.password"></el-input>
  506. </el-form-item>
  507. <el-form-item
  508. label="再次输入"
  509. prop="password2"
  510. label-width="120px"
  511. :rules="[
  512. { required: true, message: '密码不能为空', trigger: 'blur' },
  513. {
  514. pattern: /^[\w]{6,20}$/,
  515. message: '密码为6-20位',
  516. trigger: 'blur',
  517. },
  518. ]"
  519. >
  520. <el-input v-model.trim="passwrodForm.password2"></el-input>
  521. </el-form-item>
  522. </el-form>
  523. <span slot="footer" class="dialog-footer">
  524. <el-button @click="passwrodVisiable = false">取 消</el-button>
  525. <el-button type="primary" @click="submitResetPassWord">确 定</el-button>
  526. </span>
  527. </el-dialog>
  528. </div>
  529. </template>
  530. <script>
  531. import pagination from "@/components/Pagination/index";
  532. import {
  533. queryStudentList,
  534. getStudentInfoByPhone,
  535. registerStudent,
  536. updateStudent,
  537. studentHasCourse,
  538. getLatest,
  539. } from "@/api/studentManager";
  540. import cleanDeep from "clean-deep";
  541. import { vaildStudentUrl } from "@/utils/validate";
  542. import { getEmployeeOrgan, resetPassword2, getTeacher } from "@/api/buildTeam";
  543. import { subjectListTree } from "@/api/specialSetting";
  544. import QRCode from "qrcodejs2";
  545. import store from "@/store";
  546. import axios from "axios";
  547. import qs from "qs";
  548. import { getToken } from "@/utils/auth";
  549. import load from "@/utils/loading";
  550. import { permission } from "@/utils/directivePage";
  551. export default {
  552. name: "studentList",
  553. components: { pagination },
  554. data() {
  555. return {
  556. studentVisible: false,
  557. searchForm: {
  558. organId: null,
  559. search: null,
  560. studentName: null,
  561. isActive: null,
  562. hasCourse: null,
  563. // isMake: null,
  564. hasPracticeCourse: null,
  565. operatingTag: null,
  566. serviceTag: null,
  567. teacherId: null,
  568. },
  569. searchList: [],
  570. tableList: [],
  571. organList: [],
  572. teacherList: [],
  573. maskTeacherList: [],
  574. subjectList: [], // 声部列表
  575. pageInfo: {
  576. // 分页规则
  577. limit: 10, // 限制显示条数
  578. page: 1, // 当前页
  579. total: 0, // 总条数
  580. page_size: [10, 20, 40, 50], // 选择限制显示条数
  581. },
  582. studentForm: {
  583. phone: "",
  584. organId: "",
  585. name: "",
  586. sex: "",
  587. parseName: "",
  588. date: "",
  589. serviceTag: null,
  590. operatingTag: null,
  591. teacherId: null,
  592. subjectIdList: null,
  593. isNewUser: null,
  594. },
  595. studentRules: {
  596. name: [{ required: true, message: "请输入学生姓名" }],
  597. sex: [{ required: true, message: "请选择学生性别" }],
  598. date: [{ required: true, message: "请选择出生日期" }],
  599. organId: [{ required: true, message: "请选择分部" }],
  600. subjectIdList: [{ required: true, message: "请选择声部" }],
  601. serviceTag: [{ required: true, message: "请选择是否参与服务" }],
  602. isNewUser: [{ required: true, message: "请选择是否是新用户" }],
  603. operatingTag: [{ required: true, message: "请选择是否参与运营" }],
  604. teacherId: [{ required: true, message: "请选择指导老师" }],
  605. },
  606. isNew: false,
  607. active: null,
  608. maskName: "新增学员",
  609. qrcodeStatus: false,
  610. qrcodes: true,
  611. activeRow: null,
  612. passwrodVisiable: false,
  613. passwrodForm: {
  614. phone: "",
  615. password: "",
  616. password2: "",
  617. },
  618. activatedRow: null,
  619. };
  620. },
  621. mounted() {
  622. this.$store.dispatch("setBranchs");
  623. this.$store.dispatch("setTeachers");
  624. this.getList();
  625. },
  626. methods: {
  627. onSearch() {
  628. this.pageInfo.page = 1;
  629. this.getList();
  630. },
  631. onCreateQRCode() {
  632. // 生成报名二维码
  633. this.qrcodeStatus = true;
  634. // let id = this.$route.query.id
  635. // let teamName = this.$route.query.name
  636. setTimeout(() => {
  637. if (this.qrcodes) {
  638. this.qrcodes = false;
  639. this.qrcode = new QRCode("qrcode", {
  640. width: 250,
  641. height: 250,
  642. colorDark: "#000000",
  643. colorLight: "#ffffff",
  644. correctLevel: QRCode.CorrectLevel.H,
  645. });
  646. }
  647. // vaildStudentUrl() + `/#/sporadicLogin?id=${刷刷刷}`
  648. this.qrcode.clear();
  649. this.qrcode.makeCode(vaildStudentUrl() + `/#/queryStudentPer`);
  650. // this.codeUrl = vaildStudentUrl() + '/#/login?musicGroupId=' + id
  651. }, 500);
  652. },
  653. getList() {
  654. let params = this.searchForm;
  655. params.rows = this.pageInfo.limit;
  656. params.page = this.pageInfo.page;
  657. params.organId ? params.organId : (params.organId = null);
  658. queryStudentList(params).then((res) => {
  659. if (res.code == 200) {
  660. this.tableList = res.data.rows;
  661. this.pageInfo.total = res.data.total;
  662. }
  663. });
  664. },
  665. onReSet() {
  666. this.searchForm = {
  667. organId: null,
  668. search: null,
  669. studentName: null,
  670. isActive: null,
  671. hasCourse: null,
  672. // isMake: null,
  673. hasPracticeCourse: null,
  674. operatingTag: null,
  675. serviceTag: null,
  676. teacherId: null,
  677. };
  678. },
  679. downLoadStudent() {
  680. let url = "/api-web/export/studentHasCourse";
  681. let searchForm = this.searchForm;
  682. let data = {
  683. organId: searchForm.organId ? searchForm.organId : null,
  684. search: searchForm.search ? searchForm.search : null,
  685. isActive: searchForm.isActive ? searchForm.isActive : null,
  686. hasCourse: searchForm.hasCourse == "" ? null : searchForm.hasCourse,
  687. // isMake: searchForm.isMake ? searchForm.isMake : null,
  688. hasPracticeCourse: searchForm.hasPracticeCourse
  689. ? searchForm.hasPracticeCourse
  690. : null,
  691. operatingTag: searchForm.operatingTag ? searchForm.operatingTag : null,
  692. serviceTag: searchForm.serviceTag ? searchForm.serviceTag : null,
  693. teacherId: searchForm.teacherId ? searchForm.teacherId : null,
  694. };
  695. const options = {
  696. method: "POST",
  697. headers: {
  698. Authorization: getToken(),
  699. },
  700. url,
  701. data: qs.stringify(data),
  702. responseType: "blob",
  703. };
  704. this.$confirm("确定导出学员名单?", "提示", {
  705. confirmButtonText: "确定",
  706. cancelButtonText: "取消",
  707. type: "warning",
  708. })
  709. .then(() => {
  710. load.startLoading();
  711. axios(options)
  712. .then((res) => {
  713. let blob = new Blob([res.data], {
  714. // type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
  715. type: "application/vnd.ms-excel;charset=utf-8",
  716. // word文档为application/msword,pdf文档为application/pdf,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8
  717. });
  718. let text = new Response(blob).text();
  719. text.then((res) => {
  720. // 判断是否报错
  721. if (res.indexOf("code") != -1) {
  722. let json = JSON.parse(res);
  723. this.$message.error(json.msg);
  724. } else {
  725. let objectUrl = URL.createObjectURL(blob);
  726. let link = document.createElement("a");
  727. let nowTime = new Date();
  728. let ymd =
  729. nowTime.getFullYear() +
  730. (nowTime.getMonth() + 1) +
  731. nowTime.getDate();
  732. let fname = `导出学员名单` + ymd + ".xlsx"; //下载文件的名字
  733. link.href = objectUrl;
  734. link.setAttribute("download", fname);
  735. document.body.appendChild(link);
  736. link.click();
  737. }
  738. });
  739. load.endLoading();
  740. })
  741. .catch((error) => {
  742. this.$message.error("导出数据失败,请联系管理员");
  743. load.endLoading();
  744. });
  745. })
  746. .catch(() => {});
  747. },
  748. checkPhone(val) {
  749. var regu = /^1\d{10}$/;
  750. var re = new RegExp(regu);
  751. if (re.test(val)) {
  752. getStudentInfoByPhone({ mobile: this.studentForm.phone }).then(
  753. (res) => {
  754. if (res.code == 200) {
  755. if (res.data) {
  756. this.studentForm = {
  757. name: res.data.name,
  758. sex: res.data.gender,
  759. parseName: res.data.parentsName,
  760. // sound: parseInt(res.data.subjectIdList),
  761. phone: val,
  762. date: res.data.birthdate,
  763. };
  764. }
  765. }
  766. }
  767. );
  768. }
  769. },
  770. submitAddStudent() {
  771. const studentForm = this.studentForm;
  772. // 效验 然后组数据提交
  773. this.$refs["studentForm"].validate((item) => {
  774. if (item) {
  775. let obj = {
  776. phone: studentForm.phone,
  777. username: studentForm.name,
  778. gender: studentForm.sex,
  779. realName: studentForm.parseName,
  780. birthdate: studentForm.date,
  781. organId: studentForm.organId,
  782. serviceTag: studentForm.serviceTag,
  783. operatingTag: studentForm.operatingTag,
  784. teacherId: studentForm.teacherId,
  785. isNewUser: studentForm.isNewUser,
  786. subjectIdList: studentForm.subjectIdList,
  787. };
  788. registerStudent(obj).then((res) => {
  789. if (res.code == 200) {
  790. this.$message.success("添加成功");
  791. this.studentVisible = false;
  792. this.getList();
  793. }
  794. });
  795. }
  796. });
  797. },
  798. // 修改学生信息
  799. resetStudentSubmie() {
  800. const studentForm = this.studentForm;
  801. this.$refs["studentForm"].validate((item) => {
  802. if (item) {
  803. let obj = {
  804. phone: studentForm.phone,
  805. username: studentForm.name,
  806. gender: studentForm.sex,
  807. realName: studentForm.parseName,
  808. birthdate: studentForm.date,
  809. organId: studentForm.organId,
  810. id: this.active.userId,
  811. serviceTag: studentForm.serviceTag,
  812. operatingTag: studentForm.operatingTag,
  813. teacherId: studentForm.teacherId,
  814. isNewUser: studentForm.isNewUser,
  815. subjectIdList: studentForm.subjectIdList,
  816. };
  817. updateStudent(obj).then((res) => {
  818. if (res.code == 200) {
  819. this.$message.success("修改成功");
  820. this.studentVisible = false;
  821. this.getList();
  822. }
  823. });
  824. }
  825. });
  826. },
  827. async getSubjectList() {
  828. await subjectListTree({
  829. delFlag: "NO",
  830. tenantId: 1,
  831. rows: 9999,
  832. }).then((res) => {
  833. let result = res.data;
  834. if (res.code == 200) {
  835. let tempArray = [];
  836. result.rows.forEach((item, index) => {
  837. let subject = [];
  838. item.subjects.forEach((s) => {
  839. subject.push({
  840. value: s.id,
  841. label: s.name,
  842. });
  843. });
  844. tempArray[index] = {
  845. label: item.name,
  846. options: subject,
  847. };
  848. });
  849. this.subjectList = tempArray;
  850. }
  851. });
  852. },
  853. async addStudent() {
  854. await this.getSubjectList();
  855. this.isNew = true;
  856. this.studentVisible = true;
  857. this.maskName = "新增学员";
  858. },
  859. async resetStudent(row) {
  860. let organId = row.organId;
  861. await this.getSubjectList();
  862. await this.changeStudentOrgan(row.organId);
  863. this.isNew = false;
  864. this.active = row;
  865. this.studentVisible = true;
  866. this.maskName = "修改学员";
  867. this.$nextTick(() => {
  868. this.studentForm = {
  869. phone: row.parentsPhone || null,
  870. name: row.username || null,
  871. sex: row.gender,
  872. parseName: row.realName || null,
  873. date: row.birthdate || null,
  874. organId: row.organId || null,
  875. serviceTag: row.serviceTag,
  876. operatingTag: row.operatingTag,
  877. teacherId: row.teacherId || null,
  878. isNewUser: row.isNewUser,
  879. subjectIdList: Number(row.subjectIdList) || null,
  880. };
  881. });
  882. },
  883. onMaskClose(formName) {
  884. this.$refs[formName].resetFields();
  885. },
  886. resetPassWrod(row) {
  887. this.activatedRow = row;
  888. this.passwrodForm.phone = row.parentsPhone;
  889. this.passwrodVisiable = true;
  890. },
  891. closePassWord() {
  892. this.activatedRow = null;
  893. this.passwrodForm = {
  894. phone: "",
  895. password: "",
  896. password2: "",
  897. };
  898. this.$refs["passwrodForm"].resetFields();
  899. this.passwrodVisiable = false;
  900. },
  901. submitResetPassWord() {
  902. if (this.passwrodForm.password !== this.passwrodForm.password2) {
  903. this.$message.error("两次密码必须相同");
  904. return;
  905. }
  906. this.$refs["passwrodForm"].validate((res) => {
  907. if (res) {
  908. // 发请求
  909. resetPassword2({
  910. mobile: this.passwrodForm.phone,
  911. newPassword: this.passwrodForm.password,
  912. userId: this.activatedRow.userId,
  913. }).then((res) => {
  914. if (res.code == 200) {
  915. // 修改成功
  916. this.$message.success("修改成功");
  917. this.closePassWord();
  918. }
  919. });
  920. }
  921. });
  922. },
  923. async changeStudentOrgan(val) {
  924. this.studentForm.teacherId = null;
  925. await getTeacher({ organId: val }).then((res) => {
  926. if (res.code == 200) {
  927. this.maskTeacherList = res.data;
  928. }
  929. });
  930. },
  931. lookContracts(row) {
  932. getLatest({ userId: row.userId }).then((res) => {
  933. if (res.code == 200) {
  934. window.open(res.data.url);
  935. }
  936. });
  937. },
  938. },
  939. };
  940. </script>
  941. <style lang="scss" scoped>
  942. .newBand {
  943. display: inline-block;
  944. margin-right: 10px;
  945. }
  946. .right-code {
  947. // width: 50%;
  948. // float: left;
  949. .title {
  950. font-size: 18px;
  951. text-align: center;
  952. padding-bottom: 8px;
  953. }
  954. }
  955. /deep/.studentInfo {
  956. .el-dialog__body {
  957. padding-top: 0;
  958. padding-bottom: 0;
  959. }
  960. .multiple.el-select {
  961. width: 185px !important;
  962. }
  963. }
  964. </style>