You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
dianshang-qianduan/src/views/digitalMarketTech/artificialIntelligence/components/Robot-learning.vue

881 lines
31 KiB
Vue

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div class="app-container2">
<div class="Robot-learning">
<div class="left">
<div class="gdialog">
<el-scrollbar height="620px" style="height: 93%;">
<el-row>
<el-col :span="24">
<div class="TaskBackground">
<span >任务背景</span>
</div>
</el-col>
</el-row>
<p style="color:#FFFFFF !important">假设我们要构建一个决策树来预测一个人是否会购买某个产品我们将使用以下特征来进行预测</p>
<p class="info"><img src="@/assets/images/szjj/年龄.png"/>年龄年龄范围在18岁到65岁之间</p>
<p class="info"><img src="@/assets/images/szjj/性别.png"/>性别男性或女性</p>
<p class="info"><img src="@/assets/images/szjj/收入.png"/>收入收入范围在0到100,000之间</p>
<p style="color:#FFFFFF !important">我们有一个包含以下数据的训练集</p>
<div class="tabback">
<el-table :data="TrainingSet" style="width: 100%" stripe>
<el-table-column type="index" label="编号" align="center" width="150"/>
<el-table-column prop="age" label="年龄" align="center" />
<el-table-column prop="sex" label="性别" align="center" />
<el-table-column prop="income" label="收入" align="center" />
<el-table-column prop="purchase" label="购买" align="center" />
</el-table>
</div>
<p style="color:#FFFFFF !important">现在我们将使用这些数据来构建一个决策树模型<br/>
我们可以使用信息增益或基尼不纯度等指标来选择最佳特征在这个例子中我们选择使用信息增益计算结果显示应该选择性别作为根节点<br/><br/>
接下来我们根据性别的取值男性或女性将数据集分割成两个子集<br/>
对于男性子集
</p>
<div class="tabback tab2">
<el-table :data="MaleSubset" style="width: 100%" stripe>
<el-table-column type="index" label="编号" align="center" width="150"/>
<el-table-column prop="age" label="年龄" align="center" >
<template #default="{row}">
<el-input v-model.trim="row.age" placeholder=""></el-input>
</template>
</el-table-column>
<el-table-column prop="income" label="收入" align="center" >
<template #default="{row}">
<el-input v-model.trim="row.income" placeholder=""></el-input>
</template>
</el-table-column>
<el-table-column prop="purchase" label="购买" align="center">
<template #default="{row}">
<el-input v-model.trim="row.purchase" placeholder=""></el-input>
</template>
</el-table-column>
</el-table>
</div>
<el-button @click="segmentation(MaleSubset,1,'男')" class="LeftbuttonS">分割</el-button>
<p style="color:#FFFFFF !important">对于女性子集</p>
<div class="tabback tab2">
<el-table :data="FemaleSubset" style="width: 100%" stripe>
<el-table-column type="index" label="编号" align="center" width="150"/>
<el-table-column prop="age" label="年龄" align="center" >
<template #default="{row}">
<el-input v-model.trim="row.age" placeholder="" ></el-input>
</template>
</el-table-column>
<el-table-column prop="income" label="收入" align="center" >
<template #default="{row}">
<el-input v-model.trim="row.income" placeholder=""></el-input>
</template>
</el-table-column>
<el-table-column prop="purchase" label="购买" align="center">
<template #default="{row}">
<el-input v-model.trim="row.purchase" placeholder="" ></el-input>
</template>
</el-table-column>
</el-table>
</div>
<el-button @click="segmentation(FemaleSubset,2,'女')" :disabled="state<2" class="LeftbuttonS">分割</el-button>
<p style="color:#FFFFFF !important"> 对于男性子集我们可以看到购买的结果是"是""否"都有所以我们需要进一步划分我们选择年龄作为下一个节点<br/>
对于年龄的取值小于等于30岁和大于30岁<br/>
对于小于等于30岁的子集
</p>
<div class="tabback tab3">
<el-table :data="greaterThan" style="width: 100%" stripe>
<el-table-column type="index" label="编号" align="center" width="150"/>
<el-table-column prop="income" label="收入" align="center" >
<template #default="{row}">
<el-input v-model="row.income" placeholder=""></el-input>
</template>
</el-table-column>
<el-table-column prop="purchase" label="购买" align="center" >
<template #default="{row}">
<el-input v-model.trim="row.purchase" placeholder=""></el-input>
</template>
</el-table-column>
</el-table>
</div>
<el-button @click="divide(greaterThan,3)" :disabled="state<3" class="LeftbuttonS">分割</el-button>
<p style="color:#FFFFFF !important">对于大于30岁的子集</p>
<div class="tabback tab3">
<el-table :data="lessThan" style="width: 100%" stripe>
<el-table-column type="index" label="编号" align="center" width="150"/>
<el-table-column prop="income" label="收入" align="center" >
<template #default="{row}">
<el-input v-model.trim="row.income" placeholder=""></el-input>
</template>
</el-table-column>
<el-table-column prop="purchase" label="购买" align="center" >
<template #default="{row}">
<el-input v-model.trim="row.purchase" placeholder=""></el-input>
</template>
</el-table-column>
</el-table>
</div>
<el-button @click="divide(lessThan ,4)" :disabled="state<4" class="LeftbuttonS">分割</el-button>
<p style="color:#FFFFFF !important">
对于小于等于30岁的子集购买的结果都是"否",所以我们不需要再进行划分。<br/>
对于大于30岁的子集购买的结果都是"是",所以我们不需要再进行划分。<br/>
对于女性子集,购买的结果都是"是",所以我们不需要再进行划分。<br/>
请根据上述过程绘制决策树:
</p>
<div class="DecisionTree">
<div class="titleimg">
<img src="@/assets/images/szjj/性别(2).png" alt="">
</div>
<div class="titleimg sex">
<span class="tetx"> <img src="@/assets/images/szjj/性别(1).png" alt="">性别</span>
</div>
<div class="information">
<div class="box">
<span class="tetx"><img src="@/assets/images/szjj/年龄1.png" alt="">年齡</span>
</div>
<div class="box" @click="Decisiontreepurchase('女','购买')">
<span class="tetx"><img src="@/assets/images/szjj/购买2.png" alt="">购买</span>
</div>
<div class="ipt">
<el-select
v-model="Conditions.sex"
size="large">
<el-option label="男" value="男"/>
<el-option label="女" value="女"/>
</el-select>
</div>
</div>
<div class="Consumption">
<div class="box1" @click="Decisiontreepurchase('男','购买')">
<span ><img src="@/assets/images/szjj/购买(1).png" alt="" >购买</span>
</div>
<div class="box1" @click="Decisiontreepurchase('男','不购买')">
<span ><img src="@/assets/images/szjj/减少.png" alt="">不购买</span>
</div>
<div class="ipt1">
<el-select
v-model="Conditions.age"
size="large">
<el-option label="大于三十" value="是"/>
<el-option label="小于等于三十" value="否"/>
</el-select>
</div>
</div>
</div>
<p style="color:#FFFFFF !important">上述例子是决策树相关的一个简单案例,实际中决策树可以用于金融领域的精准营销,利用大数据建模,分析客户年龄、收入、职业、历史信贷记录等信息,锁定哪些客户群里更有可能发生信贷风险,<br/>
哪些属于优质客户,更可能购买产品和服务等。<br/>
来源https://zhuanlan.zhihu.com/p/651602495
</p>
</el-scrollbar>
<div class="dialog-footer" style="margin-top: 7px;">
<el-button class="tj" @click="submit">提交任务</el-button>
<el-button class="tj" type="primary" @click="restart">重新开始</el-button>
</div>
</div>
</div>
<div class="right">
<span @click="robotlearningVisible=true"></span>
</div>
<el-dialog
custom-class="gdialog"
v-model="robotlearningVisible"
title="机器学习"
width="66%"
:before-close="handleCole"
>
<el-scrollbar height="600px">
<p>
机器学习是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。<br/><br/>
它是人工智能核心,是使计算机具有智能的根本途径。<br/>
机器学习是计算机科学的一个分支,它允许计算机在不被明确告知这些模式是什么的情况下,从数据中自动推断出模式。这些推断通常基于使用算法来自动检查数据的统计属性,并创建数学模型来表示不同数量之间的关系。<br/><br/>
让我们将其与传统计算进行对比,传统计算依赖于确定性系统,其中我们明确地告诉计算机一组规则来执行特定任务。这种计算机编程方法被称为基于规则的。机器学习与基于规则的编程的不同之处在于,它能够自己推断出这些规则。<br/><br/>
假设你是一名银行经理,你想弄清楚一个贷款申请人是否有可能拖欠贷款。在基于规则的方法中,银行经理(或其他专家)将明确地告诉计算机,如果申请人的信用评分低于阈值,则拒绝该申请。<br/><br/>
然而,机器学习算法只需要获取客户信用评分和贷款结果的历史数据,然后自己计算出这个阈值应该是多少。在这样做的过程中,机器从历史数据中学习并创建自己的规则。<br/><br/>
当然,这只是对机器学习的介绍,因为现实世界的机器学习模型通常比简单的阈值复杂得多。尽管如此,这仍然是一个很好的例子,说明机器学习可以有多么强大。<br/><br/>
只要您拥有相关数据任何组织KPI都可以进行优化。例如给定一个历史客户数据集您可以预测当前的哪些客户有离开的危险这样您就可以在流失发生之前阻止它。<br/><br/>
机器学习方法已经取得了巨大的进步,而且可以完成的远不止于此。从自动驾驶汽车到语音识别,再到标记收件箱垃圾邮件的自动电子邮件过滤系统,机器学习算法构成了我们今天所依赖的许多技术进步的基础。<br/><br/>
机器学习算法通常分为三大类:监督学习、无监督学习和强化学习。接下来,让我们了解一下不同类型的机器学习算法以及它们可以解决的特定类型的问题。<br/><br/>
<span class="headline">1 监督学习</span> <br/><br/>
监督学习指的是一类算法,在这种算法中,机器学习模型被赋予一组数据,这些数据带有我们感兴趣的数据的明确标签(这个标签通常被称为响应变量或目标变量)。半监督学习使用标记和未标记数据的组合来训练人工智能模型。<br/><br/>
如果处理的是无标签的数据,则需要对数据打上标签。打标签是对数据实例进行注释以帮助训练机器学习模型的过程。打标签通常由人工完成,这可能既昂贵又耗时。然而,有一些方法可以使打标签过程自动化。<br/><br/>
监督学习的一个很好的例子是我们前面考虑的贷款申请场景。在这里,我们有过去贷款申请人的信用评分(以及潜在的收入水平、年龄等)的历史数据,以及明确的标签,这些标签告诉我们这些申请人是否拖欠贷款。<br/><br/>
监督学习算法可以进一步细分为回归和分类。这个差异是指我们的目标变量的类型。如果目标是在几个离散的类别之间进行选择——例如,申请人是否拖欠贷款,这是一张猫、狗还是人的照片,等等——那么这个问题就被称为分类,因为我们正在试图给数据确定所属的类别。然而,如果我们的目标变量是连续的,那么这个问题就被称为回归。例如,根据卧室的数量和位置来预测房子的价格。<br/><br/>
常见的监督学习算法有线性回归、逻辑回归、支持向量机、决策树等<br/><br/>
<span class="headline">2 无监督学习</span> <br/><br/>
在无监督学习问题中,我们得到的数据没有标签,我们只是在寻找模式。常见的无监督学习算法有聚类分析、关联规则挖掘、降维和特征提取等。例如,给定亚马逊客户的购买历史,我们能否识别任何集群(类似客户的组)?<br/><br/>
在这种情况下,即使我们没有明确的、确定的数据,关于一个人的兴趣是什么,只要确定一个特定的客户群体购买了类似的商品,我们就可以根据集群中的其他人也购买了什么来进行购买推荐。类似的系统是亚马逊的“你可能也会感兴趣”推荐引擎的核心。<br/><br/>
K-means聚类是一种聚类模型它根据客户行为模式的相似性将客户群体分配到不同的集群或组中。在技术层面上它的工作原理是找到每个集群的质心然后将其用作集群的初始平均值。然后根据新客户与集群中其他成员的相似性将其分配到集群中。<br/><br/>
此外一旦我们确定了集群我们就可以研究它们的特征。例如假设我们看到一个给定的集群正在购买许多电子游戏。在这种情况下我们可以有根据地猜测这群用户是游戏玩家。一旦我们完成了这种形式的分析我们甚至可以使用无监督学习的标签来创建监督学习模型例如让我们能够预测一个25岁的玩家与一个50岁的钓鱼爱好者相比可能会在我们这里花多少钱。<br/><br/>
<span class="headline">3 </span><br/><br/>
强化学习是一类机器学习算法我们分配计算机代理执行某些任务而不给它确切的指导相反我们允许计算机做出自己的选择并根据这些选择是否会导致我们想要的结果我们分配惩罚和奖励我们多次重复这个过程让计算机通过试错和反复迭代来学习做某事的最佳方式<br/><br/>
有趣的是玩游戏是强化学习显示出最惊人结果的应用谷歌臭名昭著的AlphaGo模型就是利用强化学习建立起来的它甚至击败了排名最高的人类围棋选手此后谷歌将同样的技术扩展到了AlphaZero它是最初的AlphaGo的继承者被国际象棋选手用作确定最佳策略的参考<br/><br/>
</p>
</el-scrollbar>
</el-dialog>
</div>
</div>
</template>
<script setup>
import * as commonality from "@/api/commonality.js";
// import {getUserId} from "@/utils/auth.js";
import { getUserInfo } from '@/utils/auth'
const {proxy} = getCurrentInstance();
const robotlearningVisible = ref(false);
const TrainingSet=ref([
{
age:'25',
sex:'男',
income:'30000',
purchase:'否'
},
{
age:'35',
sex:'女',
income:'40000',
purchase:'是'
},
{
age:'45',
sex:'女',
income:'80000',
purchase:'是'
},
{
age:'20',
sex:'男',
income:'10000',
purchase:'否'
},
{
age:'55',
sex:'男',
income:'60000',
purchase:'是'
},
{
age:'60',
sex:'女',
income:'90000',
purchase:'是'
},
{
age:'30',
sex:'男',
income:'50000',
purchase:'否'
},{
age:'40',
sex:'女',
income:'75000',
purchase:'是'
}
])
const MaleSubset=ref([
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
])
const FemaleSubset=ref([
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
])
const greaterThan=ref([
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
])
const lessThan=ref([
{
age:'',
sex:'',
income:'',
purchase:''
}
])
const IncorrectScoring=ref(0)
const state=ref(1)
const Conditions=ref({
sex:'',
age:'',
})
const restartStatus=ref(false)
// 分割
const segmentation = (data,id,sex) => {
if(sex=='男'){
console.log(data,"data");
}
const women = TrainingSet.value.filter(item => item.sex === sex);
let isConsistent =null
let isVacancy =null
if (women.length === 0) {
console.log('没有女性数据');
return;
}
isVacancy=data.every(val=>!val.age || !val.income || !val.purchase)
if(isVacancy){
proxy.$modal.msgWarning('分割子集不能为空!')
return
}
data.forEach((item, outerIndex) => {
const dataItem = item; // 为清晰起见,使用一个新变量
isConsistent = women.some(womanItem => {
// 如果找到一个匹配的women项返回true
return (
womanItem.sex===sex&&
dataItem.age === womanItem.age &&
dataItem.income === womanItem.income &&
dataItem.purchase === womanItem.purchase
);
});
// 只比较第四个元素
});
if (!isConsistent) {
if(id==1){
IncorrectScoring.value=1
}else if(id==2){
IncorrectScoring.value=2
}
proxy.$modal.msgError('分割错误');
// 在这里可以添加更多逻辑,比如显示更具体的错误消息
} else {
proxy.$modal.msgSuccess('分割成功');
if(id==1){
state.value=2
}else if(id==2){
state.value=3
}
}
}
const divide=(data,id)=>{
let women=null
if(id==3){
women = TrainingSet.value.filter(item => item.age <= '30');
}else if(id==4){
women = TrainingSet.value.filter(item => item.age > '30');
}
let isConsistent =null
data.forEach((item, outerIndex) => {
if (!item.income || !item.purchase) {
proxy.$modal.msgError('请填写完整');
return;
}
const dataItem = item; // 为清晰起见,使用一个新变量
isConsistent= women.some(womanItem => {
// 如果找到一个匹配的women项返回true
return (
dataItem.income === womanItem.income &&
dataItem.purchase === womanItem.purchase
);
});
});
if(data.length){
if(!isConsistent){
if(id==3){
IncorrectScoring.value=3
}else if(id==4){
IncorrectScoring.value=4
}
proxy.$modal.msgError('划分错误');
}else{
if(id==3){
state.value=4
}else if(id==4){
state.value=5
}
proxy.$modal.msgSuccess('划分成功');
}
}
}
// 购买
const Decisiontreepurchase=(sex,buys)=>{
if(state.value<4){
proxy.$modal.msgWarning('');
return
}
if(sex==''){
if(Conditions.value.sex!==''){
IncorrectScoring.value=5
proxy.$modal.msgError('');
}else{
state.value=6
proxy.$modal.msgSuccess('');
}
}else{
if(Conditions.value.age!==''){
if(Conditions.value.age==''){
if(buys ==''){
state.value=5
proxy.$modal.msgSuccess('');
}else{
proxy.$modal.msgError('');
IncorrectScoring.value=5
}
}
}else{
console.log(buys,"buys");
if(buys ==''){
proxy.$modal.msgSuccess('');
}else{
proxy.$modal.msgError('');
IncorrectScoring.value=5
}
}
}
state.value=6
}
//
const submit=()=>{
if(state.value){
if(state.value<3){
return proxy.$modal.msgWarning('/!')
}
if( state.value<5){
return proxy.$modal.msgWarning('30/30!')
}
if(state.value<6){
return proxy.$modal.msgWarning('!')
}
}
commonality.submitTask({module:'',numberOfErrors:IncorrectScoring.value > 10 ? 10 : IncorrectScoring.value || 0,taskName:'机器人学习',userId:JSON.parse(getUserInfo()).userId}).then((response) => {
proxy.$modal.msgSuccess("提交任务成功");
restartStatus.value=false
robotlearningVisible.value=false
handleCole()
})
.catch((error) => {
});
}
// 保存
const handleCole=()=>{
const dtoList={}
dtoList.one=JSON.stringify(MaleSubset.value),
dtoList.two=JSON.stringify(FemaleSubset.value),
dtoList.three=JSON.stringify(greaterThan.value),
dtoList.four=JSON.stringify(lessThan.value),
dtoList.userId=JSON.parse(getUserInfo()).userId
dtoList.subState=state.value
dtoList.numberOfErrors=IncorrectScoring.value
robotlearningVisible.value=false
if(restartStatus.value) return
commonality.RobotSave(dtoList).then((response) => {
})
}
const getList=()=>{
commonality.RobotECho({userId:JSON.parse(getUserInfo()).userId}).then(res=>{
if(restartStatus.value) return
MaleSubset.value=JSON.parse(res.data.stepOneA)
FemaleSubset.value=JSON.parse(res.data.stepOneB)
greaterThan.value=JSON.parse(res.data.stepOneC)
lessThan.value=JSON.parse(res.data.stepOneD)
state.value=res.data.subState || 1
})
}
const restart=()=>{
state.value=0
restartStatus.value=true
robotlearningVisible.value=false
MaleSubset.value=[
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
]
FemaleSubset.value=[
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
]
greaterThan.value=[
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
{
age:'',
sex:'',
income:'',
purchase:''
},
]
lessThan.value=[
{
age:'',
sex:'',
income:'',
purchase:''
}
]
Conditions.value.sex=''
Conditions.value.age=''
}
getList()
//组件销毁钩子
onBeforeUnmount(() => {
handleCole()
})
</script>
<style lang='scss' scoped>
.Robot-learning {
display: flex;
.left {
position: relative;
width: 100%;
}
.right {
position: absolute;
top: 180px;
right: 41px;
width: 216px;
padding-left: 60px;
span {
display: inline-block;
width: 110px;
height: 143px;
background: url("@/assets/images/szjj/案例任务.png") no-repeat;
background-size: 100% 100%;
cursor: pointer;
}
}
.gdialog{
.TaskBackground{
span{
display: inline-block;
width: 181px;
height: 66px;
text-align: center;
line-height: 66px;
background: url("@/assets/images/szjj/任务背景.png") no-repeat !important;
background-size: 100% 100% !important;
font-family: Source Han Sans CN;
font-weight: bold;
font-size: 20px;
color: #333333;
}
}
.info{
display: flex;
align-items: center;
color:#FFFFFF !important;
img{
margin-right: 10px;
}
}
.tabback{
width: calc(100% - 30%);
padding: 13px 17px;
background: url('@/assets/images/szjj/圆角矩形 10 拷贝 3.png') no-repeat center center;
background-size: 100% 100%;
}
.tab2{
width: calc(100% - 40%);
margin-bottom: 20px;
}
.tab3{
width: calc(100% - 50%);
margin-bottom: 20px;
}
.DecisionTree{
position: relative;
width: calc(100% - 45%);
height: 316px;
padding: 12px 0px;
background: url('@/assets/images/szjj/圆角矩形 10 拷贝 3.png') no-repeat center center;
background-size: 100% 100%;
.titleimg{
display: flex;
justify-content: center;
margin-left: 12px;
}
.sex{
position: relative;
display: flex;
justify-content: center;
align-items: center;
margin-left: 12px;
margin-top: 10px;
height: 31px;
&::before{
content: '';
display: inline-block;
position: absolute;
top: 92%;
left: 30%;
width: 264px;
height: 58px;
background: url('@/assets/images/szjj/线条.png') no-repeat center center;
background-size: 100% 100%;
}
}
.information{
position: absolute;
top: 57%;
left: 20%;
display: flex;
gap: 116px;
.box{
width: 147px;
height: 31px;
background: linear-gradient(-90deg, #6C32E0 0%, #A365E2 100%);
border-radius: 4px;
border: 2px solid;
border-image: linear-gradient(0deg, #C0DCFF, #CBBAFF) 10 10;
}
.box:nth-child(1){
&::before{
content: '男';
position: absolute;
top: -98%;
left: 14%;
}
&::after{
content: '';
position: absolute;
top: 99%;
left: -2%;
width: 169px;
height: 66px;
background: url('@/assets/images/szjj/线条.png') no-repeat center center;
background-size: 100% 100%;
}
}
// .box:nth-child(2){
// &::before{
// content: '';
// position: absolute;
// top: -98%;
// left: 87%;
// width: 85px;
// height: 28px;
// line-height: 28px;
// text-align: center;
// background: #FFFFFF;
// border-radius: 2px;
// border: 1px solid #E5E5E5;
// }
// }
}
.ipt{
position: absolute;
top: -146%;
right: -6%;
width: 85px;
height: 28px !important;
// 不继承
}
.Consumption{
position: absolute;
bottom: 3%;
left: 12%;
display: flex;
gap: 90px;
.box1{
width: 90px;
height: 31px;
background: linear-gradient(-90deg, #6C32E0 0%, #A365E2 100%);
border-radius: 4px;
border: 2px solid;
border-image: linear-gradient(0deg, #C0DCFF, #CBBAFF) 10 10;
span{
display: inline-block;
display: flex;
align-items: center;
justify-content: center;
width: 90px;
line-height: 31px;
color: #FFFFFF;
text-align: center;
img{
margin-right: 10px;
}
}
}
.box1:nth-child(1){
&::before{
content: '大于30岁';
position: absolute;
top: -100%;
left:-20%;
width: 85px;
height: 28px;
line-height: 28px;
text-align: center;
background: #FFFFFF;
border-radius: 2px;
border: 1px solid #E5E5E5;
}
}
// .box1:nth-child(2){
// &::before{
// content: '小于等于30岁';
// position: absolute;
// top: -113%;
// left: 85%;
// width: 90px;
// height: 28px;
// line-height: 28px;
// text-align: center;
// background: #FFFFFF;
// border-radius: 2px;
// // border: 1px solid #E5E5E5;
// }
// }
.ipt1{
position: absolute;
top: -136%;
right: 89%;
width: 85px;
height: 28px !important;
// 不继承
}
}
.tetx{
display: flex;
align-items: center;
justify-content: center;
width: 147px;
text-align: center;
line-height: 29px;
background: linear-gradient(-90deg, #6C32E0 0%, #A365E2 100%);
border-radius: 4px;
border: 2px solid;
border-image: linear-gradient(0deg, #C0DCFF, #CBBAFF) 10 10;
font-family: Source Han Sans CN;
font-weight: 500;
font-size: 14px;
color: #FFFFFF;
img{
margin-right: 10px;
}
}
}
.LeftbuttonS{
width: 136px;
height: 40px;
background:url('@/assets/images/szjj/按钮1.png') no-repeat center center;
background-size: 100% 100%;
font-family: Source Han Sans CN;
font-weight: 500;
color: #FFFFFF;
border: none;
// cursor: pointer;
}
}
}
.tj{
--el-button-hover-text-color:#000000;
}
</style>