UserManger.vue 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717
  1. <template>
  2. <div>
  3. <div class="search-box">
  4. <div class="filter-box">
  5. <el-input
  6. size="small"
  7. placeholder="请输入用户名"
  8. @change="checkList()"
  9. clearable
  10. v-model="username"
  11. >
  12. <i slot="suffix" class="el-input__icon el-icon-search"></i>
  13. </el-input>
  14. </div>
  15. <el-button
  16. v-if="have_type == 0 || staff == 1 || have_type == 2"
  17. type="success"
  18. @click="addUserFun"
  19. size="mini"
  20. >添加新用户</el-button
  21. >
  22. </div>
  23. <el-row :gutter="10">
  24. <el-col
  25. :xs="24"
  26. :sm="24"
  27. :md="12"
  28. :lg="6"
  29. :xl="6"
  30. v-for="item in userList"
  31. :key="item.uid"
  32. >
  33. <el-card class="box-card pad0">
  34. <div class="img-box">
  35. <img src="@/assets/images/systemManger/user.png" />
  36. <p :title="item.username">{{ item.username | ellipsis }}</p>
  37. </div>
  38. <div class="detail">
  39. <p>
  40. 模块类型
  41. <span v-if="item.user_type == '1'">农业植保监测系统</span>
  42. <span v-if="item.user_type == '2'">农业气象监测系统</span>
  43. <span v-if="item.user_type == '3'">环境灾害预警系统</span>
  44. <span v-if="item.user_type == '4'">农产品溯源系统</span>
  45. <span v-if="item.user_type == '5'">可视农业应用系统</span>
  46. <span v-if="item.user_type == '6'">苗情监测应用系统</span>
  47. </p>
  48. <p>
  49. 用户类型
  50. <span v-if="item.user_have_type == '1'">普通用户</span>
  51. <span v-if="item.user_have_type == '0'">模块管理员</span>
  52. <span v-if="item.user_have_type == '2'">项目管理员</span>
  53. </p>
  54. <p>
  55. 适配用户
  56. <span>{{ item.user_have || "无" }}</span>
  57. </p>
  58. <p :title="item.site_name">
  59. 站点名称
  60. <span>{{ (item.site_name || "无") | ellipsis }}</span>
  61. </p>
  62. <p>
  63. 站点地址
  64. <span
  65. >{{ item.site_pro }} {{ item.site_city }}
  66. {{ item.site_area }}</span
  67. >
  68. </p>
  69. <p :title="item.user_header">
  70. 系统标题
  71. <span>{{ (item.user_header || "--") | ellipsis }}</span>
  72. </p>
  73. <p>
  74. logo
  75. <span
  76. ><img style="width: 46px; height: 32px" :src="item.logo" alt=""
  77. /></span>
  78. </p>
  79. </div>
  80. <div class="btn">
  81. <el-button size="small" type="success" @click="edit(item)" plain
  82. >用户编辑</el-button
  83. >
  84. <template
  85. v-if="
  86. (have_type == 0 || staff == 1 || have_type == 2) &&
  87. currusername != item.username
  88. "
  89. >
  90. <el-button
  91. size="small"
  92. v-if="item.user_have_type == '1' || item.user_have_type == '2'"
  93. type="success"
  94. @click="allotEquip(item.id, item.username)"
  95. plain
  96. >分配设备</el-button
  97. >
  98. <el-button
  99. size="small"
  100. v-if="item.user_have_type == '1' || item.user_have_type == '2'"
  101. type="success"
  102. @click="delUser(item.id, item.username)"
  103. plain
  104. >删除用户</el-button
  105. >
  106. </template>
  107. <el-button
  108. size="small"
  109. type="success"
  110. @click="resetPassword(item.id, item.username)"
  111. plain
  112. >重置密码</el-button
  113. >
  114. </div>
  115. </el-card>
  116. </el-col>
  117. </el-row>
  118. <!-- 暂无数据 -->
  119. <div class="expertDiagnosis_referral_units_not" v-if="userList.length <= 0">
  120. <img
  121. src="@/assets/images/monitor/zanwu.png"
  122. alt
  123. class="expertDiagnosis_referral_units_notImg"
  124. />
  125. </div>
  126. <el-pagination
  127. v-if="userList.length > 0"
  128. background
  129. :page-size="8"
  130. layout="prev, pager, next"
  131. :current-page="page"
  132. :total="totalNum"
  133. @current-change="changePage"
  134. ></el-pagination>
  135. <!-- 重置密码 -->
  136. <el-dialog
  137. title="重置密码"
  138. :visible.sync="resetPassDialogVisible"
  139. width="30%"
  140. @close="resetPassDialogClosed"
  141. >
  142. <el-form
  143. ref="resetPassFormRef"
  144. :model="resetPassForm"
  145. label-width="110px"
  146. :rules="resetPassFormRules"
  147. >
  148. <el-form-item label="用户名 : " prop="username">
  149. <el-input
  150. type="text"
  151. disabled
  152. v-model="resetPassForm.username"
  153. ></el-input>
  154. </el-form-item>
  155. <el-form-item label="新密码 : " prop="pass">
  156. <el-input type="password" v-model="resetPassForm.pass"></el-input>
  157. </el-form-item>
  158. <el-form-item label="确认新密码 : " prop="checkPass">
  159. <el-input
  160. type="password"
  161. v-model="resetPassForm.checkPass"
  162. ></el-input>
  163. </el-form-item>
  164. </el-form>
  165. <span slot="footer" class="dialog-footer">
  166. <el-button @click="resetPassDialogVisible = false">取 消</el-button>
  167. <el-button type="primary" @click="resetPassSubm">确认</el-button>
  168. </span>
  169. </el-dialog>
  170. <!-- 用户编辑 -->
  171. <el-dialog
  172. title="用户信息编辑"
  173. :visible.sync="editUserDialogVisible"
  174. width="500px"
  175. @close="editUserDialogClosed"
  176. >
  177. <el-form ref="editUserFormRef" :model="editUserForm" label-width="80px">
  178. <el-form-item label="用户名 : ">
  179. <el-input v-model="editUserForm.username" disabled></el-input>
  180. </el-form-item>
  181. <el-form-item label="系统标题 : ">
  182. <el-input
  183. maxlength="11"
  184. v-model="editUserForm.user_header"
  185. ></el-input>
  186. </el-form-item>
  187. <el-form-item label="logo : ">
  188. <el-upload
  189. class="avatar-uploader"
  190. action
  191. :auto-upload="false"
  192. :show-file-list="false"
  193. :on-change="changeUpload"
  194. :before-upload="beforeAvatarUpload"
  195. >
  196. <img
  197. v-if="editUserForm.logo"
  198. :src="editUserForm.logo"
  199. class="avatar"
  200. />
  201. <i v-else class="el-icon-plus avatar-uploader-icon"></i>
  202. </el-upload>
  203. </el-form-item>
  204. <el-form-item label="站点名称 : ">
  205. <!-- <el-input maxlength="16" v-model="editUserForm.site"></el-input> -->
  206. <el-select
  207. v-model="editUserForm.site_name"
  208. clearable
  209. placeholder="请选择"
  210. >
  211. <el-option
  212. v-for="item in siteNameList"
  213. :key="item.value"
  214. :label="item.label"
  215. :value="item.value"
  216. >
  217. </el-option>
  218. </el-select>
  219. </el-form-item>
  220. <el-form-item label="站点位置 : ">
  221. <div class="block">
  222. <el-cascader
  223. placeholder="搜索:河南"
  224. v-model="cityValue"
  225. :options="cityData"
  226. :props="props"
  227. @change="handleChange"
  228. filterable
  229. :disabled="true"
  230. >
  231. </el-cascader>
  232. </div>
  233. </el-form-item>
  234. </el-form>
  235. <span slot="footer" class="dialog-footer">
  236. <el-button @click="editUserDialogVisible = false">取 消</el-button>
  237. <el-button type="primary" @click="editUserSubm">确认</el-button>
  238. </span>
  239. </el-dialog>
  240. </div>
  241. </template>
  242. <script>
  243. import cityData from "./citydata.js";
  244. export default {
  245. filters: {
  246. ellipsis(value) {
  247. if (!value) return "";
  248. if (value.length > 10) {
  249. return value.slice(0, 10) + "...";
  250. }
  251. return value;
  252. },
  253. },
  254. data() {
  255. var checkMobile = (rule, value, callback) => {
  256. const regMobile = /^1\d{10}$/;
  257. if (regMobile.test(value)) {
  258. callback();
  259. } else {
  260. // 返回一个错误提示
  261. callback(new Error("请输入合法的手机号码"));
  262. }
  263. };
  264. var validatePass = (rule, value, callback) => {
  265. if (value === "") {
  266. callback(new Error("请输入新密码"));
  267. } else {
  268. if (this.resetPassForm.checkPass !== "") {
  269. this.$refs.resetPassFormRef.validateField("checkPass");
  270. }
  271. callback();
  272. }
  273. };
  274. var validatePass2 = (rule, value, callback) => {
  275. if (value === "") {
  276. callback(new Error("请再次输入密码"));
  277. } else if (value !== this.resetPassForm.pass) {
  278. callback(new Error("两次输入密码不一致!"));
  279. } else {
  280. callback();
  281. }
  282. };
  283. return {
  284. zanwu: "/images/expertDiagnosis/zanwu.png",
  285. role: "", //筛选项 角色类型
  286. userTypeCheck: "", //筛选项 用户类型
  287. username: "", //筛选项
  288. roleList: [],
  289. page: 1,
  290. userList: [],
  291. userGroupList: [],
  292. totalNum: 0,
  293. //省市县
  294. areaList: [],
  295. resetPassDialogVisible: false,
  296. addUserDialogVisible: false,
  297. editUserDialogVisible: false,
  298. resetPassForm: {
  299. username: "",
  300. uid: "",
  301. pass: "",
  302. checkPass: "",
  303. },
  304. addUserForm: {
  305. username: "",
  306. mobile: "",
  307. pass: "",
  308. role_id: "",
  309. user_type: "",
  310. pcd: "",
  311. user_area: "",
  312. cs_user: false, //1为普通用户
  313. user_group_id: "", //用户组id
  314. },
  315. cityData,
  316. cityValue: [],
  317. props: {
  318. expandTrigger: "hover",
  319. value: "value",
  320. },
  321. editUserForm: {},
  322. //控制省/市/区显示
  323. editIsShow: false,
  324. //添加用户规则
  325. addUserFormRules: {
  326. username: [
  327. { required: true, message: "请填写用户名", trigger: "blur" },
  328. ],
  329. mobile: [
  330. { required: true, trigger: "blur", message: "手机号不能为空" },
  331. { validator: checkMobile, trigger: "blur" },
  332. ],
  333. pass: [{ required: true, message: "请填写用户密码", trigger: "blur" }],
  334. },
  335. //重置密码格规则
  336. resetPassFormRules: {
  337. pass: [
  338. { validator: validatePass, trigger: "blur" },
  339. { required: true, message: "请填写新密码", trigger: "blur" },
  340. ],
  341. checkPass: [
  342. { validator: validatePass2, trigger: "blur" },
  343. { required: true, message: "请确认新密码", trigger: "blur" },
  344. ],
  345. },
  346. have_type: "",
  347. staff: "",
  348. currusername: "",
  349. siteNameList: [], // 站点列表
  350. };
  351. },
  352. computed: {
  353. //获取用户类型
  354. userType: function () {
  355. return window.sessionStorage.getItem("myuser_type");
  356. },
  357. },
  358. created() {},
  359. mounted() {
  360. this.getList();
  361. this.have_type = localStorage.getItem("have_type"); // 0管理员 1用户
  362. this.staff = localStorage.getItem("staff"); // 1是admin
  363. this.currusername = localStorage.getItem("username"); // 1是admin
  364. this.facilityList();
  365. },
  366. methods: {
  367. getList() {
  368. this.$axios({
  369. method: "POST",
  370. url: "user_list",
  371. data: this.qs.stringify({
  372. typelist: 6,
  373. page: this.page,
  374. uname: this.username,
  375. page_size: 8,
  376. }),
  377. }).then((res) => {
  378. this.userList = res.data.userlist;
  379. this.totalNum = res.data.nums;
  380. });
  381. },
  382. // 编辑用户信息
  383. edit(role) {
  384. this.editUserForm = JSON.parse(JSON.stringify(role));
  385. this.editUserDialogVisible = true;
  386. if (this.editUserForm.site_pro == "") {
  387. this.cityValue = [
  388. this.editUserForm.site_city,
  389. this.editUserForm.site_area,
  390. ];
  391. } else {
  392. this.cityValue = [
  393. this.editUserForm.site_pro,
  394. this.editUserForm.site_city,
  395. this.editUserForm.site_area,
  396. ];
  397. }
  398. },
  399. beforeAvatarUpload(file) {
  400. console.log(file);
  401. const isJPG = file.type === "image/jpeg" || file.type === "image/png";
  402. const isLt2M = file.size / 1024 / 1024 < 2;
  403. if (!isJPG) {
  404. this.$message.error("上传头像图片只能是 JPG 和 PNG格式!");
  405. }
  406. if (!isLt2M) {
  407. this.$message.error("上传头像图片大小不能超过 2MB!");
  408. }
  409. return isJPG && isLt2M;
  410. },
  411. changeUpload(file, fileList) {
  412. var form = new FormData();
  413. form.append("img_file", file.raw);
  414. this.$axios({
  415. method: "POST",
  416. url: "base_photo",
  417. data: form,
  418. }).then((res) => {
  419. this.editUserForm.logo = res.data.src;
  420. });
  421. },
  422. handleChange(value) {
  423. console.log(value);
  424. console.log(this.cityValue);
  425. this.editUserForm.user_pro = value[0];
  426. this.editUserForm.user_city = value[1];
  427. if (value[2]) {
  428. this.editUserForm.user_area = value[2];
  429. } else {
  430. this.editUserForm.user_city = value[0].substring(
  431. 0,
  432. value[0].length - 1
  433. );
  434. this.editUserForm.user_area = value[1];
  435. }
  436. },
  437. // 分配设备
  438. allotEquip(id, name) {
  439. window.location.href = "allot?uname=" + name;
  440. },
  441. // 删除普通用户
  442. delUser(id, name) {
  443. this.$confirm("删除用户, 是否继续?", "警告", {
  444. confirmButtonText: "确定",
  445. cancelButtonText: "取消",
  446. type: "warning",
  447. })
  448. .then(() => {
  449. this.$axios({
  450. method: "POST",
  451. url: "del_user",
  452. data: this.qs.stringify({
  453. userid: id,
  454. }),
  455. }).then((res) => {
  456. if (res.data == 1) {
  457. this.getList();
  458. } else {
  459. this.$message({
  460. type: "error",
  461. message: res.data,
  462. });
  463. }
  464. });
  465. })
  466. .catch(() => {
  467. this.$message({
  468. type: "info",
  469. message: "已取消删除",
  470. });
  471. });
  472. },
  473. //密码重置
  474. resetPassword(id, name) {
  475. this.resetPassForm.id = id;
  476. this.resetPassForm.username = name;
  477. this.resetPassDialogVisible = true;
  478. },
  479. resetPassSubm() {
  480. //暂时不用
  481. this.$refs.resetPassFormRef.validate((valid) => {
  482. if (!valid) return;
  483. this.$axios({
  484. method: "POST",
  485. url: "systemmanage_user_list",
  486. data: this.qs.stringify({
  487. id: this.resetPassForm.id,
  488. req: "resetpwd",
  489. userName: this.editUserForm.username,
  490. userpassWord: this.resetPassForm.pass,
  491. userRePassWord: this.resetPassForm.pass,
  492. }),
  493. }).then((res) => {
  494. if (res.data == 0) {
  495. this.$message.success("修改密码成功");
  496. this.resetPassDialogVisible = false;
  497. } else {
  498. this.$message.error(res.data.message);
  499. }
  500. });
  501. });
  502. },
  503. //监听重置密码对话框的关闭事件
  504. resetPassDialogClosed() {
  505. this.$refs.resetPassFormRef.resetFields();
  506. },
  507. changePage(value) {
  508. this.page = value;
  509. this.getList();
  510. },
  511. //添加用户
  512. addUser() {
  513. this.addUserDialogVisible = true;
  514. },
  515. //添加用户提交
  516. addUserSubm() {
  517. this.$refs.addUserFormRef.validate((valid) => {
  518. if (!valid) return;
  519. let cs_user = this.addUserForm.cs_user ? "1" : "";
  520. this.$axios({
  521. method: "POST",
  522. url: "api_gateway?method=user.login.regiest",
  523. data: this.qs.stringify({
  524. username: this.addUserForm.username,
  525. mobile: this.addUserForm.mobile,
  526. password: this.addUserForm.pass,
  527. role_id: this.addUserForm.role_id,
  528. user_type: this.addUserForm.user_type,
  529. pcd: this.addUserForm.pcd,
  530. user_area: this.addUserForm.user_area,
  531. user_group_id: this.addUserForm.user_group_id,
  532. cs_user,
  533. }),
  534. }).then((res) => {
  535. if (res.data.message == "") {
  536. this.$message.success("添加用户成功!");
  537. this.addUserDialogVisible = false;
  538. this.getList();
  539. } else {
  540. this.$message.error(res.data.message);
  541. }
  542. });
  543. });
  544. },
  545. addUserDialogClosed() {
  546. this.$refs.addUserFormRef.resetFields();
  547. },
  548. //修改用户信息提交
  549. editUserSubm() {
  550. this.$refs.editUserFormRef.validate((valid) => {
  551. if (!valid) return;
  552. this.$axios({
  553. method: "POST",
  554. url: "user_detail",
  555. data: this.qs.stringify(this.editUserForm),
  556. }).then((res) => {
  557. if (res.data == 1) {
  558. this.editUserDialogVisible = false;
  559. var curr = localStorage.getItem("username");
  560. if (curr == this.editUserForm.username) {
  561. window.location.reload();
  562. } else {
  563. this.getList();
  564. }
  565. }
  566. });
  567. });
  568. },
  569. editUserDialogClosed() {
  570. this.$refs.editUserFormRef.resetFields();
  571. this.areaList = []; //清空省/市/区
  572. this.editIsShow = false;
  573. },
  574. checkList() {
  575. this.page = 1;
  576. this.getList();
  577. },
  578. addUserFun() {
  579. window.location.href = "systemmanage_user_add";
  580. },
  581. // 获取站点列表数据
  582. facilityList() {
  583. this.$axios({
  584. method: "GET",
  585. url: "/site_manage",
  586. })
  587. .then((res) => {
  588. if (res.data) {
  589. var data = res.data;
  590. var arrList = [];
  591. var nameList = [];
  592. var nameListB = [];
  593. var list = data.forEach((item) => {
  594. var objA = {};
  595. objA["label"] = item.site_name;
  596. objA["value"] = item.site_name;
  597. if (
  598. item.self_site_name !== undefined &&
  599. item.self_site_name == ""
  600. ) {
  601. } else {
  602. if (item.self_site_name == undefined) {
  603. if (item.child) {
  604. for (var j in item.child) {
  605. var obj = {};
  606. obj["label"] = item.child[j].site_name;
  607. obj["value"] = item.child[j].site_name;
  608. if (
  609. item.child[j].child &&
  610. item.child[j].child.length == 0
  611. ) {
  612. } else if (
  613. item.child[j].child &&
  614. item.child[j].child.length !== 0
  615. ) {
  616. for (var k in item.child[j].child) {
  617. var objB = {}
  618. objB["label"] = item.child[j].child[k].site_name;
  619. objB["value"] = item.child[j].child[k].site_name;
  620. nameListB.push(objB)
  621. }
  622. }
  623. arrList.push(obj);
  624. }
  625. }
  626. } else if (item.self_site_name !== undefined) {
  627. }
  628. }
  629. nameList.push(objA);
  630. });
  631. this.siteNameList = [...nameList, ...arrList, ...nameListB];
  632. }
  633. })
  634. .catch((err) => {
  635. console.log(err);
  636. });
  637. },
  638. },
  639. };
  640. </script>
  641. <style lang='less' scoped>
  642. .search-box {
  643. display: flex;
  644. justify-content: space-between;
  645. margin-bottom: 10px;
  646. .filter-box > div {
  647. margin-right: 15px;
  648. }
  649. .el-input {
  650. width: 200px;
  651. }
  652. .el-date-editor--daterange {
  653. width: 222px;
  654. }
  655. }
  656. .el-card {
  657. .img-box {
  658. text-align: center;
  659. border-bottom: 1px solid #e1e1e1;
  660. padding: 15px 0;
  661. p {
  662. font-size: 14px;
  663. font-weight: 800;
  664. margin-top: 10px;
  665. }
  666. }
  667. .detail {
  668. border-bottom: 1px solid #e1e1e1;
  669. padding: 10px 0;
  670. padding: 0 20px;
  671. p {
  672. display: flex;
  673. justify-content: space-between;
  674. font-size: 13px;
  675. line-height: 34px;
  676. color: #666;
  677. padding: 0 0px;
  678. }
  679. }
  680. .btn {
  681. text-align: center;
  682. padding: 20px 10px;
  683. display: flex;
  684. justify-content: space-around;
  685. button {
  686. // flex: 1;
  687. // margin: 0 8px;
  688. border: 1px solid #17bb89;
  689. color: #17bb89;
  690. // // border-radius: 4px;
  691. // // font-size: 12px;
  692. // // padding: 5px 5px;
  693. background: #fff;
  694. cursor: pointer;
  695. i {
  696. font-size: 12px;
  697. margin-right: 2px;
  698. }
  699. }
  700. button:hover {
  701. background: #fff;
  702. border: 1px solid #47d9ad;
  703. color: #47d9ad;
  704. }
  705. }
  706. }
  707. // 暂无数据
  708. .expertDiagnosis_referral_units_not {
  709. width: 272px;
  710. margin: 0 auto;
  711. }
  712. </style>