ecommerceList.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355
  1. /**
  2. * 模板名称:电商用户管理
  3. * 作者:zhangyy
  4. * 时间:2023-10-07
  5. */
  6. <template>
  7. <div class="ecommerceList">
  8. <!-- 按订单号搜索 -->
  9. <Row :gutter="10">
  10. <Col span="19">
  11. <Form :label-width="80" :model="searchFilter">
  12. <transition name="el-zoom-in-center">
  13. <Row>
  14. <Col span="6">
  15. <FormItem label="用户名">
  16. <Input placeholder="请输入用户名" v-model="searchFilter.userName"/>
  17. </FormItem>
  18. </Col>
  19. <!-- 按状态 -->
  20. <Col span="5">
  21. <FormItem label="昵称">
  22. <Input placeholder="请输入昵称" v-model="searchFilter.nickName"/>
  23. </FormItem>
  24. </Col>
  25. <!-- 按成交时间 -->
  26. <Col span="12" >
  27. <FormItem label="注册时间">
  28. <Row>
  29. <Col span="11">
  30. <DatePicker type="date" placeholder="选择日期"
  31. format="yyyy-MM-dd"
  32. v-model="searchFilter.startDate"
  33. @on-change="changeStartTime"/>
  34. </Col>
  35. <Col span="2" style="text-align: center">-</Col>
  36. <Col span="11">
  37. <DatePicker type="date" placeholder="截止日期"
  38. format="yyyy-MM-dd"
  39. v-model="searchFilter.endDate"
  40. @on-change="changeEndTime"
  41. />
  42. </Col>
  43. </Row>
  44. </FormItem>
  45. </Col>
  46. </Row>
  47. </transition>
  48. </Form>
  49. </Col>
  50. <Col span="2">
  51. <Button type="primary" icon="ios-search" @click="initData">搜索</Button>
  52. </Col>
  53. <Col span="2">
  54. <Button type="error" @click="frozenUser('MULTI')">冻结所选</Button>
  55. </Col>
  56. </Row>
  57. <br />
  58. <!-- 数据展示 -->
  59. <el-table class="el-table" ref="usersListTable" :data="usersList" v-loading="dataLoading">
  60. <el-table-column
  61. type="selection"
  62. width="55">
  63. </el-table-column>
  64. <el-table-column label="头像" width="150">
  65. <template #default="scope">
  66. <span class="imgStyle">
  67. <img v-if="scope.row.headImg" :src="scope.row.headImg" alt="">
  68. <img v-else src="../../../assets/images/default.png" alt="">
  69. </span>
  70. </template>
  71. </el-table-column>
  72. <el-table-column label="用户名" width="150">
  73. <template #default="scope">
  74. {{scope.row.userName || '无'}}
  75. </template>
  76. </el-table-column>
  77. <el-table-column label="昵称" width="150">
  78. <template #default="scope">
  79. {{scope.row.nickName || '无'}}
  80. </template>
  81. </el-table-column>
  82. <el-table-column label="组织编号" width="150">
  83. <template #default="scope">
  84. {{scope.row.orgId || '无'}}
  85. </template>
  86. </el-table-column>
  87. <el-table-column label="联系电话" width="150">
  88. <template #default="scope">
  89. {{scope.row.contactCell || '无'}}
  90. </template>
  91. </el-table-column>
  92. <el-table-column label="注册时间" width="100">
  93. <template #default="scope">
  94. <span>
  95. {{formatData(scope.row.addTime)}}
  96. </span>
  97. </template>
  98. </el-table-column>
  99. <el-table-column label="操作" width="280">
  100. <template #default="scope">
  101. <span>
  102. <Button type="success" size="small" @click="checkUsersDetail(scope.row)" style="margin-right: 5px;">详情</Button>
  103. <Button v-show="scope.row.status==0" type="error" size="small" @click="frozenUser(scope.row.id)" style="margin-right: 5px;">冻结账号</Button>
  104. <Button v-show="scope.row.status==1" type="warning" size="small" @click="thawUser(scope.row.id)" style="margin-right: 5px;">解冻账号</Button>
  105. <Button type="primary" size="small" @click="updatePsd(scope.row.id)" style="margin-right: 5px;">修改密码</Button>
  106. </span>
  107. </template>
  108. </el-table-column>
  109. </el-table>
  110. <!-- 分页 -->
  111. <div style="margin: 10px;overflow: hidden">
  112. <div style="float: right;">
  113. <Page show-elevator :total="parseInt(totalNum)" :page-size="searchFilter.limit" @on-change="changePage"></Page>
  114. </div>
  115. </div>
  116. <!-- 用户详情弹出层 -->
  117. <Modal v-model="checkUsersDetailModel" title="用户详情" @on-ok="checkUsersDetailModel=false">
  118. <Form ref="checkUsersDetailRef" :model="usersDetail" :label-width="80" >
  119. <FormItem label="用户名:" prop="userName">
  120. <span>{{usersDetail.userName}}</span>
  121. </FormItem>
  122. <FormItem label="用户头像:" prop="headImg">
  123. <span class="imgStyle">
  124. <img v-if="usersDetail.headImg" :src="usersDetail.headImg" alt="">
  125. <img v-else src="../../../assets/images/default.png" alt="">
  126. </span>
  127. </FormItem>
  128. <FormItem label="用户昵称:" prop="nickName">
  129. <span>{{usersDetail.nickName || '无'}}</span>
  130. </FormItem>
  131. <FormItem label="联系电话:" prop="contactCell">
  132. <span>{{usersDetail.contactCell || '无'}}</span>
  133. </FormItem>
  134. <FormItem label="注册时间:" prop="addTime">
  135. <span>{{formatData(usersDetail.addTime)|| '无'}}</span>
  136. </FormItem>
  137. </Form>
  138. </Modal>
  139. <!-- 修改密码 -->
  140. <Modal v-model="updatePsdModel" title="修改密码" ok-text="提交修改" @on-ok="submit()">
  141. <Form ref="changePasswordRef" :label-width="100" :model="changePassword" :rules="psdRules">
  142. <FormItem label="新密码" prop="newPwd">
  143. <Input type="password" v-model="changePassword.newPwd" placeholder="请输入新密码"/>
  144. </FormItem>
  145. <FormItem label="确认密码" prop="confirmPwd">
  146. <Input type="password" v-model="changePassword.confirmPwd" placeholder="请重复输入新密码"/>
  147. </FormItem>
  148. </Form>
  149. </Modal>
  150. </div>
  151. </template>
  152. <script>
  153. import { defineComponent, onMounted, ref ,reactive,getCurrentInstance} from 'vue'
  154. import { Message,Modal } from 'view-ui-plus'
  155. import { user } from '@/request/api'
  156. import moment from 'moment'
  157. export default defineComponent({
  158. components:{
  159. },
  160. setup() {
  161. const confirmPwdCheck = (rule, value, callback)=>{
  162. if (value != changePassword.value.newPwd) {
  163. callback(new Error('两次输入密码不一致'))
  164. }else{
  165. callback()
  166. }
  167. }
  168. let dataLoading = ref(false) //是否在加载中
  169. let usersList = ref([])
  170. let totalNum = ref(0)
  171. let imgDefault = '../../../assets/images/default.png'
  172. let updatePsdModel = ref(false)
  173. let checkUsersDetailModel = ref(false)
  174. let searchFilter = reactive({
  175. orgId:'', //订单状态
  176. userName:'', //用户名
  177. startDate: '', //订单开始日期(yyyy-MM-dd)
  178. endDate: '', //订单结束日期(yyyy-MM-dd)
  179. offset: 0,
  180. limit:10,
  181. nickName:''
  182. })
  183. let usersDetail = ref({})
  184. let changePassword = ref({
  185. id:'',
  186. newPwd: '', //新密码
  187. confirmPwd:'', //确认密码
  188. })
  189. let changePasswordRef = ref()
  190. let psdRules = { //验证规则
  191. newPwd: [
  192. { required: true, message: '请输入新密码', trigger: 'blur' },
  193. { type: 'string', min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
  194. ],
  195. confirmPwd:[
  196. { required: true, message: '请重复输入新密码', trigger: 'blur' },
  197. { type: 'string', min: 6, message: '密码长度不能小于6位', trigger: 'blur' },
  198. { validator: confirmPwdCheck, trigger: 'blur' },
  199. ]
  200. }
  201. const usersListTable = ref()
  202. // 格式化日期
  203. function formatData(date) {
  204. return moment(date).format("YYYY-MM-DD");
  205. }
  206. async function initData() {
  207. dataLoading.value = true
  208. getUsersList()
  209. dataLoading.value = false
  210. }
  211. async function getUsersList() {
  212. await user.GetUsersList({...searchFilter
  213. }).then(res => {
  214. if (res.code == '101') {
  215. usersList.value = res.data || []
  216. totalNum.value = res.total || 0
  217. } else {
  218. Message.error(res.message || "获取平台用户信息出错")
  219. }
  220. })
  221. }
  222. //更改页码
  223. function changePage(page) {
  224. searchFilter.offset = (page - 1) * searchFilter.limit
  225. getUsersList()
  226. }
  227. //更改开始时间
  228. function changeStartTime(time){
  229. searchFilter.startDate = time
  230. // this.getData()
  231. }
  232. //更改截止时间
  233. function changeEndTime(time){
  234. searchFilter.endDate = time
  235. // this.getData()
  236. }
  237. /*=====搜索=====*/
  238. function searchItem() {
  239. getUsersList()
  240. }
  241. function checkUsersDetail(item) {
  242. usersDetail.value = item
  243. checkUsersDetailModel.value = true
  244. }
  245. async function frozenUser(...args) {
  246. let params
  247. if (args[0] == "MULTI") {
  248. var selection = usersListTable.value.store.states.selection._rawValue,
  249. ids = selection.map(val => val.id).join(',')
  250. params = {ids: ids}
  251. }else {
  252. params = {ids: args[0]}
  253. }
  254. await user.FrozenUser(params).then(res => {
  255. if (res.code == '101') {
  256. Message.success(res.message || "冻结成功")
  257. getUsersList()
  258. } else {
  259. Message.error(res.message || "冻结失败")
  260. }
  261. })
  262. }
  263. async function thawUser(id) {
  264. await user.ThawUser({
  265. id:id
  266. }).then(res => {
  267. if (res.code == '101') {
  268. Message.success(res.message || "解冻成功")
  269. getUsersList()
  270. } else {
  271. Message.error(res.message || "解冻失败")
  272. }
  273. })
  274. }
  275. function updatePsd(id) {
  276. changePassword.value.id = id
  277. updatePsdModel.value = true
  278. }
  279. function submit (name) {
  280. changePasswordRef.value.validate(async (valid) => {
  281. if(valid){ //验证通过
  282. await user.UpdatePassWord({
  283. id:changePassword.value.id,
  284. newPwd: changePassword.value.newPwd,
  285. confirmPwd: changePassword.value.confirmPwd
  286. }).then((res)=>{
  287. if(res.code == '101'){
  288. Message.success("密码修改成功")
  289. changePasswordRef.value.resetFields()//将数据置空(清除callback函数影响)
  290. updatePsdModel.value = false
  291. changePassword.value.newPwd = ''
  292. changePassword.value.confirmPwd = ''
  293. }else{
  294. Message.error(res.message)
  295. }
  296. }).catch((err) => {
  297. Message.error(err)
  298. })
  299. } else { //验证失败
  300. Message.error('提交失败!');
  301. }
  302. })
  303. }
  304. onMounted(()=>{
  305. initData()
  306. })
  307. return {
  308. dataLoading,usersList,totalNum,updatePsdModel,checkUsersDetailModel,searchFilter,usersDetail,changePassword,psdRules,
  309. usersListTable,changePasswordRef,imgDefault,
  310. getUsersList,changePage,changeStartTime,changeEndTime,searchItem,checkUsersDetail,frozenUser,thawUser,updatePsd,submit,formatData,initData
  311. }
  312. },
  313. })
  314. </script>
  315. <style lang="scss" scoped>
  316. .ecommerceList{
  317. padding: 1em;
  318. .el-table{
  319. width: 100%;
  320. font-size: 12px;
  321. }
  322. .imgStyle {
  323. width: 100px;
  324. height: 100px;
  325. display: table;
  326. overflow: hidden;
  327. img {
  328. vertical-align: middle;
  329. max-width: 100px;
  330. max-height: 100px;
  331. }
  332. }
  333. }
  334. </style>