统一排行榜对齐星雀UI,页面资源后台配置实时刷新
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
237
miniprogram/pages/kaohe_dafen/kaohe_dafen.js
Normal file
237
miniprogram/pages/kaohe_dafen/kaohe_dafen.js
Normal file
@@ -0,0 +1,237 @@
|
||||
// pages/kaohe_dafen/kaohe_dafen.js
|
||||
const app = getApp();
|
||||
import request from '../../utils/request.js';
|
||||
|
||||
Page({
|
||||
data: {
|
||||
recordList: [],
|
||||
page: 1,
|
||||
pageSize: 10,
|
||||
hasMore: false,
|
||||
isLoading: false,
|
||||
ossImageUrl: app.globalData.ossImageUrl || '',
|
||||
|
||||
// 操作弹窗
|
||||
showAgreeModal: false,
|
||||
showRejectModal: false,
|
||||
showTransferModal: false,
|
||||
currentItem: null,
|
||||
rejectReason: '',
|
||||
|
||||
// 倒计时
|
||||
countdown: 2,
|
||||
counting: false,
|
||||
countdownTimer: null,
|
||||
},
|
||||
|
||||
onLoad() {
|
||||
this.loadRecords(true);
|
||||
},
|
||||
|
||||
// 加载考核记录
|
||||
async loadRecords(isRefresh = false) {
|
||||
if (this.data.isLoading) return;
|
||||
const page = isRefresh ? 1 : this.data.page;
|
||||
this.setData({ isLoading: true });
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/dengji/hqkhxq',
|
||||
method: 'POST',
|
||||
data: { page, page_size: this.data.pageSize }
|
||||
});
|
||||
if (res && res.data.code === 0) {
|
||||
const list = res.data.data.list || [];
|
||||
const hasMore = res.data.data.has_more;
|
||||
const oss = this.data.ossImageUrl;
|
||||
const processed = list.map(item => ({
|
||||
...item,
|
||||
shenqingren_avatar: item.shenqingren_avatar && !item.shenqingren_avatar.startsWith('http')
|
||||
? oss + item.shenqingren_avatar
|
||||
: item.shenqingren_avatar || '/images/default-avatar.png'
|
||||
}));
|
||||
const newList = isRefresh ? processed : [...this.data.recordList, ...processed];
|
||||
this.setData({ recordList: newList, page: page + 1, hasMore, isLoading: false });
|
||||
} else {
|
||||
wx.showToast({ title: '加载失败', icon: 'none' });
|
||||
this.setData({ isLoading: false });
|
||||
}
|
||||
} catch (e) {
|
||||
wx.showToast({ title: '网络错误', icon: 'none' });
|
||||
this.setData({ isLoading: false });
|
||||
}
|
||||
},
|
||||
|
||||
onReachBottom() {
|
||||
if (this.data.hasMore && !this.data.isLoading) {
|
||||
this.loadRecords(false);
|
||||
}
|
||||
},
|
||||
|
||||
// 联系打手(私聊)—— 照搬金牌页面逻辑
|
||||
contactDashou(e) {
|
||||
const item = e.currentTarget.dataset.item;
|
||||
if (!item) return;
|
||||
if (!item.shenqingren_id) {
|
||||
wx.showToast({ title: '无法获取打手ID', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
|
||||
const uid = wx.getStorageSync('uid');
|
||||
if (!uid) {
|
||||
wx.showToast({ title: '用户信息缺失', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
|
||||
// 1. 设置当前角色为考核官
|
||||
if (app.globalData.currentRole !== 'kaoheguan') {
|
||||
app.globalData.currentRole = 'kaoheguan';
|
||||
wx.setStorageSync('currentRole', 'kaoheguan');
|
||||
}
|
||||
|
||||
// 2. 确保 IM 连接存活
|
||||
if (app.connectForCurrentRole) {
|
||||
app.connectForCurrentRole();
|
||||
} else if (app.ensureConnection) {
|
||||
app.ensureConnection();
|
||||
}
|
||||
|
||||
// 3. 构造私聊参数
|
||||
const param = {
|
||||
toUserId: 'Ds' + item.shenqingren_id,
|
||||
toName: '打手' + item.shenqingren_id,
|
||||
toAvatar: item.shenqingren_avatar || ''
|
||||
};
|
||||
|
||||
// 4. 直接跳转聊天页面
|
||||
wx.navigateTo({
|
||||
url: '/pages/liaotian/liaotian?data=' + encodeURIComponent(JSON.stringify(param)),
|
||||
fail: (err) => {
|
||||
console.error('跳转私聊失败', err);
|
||||
wx.showToast({ title: '打开聊天失败', icon: 'none' });
|
||||
}
|
||||
});
|
||||
},
|
||||
|
||||
// 修改游戏昵称
|
||||
async modifyNick(e) {
|
||||
const { id } = e.currentTarget.dataset;
|
||||
const item = this.data.recordList.find(r => r.jilu_id === id);
|
||||
if (!item) return;
|
||||
const newNick = item.shenheguan_youxi_id || '';
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/dengji/khgxgkh',
|
||||
method: 'POST',
|
||||
data: { jilu_id: id, caozuo: 'modify_nick', youxi_id: newNick }
|
||||
});
|
||||
if (res && res.data.code === 0) {
|
||||
wx.showToast({ title: '修改成功', icon: 'success' });
|
||||
} else {
|
||||
wx.showToast({ title: res.data?.msg || '修改失败', icon: 'none' });
|
||||
}
|
||||
} catch (e) {
|
||||
wx.showToast({ title: '网络错误', icon: 'none' });
|
||||
}
|
||||
},
|
||||
|
||||
onNickInput(e) {
|
||||
const id = e.currentTarget.dataset.id;
|
||||
const value = e.detail.value;
|
||||
const list = this.data.recordList.map(item => {
|
||||
if (item.jilu_id === id) {
|
||||
return { ...item, shenheguan_youxi_id: value };
|
||||
}
|
||||
return item;
|
||||
});
|
||||
this.setData({ recordList: list });
|
||||
},
|
||||
|
||||
// 🆕 实时更新拒绝原因
|
||||
onRejectInput(e) {
|
||||
this.setData({ rejectReason: e.detail.value });
|
||||
},
|
||||
|
||||
openAgreeModal(e) {
|
||||
const item = e.currentTarget.dataset.item;
|
||||
this.setData({ showAgreeModal: true, currentItem: item });
|
||||
this.startCountdown();
|
||||
},
|
||||
openRejectModal(e) {
|
||||
const item = e.currentTarget.dataset.item;
|
||||
this.setData({ showRejectModal: true, currentItem: item, rejectReason: '' });
|
||||
this.startCountdown();
|
||||
},
|
||||
openTransferModal(e) {
|
||||
const item = e.currentTarget.dataset.item;
|
||||
this.setData({ showTransferModal: true, currentItem: item });
|
||||
this.startCountdown();
|
||||
},
|
||||
|
||||
closeAllModals() {
|
||||
this.stopCountdown();
|
||||
this.setData({
|
||||
showAgreeModal: false,
|
||||
showRejectModal: false,
|
||||
showTransferModal: false,
|
||||
currentItem: null,
|
||||
rejectReason: ''
|
||||
});
|
||||
},
|
||||
|
||||
startCountdown() {
|
||||
this.stopCountdown();
|
||||
this.setData({ counting: true, countdown: 2 });
|
||||
this.data.countdownTimer = setInterval(() => {
|
||||
if (this.data.countdown > 1) {
|
||||
this.setData({ countdown: this.data.countdown - 1 });
|
||||
} else {
|
||||
this.stopCountdown();
|
||||
this.setData({ counting: false, countdown: 0 });
|
||||
}
|
||||
}, 1000);
|
||||
},
|
||||
stopCountdown() {
|
||||
if (this.data.countdownTimer) {
|
||||
clearInterval(this.data.countdownTimer);
|
||||
this.data.countdownTimer = null;
|
||||
}
|
||||
},
|
||||
|
||||
// 执行操作(从事件对象中获取操作类型)
|
||||
async executeAction(e) {
|
||||
const actionType = e.currentTarget.dataset.action;
|
||||
if (!actionType) {
|
||||
wx.showToast({ title: '操作类型异常', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
|
||||
const item = this.data.currentItem;
|
||||
if (!item) return;
|
||||
|
||||
const params = { jilu_id: item.jilu_id, caozuo: actionType };
|
||||
|
||||
if (actionType === 'reject') {
|
||||
if (!this.data.rejectReason.trim()) {
|
||||
wx.showToast({ title: '请填写拒绝原因', icon: 'none' });
|
||||
return;
|
||||
}
|
||||
params.yuanyin = this.data.rejectReason;
|
||||
}
|
||||
|
||||
try {
|
||||
const res = await request({ url: '/dengji/khgxgkh', method: 'POST', data: params });
|
||||
if (res && res.data.code === 0) {
|
||||
wx.showToast({ title: '操作成功', icon: 'success' });
|
||||
this.closeAllModals();
|
||||
const newList = this.data.recordList.filter(r => r.jilu_id !== item.jilu_id);
|
||||
this.setData({ recordList: newList });
|
||||
} else {
|
||||
wx.showToast({ title: res.data?.msg || '操作失败', icon: 'none' });
|
||||
this.closeAllModals();
|
||||
}
|
||||
} catch (e) {
|
||||
wx.showToast({ title: '网络错误', icon: 'none' });
|
||||
this.closeAllModals();
|
||||
}
|
||||
},
|
||||
});
|
||||
10
miniprogram/pages/kaohe_dafen/kaohe_dafen.json
Normal file
10
miniprogram/pages/kaohe_dafen/kaohe_dafen.json
Normal file
@@ -0,0 +1,10 @@
|
||||
{
|
||||
"usingComponents": {
|
||||
"chenghao-tag": "/components/chenghao-tag/chenghao-tag",
|
||||
"global-notification": "/components/global-notification/global-notification",
|
||||
"popup-notice": "/components/popup-notice/popup-notice"
|
||||
},
|
||||
"navigationBarTitleText": "考核打分",
|
||||
"navigationBarBackgroundColor": "#0b0c12",
|
||||
"navigationBarTextStyle": "white"
|
||||
}
|
||||
118
miniprogram/pages/kaohe_dafen/kaohe_dafen.wxml
Normal file
118
miniprogram/pages/kaohe_dafen/kaohe_dafen.wxml
Normal file
@@ -0,0 +1,118 @@
|
||||
<!-- pages/kaohe_dafen/kaohe_dafen.wxml -->
|
||||
<view class="root-page">
|
||||
<view class="scroll-container" scroll-y="true" bindscrolltolower="onReachBottom">
|
||||
<view class="list">
|
||||
<block wx:for="{{recordList}}" wx:key="jilu_id">
|
||||
<view class="card">
|
||||
<!-- 用户信息行 -->
|
||||
<view class="user-row">
|
||||
<image class="avatar" src="{{item.shenqingren_avatar}}" mode="aspectFill" />
|
||||
<view class="info">
|
||||
<text class="uid">UID {{item.shenqingren_id}}</text>
|
||||
<text class="time">{{item.create_time}}</text>
|
||||
</view>
|
||||
<view class="contact-btn" bindtap="contactDashou" data-item="{{item}}">联系</view>
|
||||
</view>
|
||||
|
||||
<!-- 详情区 -->
|
||||
<view class="detail-grid">
|
||||
<view class="detail-item">
|
||||
<text class="label">板块</text>
|
||||
<text class="value">{{item.bankuai_mingcheng}}</text>
|
||||
</view>
|
||||
<view class="detail-item">
|
||||
<text class="label">标签</text>
|
||||
<chenghao-tag mingcheng="{{item.chenghao_mingcheng}}" texiaoJson="{{item.chenghao_texiao_json}}" />
|
||||
<text wx:if="{{item.is_jinpai}}" class="jinpai-note">(开启金牌)</text>
|
||||
</view>
|
||||
<view class="detail-item">
|
||||
<text class="label">规则</text>
|
||||
<text class="value rule-content">{{item.guize_neirong}}</text>
|
||||
</view>
|
||||
<!-- 🆕 添加被考核人游戏昵称 -->
|
||||
<view class="detail-item" wx:if="{{item.dashou_youxi_id}}">
|
||||
<text class="label">打手游戏昵称</text>
|
||||
<text class="value">{{item.dashou_youxi_id}}</text>
|
||||
</view>
|
||||
<view class="detail-item" wx:if="{{item.dashou_beizhu}}">
|
||||
<text class="label">备注</text>
|
||||
<text class="value">{{item.dashou_beizhu}}</text>
|
||||
</view>
|
||||
<view class="detail-item">
|
||||
<text class="label">次数</text>
|
||||
<text class="value">{{item.cishu}}</text>
|
||||
</view>
|
||||
<view class="detail-item">
|
||||
<text class="label">待收考核费</text>
|
||||
<text class="value amount">¥{{item.daishou_fei}}</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 上次失败原因 -->
|
||||
<view wx:if="{{item.last_fail_reason}}" class="fail-box">
|
||||
<text class="fail-label">上次拒绝原因:</text>
|
||||
<text class="fail-text">{{item.last_fail_reason}}</text>
|
||||
</view>
|
||||
|
||||
<!-- 游戏昵称修改 -->
|
||||
<view class="nick-row">
|
||||
<text class="label">我的游戏昵称</text>
|
||||
<input class="nick-input" data-id="{{item.jilu_id}}" value="{{item.shenheguan_youxi_id}}" bindinput="onNickInput" placeholder="输入昵称" />
|
||||
<view class="save-nick-btn" data-id="{{item.jilu_id}}" bindtap="modifyNick">保存</view>
|
||||
</view>
|
||||
|
||||
<!-- 操作按钮 -->
|
||||
<view class="action-row">
|
||||
<view class="action-btn agree" data-item="{{item}}" bindtap="openAgreeModal">合格</view>
|
||||
<view class="action-btn reject" data-item="{{item}}" bindtap="openRejectModal">不合格</view>
|
||||
<view class="action-btn transfer" data-item="{{item}}" bindtap="openTransferModal">转移</view>
|
||||
</view>
|
||||
</view>
|
||||
</block>
|
||||
<view wx:if="{{isLoading}}" class="loading">加载中...</view>
|
||||
<view wx:if="{{!hasMore && recordList.length > 0}}" class="no-more">—— 已加载全部 ——</view>
|
||||
<view wx:if="{{!isLoading && recordList.length === 0}}" class="empty">暂无待考核记录</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 通过确认弹窗 -->
|
||||
<view wx:if="{{showAgreeModal}}" class="modal-mask" bindtap="closeAllModals">
|
||||
<view class="modal-box" catchtap="noop">
|
||||
<view class="modal-header">确认通过考核</view>
|
||||
<view class="modal-body">通过后,该用户将获得对应标签,请认真审核后操作。</view>
|
||||
<view class="countdown-text" wx:if="{{counting}}">{{countdown}}秒后可确认</view>
|
||||
<view class="modal-footer">
|
||||
<view class="btn cancel" bindtap="closeAllModals">取消</view>
|
||||
<view class="btn confirm {{counting ? 'disabled' : ''}}" bindtap="{{counting ? '' : 'executeAction'}}" data-action="agree">确认通过</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 拒绝弹窗 -->
|
||||
<view wx:if="{{showRejectModal}}" class="modal-mask" bindtap="closeAllModals">
|
||||
<view class="modal-box" catchtap="noop">
|
||||
<view class="modal-header">拒绝通过</view>
|
||||
<textarea class="reason-input" value="{{rejectReason}}" bindinput="onRejectInput" placeholder="请填写拒绝原因" maxlength="200"></textarea>
|
||||
<view class="countdown-text" wx:if="{{counting}}">{{countdown}}秒后可确认</view>
|
||||
<view class="modal-footer">
|
||||
<view class="btn cancel" bindtap="closeAllModals">取消</view>
|
||||
<view class="btn confirm {{counting ? 'disabled' : ''}}" bindtap="{{counting ? '' : 'executeAction'}}" data-action="reject">确认拒绝</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<!-- 转移弹窗 -->
|
||||
<view wx:if="{{showTransferModal}}" class="modal-mask" bindtap="closeAllModals">
|
||||
<view class="modal-box" catchtap="noop">
|
||||
<view class="modal-header">确认转移考核</view>
|
||||
<view class="modal-body">转移后,您将无法继续考核此订单,可在考核中心重新接待。</view>
|
||||
<view class="countdown-text" wx:if="{{counting}}">{{countdown}}秒后可确认</view>
|
||||
<view class="modal-footer">
|
||||
<view class="btn cancel" bindtap="closeAllModals">取消</view>
|
||||
<view class="btn confirm {{counting ? 'disabled' : ''}}" bindtap="{{counting ? '' : 'executeAction'}}" data-action="transfer">确认转移</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<global-notification id="global-notification" />
|
||||
170
miniprogram/pages/kaohe_dafen/kaohe_dafen.wxss
Normal file
170
miniprogram/pages/kaohe_dafen/kaohe_dafen.wxss
Normal file
@@ -0,0 +1,170 @@
|
||||
/* 根容器,全屏且底部固定 */
|
||||
.root-page {
|
||||
width: 100vw;
|
||||
height: 100vh;
|
||||
background: radial-gradient(ellipse at 20% 20%, #1a1e2b 0%, #0b0c12 100%);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
/* 滚动区域 */
|
||||
.scroll-container {
|
||||
flex: 1;
|
||||
overflow-y: auto;
|
||||
padding: 30rpx 30rpx 0;
|
||||
padding-bottom: constant(safe-area-inset-bottom);
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
}
|
||||
|
||||
/* 卡片 */
|
||||
.card {
|
||||
background: rgba(25, 27, 36, 0.8);
|
||||
backdrop-filter: blur(20px);
|
||||
border: 1rpx solid rgba(201, 169, 88, 0.15);
|
||||
border-radius: 24rpx;
|
||||
padding: 30rpx;
|
||||
margin-bottom: 30rpx;
|
||||
box-shadow: 0 8rpx 30rpx rgba(0,0,0,0.5);
|
||||
}
|
||||
|
||||
/* 用户信息 */
|
||||
.user-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
.avatar {
|
||||
width: 80rpx; height: 80rpx;
|
||||
border-radius: 50%;
|
||||
border: 2rpx solid rgba(201,169,88,0.4);
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
.info { flex: 1; }
|
||||
.uid { font-size: 30rpx; color: #f0f2ff; font-weight: 600; }
|
||||
.time { font-size: 22rpx; color: #6a7090; margin-top: 4rpx; }
|
||||
.contact-btn {
|
||||
background: rgba(201,169,88,0.15);
|
||||
border: 1rpx solid rgba(201,169,88,0.3);
|
||||
border-radius: 20rpx;
|
||||
padding: 8rpx 24rpx;
|
||||
font-size: 24rpx;
|
||||
color: #c9a558;
|
||||
}
|
||||
|
||||
/* 详情网格 */
|
||||
.detail-grid {
|
||||
border-bottom: 1rpx solid rgba(255,255,255,0.06);
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.detail-item {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 16rpx 0;
|
||||
border-bottom: 1rpx solid rgba(255,255,255,0.04);
|
||||
}
|
||||
.detail-item:last-child { border-bottom: none; }
|
||||
.label { font-size: 26rpx; color: #8a90b0; width: 160rpx; flex-shrink: 0; }
|
||||
.value { font-size: 26rpx; color: #d0d4ff; font-weight: 500; }
|
||||
.rule-content { white-space: pre-wrap; line-height: 1.5; }
|
||||
.jinpai-note { font-size: 24rpx; color: #c9a558; font-weight: 600; margin-left: 10rpx; }
|
||||
|
||||
/* 失败原因 */
|
||||
.fail-box {
|
||||
background: rgba(255, 70, 70, 0.1);
|
||||
border-left: 4rpx solid #ff5e5e;
|
||||
padding: 16rpx;
|
||||
border-radius: 8rpx;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.fail-label { font-size: 24rpx; color: #ff8a8a; }
|
||||
.fail-text { font-size: 24rpx; color: #ffd0d0; }
|
||||
|
||||
/* 昵称修改 */
|
||||
.nick-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 30rpx;
|
||||
}
|
||||
.nick-input {
|
||||
flex: 1;
|
||||
background: rgba(255,255,255,0.06);
|
||||
border: 1rpx solid rgba(255,255,255,0.1);
|
||||
border-radius: 12rpx;
|
||||
padding: 12rpx 20rpx;
|
||||
color: #fff;
|
||||
font-size: 26rpx;
|
||||
margin-right: 20rpx;
|
||||
}
|
||||
.save-nick-btn {
|
||||
background: #c9a558;
|
||||
color: #0b0c12;
|
||||
padding: 12rpx 30rpx;
|
||||
border-radius: 30rpx;
|
||||
font-size: 26rpx;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
/* 操作按钮 */
|
||||
.action-row {
|
||||
display: flex;
|
||||
gap: 20rpx;
|
||||
margin-top: 20rpx;
|
||||
}
|
||||
.action-btn {
|
||||
flex: 1;
|
||||
height: 80rpx;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border-radius: 40rpx;
|
||||
font-size: 28rpx;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
}
|
||||
.agree { background: linear-gradient(135deg, #c9a558, #9e7d2e); }
|
||||
.reject { background: linear-gradient(135deg, #a85050, #802a2a); }
|
||||
.transfer { background: linear-gradient(135deg, #4a6090, #2a3a60); }
|
||||
|
||||
/* 加载/空状态 */
|
||||
.loading, .no-more, .empty { text-align: center; padding: 30rpx; color: #6a7090; font-size: 28rpx; }
|
||||
|
||||
/* 弹窗 */
|
||||
.modal-mask {
|
||||
position: fixed;
|
||||
top: 0; left: 0; right: 0; bottom: 0;
|
||||
background: rgba(0,0,0,0.7);
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
z-index: 1000;
|
||||
}
|
||||
.modal-box {
|
||||
width: 80%;
|
||||
background: #1e2030;
|
||||
border-radius: 24rpx;
|
||||
padding: 30rpx;
|
||||
border: 1rpx solid rgba(201,169,88,0.2);
|
||||
}
|
||||
.modal-header { font-size: 32rpx; color: #f0f2ff; font-weight: 600; margin-bottom: 20rpx; }
|
||||
.modal-body { font-size: 26rpx; color: #b0b8d0; margin-bottom: 20rpx; }
|
||||
.reason-input {
|
||||
width: 100%;
|
||||
height: 200rpx;
|
||||
background: rgba(255,255,255,0.05);
|
||||
border-radius: 12rpx;
|
||||
padding: 15rpx;
|
||||
color: #fff;
|
||||
font-size: 26rpx;
|
||||
box-sizing: border-box;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
.countdown-text { text-align: center; font-size: 28rpx; color: #c9a558; margin-bottom: 20rpx; }
|
||||
.modal-footer { display: flex; gap: 20rpx; }
|
||||
.btn {
|
||||
flex: 1; height: 80rpx; border-radius: 40rpx;
|
||||
display: flex; align-items: center; justify-content: center;
|
||||
font-size: 28rpx; font-weight: 600;
|
||||
}
|
||||
.cancel { background: #2a2f3e; color: #fff; }
|
||||
.confirm { background: linear-gradient(135deg, #c9a558, #9e7d2e); color: #0b0c12; }
|
||||
.confirm.disabled { opacity: 0.4; pointer-events: none; }
|
||||
Reference in New Issue
Block a user