list.vue 6.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. <template>
  2. <view class="page-container">
  3. <view class="list-container">
  4. <block v-if="!$util.isEmpty(list.data)">
  5. <view class="list-item" v-for="item in list.data" :key="item.id">
  6. <view class="item-content" @click="edit(item)">
  7. <view class="item-icon">场</view>
  8. <view class="item-info">
  9. <view class="info-main"><text class="use-case-name">{{ item.useCaseName }}</text></view>
  10. <view class="info-details">
  11. <text class="detail-text">序号: {{ item.inTurn }}</text>
  12. <text class="detail-text" :class="item.status == 1 ? 'active' : 'disabled'">{{ item.status == 1 ? '商城显示' : '商城隐藏' }}</text>
  13. </view>
  14. </view>
  15. </view>
  16. <view class="item-actions">
  17. <button class="action-btn edit-btn" @click="edit(item)">编辑</button>
  18. <button class="action-btn delete-btn" @click.stop="remove(item.id)">删除</button>
  19. </view>
  20. </view>
  21. </block>
  22. <app-wrapper-empty v-else title="暂无使用场景数据" :is-empty="$util.isEmpty(list.data)" />
  23. </view>
  24. <view class="bottom-toolbar"><button class="add-category-btn" @click="add"><text class="btn-icon">+</text><text>添加使用场景</text></button></view>
  25. <modal-module :show="modifyModal" :maskClosable="false" @cancel="modalCancel" @click="submit" width="96%" :title="modifyTitle + '使用场景'" padding="40rpx">
  26. <template v-slot:content>
  27. <view class="modal-form">
  28. <view class="form-group"><view class="form-label"><text class="label-text">场景名称</text><text class="required-mark">*</text></view><view class="form-input"><input v-model="modifyForm.useCaseName" :adjust-position="false" class="input-field" placeholder="请输入使用场景名称" maxlength="20" /></view></view>
  29. <view class="form-group"><view class="form-label"><text class="label-text">排序值</text></view><view class="form-input"><input v-model="modifyForm.inTurn" type="number" @focus="modifyForm.inTurn = ''" :adjust-position="false" class="input-field" placeholder="数值越大排序越靠前" /></view></view>
  30. <view class="form-group switch-group"><view class="form-label"><text class="label-text">显示状态</text></view><view class="form-switch"><switch :checked="modifyForm.status == 1" @change="switchChange" color="#007AFF" /><text class="switch-text">{{ modifyForm.status == 1 ? '商城显示' : '商城隐藏' }}</text></view></view>
  31. </view>
  32. </template>
  33. </modal-module>
  34. </view>
  35. </template>
  36. <script>
  37. import ModalModule from '@/components/plugin/modal';
  38. import AppWrapperEmpty from '@/components/app-wrapper-empty';
  39. import { list } from '@/mixins';
  40. import { useCaseList, useCaseAdd, useCaseUpdate, useCaseDelete } from '@/api/goods';
  41. export default {
  42. name: 'useCaseList', components: { ModalModule, AppWrapperEmpty }, mixins: [list],
  43. data() { return { modifyModal: false, modifyTitle: '添加', modifyForm: { useCaseId: 0, useCaseName: '', inTurn: '', status: 1 } }; },
  44. onPullDownRefresh() { this.resetList(); this._list().then(() => uni.stopPullDownRefresh()); },
  45. onReachBottom() { uni.stopPullDownRefresh(); },
  46. methods: {
  47. init() { this._list(); },
  48. _list() { return useCaseList().then(res => this.completes({ code: res.code, msg: res.msg, data: { list: res.data || [] } })); },
  49. add() { this.modifyTitle = '新增'; this.modifyForm = { useCaseId: 0, useCaseName: '', inTurn: '', status: 1 }; this.modifyModal = true; },
  50. edit(item) { this.modifyTitle = '编辑'; this.modifyForm = { useCaseId: item.id, useCaseName: item.useCaseName, inTurn: item.inTurn, status: item.status }; this.modifyModal = true; },
  51. modalCancel() { this.modifyModal = false; },
  52. switchChange(e) { this.modifyForm.status = e.detail.value ? 1 : 0; },
  53. submit(e) {
  54. if (e.index === 0) return this.modalCancel();
  55. if (!this.modifyForm.useCaseName) return this.$msg('请输入使用场景名称');
  56. const api = this.modifyForm.useCaseId ? useCaseUpdate : useCaseAdd;
  57. api({ ...this.modifyForm }).then(res => { if (res.code == 1) { this.$msg('操作成功!'); this.modalCancel(); this.resetList(); this._list(); } });
  58. },
  59. remove(id) { uni.showModal({ title: '提示', content: '确认删除?', success: res => { if (res.confirm) useCaseDelete({ useCaseId: id }).then(ret => { if (ret.code == 1) { this.$msg('已删除'); this.resetList(); this._list(); } }); } }); }
  60. }
  61. };
  62. </script>
  63. <style lang="scss" scoped>
  64. .page-container { min-height: 100vh; background: #f5f5f5; padding: 20rpx 20rpx 120rpx; }
  65. .list-container { background: #fff; border-radius: 12rpx; overflow: hidden; box-shadow: 0 2rpx 8rpx rgba(0,0,0,.06); margin-bottom: 60upx; }
  66. .list-item { display:flex; align-items:center; padding:20rpx 30rpx; border-bottom:1rpx solid #f0f0f0; &:last-child{border-bottom:0;} &:active{background:#f8f8f8;} }
  67. .item-content { display:flex; align-items:center; flex:1; min-width:0; }
  68. .item-icon { width:80rpx; height:80rpx; margin-right:24rpx; border-radius:8rpx; background:#e8f7ee; color:#52c41a; display:flex; align-items:center; justify-content:center; font-size:30rpx; font-weight:600; }
  69. .item-info { flex:1; }.info-main { margin-bottom:8rpx; }.use-case-name { font-size:30rpx; font-weight:600; color:#333; }.info-details { display:flex; }.detail-text { margin-right:24rpx; font-size:24rpx; color:#666; &.active{color:#383a39;} &.disabled{color:#FF3B30;} }
  70. .item-actions { display:flex; flex-shrink:0; }.action-btn { margin-left:12rpx; padding:12rpx 20rpx; border:0; border-radius:6rpx; font-size:24rpx; min-width:80rpx; color:#fff; &.edit-btn{background:#52c41a;} &.delete-btn{background:#FF3B30;} }
  71. .bottom-toolbar { position:fixed; bottom:0; left:0; right:0; z-index:2; padding:20rpx 30rpx; padding-bottom:calc(20rpx + env(safe-area-inset-bottom)); background:#fff; border-top:1rpx solid #e5e5e5; box-shadow:0 -2rpx 8rpx rgba(0,0,0,.06); }.add-category-btn { width:100%; padding:24rpx; background:#52c41a; color:#fff; border:0; border-radius:8rpx; font-size:30rpx; font-weight:600; .btn-icon{margin-right:12rpx;font-size:32rpx;} }
  72. .form-group { margin-bottom:32rpx; &:last-child{margin-bottom:0;} }.form-label { display:flex; align-items:center; margin-bottom:16rpx; }.label-text{font-size:28rpx;color:#333;font-weight:500;}.required-mark{margin-left:6rpx;color:#FF3B30;}.input-field{width:100%;height:80rpx;padding:0 20rpx;border:1rpx solid #e5e5e5;border-radius:8rpx;font-size:28rpx;box-sizing:border-box;}.form-switch{display:flex;align-items:center;}.switch-text{margin-left:16rpx;color:#666;font-size:26rpx;}
  73. </style>