|
|
- <template>
- <view class="roleSelector">
- <uv-popup ref="popup" :round="30" :customStyle="{height: '60vh'}">
- <view class="content">
- <view class="header">
- <view class="title">选择身份</view>
- <view class="close-btn" @click="close">
- <uv-icon name="close" size="20" color="#999"></uv-icon>
- </view>
- </view>
-
- <view class="role-tip">请选择您的身份类型:</view>
-
- <view class="role-list">
- <view
- v-for="(role, index) in roleOptions"
- :key="index"
- :class="['role-item', selectedRole === role.value && 'active']"
- @click="selectRole(role.value)">
- <view class="role-icon">
- <uv-icon :name="getRoleIcon(role.value)" size="20" :color="selectedRole === role.value ? '#007AFF' : '#666'"></uv-icon>
- </view>
- <view class="role-info">
- <view class="role-name">{{ role.label }}</view>
- <view class="role-desc">{{ getRoleDesc(role.value) }}</view>
- </view>
- <view class="role-check">
- <uv-icon v-if="selectedRole === role.value" name="checkmark-circle" size="20" color="#007AFF"></uv-icon>
- <uv-icon v-else name="close-circle" size="20" color="#ccc"></uv-icon>
- </view>
- </view>
- </view>
-
- <view class="action-buttons">
- <view class="btn cancel" @click="close">取消</view>
- <view class="btn confirm" @click="confirmRoleChange">确认</view>
- </view>
- </view>
- </uv-popup>
- </view>
- </template>
-
- <script>
- import { mapState, mapGetters, mapMutations } from 'vuex'
-
- export default {
- name: 'RoleSelector',
- data() {
- return {
- selectedRole: '0'
- }
- },
- computed: {
- ...mapState(['role']),
- ...mapGetters(['getRoleOptions']),
- roleOptions() {
- return this.getRoleOptions;
- }
- },
- methods: {
- ...mapMutations(['switchRole']),
-
- // 打开角色选择弹窗
- open() {
- this.selectedRole = this.role;
- this.$refs.popup.open('bottom');
- },
-
- // 关闭弹窗
- close() {
- this.$refs.popup.close();
- },
-
- // 选择角色
- selectRole(roleValue) {
- this.selectedRole = roleValue;
- },
-
- // 确认角色切换
- confirmRoleChange() {
- if (this.selectedRole !== this.role) {
- // 使用Vuex mutation切换角色
- this.switchRole(this.selectedRole);
- uni.showToast({
- title: `已切换到${this.getCurrentRoleText(this.selectedRole)}`,
- icon: 'success'
- });
-
- // 触发父组件事件
- this.$emit('roleChanged', this.selectedRole);
- }
- this.close();
- },
-
- // 获取角色图标
- getRoleIcon(roleValue) {
- switch(roleValue) {
- case '0': return 'man';
- case '1': return 'bag';
- case '2': return 'man-add';
- case '3': return 'setting';
- default: return 'man';
- }
- },
-
- // 获取角色描述
- getRoleDesc(roleValue) {
- switch(roleValue) {
- case '0': return '接单赚钱,自由工作';
- case '1': return '发布订单,管理业务';
- case '2': return '协助管理,处理订单';
- case '3': return '区域管理,审核订单';
- default: return '';
- }
- },
-
- // 获取当前角色文本
- getCurrentRoleText(roleValue) {
- const role = this.roleOptions.find(r => r.value === roleValue);
- return role ? role.label : '用户/泵司';
- }
- }
- }
- </script>
-
- <style lang="scss" scoped>
- .roleSelector {
- .content {
- padding: 30rpx 20rpx;
- height: 100%;
- box-sizing: border-box;
- display: flex;
- flex-direction: column;
- }
-
- .header {
- display: flex;
- justify-content: space-between;
- align-items: center;
- margin-bottom: 30rpx;
- padding-bottom: 20rpx;
- border-bottom: 1rpx solid #f0f0f0;
-
- .title {
- font-size: 32rpx;
- font-weight: bold;
- color: #333;
- }
-
- .close-btn {
- padding: 10rpx;
- cursor: pointer;
- }
- }
-
- .role-tip {
- font-size: 28rpx;
- color: #666;
- margin-bottom: 30rpx;
- text-align: center;
- }
-
- .role-list {
- flex: 1;
- display: flex;
- flex-direction: column;
- gap: 20rpx;
- margin-bottom: 40rpx;
- }
-
- .role-item {
- display: flex;
- align-items: center;
- padding: 25rpx 20rpx;
- border-radius: 15rpx;
- border: 2rpx solid #f0f0f0;
- transition: all 0.3s ease;
- cursor: pointer;
-
- &.active {
- border-color: #007AFF;
- background-color: #f0f8ff;
- }
-
- &:hover {
- background-color: #f8f8f8;
- }
- }
-
- .role-icon {
- width: 60rpx;
- height: 60rpx;
- border-radius: 30rpx;
- background-color: #f5f5f5;
- display: flex;
- align-items: center;
- justify-content: center;
- margin-right: 20rpx;
- }
-
- .role-info {
- flex: 1;
- }
-
- .role-name {
- font-size: 30rpx;
- font-weight: bold;
- color: #333;
- margin-bottom: 8rpx;
- }
-
- .role-desc {
- font-size: 24rpx;
- color: #999;
- line-height: 1.4;
- }
-
- .role-check {
- width: 40rpx;
- height: 40rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- }
-
- .action-buttons {
- display: flex;
- gap: 20rpx;
- padding-top: 20rpx;
- border-top: 1rpx solid #f0f0f0;
-
- .btn {
- flex: 1;
- height: 80rpx;
- border-radius: 40rpx;
- display: flex;
- align-items: center;
- justify-content: center;
- font-size: 28rpx;
- cursor: pointer;
- transition: all 0.3s ease;
-
- &.cancel {
- background-color: #f5f5f5;
- color: #666;
-
- &:hover {
- background-color: #e8e8e8;
- }
- }
-
- &.confirm {
- background-color: #007AFF;
- color: #fff;
-
- &:hover {
- background-color: #0056CC;
- }
- }
- }
- }
- }
- </style>
|