School.vue 15 KB

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