index.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762
  1. <template>
  2. <div class="dashboard-container">
  3. <transition name="fade">
  4. <div class="left">
  5. <el-form :inline="true"
  6. :model="sectionForm"
  7. class="sectionForm">
  8. <el-form-item>
  9. <el-select v-model="sectionForm.section"
  10. placeholder="请选择分部"
  11. @change="chioseSection">
  12. <el-option v-for="(item,index) in brancheList"
  13. :key="index"
  14. :value="item.branchId"
  15. :label="item.branchName"></el-option>
  16. </el-select>
  17. </el-form-item>
  18. </el-form>
  19. <h2 v-if="MajorList.length > 0">所属乐团</h2>
  20. <ul>
  21. <!-- MajorList -->
  22. <li :class="activeMarjorId == item.id?'active':''"
  23. v-for="(item,index) in MajorList"
  24. :key="index"
  25. @click="chioseMajor(item.name,item.id,item.status)">{{ item.name }}</li>
  26. </ul>
  27. </div>
  28. </transition>
  29. <div class="right">
  30. <!-- 顶部收索框 -->
  31. <el-form :inline="true"
  32. class="topWrap"
  33. :model="topForm">
  34. <el-form-item label="学生姓名">
  35. <el-input v-model="topForm.team"
  36. placeholder="请输入学生名称" />
  37. </el-form-item>
  38. <el-form-item label="学生专业">
  39. <el-select v-model="topForm.major"
  40. placeholder="请输入学生专业">
  41. <el-option v-for="(item,index) in chioseList"
  42. :key="index"
  43. :value="item.subId"
  44. :label="item.subName"></el-option>
  45. </el-select>
  46. </el-form-item>
  47. <el-form-item label="学生状态">
  48. <el-select v-model="topForm.status"
  49. placeholder="请选择学生状态"
  50. clearable>
  51. <!-- // 1报名中,2缴费中,3报名截止,4已开团 -->
  52. <el-option :value="0"
  53. label="报名中"></el-option>
  54. <el-option :value="1"
  55. label="报名完成"></el-option>
  56. <el-option :value="2"
  57. label="报名失败"></el-option>
  58. </el-select>
  59. </el-form-item>
  60. <!-- <el-form-item label="学生">
  61. <el-input v-model="topForm.student"
  62. placeholder="请输入学生姓名" />
  63. </el-form-item>-->
  64. <el-button type="primary"
  65. icon="el-icon-search"
  66. plain
  67. @click="getstudentList">搜索</el-button>
  68. <el-button type="success"
  69. icon="el-icon-refresh"
  70. plain
  71. @click="resetStudentList">重置</el-button>
  72. <el-button icon="el-icon-s-tools"
  73. plain
  74. v-if="majorStatus == 1 || majorStatus == 2"
  75. @click="showFade('','','','')">批量调剂</el-button>
  76. <!-- v-if="majorStatus == 1" -->
  77. <el-button type='danger'
  78. icon='el-icon-position'
  79. v-show="paymentStatus"
  80. @click="getMoney">开启缴费</el-button>
  81. <el-button type='warning'
  82. icon="el-icon-news"
  83. v-if='this.majorId'
  84. @click='openUrl'>打开二维码</el-button>
  85. <el-button plain
  86. @click="exportis">导出</el-button>
  87. </el-form>
  88. <!-- 提示语 -->
  89. <p class="subMsg"
  90. v-if="!majorId">请先选择分部和乐团后,再查看学生列表或者搜索学生~</p>
  91. <!-- 列表 -->
  92. <div class="tableWrap"
  93. v-if="majorId">
  94. <el-table :data="tableData"
  95. style="width: 100%"
  96. id='tableid'
  97. @selection-change="handleSelectionChange">
  98. <el-table-column type="selection"
  99. :selectable='checkboxT'
  100. width="55"
  101. v-if='this.majorStatus <= 2'>
  102. </el-table-column>
  103. <el-table-column prop="city"
  104. align="center"
  105. label="所属分部"></el-table-column>
  106. <el-table-column prop="name"
  107. align="center"
  108. label="学生姓名"></el-table-column>
  109. <el-table-column prop="sex"
  110. align="center"
  111. label="性别"
  112. :formatter="filterSex"></el-table-column>
  113. <el-table-column prop="birthday"
  114. align="center"
  115. label="出生日期"
  116. :formatter="filterDate"></el-table-column>
  117. <el-table-column prop="class"
  118. align="center"
  119. label="班级"
  120. :formatter="filterClass"></el-table-column>
  121. <el-table-column prop="school"
  122. align="center"
  123. label="单位/学校"></el-table-column>
  124. <el-table-column prop="patriarchPhone"
  125. align="center"
  126. label="联系方式"></el-table-column>
  127. <el-table-column prop="subName"
  128. align="center"
  129. label="录取专业"></el-table-column>
  130. <el-table-column prop="patriarchName"
  131. align="center"
  132. label="家长姓名"></el-table-column>
  133. <el-table-column prop="patriarchUnit"
  134. align="center"
  135. label="家长工作单位"></el-table-column>
  136. <el-table-column
  137. align="center"
  138. label="备注">
  139. <template slot-scope="scope">
  140. <p class="nomargin" v-for="value in splitS(scope.row.remark)" :key="value">{{value}}</p>
  141. </template>
  142. </el-table-column>
  143. <!-- <el-table-column prop="musical" align="center" label="乐器准备方式"></el-table-column> -->
  144. <!-- status -->
  145. <el-table-column prop="status"
  146. align="center"
  147. label="状态"
  148. :formatter="filterStatus"></el-table-column>
  149. <el-table-column prop="amount"
  150. align="center"
  151. label="实际缴费金额"></el-table-column>
  152. <el-table-column align="center"
  153. label="操作">
  154. <template slot-scope="scope">
  155. <div>
  156. <!-- 学生id crouseId subId -->
  157. <el-button type="primary"
  158. plain
  159. :disabled='!disabled'
  160. @click="showFade(scope.row.id,scope.row.courseId,scope.row.subId,scope.row.status)">调剂</el-button>
  161. </div>
  162. </template>
  163. </el-table-column>
  164. </el-table>
  165. <!-- 调剂弹出层 -->
  166. <el-dialog title="提示"
  167. :visible.sync="dialogVisible"
  168. width="30%">
  169. <span>请选择调剂乐团</span>
  170. <el-select v-model="reviseMajor"
  171. placeholder="请选择调剂课程"
  172. @change="reviseMajors">
  173. <el-option v-for="(item,index) in chioseList"
  174. :key="index"
  175. :value="item.subId+'-'+item.id"
  176. :label="item.subName"></el-option>
  177. </el-select>
  178. <span slot="footer"
  179. class="dialog-footer">
  180. <el-button @click="dialogVisible = false">取 消</el-button>
  181. <el-button type="primary"
  182. @click="submitRe">确 定</el-button>
  183. </span>
  184. </el-dialog>
  185. <!-- 分页器 -->
  186. <div class="paginationWrap">
  187. <el-pagination background
  188. class="pagination"
  189. layout="prev, pager, next"
  190. :total="total"
  191. :current-page.sync="currentPage"
  192. :page-size.sync="limit"
  193. @current-change="handleCurrentChange"></el-pagination>
  194. </div>
  195. </div>
  196. </div>
  197. <el-dialog title="二维码"
  198. :visible.sync="code"
  199. width="30%">
  200. <div class="wrap">
  201. <div id="qrCode"
  202. ref="qrCodeDiv"></div>
  203. </div>
  204. </el-dialog>
  205. <!-- 弹出框 -->
  206. <el-dialog title="提示:请输入短信模板"
  207. :visible.sync="isDialog"
  208. width="30%">
  209. <el-form v-model="dialogForm">
  210. <el-form-item>
  211. <el-input type="textarea"
  212. :disabled="isRadioDisabled"
  213. :rows="3"
  214. v-model="dialogForm.text"
  215. placeholder="请输入短信模板"></el-input>
  216. </el-form-item>
  217. </el-form>
  218. <div class="radioWrap"
  219. style="margin-top:20px">
  220. <el-radio v-model="radio"
  221. :label="1">线上</el-radio>
  222. <el-radio v-model="radio"
  223. :label="2">线下</el-radio>
  224. </div>
  225. <span slot="footer"
  226. class="dialog-footer">
  227. <el-button type="primary"
  228. @click="gotoMoneyok">确 定</el-button>
  229. </span>
  230. </el-dialog>
  231. </div>
  232. </template>
  233. <script>
  234. import qs from "qs";
  235. // import { loading } from "element-ui";
  236. import { scrollTo } from '@/utils/scroll-to'
  237. import QRCode from 'qrcodejs2'
  238. import {
  239. getAllMajor,
  240. getMusicTeams,
  241. getBranches,
  242. getStudentList,
  243. updateUser,
  244. updateClass
  245. } from "@/api/table";
  246. import { setTimeout } from "timers";
  247. import { rename } from 'fs';
  248. export default {
  249. name: "dashboard",
  250. data () {
  251. return {
  252. paymentStatus: false, // 开启缴费开关
  253. topForm: {
  254. team: "",
  255. status: "",
  256. student: "",
  257. major: ''
  258. },
  259. sectionForm: {
  260. section: ""
  261. },
  262. MajorList: [], // 所有乐团集合
  263. tableData: [
  264. ],
  265. isMusic: true,
  266. dialogVisible: false,
  267. reviseMajor: "", // 选择的团名
  268. actionTearm: "", // 选中的乐团名字
  269. majorStatus: "", // 所选乐团的状态
  270. majorId: "", // 所选乐团的ID
  271. chioseList: [], // 所有调剂科目的集合
  272. sessionId: "",
  273. brancheList: [], // 所有分部集合
  274. limit: 20,
  275. total: 0,
  276. page: 1,
  277. studentId: "", // 学生id
  278. courseId: "", // 当前选中的课程
  279. subId: "", // 当前选中的项目
  280. disabled: true, // 判断单个调剂按钮能否点击
  281. activeMarjorId: '-1', // 选中乐团的id
  282. studentStatus: '-1', //单个学生调剂时学生状态
  283. isDialog: false, // 显示隐藏弹框
  284. radio: 2, // 线上线下的选择框
  285. isRadioDisabled: false,
  286. dialogForm: {
  287. text: ''
  288. },
  289. code: false,
  290. first: true,
  291. qrcodes: ''
  292. };
  293. },
  294. methods: {
  295. showFade (id, courseId, subId, status) {
  296. if (status == 1) {
  297. this.$message.error('此学生已报名成功,无法调剂');
  298. return;
  299. }
  300. if (id && courseId) {
  301. this.studentId = id;
  302. this.courseId = courseId;
  303. }
  304. this.subId = subId;
  305. this.dialogVisible = true;
  306. },
  307. // 获取分类选项卡
  308. getMajors () {
  309. // classid 乐团id
  310. getAllMajor(qs.stringify({ clazzId: this.majorId }))
  311. .then(res => {
  312. if (res.code == 200) {
  313. this.chioseList = res.data;
  314. }
  315. })
  316. .catch(res => {
  317. });
  318. },
  319. // 获取所有乐团列表
  320. getMusicTeam (id, row) {
  321. getMusicTeams(qs.stringify({ branchId: id, row, page: this.page })).then(
  322. res => {
  323. if (res.code == 200) {
  324. this.MajorList = res.data.rows;
  325. }
  326. }
  327. );
  328. },
  329. // 获取所有分部
  330. getBranches () {
  331. getBranches().then(res => {
  332. if (res.code == 200) {
  333. this.brancheList = res.data;
  334. }
  335. });
  336. },
  337. // 点击选择分部
  338. chioseSection (id) {
  339. // 查询分部列表
  340. // console.log(id);
  341. this.sessionId = id;
  342. this.getMusicTeam(id, 50);
  343. },
  344. // 点击分部下的乐团
  345. chioseMajor (name, id, status) {
  346. this.activeMarjorId = id;
  347. this.actionTearm = name;
  348. this.majorStatus = status;
  349. if (status == 3 || status == 4) {
  350. this.disabled = false;
  351. }
  352. // 判断乐团是否已经开启缴费
  353. if (status == 2 || status == 3 || status == 4) {
  354. this.paymentStatus = false
  355. } else {
  356. this.paymentStatus = true
  357. }
  358. this.majorId = id;
  359. // 发请求 获取学生列表数据
  360. this.getstudentList();
  361. // 获取分类选项卡
  362. this.getMajors();
  363. },
  364. // 获取学生列表(查询也用这个接口)
  365. getstudentList (callBack) {
  366. if (!this.majorId) {
  367. this.$message.error("请先选择分部与乐团在搜索学生");
  368. return;
  369. }
  370. getStudentList(
  371. qs.stringify({
  372. musicTeamId: this.majorId,
  373. name: this.topForm.team,
  374. status: this.topForm.status,
  375. subId: this.topForm.major,
  376. page: this.page,
  377. rows: this.limit
  378. })
  379. ).then(res => {
  380. this.tableData = res.data.rows;
  381. this.total = res.data.total;
  382. this.pageSize = res.data.limit;
  383. // 回调函数
  384. if(callBack && typeof callBack === 'function') {
  385. callBack()
  386. }
  387. });
  388. },
  389. // 重置搜索
  390. resetStudentList () {
  391. this.topForm.team = "";
  392. this.topForm.status = "";
  393. this.topForm.major = "";
  394. this.page = 1;
  395. this.getstudentList();
  396. },
  397. // 性别分类过滤器
  398. filterSex (val) {
  399. let arr = ["男", "女"];
  400. return arr[val.sex];
  401. },
  402. // 时间格式化过滤器
  403. filterDate (val) {
  404. let str = "";
  405. val.birthday ? (str = val.birthday.split(" ")[0]) : (str = "");
  406. return str;
  407. },
  408. // 格式化班级
  409. filterClass (val) {
  410. return val.grade + val.gclass;
  411. },
  412. // 格式化状态
  413. filterStatus (val) {
  414. let arr = ["报名中", "报名完成", "报名失败"];
  415. return arr[val.status];
  416. },
  417. // 修改科目触发事件
  418. reviseMajors (val) {
  419. // 这里切割字符串 拿到想要的数据
  420. if (val) {
  421. this.subId = val.split('-')[0];
  422. this.crouseId = val.split('-')[1];
  423. }
  424. },
  425. // 确认修改
  426. submitRe () {
  427. // console.log(this.crouseId);
  428. updateUser(
  429. qs.stringify({
  430. courseId: this.crouseId,
  431. subId: this.subId,
  432. userId: this.studentId
  433. })
  434. ).then(res => {
  435. if (res.code == 200) {
  436. this.dialogVisible = false;
  437. this.$message.success(res.msg);
  438. this.reviseMajor = "";
  439. // 刷新列表
  440. this.getstudentList();
  441. }
  442. });
  443. },
  444. // 点击开始缴费 1报名中,2缴费中,3报名截止,4已开团
  445. getMoney () {
  446. this.isDialog = true;
  447. },
  448. handleCurrentChange (val) {
  449. this.page = val;
  450. // this.limit = pageSize;
  451. this.getstudentList();
  452. // if (this.autoScroll) {
  453. scrollTo(0, 800);
  454. // }
  455. },
  456. handleSelectionChange (val) {
  457. let str = '';
  458. if (val.length >= 2) {
  459. this.disabled = false;
  460. } else {
  461. this.disabled = true;
  462. }
  463. if (val.length > 0) {
  464. val.forEach(item => {
  465. str += item.id + ','
  466. })
  467. }
  468. str = str.substring(0, str.length - 1);
  469. this.studentId = str;
  470. },
  471. checkboxT (row) {
  472. // console.log(this.majorStatus > 2);
  473. if (row.status == 1 || this.majorStatus > 2) {
  474. return false;
  475. } else {
  476. return true;
  477. }
  478. },
  479. // 点击打开报名链接
  480. openUrl () {
  481. // debugger
  482. this.code = true;
  483. this.qrcode();
  484. // window.open(`https://pay.dayaedu.com/#/order?classId=${this.majorId}&schoolName=${this.actionTearm}`)
  485. },
  486. gotoMoneyok () {
  487. let val = this.dialogForm.text;
  488. if (this.radio != 1) {
  489. // 线上
  490. if (!val.trim()) {
  491. this.$message.error('请输入短信模板');
  492. return;
  493. }
  494. }
  495. updateClass(qs.stringify({ id: this.majorId, smsMsg: val, type: this.radio })).then(res => {
  496. if (res.code == 200) {
  497. this.$message.success("乐团报名成功请尽快缴费");
  498. setTimeout(() => {
  499. this.getstudentList();
  500. this.majorStatus = 2;
  501. this.isDialog = false;
  502. this.dialogForm.text = '';
  503. }, 1000);
  504. } else {
  505. this.$message.error(res.msg)
  506. }
  507. });
  508. },
  509. qrcode () {
  510. let date = new Date().getTime()
  511. setTimeout(() => {
  512. let date = new Date().getTime();
  513. this.qrcodes = new QRCode(document.getElementById("qrCode"), {
  514. width: 200, // 设置宽度,单位像素
  515. height: 200, // 设置高度,单位像素
  516. text: `http://testpay.dayaedu.com/#/order?classId=${this.majorId}&schoolName=${this.actionTearm}&?${date}` // 设置二维码内容或跳转地址
  517. })
  518. }, 100)
  519. if (document.getElementById("qrCode")) {
  520. document.getElementById("qrCode").innerHTML = ''
  521. }
  522. },
  523. exportis () {
  524. // var curTbl = document.getElementById('tableid');
  525. // this.tableId = curTbl;
  526. // 获取所有学生数据然后到出
  527. this.limit = 200 // 每页获取200条数据
  528. this.topForm.team = "";
  529. this.topForm.status = "";
  530. this.topForm.major = "";
  531. this.page = 1;
  532. // 重置,显示所有数据,然后到出
  533. this.getstudentList(() => {
  534. // 需要等数据更新,然后做下载功能
  535. setTimeout(() => {
  536. if (this.tableData.length <= 0) {
  537. return false
  538. }
  539. this.method5('tableid');
  540. }, 500);
  541. })
  542. },
  543. // 导出
  544. getExplorer () {
  545. var explorer = window.navigator.userAgent;
  546. //ie
  547. if (explorer.indexOf("MSIE") >= 0) {
  548. return 'ie';
  549. }
  550. //firefox
  551. else if (explorer.indexOf("Firefox") >= 0) {
  552. return 'Firefox';
  553. }
  554. //Chrome
  555. else if (explorer.indexOf("Chrome") >= 0) {
  556. return 'Chrome';
  557. }
  558. //Opera
  559. else if (explorer.indexOf("Opera") >= 0) {
  560. return 'Opera';
  561. }
  562. //Safari
  563. else if (explorer.indexOf("Safari") >= 0) {
  564. return 'Safari';
  565. }
  566. },
  567. method5 (tableid) {
  568. if (this.getExplorer() == 'ie') {
  569. var curTbl = document.getElementById(tableid);
  570. var oXL = new ActiveXObject("Excel.Application");
  571. var oWB = oXL.Workbooks.Add();
  572. var xlsheet = oWB.Worksheets(1);
  573. var sel = document.body.createTextRange();
  574. sel.moveToElementText(curTbl);
  575. sel.select();
  576. sel.execCommand("Copy");
  577. xlsheet.Paste();
  578. oXL.Visible = true;
  579. try {
  580. var fname = oXL.Application.GetSaveAsFilename("哈哈哈.xls", "Excel Spreadsheets (*.xls), *.xls");
  581. } catch (e) {
  582. print("Nested catch caught " + e);
  583. } finally {
  584. oWB.SaveAs(fname);
  585. oWB.Close(savechanges = false);
  586. oXL.Quit();
  587. oXL = null;
  588. this.idTmr = window.setInterval("Cleanup();", 1);
  589. }
  590. }
  591. else {
  592. this.tableToExcel();
  593. }
  594. },
  595. Cleanup () {
  596. window.clearInterval(this.idTmr);
  597. this.CollectGarbage();
  598. },
  599. tableToExcel () {
  600. (function () {
  601. var uri = 'data:application/vnd.ms-excel;base64,',
  602. template = '<html><head><meta charset="UTF-8"></head><body><table>{table}</table></body></html>',
  603. base64 = function (s) { return window.btoa(unescape(encodeURIComponent(s))) },
  604. format = function (s, c) {
  605. return s.replace(/{(\w+)}/g,
  606. function (m, p) { return c[p]; }) }
  607. // table name
  608. let table = document.getElementById('tableid')
  609. // || name
  610. var ctx = { worksheet: 'Worksheet', table: table.innerHTML }
  611. window.location.href = uri + base64(format(template, ctx))
  612. //
  613. // return function () {
  614. // }
  615. })()
  616. },
  617. splitS(remark) {
  618. if(!remark) {
  619. return ''
  620. }
  621. let temp = remark.split('\n')
  622. return temp
  623. }
  624. },
  625. watch: {
  626. radio (val) {
  627. if (val == 1) {
  628. this.isRadioDisabled = true;
  629. } else {
  630. this.isRadioDisabled = false;
  631. }
  632. }
  633. },
  634. computed: {
  635. currentPage: {
  636. get () {
  637. return this.page
  638. },
  639. set (val) {
  640. this.$emit('update:page', val)
  641. }
  642. },
  643. },
  644. mounted () {
  645. // 获取所有分部
  646. this.getBranches();
  647. // 获取所有学生列表
  648. // this.getstudentList();
  649. }
  650. };
  651. </script>
  652. <style scoped>
  653. .dashboard-container {
  654. padding-left: 10px;
  655. display: flex;
  656. flex-direction: row;
  657. justify-content: flex-start;
  658. flex-wrap: nowrap;
  659. }
  660. .dashboard-container .left {
  661. width: 200px;
  662. min-height: 100vh;
  663. /* background-color: #14928a; */
  664. padding-top: 15px;
  665. border-right: 1px solid #ccc;
  666. }
  667. .dashboard-container .left h2 {
  668. margin-top: 15px;
  669. height: 40px;
  670. line-height: 40px;
  671. font-size: 18px;
  672. text-align: center;
  673. margin: 0;
  674. padding: 0;
  675. color: #333;
  676. }
  677. .dashboard-container .right {
  678. padding: 15px 0;
  679. width: calc(100% - 200px);
  680. }
  681. .topWrap {
  682. margin-left: 40px;
  683. }
  684. .fade-enter-active,
  685. .fade-leave-active {
  686. transition: opacity 0.5s;
  687. }
  688. .fade-enter, .fade-leave-to /* .fade-leave-active below version 2.1.8 */ {
  689. opacity: 0;
  690. }
  691. .left ul {
  692. margin: 0;
  693. padding: 0;
  694. }
  695. .left li {
  696. display: block;
  697. text-align: center;
  698. list-style: none;
  699. color: #333;
  700. font-size: 14px;
  701. line-height: 70px;
  702. cursor: pointer;
  703. }
  704. .left li.active {
  705. color: #ffc10d;
  706. }
  707. .paginationWrap {
  708. display: flex;
  709. flex-direction: row;
  710. justify-content: flex-end;
  711. }
  712. .pagination {
  713. margin-top: 20px;
  714. }
  715. .joinBtn {
  716. position: fixed;
  717. right: 30px;
  718. top: 700px;
  719. z-index: 100;
  720. }
  721. .sectionForm {
  722. display: flex;
  723. flex-direction: row;
  724. justify-content: center;
  725. }
  726. .subMsg {
  727. width: 100%;
  728. text-align: center;
  729. font-size: 14px;
  730. color: #ccc;
  731. margin-top: 100px;
  732. }
  733. .wrap {
  734. width: 100%;
  735. display: flex;
  736. flex-direction: column;
  737. align-items: center;
  738. }
  739. .nomargin {
  740. margin: 0;
  741. }
  742. </style>