UserManger.vue 16 KB

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