index.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983
  1. <template>
  2. <div class="content-box">
  3. <div class="left">
  4. <el-icon :size="23" class="camera"><UserFilled /></el-icon>
  5. <span class="cameratxt">用户管理</span>
  6. </div>
  7. <div class="middle">
  8. <div class="filter">
  9. <div class="condition">
  10. <span>姓名 </span>
  11. <el-input
  12. clearable
  13. v-model="searchData.input1"
  14. class="w-50 m-2"
  15. placeholder="请输入姓名"
  16. style="width: 150px"
  17. />
  18. </div>
  19. <div class="condition">
  20. <span>账号 </span>
  21. <el-input
  22. clearable
  23. v-model="searchData.input2"
  24. class="w-50 m-2"
  25. placeholder="请输入账号"
  26. style="width: 150px"
  27. />
  28. </div>
  29. <div class="condition">
  30. <span>联系方式 </span>
  31. <el-input
  32. clearable
  33. v-model="searchData.input3"
  34. class="w-50 m-2"
  35. placeholder="请输入联系方式"
  36. style="width: 180px"
  37. />
  38. </div>
  39. <div class="condition">
  40. <span>角色 </span>
  41. <el-select
  42. style="width: 120px"
  43. v-model="searchData.input4"
  44. class="m-2"
  45. placeholder="请选择角色"
  46. >
  47. <el-option label="管理员" value="2" />
  48. <el-option label="超级管理员" value="1" />
  49. </el-select>
  50. </div>
  51. <div class="condition">
  52. <span>创建时间 </span>
  53. <el-date-picker
  54. v-model="searchData.input5"
  55. type="datetimerange"
  56. start-placeholder="开始日期"
  57. end-placeholder="结束日期"
  58. format="YYYY-MM-DD HH:mm:ss"
  59. value-format="YYYY-MM-DD HH:mm:ss"
  60. />
  61. </div>
  62. <el-button type="primary" class="search" @click="search">搜索</el-button>
  63. <el-button type="primary" plain @click="resetInput">重置</el-button>
  64. </div>
  65. <!-- 按钮列表 -->
  66. <div class="gongneng">
  67. <el-button type="primary" plain @click="addlist">新增</el-button>
  68. <el-button type="success" plain @click="importExcel">导入</el-button>
  69. <el-button type="warning" plain @click="downLoad">导出</el-button>
  70. <el-button type="danger" plain @click="allDel">删除</el-button>
  71. </div>
  72. <!-- 编辑/新增管理员 -->
  73. <el-dialog
  74. v-model="centerDialogVisible"
  75. :title="dialongTitle"
  76. width="30%"
  77. align-center
  78. :before-close="editClose"
  79. >
  80. <el-form
  81. ref="ruleFormRef"
  82. :model="ruleForm"
  83. :rules="rules"
  84. label-width="120px"
  85. class="demo-ruleForm"
  86. :size="formSize"
  87. status-icon
  88. >
  89. <el-form-item label="姓名" prop="name">
  90. <el-input v-model="ruleForm.name" placeholder="请输入姓名" />
  91. </el-form-item>
  92. <el-form-item label="性别" prop="region">
  93. <el-select
  94. v-model="ruleForm.region"
  95. style="width: 180px"
  96. placeholder="请选择性别"
  97. >
  98. <el-option label="男" value="1" />
  99. <el-option label="女" value="0" />
  100. </el-select>
  101. </el-form-item>
  102. <el-form-item label="账号" prop="date1">
  103. <el-input v-model="ruleForm.date1" placeholder="请输入账号" />
  104. </el-form-item>
  105. <el-form-item label="密码" prop="date2" v-show="dialongTitle == '新增用户'">
  106. <el-input v-model="ruleForm.date2" placeholder="请输入密码" />
  107. </el-form-item>
  108. <el-form-item label="联系方式" prop="phone">
  109. <el-input v-model="ruleForm.phone" placeholder="请输入联系方式"></el-input>
  110. </el-form-item>
  111. <el-form-item label="类别" prop="resource">
  112. <el-select v-model="ruleForm.resource" placeholder="请选择类别">
  113. <el-option label="超级管理员" value="1" />
  114. <el-option label="管理员" value="2" />
  115. </el-select>
  116. </el-form-item>
  117. <el-form-item>
  118. <el-button type="primary" @click="submitForm(ruleFormRef)"> 确定 </el-button>
  119. <el-button @click="resetForm(ruleFormRef)">重置</el-button>
  120. </el-form-item>
  121. </el-form>
  122. </el-dialog>
  123. <!-- 导入用户按钮 -->
  124. <el-dialog
  125. v-model="importByExcelDialog"
  126. title="导入用户信息"
  127. width="45%"
  128. align-center
  129. custom-class="importExecl"
  130. >
  131. <el-steps :active="active" align-center finish-status="success">
  132. <el-step title="下载模板 1" :icon="Pointer" />
  133. <el-step title="执行上传 2" :icon="Upload" />
  134. <el-step title="导入完成 3" :icon="Select" />
  135. </el-steps>
  136. <div class="cont">
  137. <div class="download">
  138. <el-icon :size="30"><Pointer /></el-icon><span>请按照数据模板导入数据</span>
  139. </div>
  140. <el-button type="primary">
  141. <a href="/video/videoManage/userProfile.xlsx" style="color: #fff">下载模板</a>
  142. </el-button>
  143. <div class="upload">
  144. <div class="download">
  145. <el-icon :size="30"><Upload /></el-icon
  146. ><span>将文件上传(用户上传的excel文件需要符合规定的格式)</span>
  147. </div>
  148. <el-upload
  149. v-model:file-list="fileList"
  150. class="upload-demo"
  151. action="none"
  152. :limit="1"
  153. :multiple="false"
  154. :auto-upload="false"
  155. :on-change="changeUpload"
  156. :before-remove="beforeRemove"
  157. >
  158. <el-button type="primary">选择文件</el-button>
  159. <template #tip>
  160. <div class="el-upload__tip">仅允许上传一个文件</div>
  161. </template>
  162. </el-upload>
  163. </div>
  164. <div class="accomplish">
  165. <el-button
  166. type="primary"
  167. :disabled="active == 1"
  168. style="margin-top: 12px"
  169. @click="next"
  170. >完成导入</el-button
  171. >
  172. </div>
  173. </div>
  174. </el-dialog>
  175. </div>
  176. <div class="footer">
  177. <el-table
  178. :row-class-name="tableRowClassName"
  179. :data="tableData.list"
  180. style="width: 100%"
  181. @selection-change="handleSelectionChange"
  182. >
  183. <el-table-column align="center" type="selection" width="80" />
  184. <el-table-column align="center" prop="name" label="姓名" width="100" />
  185. <el-table-column align="center" width="100" prop="sex" label="性别" />
  186. <el-table-column align="center" prop="username" label="用户名(账号)" />
  187. <el-table-column align="center" prop="adminType" label="类别" />
  188. <el-table-column align="center" prop="phone" label="手机号码" />
  189. <el-table-column align="center" width="300" prop="createTime" label="创建时间" />
  190. <el-table-column align="center" label="操作">
  191. <template #default="scope">
  192. <el-button link type="primary" size="small" @click="handleUp(scope.row)"
  193. >编辑</el-button
  194. >
  195. <el-button link type="primary" size="small" @click="handleDel(scope.row)"
  196. >删除</el-button
  197. >
  198. </template>
  199. </el-table-column>
  200. </el-table>
  201. </div>
  202. <el-pagination
  203. v-model:page-size="pageSize"
  204. v-model:current-page="currentPage"
  205. layout="total, prev, pager, next, jumper"
  206. :total="total"
  207. @current-change="handleCurrentChange"
  208. />
  209. </div>
  210. </template>
  211. <script setup>
  212. import { ref, reactive, onBeforeMount } from "vue";
  213. import { useRouter } from "vue-router";
  214. import { Select, Pointer, Upload } from "@element-plus/icons-vue";
  215. import { JSEncrypt } from "jsencrypt"; // 加密密码
  216. import { ElMessage, ElMessageBox } from "element-plus";
  217. import { dayjs } from "element-plus";
  218. import axios from "axios";
  219. import lodash from "lodash";
  220. import adminApi from "@/api/admin.js";
  221. const router = useRouter();
  222. // 搜索框数据
  223. const searchData = reactive({
  224. input1: "",
  225. input2: "",
  226. input3: "",
  227. input4: "",
  228. input5: "",
  229. });
  230. // 表格数据
  231. const tableData = reactive({ list: [] });
  232. const dialongTitle = ref(""); // 弹窗标题
  233. const pageSize = ref(13);
  234. const currentPage = ref(1); // 当前页
  235. const total = ref(); // 当前总数
  236. const selectData = reactive({ list: [] }); // 多选框选择的数据
  237. const centerDialogVisible = ref(false); // 控制新增或修改弹窗开关
  238. const importByExcelDialog = ref(false); // 控制导入弹窗
  239. const active = ref(1); // 导入步骤计数
  240. const fileList = ref(); // 上传的文件
  241. // 表单数据
  242. const formSize = ref("default");
  243. const ruleFormRef = ref();
  244. const ruleForm = reactive({
  245. name: "",
  246. region: "",
  247. date1: "",
  248. date2: "",
  249. phone: "",
  250. resource: "",
  251. id: "",
  252. });
  253. // 表单验证
  254. const rules = reactive({
  255. region: [
  256. {
  257. required: true,
  258. message: "请选择性别",
  259. trigger: "blur",
  260. },
  261. ],
  262. name: [
  263. {
  264. required: true,
  265. message: "请输入姓名",
  266. trigger: "blur",
  267. },
  268. ],
  269. date1: [
  270. {
  271. required: true,
  272. message: "请输入账号",
  273. trigger: "blur",
  274. },
  275. ],
  276. date2: [
  277. {
  278. required: true,
  279. message: "请输入密码",
  280. trigger: "blur",
  281. },
  282. ],
  283. phone: [
  284. {
  285. required: true,
  286. message: "请输入电话号码",
  287. trigger: "blur",
  288. },
  289. {
  290. validator: function (rule, value, callback) {
  291. if (/^1[34578]\d{9}$/.test(value) == false) {
  292. callback(new Error("请输入正确的手机号"));
  293. } else {
  294. callback();
  295. }
  296. },
  297. trigger: "blur",
  298. },
  299. ],
  300. resource: [
  301. {
  302. required: true,
  303. message: "请选择类别",
  304. trigger: "blur",
  305. },
  306. ],
  307. });
  308. // 路由
  309. const handleSelect = (key, keyPath) => {
  310. router.push({
  311. path: `/vidicons/${key}`,
  312. });
  313. };
  314. // 获取管理员列表
  315. const getList = (curPage) => {
  316. adminApi
  317. .adminList({ pageSize: 13, curPage })
  318. .then((res) => {
  319. console.log(res);
  320. total.value = res.data.totalCount;
  321. res.data.list.forEach((item) => {
  322. if (item.sex == 0) {
  323. item.sex = "女";
  324. } else if (item.sex == 1) {
  325. item.sex = "男";
  326. }
  327. if (item.adminType == "1") {
  328. item.adminType = "超级管理员";
  329. } else if (item.adminType == "2") {
  330. item.adminType = "管理员";
  331. }
  332. });
  333. tableData.list = res.data.list;
  334. })
  335. .catch((err) => {
  336. console.log(err);
  337. });
  338. };
  339. // 搜索按钮
  340. const search = lodash.debounce(() => {
  341. let startTime = "";
  342. let endTime = "";
  343. if (searchData.input5 == []) {
  344. startTime = "";
  345. endTime = "";
  346. } else {
  347. startTime = searchData.input5[0];
  348. endTime = searchData.input5[1];
  349. }
  350. let data = {
  351. pageSize: 13,
  352. curPage: 1,
  353. name: searchData.input1,
  354. username: searchData.input2,
  355. phone: searchData.input3,
  356. adminType: searchData.input4,
  357. startTime,
  358. endTime,
  359. };
  360. adminApi
  361. .adminList(data)
  362. .then((res) => {
  363. console.log(res);
  364. total.value = res.data.totalCount;
  365. res.data.list.forEach((item) => {
  366. if (item.sex == 0) {
  367. item.sex = "女";
  368. } else {
  369. item.sex = "男";
  370. }
  371. if (item.adminType == "1") {
  372. item.adminType = "超级管理员";
  373. } else {
  374. item.adminType = "管理员";
  375. }
  376. });
  377. ElMessage({
  378. type: "success",
  379. showClose: true,
  380. message: "搜索成功",
  381. center: true,
  382. });
  383. currentPage.value = 1;
  384. tableData.list = res.data.list;
  385. })
  386. .catch((err) => {
  387. console.log(err);
  388. ElMessage({
  389. type: "error",
  390. showClose: true,
  391. message: "搜索失败",
  392. center: true,
  393. });
  394. });
  395. }, 300);
  396. // 重置搜索框
  397. const resetInput = lodash.debounce(() => {
  398. searchData.input1 = "";
  399. searchData.input2 = "";
  400. searchData.input3 = "";
  401. searchData.input4 = "";
  402. searchData.input5 = "";
  403. currentPage.value = 1;
  404. getList(1);
  405. }, 300);
  406. // 多选框功能
  407. const handleSelectionChange = (val) => {
  408. console.log(val);
  409. selectData.list = val;
  410. };
  411. // 删除多选IP
  412. const allDel = () => {
  413. console.log(selectData.list);
  414. ElMessageBox.confirm("此操作将永久删除所选用户,是否继续?", "提示", {
  415. confirmButtonText: "确认",
  416. cancelButtonText: "取消",
  417. type: "warning",
  418. })
  419. .then(async () => {
  420. let idIP = [];
  421. selectData.list.forEach((item) => {
  422. idIP.push(item.id);
  423. });
  424. console.log(idIP);
  425. let res = await adminApi.adminDel(idIP);
  426. if (res.success) {
  427. if (
  428. tableData.list.length - selectData.list.length == 0 &&
  429. currentPage.value != 1
  430. ) {
  431. currentPage.value = currentPage.value - 1;
  432. }
  433. ElMessage({
  434. type: "success",
  435. showClose: true,
  436. message: "删除成功",
  437. center: true,
  438. });
  439. getList(currentPage.value);
  440. } else {
  441. ElMessage({
  442. type: "warning",
  443. showClose: true,
  444. message: "删除失败",
  445. center: true,
  446. });
  447. }
  448. })
  449. .catch(() => {
  450. ElMessage({
  451. type: "info",
  452. message: "取消删除",
  453. });
  454. });
  455. };
  456. // 重置表单
  457. const resetForm = (formEl) => {
  458. formEl.resetFields();
  459. console.log("重置表单");
  460. ruleForm.phone = "";
  461. ruleForm.date1 = "";
  462. ruleForm.resource = "";
  463. // ruleForm.password=,
  464. ruleForm.region = "";
  465. ruleForm.name = "";
  466. ruleForm.date2 = "";
  467. // if (!formEl) return;
  468. // formEl.resetFields();
  469. };
  470. //新增按钮
  471. const addlist = () => {
  472. dialongTitle.value = "新增用户";
  473. ruleForm.phone = "";
  474. ruleForm.date1 = "";
  475. ruleForm.resource = "";
  476. // ruleForm.password=,
  477. ruleForm.region = "";
  478. ruleForm.name = "";
  479. ruleForm.date2 = "";
  480. centerDialogVisible.value = true;
  481. };
  482. //修改按钮
  483. const handleUp = (row) => {
  484. console.log(row);
  485. ruleForm.id = row.id;
  486. ruleForm.phone = row.phone;
  487. ruleForm.date1 = row.username;
  488. ruleForm.name = row.name;
  489. ruleForm.date2 = row.password;
  490. ruleForm.region = row.sex;
  491. ruleForm.resource = row.adminType;
  492. dialongTitle.value = "修改用户";
  493. centerDialogVisible.value = true;
  494. };
  495. // 关闭新增/修改页面
  496. const editClose = (done) => {
  497. ruleFormRef.value.resetFields();
  498. ruleForm.phone = "";
  499. ruleForm.date1 = "";
  500. ruleForm.resource = "";
  501. // ruleForm.password=,
  502. ruleForm.region = "";
  503. ruleForm.name = "";
  504. ruleForm.date2 = "";
  505. centerDialogVisible.value = false;
  506. done();
  507. };
  508. // 确定表单
  509. const submitForm = async (formEl) => {
  510. if (!formEl) return;
  511. await formEl.validate((valid, fields) => {
  512. if (valid) {
  513. console.log("submit!");
  514. if (dialongTitle.value == "新增用户") {
  515. let publicKey =
  516. "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMOcPB06u5yKyQsPjfVWiWgbEIrd14kiXNNihciaVKb6HnkQvq7zpQuZ80WEX94spnUMI3iOAl/GmIvHrpGwcbB4hJbznm+PajiwnUSPuCCXA68YJF640cJKb/8KeM7WVz69OFkIEPHhVxOy4FFF5QWe/kt6zOZ19HmE+ak+5x/QIDAQAB";
  517. let encryptor = new JSEncrypt(); // 新建JSEncrypt对象
  518. encryptor.setPublicKey(publicKey); // 设置公钥
  519. let rsaPassWord = encryptor.encrypt(ruleForm.date2); // 对密码进行加密
  520. let data = {
  521. phone: ruleForm.phone,
  522. username: ruleForm.date1,
  523. adminType: ruleForm.resource,
  524. password: rsaPassWord,
  525. sex: ruleForm.region,
  526. name: ruleForm.name,
  527. createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
  528. };
  529. if (data.sex == "女") {
  530. data.sex = 0;
  531. } else if (data.sex == "男") {
  532. data.sex = 1;
  533. }
  534. if (data.adminType == "超级管理员") {
  535. data.adminType = 1;
  536. } else if (data.adminType == "管理员") {
  537. data.adminType = 2;
  538. }
  539. adminApi
  540. .adminAdd(data)
  541. .then((res) => {
  542. console.log(tableData.list.length);
  543. if (res.success) {
  544. if (tableData.list.length == 13) {
  545. currentPage.value = currentPage.value + 1;
  546. }
  547. ElMessage({
  548. type: "success",
  549. showClose: true,
  550. message: res.message,
  551. center: true,
  552. });
  553. getList(currentPage.value);
  554. ruleFormRef.value.resetFields();
  555. centerDialogVisible.value = false;
  556. } else {
  557. ElMessage({
  558. type: "warning",
  559. showClose: true,
  560. message: res.message,
  561. center: true,
  562. });
  563. }
  564. })
  565. .catch((err) => {
  566. console.log(err);
  567. ElMessage({
  568. type: "error",
  569. showClose: true,
  570. message: "添加失败",
  571. center: true,
  572. });
  573. });
  574. } else {
  575. // let publicKey =
  576. // "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDMOcPB06u5yKyQsPjfVWiWgbEIrd14kiXNNihciaVKb6HnkQvq7zpQuZ80WEX94spnUMI3iOAl/GmIvHrpGwcbB4hJbznm+PajiwnUSPuCCXA68YJF640cJKb/8KeM7WVz69OFkIEPHhVxOy4FFF5QWe/kt6zOZ19HmE+ak+5x/QIDAQAB";
  577. // let encryptor = new JSEncrypt(); // 新建JSEncrypt对象
  578. // encryptor.setPublicKey(publicKey); // 设置公钥
  579. // let rsaPassWord = encryptor.encrypt(ruleForm.date2); // 对密码进行加密
  580. let data = {
  581. phone: ruleForm.phone,
  582. username: ruleForm.date1,
  583. adminType: ruleForm.resource,
  584. sex: ruleForm.region,
  585. name: ruleForm.name,
  586. id: ruleForm.id,
  587. createTime: dayjs().format("YYYY-MM-DD HH:mm:ss"),
  588. };
  589. if (data.sex == "女") {
  590. data.sex = 0;
  591. } else if (data.sex == "男") {
  592. data.sex = 1;
  593. }
  594. if (data.adminType == "超级管理员") {
  595. data.adminType = 1;
  596. } else if (data.adminType == "管理员") {
  597. data.adminType = 2;
  598. }
  599. adminApi
  600. .adminUpdate(data)
  601. .then((res) => {
  602. console.log(res);
  603. if (res.success) {
  604. ElMessage({
  605. type: "success",
  606. showClose: true,
  607. message: res.message,
  608. center: true,
  609. });
  610. getList(currentPage.value);
  611. ruleFormRef.value.resetFields();
  612. centerDialogVisible.value = false;
  613. } else {
  614. ElMessage({
  615. type: "warning",
  616. showClose: true,
  617. message: res.message,
  618. center: true,
  619. });
  620. }
  621. })
  622. .catch((err) => {
  623. console.log(err);
  624. ElMessage({
  625. type: "error",
  626. showClose: true,
  627. message: res.message,
  628. center: true,
  629. });
  630. });
  631. }
  632. } else {
  633. console.log("error submit!", fields);
  634. }
  635. });
  636. };
  637. // 删除按钮
  638. const handleDel = (row) => {
  639. console.log("click");
  640. ElMessageBox.confirm("此操作将永久删除所选中的IP,是否继续?", "提示", {
  641. confirmButtonText: "确认",
  642. cancelButtonText: "取消",
  643. type: "warning",
  644. })
  645. .then(() => {
  646. let idIP = [];
  647. selectData.list.forEach((item) => {
  648. idIP.push(item.id);
  649. });
  650. console.log(idIP);
  651. adminApi
  652. .adminDel([row.id])
  653. .then((res) => {
  654. console.log(tableData.list.length);
  655. if (tableData.list.length == 1 && currentPage.value != 1) {
  656. currentPage.value = currentPage.value - 1;
  657. }
  658. ElMessage({
  659. type: "success",
  660. showClose: true,
  661. message: "删除成功",
  662. center: true,
  663. });
  664. getList(currentPage.value);
  665. })
  666. .catch((err) => {
  667. console.log(err);
  668. ElMessage({
  669. type: "warning",
  670. showClose: true,
  671. message: "删除失败",
  672. center: true,
  673. });
  674. });
  675. })
  676. .catch(() => {
  677. ElMessage({
  678. type: "info",
  679. message: "取消删除",
  680. });
  681. });
  682. };
  683. // 导出按钮
  684. const downLoad = lodash.debounce(() => {
  685. let startTime = searchData.input5[0];
  686. let endTime = searchData.input5[1];
  687. let data = {
  688. name: searchData.input1,
  689. username: searchData.input2,
  690. phone: searchData.input3,
  691. adminType: searchData.input4,
  692. startTime,
  693. endTime,
  694. };
  695. adminApi
  696. .download(data)
  697. .then((res) => {
  698. let name = "用户管理列表";
  699. var content = res;
  700. // var data = new Blob([content], { type: "application/octet-stream;charset=utf-8" });
  701. var data = new Blob([content], { type: "application/vnd.ms-excel;charset=utf-8" });
  702. var downloadUrl = window.URL.createObjectURL(data);
  703. var anchor = document.createElement("a");
  704. anchor.href = downloadUrl;
  705. anchor.download = name + ".xlsx";
  706. anchor.click();
  707. window.URL.revokeObjectURL(data);
  708. console.log(res);
  709. ElMessage({
  710. type: "success",
  711. showClose: true,
  712. message: "导出成功",
  713. center: true,
  714. });
  715. })
  716. .catch((err) => {
  717. console.log(err);
  718. ElMessage({
  719. type: "error",
  720. showClose: true,
  721. message: "导出失败",
  722. center: true,
  723. });
  724. });
  725. }, 300);
  726. // 导入按钮
  727. const importExcel = () => {
  728. importByExcelDialog.value = true;
  729. };
  730. // 上传文件
  731. const changeUpload = (file, fileList) => {
  732. // fileList.value = [];
  733. if (file) {
  734. fileList.value = file;
  735. }
  736. active.value = 2;
  737. };
  738. // 移出文件前的回调
  739. const beforeRemove = (file) => {
  740. console.log(file);
  741. active.value = 1;
  742. };
  743. // 步骤条功能
  744. const next = async () => {
  745. console.log(fileList.value);
  746. let formData = new FormData();
  747. formData.append("file", fileList.value[0].raw);
  748. let res = await axios({
  749. method: "post",
  750. url: "/video/transcoding/videoAdmin/importByExcel",
  751. data: formData,
  752. headers: {
  753. admin_token: sessionStorage.getItem("admin_token"),
  754. },
  755. });
  756. // console.log(res);
  757. if (res.data.success) {
  758. setTimeout(() => {
  759. importByExcelDialog.value = false;
  760. fileList.value = "";
  761. active.value = 1;
  762. }, 1000);
  763. ElMessage({
  764. type: "success",
  765. showClose: true,
  766. message: "导入成功",
  767. center: true,
  768. });
  769. active.value = 3;
  770. currentPage.value = 1;
  771. getList(1);
  772. } else {
  773. ElMessage({
  774. type: "warning",
  775. showClose: true,
  776. message: res.data.message,
  777. center: true,
  778. });
  779. }
  780. };
  781. // 表格斑马纹颜色修改
  782. const tableRowClassName = ({ row, rowIndex }) => {
  783. if (rowIndex % 2 === 0) {
  784. return "even";
  785. } else if (rowIndex % 2 !== 0) {
  786. return "odd";
  787. }
  788. return "";
  789. };
  790. // 分页
  791. const handleCurrentChange = (value) => {
  792. currentPage.value = value;
  793. getList(value);
  794. };
  795. onBeforeMount(() => {
  796. getList(1);
  797. });
  798. </script>
  799. <style scoped lang="scss">
  800. .content-box {
  801. width: 97.5%;
  802. height: 90%;
  803. margin: 20px auto;
  804. background-color: #fff;
  805. color: #fff;
  806. display: flex;
  807. flex-direction: column;
  808. .left {
  809. width: calc(100wh - 40px);
  810. display: flex;
  811. align-items: center;
  812. height: 60px;
  813. margin: 0 30px;
  814. border-bottom: 1px solid #ccc;
  815. color: #000;
  816. font-size: 18px;
  817. font-weight: 600;
  818. .camera {
  819. margin-right: 15px;
  820. color: #4392f7;
  821. }
  822. }
  823. .middle {
  824. width: 96%;
  825. margin: 0 auto;
  826. color: #000;
  827. border-bottom: 1px solid rgb(231, 231, 231);
  828. .filter {
  829. display: flex;
  830. flex-wrap: wrap;
  831. align-items: center;
  832. .condition {
  833. display: flex;
  834. align-items: center;
  835. margin: 10px 30px 10px 0;
  836. span {
  837. margin: 0 10px 0 0;
  838. }
  839. }
  840. }
  841. .gongneng {
  842. margin: 10px 0;
  843. }
  844. :deep(.cont) {
  845. width: 60%;
  846. margin: 20px auto;
  847. }
  848. :deep(.download) {
  849. display: flex;
  850. align-items: center;
  851. margin: 10px;
  852. }
  853. :deep(.download span) {
  854. font-size: 16px;
  855. margin-left: 20px;
  856. }
  857. :deep(.cont .el-button) {
  858. margin-left: 60px;
  859. margin-bottom: 30px;
  860. }
  861. :deep(.cont .accomplish) {
  862. width: 100%;
  863. display: flex;
  864. justify-content: center;
  865. }
  866. :deep(.cont .accomplish .el-button) {
  867. width: 50%;
  868. margin: 0;
  869. }
  870. }
  871. .footer {
  872. width: 96%;
  873. height: 562px;
  874. margin: 20px auto 30px;
  875. .el-table--fit {
  876. height: 100%;
  877. :deep(.el-table__row) {
  878. height: 40px;
  879. }
  880. :deep(.el-table__row td) {
  881. padding: 0;
  882. }
  883. // 输出链接弹窗样式
  884. :deep(.link .el-dialog__header) {
  885. text-align: left;
  886. font-size: 20px;
  887. font-weight: 600;
  888. }
  889. :deep(.link .el-dialog__body) {
  890. padding: 10px 20px;
  891. height: 100px;
  892. margin-bottom: 10px;
  893. }
  894. .link {
  895. .linkcontent {
  896. text-align: left;
  897. height: 100px;
  898. border: 1px solid #ccc;
  899. p {
  900. margin: 5px 10px;
  901. }
  902. }
  903. }
  904. :deep(.playVideo .el-dialog__header) {
  905. text-align: left;
  906. font-size: 20px;
  907. font-weight: 600;
  908. background-color: #ccc;
  909. margin-right: 0;
  910. }
  911. :deep(.playVideo .el-dialog__body) {
  912. height: 600px;
  913. }
  914. .el-button--primary {
  915. margin-left: 5px;
  916. }
  917. :deep(.el-table__body .even) {
  918. background-color: #fff;
  919. }
  920. :deep(.el-table__body .odd) {
  921. background-color: #f5f8fc;
  922. }
  923. }
  924. }
  925. .el-pagination {
  926. // width: 1600px;
  927. width: 96%;
  928. margin: 0 auto 18px;
  929. justify-content: flex-end;
  930. :deep(.el-pagination__total) {
  931. color: #000;
  932. }
  933. :deep(.el-pagination__goto) {
  934. color: #000;
  935. }
  936. :deep(.el-pagination__classifier) {
  937. color: #000;
  938. }
  939. :deep(.el-pager li) {
  940. margin: 0 3px;
  941. }
  942. :deep(.btn-prev) {
  943. margin-right: 3px;
  944. }
  945. :deep(.btn-next) {
  946. margin-left: 3px;
  947. }
  948. }
  949. }
  950. .el-input {
  951. width: 192px;
  952. }
  953. </style>