UserManger.vue 16 KB

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