school.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560
  1. <template>
  2. <section class="content">
  3. <div
  4. v-loading.fullscreen="loading"
  5. class="box-body"
  6. element-loading-text="请稍后..."
  7. >
  8. <!-- 表单 -->
  9. <el-form :inline="true" :model="formSearch">
  10. <el-form-item label="学校名称">
  11. <el-input v-model="formSearch.name" placeholder="请输入学校名称" />
  12. </el-form-item>
  13. <el-form-item label="学校代码">
  14. <el-input v-model="formSearch.code" placeholder="请输入学校代码" />
  15. </el-form-item>
  16. <el-form-item label="学校域名">
  17. <el-input
  18. v-model="formSearch.domainName"
  19. placeholder="请输入学校域名"
  20. />
  21. </el-form-item>
  22. <el-form-item>
  23. <el-button
  24. size="small"
  25. type="primary"
  26. icon="el-icon-search"
  27. @click="handleSearchBtn"
  28. >查询</el-button
  29. >
  30. <el-button
  31. size="small"
  32. icon="el-icon-refresh"
  33. @click="resetSearchForm"
  34. >重置</el-button
  35. >
  36. <el-button
  37. size="small"
  38. type="primary"
  39. icon="el-icon-plus"
  40. @click="insert"
  41. >新增</el-button
  42. >
  43. </el-form-item>
  44. </el-form>
  45. <div class="block-seperator"></div>
  46. <span>操作:</span>
  47. <el-button
  48. size="small"
  49. type="success"
  50. :disabled="noBatchSelected"
  51. icon="el-icon-check"
  52. @click="enableOrg"
  53. >启用</el-button
  54. >
  55. <el-button
  56. size="small"
  57. type="danger"
  58. :disabled="noBatchSelected"
  59. icon="el-icon-close"
  60. @click="disableOrg"
  61. >禁用</el-button
  62. >
  63. <div style="width: 100%; margin-bottom: 10px"></div>
  64. <!-- 添加或修改学校弹出框 -->
  65. <el-dialog
  66. title="学校信息"
  67. width="500px"
  68. :visible.sync="schoolDialog"
  69. @close="dialogBeforeClose"
  70. >
  71. <el-form
  72. ref="schoolForm"
  73. :inline="true"
  74. inline-message
  75. :model="schoolForm"
  76. :rules="rules"
  77. label-position="right"
  78. label-width="90px"
  79. class="editSchoolForm"
  80. >
  81. <el-row>
  82. <el-form-item label="学校代码" label-width="120px" prop="code">
  83. <el-input
  84. v-model="schoolForm.code"
  85. class="pull_length"
  86. auto-complete="off"
  87. placeholder="学校域名"
  88. :disabled="null != schoolForm.id"
  89. />
  90. </el-form-item>
  91. </el-row>
  92. <el-row>
  93. <el-form-item label="学校名称" label-width="120px" prop="name">
  94. <el-input
  95. v-model="schoolForm.name"
  96. class="pull_length"
  97. auto-complete="off"
  98. placeholder="学校名称"
  99. />
  100. </el-form-item>
  101. </el-row>
  102. <el-row>
  103. <el-form-item
  104. label="学校域名"
  105. label-width="120px"
  106. prop="domainName"
  107. >
  108. <el-input
  109. v-model="schoolForm.domainName"
  110. class="pull_length"
  111. auto-complete="off"
  112. placeholder="学校域名"
  113. />
  114. </el-form-item>
  115. </el-row>
  116. <el-row>
  117. <el-form-item label="负责人" label-width="120px" prop="contacts">
  118. <el-input
  119. v-model="schoolForm.contacts"
  120. class="pull_length"
  121. auto-complete="off"
  122. placeholder="负责人"
  123. />
  124. </el-form-item>
  125. </el-row>
  126. <el-row>
  127. <el-form-item label="联系方式" label-width="120px" prop="telephone">
  128. <el-input
  129. v-model="schoolForm.telephone"
  130. class="pull_length"
  131. auto-complete="off"
  132. placeholder="联系方式"
  133. />
  134. </el-form-item>
  135. </el-row>
  136. <el-row>
  137. <el-form-item label="状态" label-width="120px" prop="enable">
  138. <el-radio-group v-model="schoolForm.enable" class="pull_right_sm">
  139. <el-radio label="true">启用</el-radio>
  140. <el-radio label="false">禁用</el-radio>
  141. </el-radio-group>
  142. </el-form-item>
  143. </el-row>
  144. <el-row class="d-flex justify-content-center">
  145. <el-button type="primary" @click="submitForm">保 存</el-button>
  146. <el-button @click="schoolDialog = false">取 消</el-button>
  147. </el-row>
  148. </el-form>
  149. </el-dialog>
  150. <!-- 页面列表 -->
  151. <el-table
  152. :data="tableData"
  153. border
  154. resizable
  155. stripe
  156. @selection-change="selectChange"
  157. >
  158. <el-table-column type="selection" width="40" />
  159. <el-table-column prop="id" label="ID" width="60" />
  160. <el-table-column label="学校名称">
  161. <template slot-scope="scope">
  162. <el-popover trigger="hover" placement="right">
  163. <div style="font-size: 18px; font-family: 新宋体">
  164. <tr>
  165. <td style="color: green">学校名称</td>
  166. <td style="color: purple; padding-left: 20px">
  167. {{ scope.row.name }}
  168. </td>
  169. </tr>
  170. <tr>
  171. <td style="color: green">学校代码</td>
  172. <td style="color: purple; padding-left: 20px">
  173. {{ scope.row.code }}
  174. </td>
  175. </tr>
  176. <tr>
  177. <td style="color: green">负责人</td>
  178. <td style="color: purple; padding-left: 20px">
  179. {{ scope.row.contacts }}
  180. </td>
  181. </tr>
  182. <tr>
  183. <td style="color: green">联系方式</td>
  184. <td style="color: purple; padding-left: 20px">
  185. {{ scope.row.telephone }}
  186. </td>
  187. </tr>
  188. </div>
  189. <div slot="reference" class="name-wrapper">
  190. <span>{{ scope.row.name }}</span>
  191. </div>
  192. </el-popover>
  193. </template>
  194. </el-table-column>
  195. <el-table-column prop="code" width="190" label="学校代码" />
  196. <el-table-column prop="domainName" width="190" label="学校域名" />
  197. <el-table-column
  198. sortable
  199. prop="updateTime"
  200. width="170"
  201. label="更新时间"
  202. />
  203. <el-table-column width="50" label="状态">
  204. <span slot-scope="scope">
  205. <span v-if="scope.row.enable">
  206. <el-tooltip
  207. class="item"
  208. effect="dark"
  209. content="启用"
  210. placement="left"
  211. >
  212. <i class="el-icon-success" style="color: green"></i>
  213. </el-tooltip>
  214. </span>
  215. <span v-else>
  216. <el-tooltip
  217. class="item"
  218. effect="dark"
  219. content="禁用"
  220. placement="left"
  221. >
  222. <i class="el-icon-error" style="color: red"></i>
  223. </el-tooltip>
  224. </span>
  225. </span>
  226. </el-table-column>
  227. <el-table-column :context="_self" width="210" prop label="操作">
  228. <div slot-scope="scope">
  229. <el-button
  230. size="mini"
  231. type="primary"
  232. plain
  233. @click="edit(scope.row)"
  234. >
  235. <i class="el-icon-edit"></i> 编辑
  236. </el-button>
  237. &nbsp;
  238. <el-popover
  239. placement="left"
  240. width="200"
  241. trigger="hover"
  242. :v-model="false"
  243. >
  244. <div style="margin: 0">
  245. <qrcode
  246. :value="qrcodeContent(scope.row)"
  247. :options="{ width: 180 }"
  248. ></qrcode>
  249. </div>
  250. <el-button slot="reference" size="mini" type="primary" plain
  251. ><i class="el-icon-view"></i> 二维码</el-button
  252. >
  253. </el-popover>
  254. </div>
  255. </el-table-column>
  256. </el-table>
  257. <div class="page pull-right">
  258. <el-pagination
  259. :current-page="currentPage"
  260. :page-size="pageSize"
  261. :page-sizes="[10, 20, 50, 100, 200, 300]"
  262. layout="total, sizes, prev, pager, next, jumper"
  263. :total="total"
  264. @current-change="handleCurrentChange"
  265. @size-change="handleSizeChange"
  266. />
  267. </div>
  268. </div>
  269. </section>
  270. </template>
  271. <script>
  272. import { CORE_API } from "@/constants/constants.js";
  273. import VueQrcode from "@chenfengyuan/vue-qrcode";
  274. import { mapState } from "vuex";
  275. export default {
  276. name: "School",
  277. components: {
  278. qrcode: VueQrcode,
  279. },
  280. data() {
  281. return {
  282. formSearch: {
  283. code: "",
  284. name: "",
  285. domainName: "",
  286. },
  287. schoolForm: {
  288. id: null,
  289. name: "",
  290. code: "",
  291. domainName: "",
  292. contacts: "",
  293. telephone: "",
  294. enable: "true",
  295. remark: "",
  296. },
  297. schoolDialog: false,
  298. logoDialog: false,
  299. curSchool: {
  300. name: null,
  301. code: null,
  302. },
  303. uploadAction: "",
  304. uploadHeaders: {},
  305. uploadData: {},
  306. fileList: [],
  307. selectedOrgIds: [],
  308. loading: true,
  309. tableData: [],
  310. currentPage: 1,
  311. pageSize: 10,
  312. total: 10,
  313. imp: "",
  314. rules: {
  315. code: [{ required: true, message: "请输入学校代码", trigger: "blur" }],
  316. domainName: [
  317. { required: true, message: "请输入学校域名", trigger: "blur" },
  318. ],
  319. name: [{ required: true, message: "请输入学校名称", trigger: "blur" }],
  320. contacts: [
  321. { required: true, message: "请输入负责人", trigger: "blur" },
  322. ],
  323. telephone: [
  324. { required: true, message: "请输入联系方式", trigger: "blur" },
  325. ],
  326. enable: [{ required: true, message: "请选择状态", trigger: "change" }],
  327. },
  328. };
  329. },
  330. computed: {
  331. ...mapState({ user: (state) => state.user }),
  332. noBatchSelected() {
  333. return this.selectedOrgIds.length === 0;
  334. },
  335. orgIds() {
  336. var orgIds = "";
  337. for (let orgId of this.selectedOrgIds) {
  338. if (!orgIds) {
  339. orgIds += orgId;
  340. } else {
  341. orgIds += "," + orgId;
  342. }
  343. }
  344. return orgIds;
  345. },
  346. },
  347. //初始化查询
  348. created() {
  349. this.searchForm();
  350. this.uploadHeaders = {
  351. key: this.user.key,
  352. token: this.user.token,
  353. };
  354. },
  355. methods: {
  356. resetSearchForm() {
  357. this.formSearch.code = "";
  358. this.formSearch.name = "";
  359. this.formSearch.domainName = "";
  360. },
  361. dialogBeforeClose() {
  362. this.$refs.schoolForm.clearValidate();
  363. },
  364. handleSizeChange(val) {
  365. this.pageSize = val;
  366. this.currentPage = 1;
  367. this.searchForm();
  368. },
  369. getTag(status) {
  370. if (status == true) {
  371. return "success";
  372. } else if (status == false) {
  373. return "danger";
  374. }
  375. return status;
  376. },
  377. handleCurrentChange(val) {
  378. this.currentPage = val;
  379. this.searchForm();
  380. },
  381. handleSearchBtn() {
  382. this.currentPage = 1;
  383. this.searchForm();
  384. },
  385. //查询
  386. searchForm() {
  387. let searchLock = true;
  388. setTimeout(() => {
  389. if (searchLock) {
  390. this.loading = true;
  391. }
  392. }, 500);
  393. var param = new URLSearchParams(this.formSearch);
  394. var url =
  395. CORE_API +
  396. "/org/rootOrgPage/" +
  397. (this.currentPage - 1) +
  398. "/" +
  399. this.pageSize +
  400. "?" +
  401. param;
  402. this.$httpWithMsg
  403. .get(url)
  404. .then((response) => {
  405. this.tableData = response.data.list;
  406. this.total = response.data.total;
  407. this.loading = false;
  408. })
  409. .finally(() => {
  410. searchLock = false;
  411. this.loading = false;
  412. });
  413. },
  414. //启用
  415. enableOrg() {
  416. if (this.selectedOrgIds.length === 0) {
  417. this.$notify({
  418. type: "warning",
  419. message: "请选择要启用的机构",
  420. });
  421. } else {
  422. this.$confirm("是否启用这些机构?", "提示", {
  423. confirmButtonText: "确定",
  424. cancelButtonText: "取消",
  425. type: "warning",
  426. }).then(() => {
  427. var url = CORE_API + "/org/enable/" + this.orgIds;
  428. this.$httpWithMsg.put(url).then(() => {
  429. this.$notify({
  430. type: "success",
  431. message: "启用成功!",
  432. });
  433. this.searchForm();
  434. });
  435. });
  436. }
  437. },
  438. disableOrg() {
  439. if (this.selectedOrgIds.length === 0) {
  440. this.$notify({
  441. type: "warning",
  442. message: "请选择要禁用的机构",
  443. });
  444. } else {
  445. this.$confirm("是否禁用这些机构?", "提示", {
  446. confirmButtonText: "确定",
  447. cancelButtonText: "取消",
  448. type: "warning",
  449. }).then(() => {
  450. var url = CORE_API + "/org/disable/" + this.orgIds;
  451. this.$httpWithMsg.put(url, {}).then(() => {
  452. this.$notify({
  453. type: "success",
  454. message: "禁用成功!",
  455. });
  456. this.searchForm();
  457. });
  458. });
  459. }
  460. },
  461. selectChange(row) {
  462. this.selectedOrgIds = [];
  463. row.forEach((element) => {
  464. this.selectedOrgIds.push(element.id);
  465. });
  466. console.log(this.selectedOrgIds);
  467. },
  468. //重置
  469. resetForm() {
  470. this.$refs.schoolForm.resetFields();
  471. },
  472. //提交
  473. submitForm() {
  474. this.$refs.schoolForm.validate((valid) => {
  475. if (valid) {
  476. if (null != this.schoolForm.id) {
  477. //修改
  478. url = CORE_API + "/org/updateRootOrg";
  479. this.$httpWithMsg.put(url, this.schoolForm).then(() => {
  480. this.$notify({
  481. type: "success",
  482. message: "修改成功!",
  483. });
  484. this.searchForm();
  485. this.schoolDialog = false;
  486. });
  487. } else {
  488. //新增
  489. var url = CORE_API + "/org/addRootOrg";
  490. this.$httpWithMsg.post(url, this.schoolForm).then(() => {
  491. this.$notify({
  492. type: "success",
  493. message: "新增成功!",
  494. });
  495. this.searchForm();
  496. this.schoolDialog = false;
  497. });
  498. }
  499. } else {
  500. console.log("error submit!");
  501. return false;
  502. }
  503. });
  504. },
  505. //新增
  506. insert() {
  507. this.schoolForm.id = null;
  508. this.schoolForm.name = "";
  509. this.schoolForm.code = "";
  510. this.schoolForm.domainName = "";
  511. this.schoolForm.telephone = "";
  512. this.schoolForm.contacts = "";
  513. this.schoolForm.enable = "true";
  514. this.schoolDialog = true;
  515. },
  516. //修改
  517. edit(row) {
  518. this.schoolForm.id = row.id;
  519. this.schoolForm.name = row.name;
  520. this.schoolForm.code = row.code;
  521. this.schoolForm.domainName = row.domainName;
  522. this.schoolForm.telephone = row.telephone;
  523. this.schoolForm.contacts = row.contacts;
  524. this.schoolForm.enable = row.enable ? "true" : "false";
  525. this.schoolDialog = true;
  526. },
  527. qrcodeContent(row) {
  528. let str = row.id + "@" + row.name;
  529. let base64Str = Buffer.from(str).toString("base64");
  530. // console.log(base64Str);
  531. return base64Str;
  532. },
  533. },
  534. };
  535. </script>
  536. <style scoped>
  537. .page {
  538. margin-top: 10px;
  539. }
  540. .el-upload {
  541. width: 80px;
  542. }
  543. .editSchoolForm .pull_length {
  544. width: 200px;
  545. }
  546. </style>