青鸟ai,pc版仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

287 lines
7.0 KiB

<!-- 子菜单容器组件 -->
<script setup lang="ts">
import { ref } from 'vue'
import type { AppGroup, RoleData } from './index.d'
import { getAppList, getRole } from '@/api/base/role'
defineEmits(['handleRole', 'handleApply'])
const roleList = ref<RoleData[]>([])
const application = ref<AppGroup[]>([])
const typeIndex = ref(0)
// 角色
function getRoleData() {
getRole(1).then((res) => {
roleList.value = res
})
}
getRoleData()
// 应用
function getAppData() {
getAppList().then((res) => {
application.value = res
})
}
getAppData()
// 应用切换
function handleChange(index: number) {
typeIndex.value = index
}
</script>
<template>
<div class="app-role-default-box w-full h-full">
<div class="applicationsbox">
<div class="rolecounseling">
<div class="title">
角色咨询
</div>
<div class="role-box">
<div
v-for="(item, index) in roleList"
:key="index"
class="role-card"
@click="$emit('handleRole', item, index)"
>
<div class="top">
<div class="avatar">
<img :src="item.roleImg" class="roleImg" />
</div>
<div class="exchange">
交流
</div>
</div>
<div class="message">
<div class="role">
<div class="rolename">
{{ item.roleName }}
</div>
<div class="name">
{{ item.roleInfo }}
</div>
</div>
<div class="explain">
{{ item.remark }}
</div>
</div>
</div>
</div>
</div>
<div class="applicationbox">
<div class="title">
应用市场
</div>
<div class="type">
<div>
<div
v-for="(item, index) in application"
:key="index"
:class="typeIndex === index ? 'typename change' : 'typename'"
@click="handleChange(index)"
>
{{ item.groupName }}
</div>
</div>
<div v-if="application.length > 0" class="list-box">
<div
v-for="(item, index) in application[typeIndex].roleInfoAppModelList"
:key="index"
class="applyList"
@click="$emit('handleApply', item, index)"
>
<div class="img">
<img class="apple-img" :src="item.roleImg" />
<div class="name">
{{ item.roleName }}
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>
<style lang="scss" scoped>
@include app('role-default-box') {
.applicationsbox {
width: 100%;
.rolecounseling {
width: 100%;
max-height: 60vh;
overflow: auto;
.title {
font-size: 16px;
font-weight: 600;
color: #141515;
}
.role-box {
margin-top: 15px;
display: flex;
flex-wrap: wrap;
column-gap: 2%;
margin-top: 40px;
.role-card {
width: 23%;
height: 100px;
margin-bottom: 35px;
background: linear-gradient(169deg, #edf3ff 0%, #f7f9ff 100%);
// box-shadow: 1px 4px 10px 0px rgba(194, 205, 235, 0.49);
border-radius: 10px;
transition: all 0.3s linear 0s;
cursor: pointer;
&:hover {
box-shadow: 1px 4px 10px 0px rgba(194, 205, 235, 0.49);
}
.top {
display: flex;
position: relative;
.avatar {
margin-top: -20px;
padding-left: 25px;
font-size: 0;
.roleImg {
width: 55px;
height: 55px;
}
}
.exchange {
position: absolute;
top: 5px;
right: 0px;
width: 4px;
height: 30px;
background: #4670e3;
font-size: 0;
border-radius: 100px 0px 0px 100px;
transition: width 0.3s linear 0s;
}
}
.message {
width: 80%;
margin: 10px auto 0;
display: flex;
flex-direction: column;
justify-content: center;
.role {
display: flex;
align-items: center;
.rolename {
font-size: 15px;
font-weight: 600;
color: #253351;
}
.name {
margin-left: 30px;
font-size: 13px;
font-weight: 400;
color: #253351;
}
}
.explain {
font-size: 11px;
font-weight: 400;
color: #335d91;
line-height: 25px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
}
&:hover .exchange {
width: 70px;
background: #4670e3;
border-radius: 100px 0px 0px 100px;
text-align: center;
color: white;
line-height: 30px;
font-size: 14px;
font-weight: 500;
}
}
}
}
.applicationbox {
width: 100%;
padding: 20px 0px;
max-height: 50vh;
.title {
font-size: 16px;
font-weight: 600;
color: #141515;
}
.type {
display: flex;
flex-direction: column;
margin-top: 20px;
overflow: auto;
.typename {
cursor: pointer;
border-radius: 16px;
margin: 0 11px;
padding: 4px 8px;
font-size: 13px;
font-weight: 500;
display: inline-block;
&.change {
background: #236cff;
color: #ffffff;
}
}
.list-box {
margin-top: 20px;
display: flex;
flex-wrap: wrap;
.applyList {
display: flex;
flex-direction: column;
padding: 10px 15px;
.img {
position: relative;
overflow: hidden;
cursor: pointer;
.apple-img {
width: 100px;
height: 100px;
}
.name {
width: 100%;
position: absolute;
bottom: 0px;
left: 0;
text-align: center;
color: white;
font-size: 11px;
height: 25px;
border-bottom-left-radius: 5px;
border-bottom-right-radius: 5px;
line-height: 25px;
background-color: rgba(0, 0, 0, 0.5);
}
}
}
}
}
}
}
}
</style>