list.vue 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423
  1. <template>
  2. <base-page>
  3. <view class="userlist">
  4. <view class="userlist-box">
  5. <view class="userlist-left">
  6. <view class="user-title">
  7. 员工
  8. <text class="iconfont icongengduo1"></text>
  9. </view>
  10. <view class="user-search">
  11. <view class="search">
  12. <text class="iconfont icon31sousuo"></text>
  13. <input v-model="search_text" type="text" @input="search" placeholder="请输入员工名称/手机号" />
  14. </view>
  15. </view>
  16. <view class="user-list-wrap">
  17. <block v-if="list.length > 0">
  18. <scroll-view scroll-y="true" class="user-list-scroll all-scroll" @scrolltolower="getUserList">
  19. <view class="item" @click="userSelect(item, index)" v-for="(item, index) in list" :key="index" :class="index == selectUserKeys ? 'itemhover' : ''">
  20. <image :src="$util.img(defaultImg.head)" @error="imgError(index)" mode="aspectFit"></image>
  21. <view class="item-right">
  22. <view>
  23. <view class="user-name">{{ item.username }}</view>
  24. <view class="user-money">{{ item.group_name }}</view>
  25. </view>
  26. <view>
  27. <view class="user-status">{{ item.status ? '正常' : '锁定' }}</view>
  28. <view class="login-time">{{ item.login_time ? $util.timeFormat(item.login_time) : '--' }}</view>
  29. </view>
  30. </view>
  31. </view>
  32. </scroll-view>
  33. </block>
  34. <view class="notYet" v-else-if="!one_judge && list.length == 0">暂无员工</view>
  35. </view>
  36. <view class="add-user"><button type="default" class="primary-btn" @click="addUser">添加员工</button></view>
  37. </view>
  38. <view class="userlist-right">
  39. <view class="user-title">员工详情</view>
  40. <view class="user-information">
  41. <block v-if="JSON.stringify(detail) != '{}'">
  42. <view class="title">基本信息</view>
  43. <view class="information-box">
  44. <view class="box-left">
  45. <view class="information">
  46. <view>员工名称:</view>
  47. <view>{{ detail.username }}</view>
  48. </view>
  49. <view class="information">
  50. <view>员工角色:</view>
  51. <view>{{ detail.group_name }}</view>
  52. </view>
  53. <view class="information">
  54. <view>员工状态:</view>
  55. <view>{{ detail.status ? '正常' : '锁定' }}</view>
  56. </view>
  57. <view class="information">
  58. <view>最后登录IP:</view>
  59. <view>{{ detail.login_ip ? detail.login_ip : '--' }}</view>
  60. </view>
  61. <view class="information">
  62. <view>最后登录时间:</view>
  63. <view>{{ detail.login_time ? $util.timeFormat(detail.login_time) : '--' }}</view>
  64. </view>
  65. </view>
  66. <image class="user-img" :src="$util.img(defaultImg.head)" @error="imgDetailError()" mode="widthFix"></image>
  67. </view>
  68. <view class="button-box" v-if="detail.is_admin == 0">
  69. <view class="button" @click="deleteUser(detail.uid)">删除</view>
  70. <view class="button" @click="editUserAction(detail.uid)">修改</view>
  71. </view>
  72. <view class="title">操作日志</view>
  73. <view><uni-table url="/cashier/storeapi/user/userlog" :cols="logCols" :option="{ uid: detail.uid }" :pagesize="7"></uni-table></view>
  74. </block>
  75. <block v-else><image class="cart-empty" :src="$util.img('upload/uniapp/cashier/cart_empty.png')" mode="widthFix"></image></block>
  76. </view>
  77. </view>
  78. <!-- 添加员工 -->
  79. <uni-popup ref="addmemberPop">
  80. <view class="pop-box addmemberPop-box">
  81. <view class="pop-header">
  82. {{ parseInt(formData.uid) > 0 ? '修改' : '添加' }}员工
  83. <view class="pop-header-close" @click="cancelAddUser()"><i class="iconguanbi1 iconfont"></i></view>
  84. </view>
  85. <view class="common-scrollbar pop-content">
  86. <view class="form-content">
  87. <view class="form-item">
  88. <view class="form-label">
  89. <text class="required">*</text>
  90. 用户名:
  91. </view>
  92. <view class="form-inline search-wrap">
  93. <input
  94. type="text"
  95. :disabled="parseInt(formData.uid) > 0 ? true : false"
  96. class="form-input"
  97. v-model="formData.username"
  98. placeholder="请输入用户名"
  99. />
  100. </view>
  101. </view>
  102. <view class="form-item" v-if="!parseInt(formData.uid)">
  103. <view class="form-label">
  104. <text class="required"></text>
  105. 密码:
  106. </view>
  107. <view class="form-inline search-wrap"><input type="text" class="form-input" v-model="formData.password" placeholder="请输入密码" /></view>
  108. </view>
  109. <view class="form-item" v-else>
  110. <view class="form-label">
  111. <text class="required"></text>
  112. 状态:
  113. </view>
  114. <view class="form-inline search-wrap">
  115. <radio-group @change="statusChange" class="form-radio-group">
  116. <label class="radio form-radio-item">
  117. <radio value="1" :checked="formData.status == 1" />
  118. 正常
  119. </label>
  120. <label class="radio form-radio-item">
  121. <radio value="0" :checked="formData.status == 0" />
  122. 锁定
  123. </label>
  124. </radio-group>
  125. </view>
  126. </view>
  127. <view class="form-item">
  128. <view class="form-label">
  129. <text class="required"></text>
  130. 员工角色:
  131. </view>
  132. <view class="form-inline">
  133. <select-lay
  134. :zindex="10"
  135. :value="formData.group_id.toString()"
  136. name="names"
  137. placeholder="请选择员工角色"
  138. :options="userGroup"
  139. @selectitem="selectUserGroup"
  140. ></select-lay>
  141. </view>
  142. </view>
  143. </view>
  144. </view>
  145. <view class="pop-bottom">
  146. <button type="primary" class="primary-btn" @click="save">{{ parseInt(formData.uid) > 0 ? '修改' : '添加' }}员工</button>
  147. </view>
  148. </view>
  149. </uni-popup>
  150. </view>
  151. </view>
  152. </base-page>
  153. </template>
  154. <script>
  155. import unipopup from '@/components/uni-popup/uni-popup.vue';
  156. export default {
  157. components: { unipopup },
  158. data() {
  159. return {
  160. //选中的员工下标
  161. selectUserKeys: 0,
  162. //搜索的数据
  163. search_text: '',
  164. // 初始是请求第几页
  165. page: 1,
  166. // 每次返回数据数
  167. page_size: 8,
  168. //员工列表数据
  169. list: [],
  170. // 第一次请求列表做详情渲染判断
  171. one_judge: true,
  172. //员工详情数据
  173. detail: {},
  174. logCols: [
  175. {
  176. width: 60,
  177. title: '操作记录',
  178. align: 'left',
  179. field: 'action_name'
  180. },
  181. {
  182. width: 20,
  183. title: '操作IP地址',
  184. align: 'left',
  185. field: 'ip'
  186. },
  187. {
  188. width: 20,
  189. title: '操作时间',
  190. align: 'right',
  191. templet: data => {
  192. return this.$util.timeFormat(data.create_time);
  193. }
  194. }
  195. ],
  196. formData: {
  197. username: '',
  198. password: '',
  199. group_id: ''
  200. },
  201. userGroup: [],
  202. isRepeat: false
  203. };
  204. },
  205. onLoad() {
  206. // 初始化请求员工列表数据
  207. this.getUserList();
  208. this.getUserGroup();
  209. },
  210. methods: {
  211. switchStoreAfter() {
  212. this.page = 1;
  213. this.list = [];
  214. this.one_judge = true;
  215. this.getUserList();
  216. },
  217. // 选中的员工数据
  218. userSelect(item, keys) {
  219. this.selectUserKeys = keys;
  220. this.getUserDetail(item.uid);
  221. this.one_judge = true;
  222. this.isRepeat = false;
  223. this.formData = {
  224. username: '',
  225. password: '',
  226. group_id: ''
  227. };
  228. },
  229. statusChange(e) {
  230. this.formData.status = e.detail.value;
  231. },
  232. // 搜索员工
  233. search() {
  234. this.page = 1;
  235. this.list = [];
  236. this.one_judge = true;
  237. this.getUserList();
  238. },
  239. /**
  240. * 请求的列表数据
  241. */
  242. getUserList() {
  243. this.$api.sendRequest({
  244. url: '/cashier/storeapi/user/lists',
  245. data: {
  246. page: this.page,
  247. page_size: this.page_size,
  248. username: this.search_text
  249. },
  250. success: res => {
  251. if (res.data.list.length == 0 && this.one_judge) {
  252. this.detail = {};
  253. this.one_judge = false;
  254. }
  255. if (res.code >= 0 && res.data.list.length != 0) {
  256. this.page += 1;
  257. if (this.list.length == 0) {
  258. this.list = res.data.list;
  259. } else {
  260. this.list = this.list.concat(res.data.list);
  261. }
  262. //初始时加载一遍详情数据
  263. if (this.one_judge) {
  264. this.getUserDetail(this.list[0].uid);
  265. }
  266. }
  267. }
  268. });
  269. },
  270. imgError(index) {
  271. this.list[index].user_img = this.util.img('addon/meirong/o2o/img/default_user.png');
  272. },
  273. imgDetailError() {
  274. this.detail.user_img = this.util.img('addon/meirong/o2o/img/default_user.png');
  275. },
  276. getUserDetail(uid) {
  277. this.$api.sendRequest({
  278. url: '/cashier/storeapi/user/userinfo',
  279. data: { uid },
  280. success: res => {
  281. if (res.code == 0) {
  282. this.detail = res.data;
  283. this.one_judge = false;
  284. }
  285. }
  286. });
  287. },
  288. getUserGroup() {
  289. this.$api.sendRequest({
  290. url: '/cashier/storeapi/user/group',
  291. success: res => {
  292. if (res.code == 0 && res.data) {
  293. this.userGroup = res.data.map(item => {
  294. return {
  295. label: item.group_name,
  296. value: item.group_id
  297. };
  298. });
  299. }
  300. }
  301. });
  302. },
  303. editUserAction(uid) {
  304. this.$api.sendRequest({
  305. url: '/cashier/storeapi/user/userinfo',
  306. data: { uid },
  307. success: res => {
  308. if (res.code == 0) {
  309. this.formData = {
  310. username: res.data.username,
  311. group_id: res.data.group_id,
  312. uid: res.data.uid,
  313. status: res.data.status
  314. };
  315. this.$refs.addmemberPop.open();
  316. }
  317. }
  318. });
  319. },
  320. // 设置员工状态(正常:1,离职:0)
  321. deleteUser(uid, status) {
  322. this.$api.sendRequest({
  323. url: '/cashier/storeapi/user/deleteuser',
  324. data: {
  325. uid
  326. },
  327. success: res => {
  328. if (res.code >= 0) {
  329. this.page = 1;
  330. this.list = [];
  331. this.one_judge = true;
  332. this.getUserList();
  333. } else {
  334. this.$util.showToast({ title: res.message });
  335. }
  336. }
  337. });
  338. },
  339. addUser() {
  340. this.$refs.addmemberPop.open();
  341. },
  342. cancelAddUser() {
  343. this.formData = {
  344. username: '',
  345. password: '',
  346. group_id: ''
  347. };
  348. this.$refs.addmemberPop.close();
  349. },
  350. selectUserGroup(index, item) {
  351. if (index >= 0) {
  352. this.formData.group_id = parseInt(item.value);
  353. } else {
  354. this.formData.group_id = 0;
  355. }
  356. },
  357. save() {
  358. if (!this.verify() || this.isRepeat) return;
  359. this.isRepeat = true;
  360. let url = '/cashier/storeapi/user/adduser';
  361. if (parseInt(this.formData.uid) > 0) {
  362. url = '/cashier/storeapi/user/edituser';
  363. }
  364. this.$api.sendRequest({
  365. url: url,
  366. data: this.formData,
  367. success: res => {
  368. if (res.code >= 0) {
  369. this.$util.showToast({ title: '操作成功' });
  370. this.page = 1;
  371. this.list = [];
  372. this.cancelAddUser();
  373. this.getUserList();
  374. this.one_judge = true;
  375. this.isRepeat = false;
  376. this.formData = {
  377. username: '',
  378. password: '',
  379. group_id: ''
  380. };
  381. } else {
  382. this.isRepeat = false;
  383. this.$util.showToast({ title: res.message });
  384. }
  385. }
  386. });
  387. },
  388. verify() {
  389. if (!this.formData.username) {
  390. this.$util.showToast({
  391. title: '请输入用户名'
  392. });
  393. return false;
  394. }
  395. if (parseInt(this.formData.uid) == 0 && !this.formData.password) {
  396. this.$util.showToast({
  397. title: '请输入密码'
  398. });
  399. return false;
  400. }
  401. if (!this.formData.group_id) {
  402. this.$util.showToast({
  403. title: '请选择员工角色'
  404. });
  405. return false;
  406. }
  407. return true;
  408. }
  409. }
  410. };
  411. </script>
  412. <style scoped lang="scss">
  413. @import './public/css/user.scss';
  414. </style>