attendanceRecord.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038
  1. <template>
  2. <div class="content-box">
  3. <div class="left">
  4. <!-- <el-icon :size="23" class="camera"><VideoCameraFilled /></el-icon> -->
  5. <span class="cameratxt">考勤记录</span>
  6. </div>
  7. <!-- <el-tabs v-model="recordType" class="demo-tabs" @tab-click="handleClick">
  8. <el-tab-pane label="学生" :name="1">学生</el-tab-pane>
  9. <el-tab-pane label="教师" :name="2">教师</el-tab-pane>
  10. </el-tabs> -->
  11. <div class="scrollId" >
  12. <div class="middle">
  13. <div class="filter">
  14. <div class="condition">
  15. <el-input
  16. :clearable="true"
  17. @blur="searchBtn"
  18. @clear="searchBtn"
  19. v-model.trim="searchInput.name"
  20. class="sel"
  21. placeholder="请输入学生姓名"
  22. />
  23. </div>
  24. <div class="condition">
  25. <el-input
  26. :clearable="true"
  27. @blur="searchBtn"
  28. @clear="searchBtn"
  29. v-model.trim="searchInput.cardId"
  30. class="sel"
  31. placeholder="请输入学生学号"
  32. />
  33. </div>
  34. <el-button
  35. color="rgba(0, 97, 255, 1)"
  36. type="primary"
  37. class="search"
  38. @click="searchBtn"
  39. >
  40. <!-- <el-icon>
  41. <Search />
  42. </el-icon> -->
  43. 查询</el-button
  44. >
  45. <!-- 年级 -->
  46. <div class="condition" v-if="classId==0">
  47. <span class="title">年级 : </span>
  48. <el-select
  49. v-model="searchInput.grade"
  50. placeholder="请选择年级"
  51. style="width: 160px"
  52. @change="gradeChange"
  53. :clearable="true"
  54. >
  55. <el-option
  56. v-for="i in gradeData"
  57. :label="i.name"
  58. :value="i.id"
  59. >
  60. </el-option>
  61. </el-select>
  62. </div>
  63. <!-- 班级 -->
  64. <div class="condition" v-if="classId==0">
  65. <span class="title">班级 : </span>
  66. <el-tooltip
  67. class="box-item"
  68. effect="dark"
  69. content="请先选择年级"
  70. placement="top"
  71. >
  72. <el-select
  73. v-model="searchInput.class"
  74. placeholder="请选择班级"
  75. style="width: 160px"
  76. @change="searchBtn"
  77. :clearable="true"
  78. >
  79. <el-option
  80. v-for="i in classData"
  81. :label="i.name"
  82. :value="i.id"
  83. />
  84. </el-select>
  85. </el-tooltip>
  86. </div>
  87. <!-- 年级 -->
  88. <div class="condition" v-if="classId!=0">
  89. <span class="title">年级 : </span>
  90. <el-select
  91. v-model="searchInput.grade"
  92. placeholder="请选择年级"
  93. style="width: 160px"
  94. >
  95. <el-option
  96. v-for="i in gradeData"
  97. :label="i.name"
  98. :value="i.id"
  99. >
  100. </el-option>
  101. </el-select>
  102. </div>
  103. <!-- 班级 -->
  104. <div class="condition" v-if="classId!=0">
  105. <span class="title">班级 : </span>
  106. <el-select
  107. v-model="searchInput.class"
  108. placeholder="请选择班级"
  109. style="width: 160px"
  110. @change="searchBtn"
  111. >
  112. <el-option
  113. v-for="i in classData"
  114. :label="i.name"
  115. :value="i.id"
  116. />
  117. </el-select>
  118. </div>
  119. <!-- 部门 -->
  120. <!-- <div class="condition">
  121. <span class="title">部门 : </span>
  122. <el-select
  123. v-model="searchInput.department"
  124. placeholder="请选择部门"
  125. style="width: 160px"
  126. @change="searchBtn"
  127. :clearable="true"
  128. >
  129. <el-option
  130. v-for="i in departmentData"
  131. :label="i.name"
  132. :value="i.id"
  133. />
  134. </el-select>
  135. </div> -->
  136. <!-- 识别分组 -->
  137. <!-- <div class="condition">
  138. <span class="title">识别分组 : </span>
  139. <el-select
  140. v-model="searchInput.recognition"
  141. placeholder="请选择识别分组"
  142. style="width: 160px"
  143. @change="searchBtn"
  144. :clearable="true"
  145. >
  146. <el-option
  147. v-for="i in recognitionData"
  148. :label="i.name"
  149. :value="i.id"
  150. >
  151. </el-option>
  152. </el-select>
  153. </div> -->
  154. <!-- 通行状态 -->
  155. <div class="condition">
  156. <span class="title">考勤状态 : </span>
  157. <el-select
  158. v-model="searchInput.passType"
  159. placeholder="请选择考勤状态"
  160. style="width: 160px"
  161. @change="searchBtn"
  162. :clearable="true"
  163. >
  164. <el-option label="准时" :value="0"></el-option>
  165. <el-option label="迟到" :value="1"></el-option>
  166. <el-option label="缺卡" :value="3"></el-option>
  167. <el-option label="请假" :value="6"></el-option>
  168. <el-option label="超时打卡" :value="7">
  169. </el-option>
  170. </el-select>
  171. </div>
  172. <!-- 时间 -->
  173. <div class="condition">
  174. <span class="title">时间 : </span>
  175. <el-date-picker
  176. v-model="searchInput.createTime"
  177. type="datetimerange"
  178. unlink-panels
  179. :clearable='true'
  180. range-separator="-"
  181. start-placeholder="起始时间"
  182. end-placeholder="结束时间"
  183. format="YYYY-MM-DD HH:mm:ss"
  184. value-format="YYYY-MM-DD HH:mm:ss"
  185. :prefix-icon="Calendar"
  186. placeholder="请选择日期"
  187. style="width: 350px"
  188. @change="searchBtn"
  189. />
  190. </div>
  191. </div>
  192. <!-- 按钮列表 -->
  193. <div class="gongneng">
  194. <el-button
  195. type="primary"
  196. color="rgba(0, 97, 255, 1)"
  197. plain
  198. @click="importExcel"
  199. >记录导出</el-button
  200. >
  201. <el-button
  202. type="primary"
  203. color="rgba(0, 97, 255, 1)"
  204. plain
  205. @click="editClick"
  206. >推送人设置</el-button
  207. >
  208. </div>
  209. </div>
  210. <div class="footer" v-loading="loading">
  211. <el-table
  212. :row-class-name="tableRowClassName"
  213. :data="tableData.list"
  214. @selection-change="handleSelectionChange"
  215. style="width: 100%"
  216. :header-cell-style="{
  217. background: 'rgba(240, 243, 247, 1)',
  218. height: '50px',
  219. border: 0,
  220. }"
  221. >
  222. <el-table-column
  223. align="center"
  224. type="index"
  225. label="序号"
  226. width="80"
  227. />
  228. <el-table-column align="center" prop="name" label="姓名" />
  229. <el-table-column align="center" prop="gradeName" label="年级" />
  230. <el-table-column align="center" prop="className" label="班级" />
  231. <el-table-column align="center" prop="cardNo" label="学号" />
  232. <el-table-column align="center" prop="cardNo" label="图像">
  233. <template #default={row}>
  234. <div v-viewer>
  235. <img :src="row.headImage" style="width:60px;height:60px"/>
  236. </div>
  237. </template>
  238. </el-table-column>
  239. <el-table-column align="center" label="打卡时间">
  240. <template #default={row}>
  241. <span v-if="row.status==6">{{row.initiateTime}}</span>
  242. <span v-else>{{row.attendTime}}</span>
  243. </template>
  244. </el-table-column>
  245. <el-table-column align="center" prop="score" label="状态" >
  246. <template #default={row}>
  247. <span v-if="row.status==0">准时</span>
  248. <span v-if="row.status==1">迟到</span>
  249. <span v-if="row.status==3">缺卡</span>
  250. <span v-if="row.status==6">请假</span>
  251. <span v-if="row.status==7">超时打卡</span>
  252. </template>
  253. </el-table-column>
  254. <!-- <el-table-column align="center" prop="status" label="操作">
  255. <template #default="scope">
  256. <div class="look" @click="editClick(scope.row)">编辑</div>
  257. </template>
  258. </el-table-column> -->
  259. </el-table>
  260. </div>
  261. <!-- 分页组件 -->
  262. <div class="pageSize">
  263. <span></span>
  264. <el-pagination
  265. background
  266. :current-page="studentData.currentPage"
  267. :page-sizes="[10, 20, 50, 100]"
  268. :page-size="studentData.pageSize"
  269. layout="total, prev, pager, next, jumper, slot"
  270. :total="studentData.total"
  271. @update:page-size="handleSizeChange"
  272. @update:current-page="handleCurrentChange"
  273. />
  274. </div>
  275. <!-- 推送人设置 -->
  276. <el-dialog
  277. class="editDialog"
  278. v-model="editVisible"
  279. :close-on-click-modal="false"
  280. :close-on-press-escape="false"
  281. title="推送人设置"
  282. align-center
  283. width="500"
  284. :before-close="editCancel"
  285. >
  286. <div class="switch">
  287. <p>按照身份推送 :</p>
  288. <el-checkbox v-model="editChecked1" label="家长" :true-value="1" :false-value="2" size="large" />
  289. <el-checkbox v-model="editChecked2" label="班主任" :true-value="1" :false-value="2" size="large" />
  290. </div>
  291. <div class="options">
  292. <el-button
  293. color="rgba(41, 109, 227, 1)"
  294. class="queding"
  295. type="primary"
  296. @click="editConfirm"
  297. >
  298. 确认
  299. </el-button>
  300. <el-button @click="editCancel">取消</el-button>
  301. </div>
  302. </el-dialog>
  303. <div class="bgImg" v-if="bgImg">
  304. <el-carousel
  305. @click="bgImg = false"
  306. ref="bgImgs"
  307. indicator-position
  308. arrow="always"
  309. :autoplay="false"
  310. trigger
  311. >
  312. <el-carousel-item >
  313. <img :src="showImg" alt="" />
  314. </el-carousel-item>
  315. </el-carousel>
  316. </div>
  317. </div>
  318. </div>
  319. </template>
  320. <script setup>
  321. import {
  322. ref,
  323. reactive,
  324. watch,
  325. nextTick,
  326. onBeforeMount,
  327. onUnmounted,
  328. } from "vue";
  329. import { useRouter } from "vue-router";
  330. import { ElMessage, ElMessageBox } from "element-plus";
  331. import { Calendar } from "@element-plus/icons-vue";
  332. import vidiconsApi from "@/api/vidicons.js";
  333. import { dayjs } from "element-plus";
  334. import eds from "@/utils/eds.js";
  335. import lodash from "lodash";
  336. import axios from "axios";
  337. import { useStore } from "vuex";
  338. const store = useStore();
  339. const api = ref("");
  340. const router = useRouter();
  341. // 表格数据
  342. const loading = ref(false);
  343. const classId=ref() // 获取所管理的班级的id(0是所有班级)
  344. const tableData = reactive({
  345. list: [],
  346. });
  347. const gradeData = ref(); //年级下拉数据
  348. const classData = ref(); //班级下拉数据
  349. const departmentData = ref([{ name: "发财部", id: 1 }]); //部门下拉数据
  350. const recognitionData = ref([
  351. { name: "全部", id: 1 },
  352. { name: "其他组", id: 2 },
  353. ]); //识别分组数据
  354. const passTypeData = ref([{ name: "正常通行", id: 1 }]); //通行状态数据
  355. const searchInput = reactive({
  356. name: "",
  357. cardId: "",
  358. grade: "", // 年级
  359. class: "", // 班级
  360. department: "", // 部门
  361. recognition: "", // 识别分组
  362. passType: "", // 通行状态
  363. createTime: [
  364. ], // 时间
  365. }); // 搜索按钮数据
  366. const studentData = reactive({
  367. currentPage: ref(1), // 当前页
  368. pageSize: ref(10),
  369. total: ref(5), // 当前总数
  370. });
  371. const bgImg = ref(false);
  372. const showImg=ref('')
  373. // 推送人设置
  374. const editVisible=ref(false)
  375. const editId=ref()
  376. const editChecked1=ref(2)// 家长
  377. const editChecked2=ref(2)// 班主任
  378. // 年级数据下拉
  379. const adminClassDataList = async () => {
  380. console.log(classId.value==1);
  381. if(classId.value==0){
  382. let grade = await axios({
  383. method: "get",
  384. url: api.value + "/wanzai/api/smartGrade/querySmartGrades",
  385. headers: {
  386. token: sessionStorage.getItem("token"),
  387. user_head: sessionStorage.getItem("userhead"),
  388. },
  389. // params: data,
  390. });
  391. console.log(
  392. grade,
  393. JSON.parse(eds.decryptDes(grade.data.data)),
  394. "年级下拉数据"
  395. );
  396. gradeData.value = JSON.parse(eds.decryptDes(grade.data.data));
  397. }else{
  398. let grade = await axios({
  399. method: "get",
  400. url: api.value + "/wanzai/api/smartClass/getClassId",
  401. headers: {
  402. token: sessionStorage.getItem("token"),
  403. user_head: sessionStorage.getItem("userhead"),
  404. },
  405. params: {
  406. schoolClass:classId.value
  407. },
  408. });
  409. console.log(
  410. grade,
  411. JSON.parse(eds.decryptDes(grade.data.data)),
  412. "年级下拉数据"
  413. );
  414. let data = JSON.parse(eds.decryptDes(grade.data.data));
  415. gradeData.value=[{
  416. name:data.gradeName,
  417. id:data.gradeId
  418. }]
  419. classData.value=[{
  420. name:data.className,
  421. id:data.classId
  422. }]
  423. searchInput.grade=data.gradeId
  424. searchInput.class=data.classId
  425. }
  426. getList()
  427. };
  428. // 管理员 改变年级选择
  429. const gradeChange = (value) => {
  430. console.log(value);
  431. if (value) {
  432. adminClassInfoList(value);
  433. } else {
  434. classData.value = [];
  435. searchInput.class=""
  436. }
  437. getList();
  438. };
  439. // 管理员 班级数据下拉
  440. const adminClassInfoList = async (value) => {
  441. let data = {
  442. gradeId: value,
  443. };
  444. let res = await axios({
  445. method: "get",
  446. url: api.value + "/wanzai/api/smartClass/querySmartClasss",
  447. headers: {
  448. token: sessionStorage.getItem("token"),
  449. user_head: sessionStorage.getItem("userhead"),
  450. },
  451. params: data,
  452. });
  453. if (res.data.code == 200) {
  454. console.log(
  455. res,
  456. JSON.parse(eds.decryptDes(res.data.data)),
  457. "班级下拉数据"
  458. );
  459. classData.value = JSON.parse(eds.decryptDes(res.data.data));
  460. } else {
  461. classData.value = [];
  462. }
  463. };
  464. // 获取成绩分页数据 (----------------------------------------------------------------)
  465. const getList = async () => {
  466. loading.value = true;
  467. let data = {
  468. currentPage: studentData.currentPage,
  469. pageCount: studentData.pageSize,
  470. name: searchInput.name, // 用户名称
  471. studentNo: searchInput.cardId, // 用户名称
  472. status:searchInput.passType,
  473. gradeId:searchInput.grade,
  474. classId:searchInput.class,
  475. };
  476. if(searchInput.createTime){
  477. data.startTime = searchInput.createTime[0];
  478. data.endTime = searchInput.createTime[1]
  479. }
  480. let res = await axios({
  481. method: "get",
  482. url: api.value + "/wanzai/api/smartAttendance/queryPage",
  483. headers: {
  484. token: sessionStorage.getItem("token"),
  485. user_head: sessionStorage.getItem("userhead"),
  486. },
  487. params: data,
  488. });
  489. console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "考勤记录");
  490. if (res.data.code == 200) {
  491. loading.value = false;
  492. tableData.list = JSON.parse(eds.decryptDes(res.data.data)).list;
  493. studentData.total = JSON.parse(eds.decryptDes(res.data.data)).totalCount;
  494. } else {
  495. loading.value = false;
  496. ElMessage({
  497. type: "error",
  498. showClose: true,
  499. message: res.data.message,
  500. center: true,
  501. });
  502. }
  503. };
  504. // 搜索功能
  505. const searchBtn = lodash.debounce(async () => {
  506. getList();
  507. }, 300);
  508. // 推送人设置
  509. const editClick =async () =>{
  510. editVisible.value=true
  511. let res = await axios({
  512. method: "get",
  513. url: api.value + "/wanzai/api/smartPushConfig/list",
  514. headers: {
  515. token: sessionStorage.getItem("token"),
  516. user_head: sessionStorage.getItem("userhead"),
  517. },
  518. });
  519. console.log(res, JSON.parse(eds.decryptDes(res.data.data)), "推送配置");
  520. if (res.data.code == 200) {
  521. let data = JSON.parse(eds.decryptDes(res.data.data))
  522. editId.value=data.id
  523. editChecked1.value=data.parentsPush
  524. editChecked2.value=data.chargeTeacherPush
  525. }
  526. }
  527. const editConfirm=async ()=>{
  528. let data = {
  529. id: editId.value,
  530. parentsPush: editChecked1.value,
  531. chargeTeacherPush: editChecked2.value, // 用户名称
  532. };
  533. let res = await axios({
  534. method: "post",
  535. url: api.value + "/wanzai/api/smartPushConfig/update",
  536. headers: {
  537. token: sessionStorage.getItem("token"),
  538. user_head: sessionStorage.getItem("userhead"),
  539. },
  540. data: data,
  541. });
  542. console.log(res, "确定推送");
  543. if (res.data.code == 200) {
  544. editVisible.value=false
  545. ElMessage({
  546. type: "success",
  547. showClose: true,
  548. message: res.data.message,
  549. center: true,
  550. });
  551. } else {
  552. ElMessage({
  553. type: "error",
  554. showClose: true,
  555. message: res.data.message,
  556. center: true,
  557. });
  558. }
  559. }
  560. const editCancel=()=>{
  561. editVisible.value=false
  562. }
  563. //导出功能 (-----------------------------------------------------------------)
  564. const importExcel = async () => {
  565. let data = {
  566. currentPage: studentData.currentPage,
  567. pageCount: studentData.pageSize,
  568. name: searchInput.name, // 用户名称
  569. studentNo: searchInput.cardId, // 用户名称
  570. status:searchInput.passType,
  571. gradeId:searchInput.grade,
  572. classId:searchInput.class,
  573. };
  574. if(searchInput.createTime){
  575. data.startTime = searchInput.createTime[0];
  576. data.endTime = searchInput.createTime[1]
  577. }
  578. let res = await axios({
  579. method: "get",
  580. url: api.value + "/wanzai/api/smartAttendance/queryPageExport",
  581. headers: {
  582. token: sessionStorage.getItem("token"),
  583. user_head: sessionStorage.getItem("userhead"),
  584. },
  585. params: data,
  586. responseType: "blob",
  587. });
  588. console.log(res, "导出用户");
  589. if (res.status == 200) {
  590. let name = `考勤记录数据`;
  591. var content = res.data;
  592. var datas = new Blob([content]);
  593. var downloadUrl = window.URL.createObjectURL(datas);
  594. var anchor = document.createElement("a");
  595. anchor.href = downloadUrl;
  596. anchor.download = name + ".xlsx";
  597. anchor.click();
  598. window.URL.revokeObjectURL(datas);
  599. ElMessage({
  600. type: "success",
  601. showClose: true,
  602. message: "导出成功",
  603. center: true,
  604. });
  605. } else {
  606. ElMessage({
  607. type: "error",
  608. showClose: true,
  609. message: "导出失败",
  610. center: true,
  611. });
  612. }
  613. };
  614. // 表格斑马纹颜色修改
  615. const tableRowClassName = ({ row, rowIndex }) => {
  616. if (rowIndex % 2 === 0) {
  617. return "even";
  618. } else if (rowIndex % 2 !== 0) {
  619. return "odd";
  620. }
  621. return "";
  622. };
  623. const handleSizeChange=(value)=>{
  624. studentData.pageSize=value
  625. getList()
  626. }
  627. // 分页
  628. const handleCurrentChange = (value) => {
  629. studentData.currentPage = value;
  630. getList();
  631. };
  632. // 查看图片
  633. const imgClick = (row) => {
  634. console.log(row);
  635. bgImg.value = true;
  636. showImg.value = row;
  637. };
  638. // 分页
  639. const teacherPageChange = (value) => {
  640. teacherData.currentPage = value;
  641. getList();
  642. };
  643. // 判断为班主任 还是 超级管理员
  644. const getAdminId=async ()=>{
  645. // 获取所管理的班级的id(0是所有班级)
  646. let res = await axios({
  647. method: "get",
  648. url: api.value + "/wanzai/api/smartAuthorGroup/getClassById",
  649. headers: {
  650. token: sessionStorage.getItem("token"),
  651. user_head: sessionStorage.getItem("userhead"),
  652. },
  653. params:{
  654. userHead:sessionStorage.getItem("userhead")
  655. },
  656. });
  657. console.log(res,JSON.parse(eds.decryptDes(res.data.data)),"获取所管理的班级的id(0是所有班级)");
  658. if (res.data.code == 200) {
  659. let classIds=JSON.parse(eds.decryptDes(res.data.data)).schoolClass
  660. classId.value = classIds
  661. adminClassDataList()
  662. }
  663. }
  664. onBeforeMount(async () => {
  665. api.value = store.state.user.api;
  666. // getList();
  667. getAdminId();
  668. });
  669. onUnmounted(() => {
  670. // document.removeEventListener("keyup", Enters);
  671. });
  672. </script>
  673. <style scoped lang="scss">
  674. .content-box {
  675. min-width: 500px;
  676. width: calc(100vw - 260px);
  677. height: calc(100vh - 105px);
  678. margin: 20px auto;
  679. background-color: #fff;
  680. color: #fff;
  681. display: flex;
  682. flex-direction: column;
  683. box-shadow: 0px 3px 10px rgba(0, 97, 255, 0.2);
  684. .left {
  685. // width: calc(100wh - 40px);
  686. display: flex;
  687. align-items: center;
  688. height: 60px;
  689. margin: 0 30px;
  690. border-bottom: 1px solid #ccc;
  691. color: rgb(0, 0, 0);
  692. font-size: 18px;
  693. font-weight: 600;
  694. span {
  695. height: 60px;
  696. display: block;
  697. line-height: 60px;
  698. margin-right: 20px;
  699. }
  700. .is_active {
  701. color: rgba(111, 182, 184, 1);
  702. }
  703. }
  704. :deep(.el-tabs) {
  705. margin: 0 30px;
  706. .el-tabs__header {
  707. margin: 0;
  708. }
  709. .el-tabs__content {
  710. display: none;
  711. }
  712. }
  713. .scrollId {
  714. overflow: auto;
  715. height: calc(100% - 61px);
  716. display: flex;
  717. flex-direction: column;
  718. .middle {
  719. width: 96%;
  720. margin: 0 auto;
  721. color: #000;
  722. // border-bottom: 1px solid rgb(231, 231, 231);
  723. .filter {
  724. display: flex;
  725. flex-wrap: wrap;
  726. align-items: center;
  727. margin: 10px 0 0 0;
  728. .search {
  729. color: #fff;
  730. }
  731. .condition {
  732. display: flex;
  733. align-items: center;
  734. margin: 10px 20px 10px 0;
  735. :deep(.el-input .el-input__inner) {
  736. font-size: 14px;
  737. }
  738. .title {
  739. padding: 0 25px 0 0;
  740. }
  741. }
  742. .grade {
  743. .el-input {
  744. :deep(.el-input__wrapper) {
  745. box-shadow: none;
  746. }
  747. }
  748. .grade_left {
  749. border-top: 1px solid #dcdfe6;
  750. border-bottom: 1px solid #dcdfe6;
  751. border-left: 1px solid #dcdfe6;
  752. border-top-left-radius: 4px;
  753. border-bottom-left-radius: 4px;
  754. }
  755. .line {
  756. display: block;
  757. height: 32px;
  758. line-height: 32px;
  759. padding: 0 8px;
  760. border-top: 1px solid #dcdfe6;
  761. border-bottom: 1px solid #dcdfe6;
  762. }
  763. .grade_right {
  764. border-top: 1px solid #dcdfe6;
  765. border-bottom: 1px solid #dcdfe6;
  766. border-right: 1px solid #dcdfe6;
  767. border-top-right-radius: 4px;
  768. border-bottom-right-radius: 4px;
  769. }
  770. }
  771. .search {
  772. margin-right: 20px;
  773. }
  774. }
  775. .gongneng {
  776. margin: 10px 0 10px 0;
  777. span {
  778. color: #fff;
  779. }
  780. .el-button {
  781. margin-right: 10px;
  782. }
  783. }
  784. }
  785. .footer {
  786. width: 96%;
  787. flex: 1;
  788. min-height: 300px;
  789. margin: 10px auto 0;
  790. .el-table--fit {
  791. height: 100%;
  792. :deep(.el-table__header-wrapper) {
  793. background-color: #000;
  794. font-size: 14px;
  795. tr {
  796. // color: #000;
  797. }
  798. }
  799. :deep(.el-table__row) {
  800. height: 50px;
  801. font-size: 14px;
  802. // color: #000;
  803. &:hover {
  804. td {
  805. background-color: rgba(223, 236, 254, 1);
  806. }
  807. }
  808. }
  809. :deep(.el-table__row td) {
  810. padding: 0;
  811. border: 0;
  812. .normal {
  813. background-color: rgba(139, 195, 74, 1);
  814. color: #fff;
  815. padding: 4px;
  816. }
  817. }
  818. .el-button--primary {
  819. margin-left: 5px;
  820. }
  821. :deep(.el-table__body .even) {
  822. background-color: #fff;
  823. }
  824. :deep(.el-table__body .odd) {
  825. background-color: rgba(240, 243, 247, 1);
  826. }
  827. :deep(.edit) {
  828. display: flex;
  829. align-items: center;
  830. justify-content: center;
  831. color: rgba(111, 182, 184, 1);
  832. }
  833. :deep(.look) {
  834. padding: 0 10px;
  835. cursor: pointer;
  836. color: rgba(30, 125, 251, 1);
  837. }
  838. .del {
  839. padding: 0 10px;
  840. color: rgba(212, 48, 48, 1);
  841. cursor: pointer;
  842. }
  843. // :deep(.look):hover {
  844. // color: red;
  845. // }
  846. // :deep(.del):hover {
  847. // color: red;
  848. // }
  849. }
  850. }
  851. .pageSize {
  852. display: flex;
  853. align-items: center;
  854. justify-content: space-between;
  855. margin: 20px 30px;
  856. span {
  857. color: #000;
  858. }
  859. .el-pagination {
  860. // width: 1600px;
  861. :deep(.el-pagination__total) {
  862. color: #000;
  863. }
  864. :deep(.el-pagination__goto) {
  865. color: #000;
  866. }
  867. :deep(.el-pagination__classifier) {
  868. color: #000;
  869. }
  870. :deep(.el-input__wrapper) {
  871. border: 1px solid rgba(0, 0, 0, 1);
  872. border-radius: 5px;
  873. box-shadow: none;
  874. }
  875. :deep(.el-pager li) {
  876. margin: 0 5px;
  877. border: 1px solid rgba(0, 0, 0, 1);
  878. border-radius: 5px;
  879. background-color: transparent;
  880. }
  881. :deep(.el-pager li.is-active) {
  882. // background-color: rgba(0, 97, 255, 0.8);
  883. border: 1px solid rgba(0, 97, 255, 1);
  884. color: rgba(0, 97, 255, 1);
  885. }
  886. :deep(.btn-prev) {
  887. margin-right: 5px;
  888. border: 1px solid rgba(0, 0, 0, 1);
  889. border-radius: 5px;
  890. background-color: transparent;
  891. }
  892. :deep(.btn-next) {
  893. margin-left: 5px;
  894. border: 1px solid rgba(0, 0, 0, 1);
  895. border-radius: 5px;
  896. background-color: transparent;
  897. }
  898. }
  899. }
  900. :deep(.editDialog) {
  901. // height: 420px;
  902. border-radius: 11px;
  903. .el-dialog__header {
  904. border-radius: 11px 11px 0 0;
  905. background: rgba(237, 241, 245, 1);
  906. font-weight: 600;
  907. margin: 0;
  908. .el-dialog__headerbtn {
  909. outline: none;
  910. }
  911. }
  912. .el-dialog__body {
  913. padding: 0 30px;
  914. height: 300px;
  915. .switch {
  916. margin: 10px 0;
  917. p {
  918. font-size: 17px;
  919. margin-right: 10px;
  920. }
  921. }
  922. .attention {
  923. color: rgb(238, 190, 119);
  924. }
  925. .options {
  926. margin: 160px 20px 20px 0;
  927. width: 100%;
  928. display: flex;
  929. flex-direction: row-reverse;
  930. .queding {
  931. color: #fff;
  932. margin-left: 15px;
  933. }
  934. }
  935. }
  936. }
  937. .bgImg {
  938. position: absolute;
  939. left: 0;
  940. top: 0;
  941. z-index: 99999999;
  942. width: 100%;
  943. height: 100%;
  944. background-color: rgba(255, 255, 255, 0.8);
  945. :deep(.el-carousel__arrow){
  946. display:none;
  947. }
  948. // border-radius: 50px;
  949. :deep(.el-carousel__container) {
  950. width: 100%;
  951. height: calc(100vh);
  952. .el-carousel__item {
  953. display: flex;
  954. justify-content: center;
  955. img {
  956. height: 100%;
  957. }
  958. }
  959. }
  960. }
  961. }
  962. }
  963. .el-input {
  964. width: 192px;
  965. }
  966. </style>
  967. <style lang="scss">
  968. //添加成员 联系人下拉框样式
  969. .gradeSelect {
  970. // border: 1px solid red;
  971. .el-select-dropdown__wrap {
  972. height: 200px;
  973. // border: 1px solid red;
  974. }
  975. }
  976. .el-popper {
  977. .addStudentMore {
  978. text-align: center;
  979. }
  980. }
  981. </style>