|
|
|
@ -1,12 +1,7 @@ |
|
|
|
<template> |
|
|
|
<div class="evaluate-detail-page"> |
|
|
|
<!-- 顶部导航栏 --> |
|
|
|
<van-nav-bar |
|
|
|
:title="detail.title || '执法评价'" |
|
|
|
left-text="关闭" |
|
|
|
left-arrow |
|
|
|
@click-left="onClickLeft" |
|
|
|
/> |
|
|
|
<van-nav-bar :title="detail.title || '执法评价'" left-text="关闭" left-arrow @click-left="onClickLeft" /> |
|
|
|
|
|
|
|
<!-- 内容区域 --> |
|
|
|
<div class="content-area"> |
|
|
|
@ -19,7 +14,7 @@ |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">统一社会信用代码</span> |
|
|
|
<span class="info-value">{{ detail.creditCode }}</span> |
|
|
|
<span class="info-value">{{ detail.enterpriseNumber }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
@ -28,27 +23,30 @@ |
|
|
|
<div class="card-title">执法信息</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">执法单位</span> |
|
|
|
<span class="info-value">{{ detail.bureauDeptName }}</span> |
|
|
|
<span class="info-value">{{ detail.lawEnforcement }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">执法人员</span> |
|
|
|
<div class="info-value enforcer-value"> |
|
|
|
<div v-for="(enforcer, idx) in detail.enforcers" :key="idx"> |
|
|
|
{{ enforcer.name }} {{ enforcer.phone }} |
|
|
|
<div> |
|
|
|
{{ detail.lawEnforcer }}{{ detail.lawEnforcerId }} |
|
|
|
</div> |
|
|
|
<div> |
|
|
|
{{ detail.lawEnforcerTwo }}{{ detail.lawEnforcerIdTwo }} |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">执法类别</span> |
|
|
|
<span class="info-value">{{ detail.category }}</span> |
|
|
|
<span class="info-value">{{ getDictText('law_enforce_category', detail.lawEnforceCategory) }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">任务来源</span> |
|
|
|
<span class="info-value">{{ detail.source }}</span> |
|
|
|
<span class="info-value">{{ getDictText('check_category', detail.checkCategory) }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">执法事项</span> |
|
|
|
<span class="info-value">{{ detail.matter }}</span> |
|
|
|
<span class="info-value">{{ detail.lawEnforcementItem }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">执法时间</span> |
|
|
|
@ -57,20 +55,21 @@ |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">受委托执法</span> |
|
|
|
<span class="info-value"> |
|
|
|
<van-radio-group v-model="detail.isEntrusted" direction="horizontal" disabled> |
|
|
|
<van-radio :name="true">是</van-radio> |
|
|
|
<van-radio :name="false">否</van-radio> |
|
|
|
<van-radio-group v-model="detail.hasAuto" direction="horizontal" disabled> |
|
|
|
<van-radio :name="1">是</van-radio> |
|
|
|
<van-radio :name="0">否</van-radio> |
|
|
|
</van-radio-group> |
|
|
|
</span> |
|
|
|
</div> |
|
|
|
<div class="info-row"> |
|
|
|
<span class="info-label">委托行政机关</span> |
|
|
|
<span class="info-value">{{ detail.entrustDept }}</span> |
|
|
|
<span class="info-value">{{ detail.entrustDeptName }}</span> |
|
|
|
</div> |
|
|
|
<div class="info-row result-row"> |
|
|
|
<div class="info-row result-row" > |
|
|
|
<span class="info-label">结果</span> |
|
|
|
<span class="info-value"> |
|
|
|
<span class="result-tag" :class="detail.result === '合格' ? 'pass' : 'fail'">{{ detail.result }}</span> |
|
|
|
<span class="result-tag" :class="detail.reslut === 0 ? 'pass' : 'fail'">{{ detail.reslut === 0 ? '合格' : '不合格' |
|
|
|
}}</span> |
|
|
|
<span class="view-detail-link" @click="onViewCaseDetail">查看案件详情 ></span> |
|
|
|
</span> |
|
|
|
</div> |
|
|
|
@ -87,46 +86,28 @@ |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 评价卡片 --> |
|
|
|
<div class="evaluate-card"> |
|
|
|
<!-- 评价卡片(已评价:仅当后端返回 enterpriseEvaluateInfoVo 有数据时显示;待评价:始终显示) --> |
|
|
|
<div class="evaluate-card" v-if="showEvaluateCard"> |
|
|
|
<div class="card-title">评价</div> |
|
|
|
|
|
|
|
<!-- 表情选择 --> |
|
|
|
<div class="emoji-section"> |
|
|
|
<div |
|
|
|
class="emoji-item" |
|
|
|
:class="{ active: evaluateForm.satisfaction === '满意' }" |
|
|
|
@click="evaluateForm.satisfaction = '满意'" |
|
|
|
> |
|
|
|
<img |
|
|
|
class="emoji-img" |
|
|
|
:src="evaluateForm.satisfaction === '满意' ? veryGoodImg : veryGoodDisImg" |
|
|
|
alt="满意" |
|
|
|
/> |
|
|
|
<div class="emoji-item" :class="{ active: evaluateForm.satisfaction === '满意', disabled: readonly }" |
|
|
|
@click="!readonly && (evaluateForm.satisfaction = '满意')"> |
|
|
|
<img class="emoji-img" :src="evaluateForm.satisfaction === '满意' ? veryGoodImg : veryGoodDisImg" |
|
|
|
alt="满意" /> |
|
|
|
<span class="emoji-label">满意</span> |
|
|
|
</div> |
|
|
|
<div |
|
|
|
class="emoji-item" |
|
|
|
:class="{ active: evaluateForm.satisfaction === '较满意' }" |
|
|
|
@click="evaluateForm.satisfaction = '较满意'" |
|
|
|
> |
|
|
|
<img |
|
|
|
class="emoji-img" |
|
|
|
:src="evaluateForm.satisfaction === '较满意' ? goodImg : goodDisImg" |
|
|
|
alt="较满意" |
|
|
|
/> |
|
|
|
<div class="emoji-item" :class="{ active: evaluateForm.satisfaction === '较满意', disabled: readonly }" |
|
|
|
@click="!readonly && (evaluateForm.satisfaction = '较满意')"> |
|
|
|
<img class="emoji-img" :src="evaluateForm.satisfaction === '较满意' ? goodImg : goodDisImg" |
|
|
|
alt="较满意" /> |
|
|
|
<span class="emoji-label">较满意</span> |
|
|
|
</div> |
|
|
|
<div |
|
|
|
class="emoji-item" |
|
|
|
:class="{ active: evaluateForm.satisfaction === '不满意' }" |
|
|
|
@click="evaluateForm.satisfaction = '不满意'" |
|
|
|
> |
|
|
|
<img |
|
|
|
class="emoji-img" |
|
|
|
:src="evaluateForm.satisfaction === '不满意' ? badImg : badDisImg" |
|
|
|
alt="不满意" |
|
|
|
/> |
|
|
|
<div class="emoji-item" :class="{ active: evaluateForm.satisfaction === '不满意', disabled: readonly }" |
|
|
|
@click="!readonly && (evaluateForm.satisfaction = '不满意')"> |
|
|
|
<img class="emoji-img" :src="evaluateForm.satisfaction === '不满意' ? badImg : badDisImg" |
|
|
|
alt="不满意" /> |
|
|
|
<span class="emoji-label">不满意</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -135,22 +116,26 @@ |
|
|
|
<div class="rating-section"> |
|
|
|
<div class="rating-row"> |
|
|
|
<span class="rating-label">执法文明</span> |
|
|
|
<van-rate v-model="evaluateForm.civility" :size="20" color="#ffd21e" void-icon="star" void-color="#eee" /> |
|
|
|
<van-rate v-model="evaluateForm.civility" :size="20" color="#ffd21e" void-icon="star" |
|
|
|
void-color="#eee" :readonly="readonly" /> |
|
|
|
<span class="rating-text">{{ getRatingText(evaluateForm.civility) }}</span> |
|
|
|
</div> |
|
|
|
<div class="rating-row"> |
|
|
|
<span class="rating-label">执法效率</span> |
|
|
|
<van-rate v-model="evaluateForm.efficiency" :size="20" color="#ffd21e" void-icon="star" void-color="#eee" /> |
|
|
|
<van-rate v-model="evaluateForm.efficiency" :size="20" color="#ffd21e" void-icon="star" |
|
|
|
void-color="#eee" :readonly="readonly" /> |
|
|
|
<span class="rating-text">{{ getRatingText(evaluateForm.efficiency) }}</span> |
|
|
|
</div> |
|
|
|
<div class="rating-row"> |
|
|
|
<span class="rating-label">执法态度</span> |
|
|
|
<van-rate v-model="evaluateForm.attitude" :size="20" color="#ffd21e" void-icon="star" void-color="#eee" /> |
|
|
|
<van-rate v-model="evaluateForm.attitude" :size="20" color="#ffd21e" void-icon="star" |
|
|
|
void-color="#eee" :readonly="readonly" /> |
|
|
|
<span class="rating-text">{{ getRatingText(evaluateForm.attitude) }}</span> |
|
|
|
</div> |
|
|
|
<div class="rating-row"> |
|
|
|
<span class="rating-label">合 法 性</span> |
|
|
|
<van-rate v-model="evaluateForm.legality" :size="20" color="#ffd21e" void-icon="star" void-color="#eee" /> |
|
|
|
<van-rate v-model="evaluateForm.legality" :size="20" color="#ffd21e" void-icon="star" |
|
|
|
void-color="#eee" :readonly="readonly" /> |
|
|
|
<span class="rating-text">{{ getRatingText(evaluateForm.legality) }}</span> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -158,7 +143,8 @@ |
|
|
|
<!-- 其他问题开关 --> |
|
|
|
<div class="switch-section"> |
|
|
|
<span class="switch-label">其他问题</span> |
|
|
|
<van-switch v-model="evaluateForm.hasOtherIssues" size="20" active-color="#2b7de9" /> |
|
|
|
<van-switch v-model="evaluateForm.hasOtherIssues" size="20" active-color="#2b7de9" |
|
|
|
:disabled="readonly" /> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 问题列表 --> |
|
|
|
@ -166,19 +152,13 @@ |
|
|
|
<div class="question-item" v-for="(q, idx) in questionList" :key="idx"> |
|
|
|
<div class="question-text">{{ idx + 1 }}、{{ q.text }}</div> |
|
|
|
<div class="question-options"> |
|
|
|
<div |
|
|
|
class="option-btn" |
|
|
|
:class="{ active: q.answer === '是' }" |
|
|
|
@click="q.answer = '是'" |
|
|
|
> |
|
|
|
<div class="option-btn" :class="{ active: q.answer === '是', disabled: readonly }" |
|
|
|
@click="!readonly && (q.answer = '是')"> |
|
|
|
<van-icon name="success" v-if="q.answer === '是'" /> |
|
|
|
是 |
|
|
|
</div> |
|
|
|
<div |
|
|
|
class="option-btn" |
|
|
|
:class="{ active: q.answer === '否' }" |
|
|
|
@click="q.answer = '否'" |
|
|
|
> |
|
|
|
<div class="option-btn" :class="{ active: q.answer === '否', disabled: readonly }" |
|
|
|
@click="!readonly && (q.answer = '否')"> |
|
|
|
<van-icon name="success" v-if="q.answer === '否'" /> |
|
|
|
否 |
|
|
|
</div> |
|
|
|
@ -188,8 +168,8 @@ |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
|
|
|
|
<!-- 底部提交按钮 --> |
|
|
|
<div class="footer-bar"> |
|
|
|
<!-- 底部提交按钮(仅待评价状态显示) --> |
|
|
|
<div class="footer-bar" v-if="!readonly"> |
|
|
|
<van-button type="primary" block round @click="onSubmit">提交评价</van-button> |
|
|
|
</div> |
|
|
|
</div> |
|
|
|
@ -204,41 +184,64 @@ import goodImg from '@/assets/images/eval-good.png'; |
|
|
|
import goodDisImg from '@/assets/images/eval-good-dis.png'; |
|
|
|
import badImg from '@/assets/images/eval-bad.png'; |
|
|
|
import badDisImg from '@/assets/images/eval-bad-dis.png'; |
|
|
|
import { |
|
|
|
getEvaluateDetail, |
|
|
|
getEnforcementRegistrationDetailById, |
|
|
|
submitEvaluate, |
|
|
|
} from '@/api/enterprise'; |
|
|
|
import { loadDict, getDictText } from '@/util/dictUtil'; |
|
|
|
|
|
|
|
const router = useRouter(); |
|
|
|
const route = useRoute(); |
|
|
|
|
|
|
|
const id = route.query.id; |
|
|
|
// 只读标识:hasEvaluate=1 已评价只能查看,0/空 为待评价可提交 |
|
|
|
const readonly = computed(() => String(route.query.hasEvaluate) === '1'); |
|
|
|
// 已评价返回的评价信息对象(后端 enterpriseEvaluateInfoVo) |
|
|
|
const evaluateInfo = ref(null); |
|
|
|
// 评价卡片是否显示:待评价始终显示;已评价仅当 enterpriseEvaluateInfoVo 有数据时显示 |
|
|
|
const showEvaluateCard = computed(() => { |
|
|
|
if (!readonly.value) return true; |
|
|
|
const info = evaluateInfo.value; |
|
|
|
return !!(info && typeof info === 'object' && Object.keys(info).length > 0); |
|
|
|
}); |
|
|
|
|
|
|
|
// 预加载执法类别字典(用于翻译 detail.lawEnforceCategory) |
|
|
|
const lawEnforceCategoryLoaded = ref(false); |
|
|
|
loadDict('law_enforce_category', () => { lawEnforceCategoryLoaded.value = true; }); |
|
|
|
|
|
|
|
// 预加载任务来源字典(用于翻译 detail.checkCategory) |
|
|
|
const checkCategoryLoaded = ref(false); |
|
|
|
loadDict('check_category', () => { checkCategoryLoaded.value = true; }); |
|
|
|
|
|
|
|
// ========== 详情数据 ========== |
|
|
|
const detail = ref({ |
|
|
|
title: 'xxx信息技术有限公司检查', |
|
|
|
enterpriseName: 'xxx信息技术有限公司', |
|
|
|
creditCode: '91440300769163989U', |
|
|
|
bureauDeptName: '深圳市司法局', |
|
|
|
enforcers: [ |
|
|
|
{ name: '刘新忠', phone: '19028763225' }, |
|
|
|
{ name: '安旭明', phone: '19028763225' }, |
|
|
|
], |
|
|
|
category: '行政检查', |
|
|
|
source: '日常巡查', |
|
|
|
matter: 'xxx信息技术有限公司', |
|
|
|
enforcementTime: '2026-03-23 09:00 ~ 12:00', |
|
|
|
title: '', |
|
|
|
enterpriseName: '', |
|
|
|
creditCode: '', |
|
|
|
bureauDeptName: '', |
|
|
|
enforcers: [], |
|
|
|
category: '', |
|
|
|
source: '', |
|
|
|
matter: '', |
|
|
|
enforcementTime: '', |
|
|
|
isEntrusted: false, |
|
|
|
entrustDept: '深圳市发展和改革委员会', |
|
|
|
result: '合格', |
|
|
|
entrustDept: '', |
|
|
|
result: '', |
|
|
|
attachments: [], |
|
|
|
}); |
|
|
|
|
|
|
|
// ========== 评价表单 ========== |
|
|
|
// ========== 评价表单(默认值:满意 / 5 星 / 其他问题打开)========== |
|
|
|
const evaluateForm = ref({ |
|
|
|
satisfaction: '满意', |
|
|
|
civility: 5, |
|
|
|
efficiency: 4, |
|
|
|
attitude: 3, |
|
|
|
efficiency: 5, |
|
|
|
attitude: 5, |
|
|
|
legality: 5, |
|
|
|
hasOtherIssues: true, |
|
|
|
}); |
|
|
|
|
|
|
|
// ========== 问题列表 ========== |
|
|
|
// ========== 问题列表(默认模板)========== |
|
|
|
const questionList = ref([ |
|
|
|
{ text: '是否存在和执法,接受被执法企业的馈赠、报酬、福利等?', answer: '否' }, |
|
|
|
{ text: '是否存在要求被执法企业提供宴请、娱乐、旅游等活动?', answer: '否' }, |
|
|
|
@ -247,9 +250,89 @@ const questionList = ref([ |
|
|
|
{ text: '是否存在变相执法,以咨询、培训、考核等名义行执法之实?', answer: '否' }, |
|
|
|
]); |
|
|
|
|
|
|
|
// ========== 字段映射工具:对后端多种字段名容错 ========== |
|
|
|
const pickFirst = (obj, keys, fallback = '') => { |
|
|
|
if (!obj) return fallback; |
|
|
|
for (const k of keys) { |
|
|
|
const v = obj[k]; |
|
|
|
if (v !== undefined && v !== null && v !== '') return v; |
|
|
|
} |
|
|
|
return fallback; |
|
|
|
}; |
|
|
|
|
|
|
|
// 解析执法人员 |
|
|
|
const parseEnforcers = (data) => { |
|
|
|
const list = []; |
|
|
|
if (data.lawEnforcer) list.push({ name: data.lawEnforcer, phone: data.lawEnforcerId || '' }); |
|
|
|
if (data.lawEnforcerTwo) list.push({ name: data.lawEnforcerTwo, phone: data.lawEnforcerIdTwo || '' }); |
|
|
|
const raw = data.enforcers || data.enforcerList || []; |
|
|
|
if (Array.isArray(raw) && raw.length) { |
|
|
|
raw.forEach(p => { |
|
|
|
if (typeof p === 'string') list.push({ name: p, phone: '' }); |
|
|
|
else list.push({ |
|
|
|
name: p.name || p.userName || p.realName || '', |
|
|
|
phone: p.phone || p.mobile || p.tel || '' |
|
|
|
}); |
|
|
|
}); |
|
|
|
} |
|
|
|
return list.filter(p => p.name); |
|
|
|
}; |
|
|
|
|
|
|
|
// 获取执法详情 |
|
|
|
const fetchRegistrationDetail = () => { |
|
|
|
if (!id) return; |
|
|
|
getEnforcementRegistrationDetailById({ id }, (res) => { |
|
|
|
const data = (res && (res.data || res.rows?.[0] || res)) || {}; |
|
|
|
detail.value = data.enforcementRegistrationVo |
|
|
|
|| {}; |
|
|
|
// 保存企业评价信息(可能为 null),用于已评价识别评价卡片是否显示 |
|
|
|
evaluateInfo.value = data.enterpriseEvaluateInfoVo || null; |
|
|
|
// 已评价:将后端评价数据回填到表单供只读展示 |
|
|
|
if (evaluateInfo.value) fillEvaluateFormFromInfo(evaluateInfo.value); |
|
|
|
}, () => { |
|
|
|
showToast('执法详情加载失败'); |
|
|
|
}); |
|
|
|
}; |
|
|
|
|
|
|
|
// satisfaction 文字 <-> 数字 映射:不满意=1、较满意=2、非常满意(满意)=3 |
|
|
|
const SATISFACTION_LIST = [ |
|
|
|
{ num: 1, text: '不满意' }, |
|
|
|
{ num: 2, text: '较满意' }, |
|
|
|
{ num: 3, text: '满意', alias: ['非常满意'] }, |
|
|
|
]; |
|
|
|
const SATISFACTION_TO_NUM = SATISFACTION_LIST.reduce((map, it) => { |
|
|
|
map[it.text] = it.num; |
|
|
|
(it.alias || []).forEach(a => { map[a] = it.num; }); |
|
|
|
return map; |
|
|
|
}, {}); |
|
|
|
const SATISFACTION_TO_TEXT = SATISFACTION_LIST.reduce((map, it) => { |
|
|
|
map[it.num] = it.text; |
|
|
|
return map; |
|
|
|
}, {}); |
|
|
|
|
|
|
|
// 将后端 enterpriseEvaluateInfoVo 回填到表单/问题列表 |
|
|
|
const fillEvaluateFormFromInfo = (info) => { |
|
|
|
evaluateForm.value = { |
|
|
|
satisfaction: SATISFACTION_TO_TEXT[Number(info.satisfaction)] || evaluateForm.value.satisfaction, |
|
|
|
civility: Number(info.serviceExperience) || 0, |
|
|
|
efficiency: Number(info.checkQuality) || 0, |
|
|
|
attitude: Number(info.checkAttitude) || 0, |
|
|
|
legality: Number(info.proceduralLegality) || 0, |
|
|
|
hasOtherIssues: String(info.otherProblemSwitch) === '1', |
|
|
|
}; |
|
|
|
questionList.value = questionList.value.map((q, idx) => ({ |
|
|
|
...q, |
|
|
|
answer: String(info['problem' + (idx + 1)]) === '1' ? '是' : '否', |
|
|
|
})); |
|
|
|
}; |
|
|
|
|
|
|
|
onMounted(() => { |
|
|
|
fetchRegistrationDetail(); |
|
|
|
}); |
|
|
|
|
|
|
|
// ========== 评分文字映射 ========== |
|
|
|
const getRatingText = (score) => { |
|
|
|
const map = { 1: '不满意', 2: '基本满意', 3: '满意', 4: '非常满意', 5: '非常满意' }; |
|
|
|
const map = { 1: '不满意', 2: '基本满意', 3: '满意', 4: '比较满意', 5: '非常满意' }; |
|
|
|
return map[score] || ''; |
|
|
|
}; |
|
|
|
|
|
|
|
@ -265,10 +348,30 @@ const onViewCaseDetail = () => { |
|
|
|
|
|
|
|
// ========== 提交评价 ========== |
|
|
|
const onSubmit = () => { |
|
|
|
showToast('评价提交成功'); |
|
|
|
setTimeout(() => { |
|
|
|
router.back(); |
|
|
|
}, 1500); |
|
|
|
if (readonly.value) return; |
|
|
|
// 按后端约定字段构造提交参数 |
|
|
|
const params = { |
|
|
|
enforcementRegistrationId: id, |
|
|
|
satisfaction: SATISFACTION_TO_NUM[evaluateForm.value.satisfaction] || 3, |
|
|
|
serviceExperience: evaluateForm.value.civility, // 执法文明 |
|
|
|
checkAttitude: evaluateForm.value.attitude, // 执法态度 |
|
|
|
checkQuality: evaluateForm.value.efficiency, // 执法效率 |
|
|
|
proceduralLegality: evaluateForm.value.legality, // 合法性 |
|
|
|
otherProblemSwitch: evaluateForm.value.hasOtherIssues ? 1 : 0, |
|
|
|
}; |
|
|
|
// 问题列表 problem1~problem5:是=1 否=0;关闭"其他问题"开关时全部传 0 |
|
|
|
questionList.value.forEach((q, idx) => { |
|
|
|
const val = evaluateForm.value.hasOtherIssues ? (q.answer === '是' ? 1 : 0) : 0; |
|
|
|
params['problem' + (idx + 1)] = val; |
|
|
|
}); |
|
|
|
submitEvaluate(params, () => { |
|
|
|
showToast('评价提交成功'); |
|
|
|
setTimeout(() => { |
|
|
|
router.back(); |
|
|
|
}, 1500); |
|
|
|
}, () => { |
|
|
|
showToast('评价提交失败'); |
|
|
|
}); |
|
|
|
}; |
|
|
|
</script> |
|
|
|
|
|
|
|
@ -538,4 +641,10 @@ const onSubmit = () => { |
|
|
|
box-shadow: 0 -2px 8px rgba(0, 0, 0, 0.05); |
|
|
|
z-index: 10; |
|
|
|
} |
|
|
|
|
|
|
|
/* ===== 只读状态可点击元素设置不可交互光标 ===== */ |
|
|
|
.emoji-item.disabled, |
|
|
|
.option-btn.disabled { |
|
|
|
cursor: not-allowed; |
|
|
|
} |
|
|
|
</style> |
|
|
|
|