10 changed files with 401 additions and 13 deletions
@ -0,0 +1,14 @@
|
||||
import { defHttp } from '@/utils/axios/index' |
||||
|
||||
// 角色
|
||||
export async function getRole(type: number) { |
||||
return defHttp.get({ |
||||
url: `/open-chat/roleInfo/list?type=${type}`, |
||||
}) |
||||
} |
||||
// 应用
|
||||
export function getAppList() { |
||||
return defHttp.get({ |
||||
url: `/open-chat/roleInfo/app/group/list`, |
||||
}) |
||||
} |
@ -0,0 +1,20 @@
|
||||
export interface RoleData { |
||||
roleImg: string |
||||
roleName: string |
||||
roleInfo: string |
||||
remark: string |
||||
} |
||||
|
||||
interface RoleInfoAppModel { |
||||
id: number |
||||
roleName: string |
||||
roleType: string |
||||
roleInfo: string |
||||
roleImg: string |
||||
type: number |
||||
} |
||||
|
||||
export interface AppGroup { |
||||
groupName: string |
||||
roleInfoAppModelList: RoleInfoAppModel[] |
||||
} |
@ -0,0 +1,3 @@
|
||||
import AppRoleDefault from './index.vue' |
||||
|
||||
export { AppRoleDefault } |
@ -0,0 +1,293 @@
|
||||
<!-- 子菜单容器组件 --> |
||||
<script setup lang="ts"> |
||||
import { ref } from 'vue' |
||||
import type { AppGroup, RoleData } from './index.d' |
||||
import { getAppList, getRole } from '@/api/base/role' |
||||
|
||||
const roleList = ref<RoleData[]>([]) |
||||
const application = ref<AppGroup[]>([]) |
||||
const typeIndex = ref(0) |
||||
|
||||
// 角色 |
||||
function getRoleData() { |
||||
getRole(1).then((res) => { |
||||
roleList.value = res |
||||
}) |
||||
} |
||||
// 应用 |
||||
function getAppData() { |
||||
getAppList().then((res) => { |
||||
application.value = res |
||||
}) |
||||
} |
||||
getRoleData() |
||||
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" |
||||
> |
||||
<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" |
||||
> |
||||
<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-family: |
||||
PingFangSC, |
||||
PingFang SC; |
||||
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; |
||||
|
||||
cursor: pointer; |
||||
|
||||
.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: linear-gradient(131deg, #226aff 0%, #3fc6ff 100%); |
||||
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-family: |
||||
PingFangSC, |
||||
PingFang SC; |
||||
font-weight: 600; |
||||
color: #253351; |
||||
} |
||||
.name { |
||||
margin-left: 30px; |
||||
font-size: 13px; |
||||
font-family: |
||||
PingFangSC, |
||||
PingFang SC; |
||||
font-weight: 400; |
||||
color: #253351; |
||||
} |
||||
} |
||||
.explain { |
||||
font-size: 11px; |
||||
font-family: |
||||
PingFangSC, |
||||
PingFang SC; |
||||
font-weight: 400; |
||||
color: #335d91; |
||||
line-height: 25px; |
||||
white-space: nowrap; |
||||
overflow: hidden; |
||||
text-overflow: ellipsis; |
||||
} |
||||
} |
||||
&:hover .exchange { |
||||
width: 50px; |
||||
background: linear-gradient(131deg, #226aff 0%, #3fc6ff 100%); |
||||
border-radius: 100px 0px 0px 100px; |
||||
text-align: center; |
||||
color: white; |
||||
line-height: 30px; |
||||
font-size: 14px; |
||||
font-family: |
||||
PingFangSC, |
||||
PingFang SC; |
||||
font-weight: 500; |
||||
} |
||||
} |
||||
} |
||||
} |
||||
|
||||
.applicationbox { |
||||
width: 100%; |
||||
padding: 20px 0px; |
||||
max-height: 50vh; |
||||
.title { |
||||
font-size: 16px; |
||||
font-family: |
||||
PingFangSC, |
||||
PingFang SC; |
||||
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-family: |
||||
PingFangSC, |
||||
PingFang SC; |
||||
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> |
@ -0,0 +1,46 @@
|
||||
<script setup lang="ts"> |
||||
import { ref } from 'vue' |
||||
|
||||
import { AppContainerBox } from '@/components/AppContainerBox' |
||||
import { AppSubMenuTitle } from '@/components/AppSubMenuTitle' |
||||
import { AppSubMenuList } from '@/components/AppSubMenuList' |
||||
import { AppRoleDefault } from '@/components/AppRoleDefault' |
||||
import type { SubMenuItem } from '@/components/AppSubMenuList/index.d' |
||||
|
||||
const subMenuActive = ref(0) |
||||
const subMenuList = ref<SubMenuItem[]>([ |
||||
{ |
||||
title: '新对话1', |
||||
content: '这是一个新的对话哦;啦啦啦', |
||||
id: '1', |
||||
}, |
||||
{ |
||||
title: '新对话2', |
||||
content: '这是一个新的对话哦', |
||||
id: '2', |
||||
}, |
||||
]) |
||||
|
||||
function handleSubMenuChange(index: number) { |
||||
subMenuActive.value = index |
||||
} |
||||
</script> |
||||
|
||||
<template> |
||||
<AppContainerBox> |
||||
<template #subMenu> |
||||
<AppSubMenuTitle title="角色会话"></AppSubMenuTitle> |
||||
<!-- <div class="px-5 mb-5"> |
||||
<Button type="primary" class="w-full"> |
||||
新建会话 |
||||
</Button> |
||||
</div> --> |
||||
<AppSubMenuList :list="subMenuList" :active-index="subMenuActive" @change="handleSubMenuChange"></AppSubMenuList> |
||||
</template> |
||||
<template #content> |
||||
<AppRoleDefault></AppRoleDefault> |
||||
</template> |
||||
</AppContainerBox> |
||||
</template> |
||||
|
||||
<style scoped></style> |
Loading…
Reference in new issue