topPage.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794
  1. <template>
  2. <div>
  3. <div class="top">
  4. <div class="topBlock">
  5. <div class="topTit" style="display: flex;">
  6. <div>欢迎使用</div>
  7. <div style="color: #0354D7;margin: 0 15px;"><span v-if="userinfo.orgName">{{userinfo.orgName}}—</span>{{ userinfo.schoolName }}</div>
  8. <div>AI平台!</div>
  9. </div>
  10. <div class="topDetail">
  11. {{ fromL.basics.brief }}
  12. </div>
  13. </div>
  14. <img style="width: 96px;height: 96px;" src="../assets/img/root.png" alt="">
  15. <!-- <div v-if="fromL.basics.loginBanner" style="margin: 20px 0;border-radius: 10px;overflow: hidden;">
  16. <el-carousel :interval="5000" arrow="always">
  17. <el-carousel-item v-for="(item,index) in bannerL(fromL.basics.loginBanner)" :key="index">
  18. <img style="width: 100%;object-fit: cover;" :src="fromL.basics.loginBanner" alt="">
  19. </el-carousel-item>
  20. </el-carousel>
  21. </div> -->
  22. </div>
  23. <!-- 平台应用 -->
  24. <div class="TabList">
  25. <div
  26. @mouseenter="setHovered(index, true)"
  27. @mouseleave="setHovered(index, false)"
  28. class="TabListAll"
  29. @click="openApp(item)"
  30. v-for="(item,index) in tabList"
  31. :key="index+'1p'">
  32. <div class="TabListCon">
  33. <div v-for="(p,pin) in AppCon(item.url)" :key="pin+'p'">
  34. <img class="imgApp" v-if="tabList[index].hovered ? p.hoverIcon : p.platformIcon" :src="tabList[index].hovered ? p.hoverIcon : p.platformIcon" alt="">
  35. <div class="TabListName">
  36. {{ p.name }}
  37. </div>
  38. </div>
  39. <div class="TabListBri">
  40. <el-tooltip class="item" effect="light" :content="item.description" placement="bottom">
  41. <span>
  42. {{ item.description }}
  43. </span>
  44. </el-tooltip>
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. <!-- 常见应用 -->
  50. <div class="footCon">
  51. <div class="footConLeft">
  52. <img src="../assets/img/dong.png" alt="">
  53. </div>
  54. <div style="display: flex;gap: 16px;flex: 1;">
  55. <div class="footList">
  56. <div class="footListCon" v-for="(item,index) in admincocoFlow" @click="openNewWindow(item)" :key="index+'2p'">
  57. <div class="footListConimg">
  58. <img style="margin-bottom: 12px;height: 24px;width: 22px;"
  59. :src="appImgList[index]" alt=""></div>
  60. <div class="TabListName">{{ item.name }}</div>
  61. <div class="TabListBri">
  62. <el-tooltip class="item" effect="light" :content="item.detail" placement="bottom">
  63. <span>
  64. {{ item.detail }}
  65. </span>
  66. </el-tooltip>
  67. </div>
  68. <!-- <div class="cha" @click.stop="delApp(item.lid)">
  69. <img style="width: 20px;" src="../assets/img/cha.svg" alt="">
  70. </div> -->
  71. </div>
  72. </div>
  73. <div class="footList2">
  74. <div class="footList2Tit">
  75. 常见应用
  76. </div>
  77. <div v-for="(i,index) in (4 - CocoFlowList.length)" @click="openUsuallyApp"
  78. :key="index+'3p'" class="footListCon2">
  79. <div style="margin-bottom: 8px;font-size: 40px;color: #0354D7;">
  80. <img src="../assets/img/add.svg" alt="">
  81. </div>
  82. </div>
  83. <div class="footListCon6" v-for="(item,index) in CocoFlowList" @click="openNewWindow(item)" :key="index+'4p'">
  84. <div class="footListConimg">
  85. <img style="margin-bottom: 12px;height: 24px;width: 22px;" :src="JSON.parse(item.json).icon" alt="">
  86. </div>
  87. <div class="TabListName">{{ item.name }}</div>
  88. <div class="TabListBri">
  89. <el-tooltip class="item" effect="light" :content="item.detail" placement="bottom">
  90. <span>
  91. {{ item.detail }}
  92. </span>
  93. </el-tooltip>
  94. </div>
  95. <div class="cha" @click.stop="delApp(item.lid)">
  96. <img style="width: 20px;" src="../assets/img/cha.svg" alt="">
  97. </div>
  98. </div>
  99. </div>
  100. </div>
  101. </div>
  102. <!-- 常见应用弹框 -->
  103. <el-dialog
  104. title="应用列表"
  105. :visible.sync="dialogVisible"
  106. class="moreDia"
  107. :close-on-click-modal="false"
  108. :modal="false"
  109. width="60%"
  110. :before-close="handleClose">
  111. <div v-loading="loading" style="display: grid;grid-template-columns: repeat(auto-fit, minmax(300px, 1fr));gap: 16px;height: 300px;overflow: auto;">
  112. <div v-for="(item,index) in isAdd(usuallyList)" class="tabCon" @click="addApp(item.id)" :key="index+'6p'" style="min-width: 308px;">
  113. <div class="AppList">
  114. <img class="appImg" :src="JSON.parse(item.json).icon" alt="">
  115. <div class="con">
  116. <div class="tit">{{ item.name }}</div>
  117. <div class="bri">
  118. <el-tooltip class="item" effect="light" :content="item.detail" placement="bottom">
  119. <span>
  120. {{ item.detail }}
  121. </span>
  122. </el-tooltip>
  123. </div>
  124. </div>
  125. <div style="position: absolute;top: 6px;right: 15px;" v-if="tab.includes(item.id)">
  126. </div>
  127. </div>
  128. </div>
  129. </div>
  130. <div style="height: 45px;line-height: 45px;text-align: end;">
  131. <el-button @click="handleClose">取消</el-button>
  132. <el-button @click="addUsuallyApp" type="primary">确认</el-button>
  133. </div>
  134. </el-dialog>
  135. </div>
  136. </template>
  137. <script>
  138. import { mapGetters } from 'vuex';
  139. import store from '../store'
  140. import { API_CONFIG } from "@/common/apiConfig";
  141. export default {
  142. computed: {
  143. ...mapGetters(['userinfo','fromL']),
  144. // banner循环图
  145. // bannerL(){
  146. // return function(val){
  147. // console.log('val',val);
  148. // return val.split(',')
  149. // }
  150. // },
  151. // 如果hk,com没有图标,默认使用cn的
  152. AppCon(){
  153. return function(c) {
  154. let k = JSON.parse(JSON.stringify(c))
  155. let data = k.filter(e=>{
  156. return e.region == this.userinfo.schoolArea || e.region == this.userinfo.orgArea
  157. })
  158. let data2 = k.filter(e=>{
  159. return e.region == 'cn'
  160. })
  161. // 如果hk,com没有图标,默认使用cn的
  162. if (!data[0].icon){
  163. data[0].icon = data2[0].icon
  164. data[0].activeIcon = data2[0].activeIcon
  165. }
  166. return data
  167. };
  168. },
  169. // 筛选是否为管理员可见,是否被删除
  170. appSignL(){
  171. return function(val){
  172. let data = []
  173. if (this.userinfo.type == 1 && this.userinfo.role == 1) {
  174. val.forEach( e =>{
  175. if (e.menuName || e.status == 0) {
  176. data.push(e)
  177. }
  178. })
  179. } else {
  180. val.forEach( e =>{
  181. if (e.menuName || (e.isAdmin == '0' && e.status == 0)) {
  182. data.push(e)
  183. }
  184. })
  185. }
  186. return data
  187. }
  188. },
  189. // 判断是否被添加过
  190. isAdd(){
  191. return function(val){
  192. const difference = val.filter(item1 =>
  193. !this.CocoFlowList.some(item2 => item1.id === item2.id)
  194. );
  195. return difference
  196. }
  197. }
  198. },
  199. data() {
  200. return {
  201. dialogVisible:false,
  202. //常见ai应用列表(添加弹框)
  203. usuallyList:[],
  204. loading:false,
  205. //选中应用列表
  206. tab:[],
  207. // 管理平台添加常见cocoFlow应用
  208. admincocoFlow:[],
  209. // 用户ai应用数组
  210. CocoFlowList:[],
  211. // 平台工具
  212. tabList:[],
  213. appImgList:[
  214. require('../assets/img/img4.svg'),
  215. require('../assets/img/img1.svg'),
  216. require('../assets/img/img3.svg'),
  217. require('../assets/img/img5.svg'),
  218. require('../assets/img/img8.svg'),
  219. require('../assets/img/img2.svg'),
  220. require('../assets/img/img7.svg'),
  221. require('../assets/img/img6.svg'),
  222. ],
  223. hovList:[],
  224. }
  225. },
  226. methods: {
  227. setHovered(index, value) {
  228. // console.log(index, value);
  229. this.tabList[index].hovered = value;
  230. // console.log('this.tabList',this.tabList[index].hovered);
  231. },
  232. // 删除应用
  233. delApp(val){
  234. this.$confirm('确定删除吗', '提示', {
  235. confirmButtonText: '确定',
  236. cancelButtonText: '取消',
  237. type: 'warning'
  238. }).then(async () => {
  239. let params = [
  240. {
  241. functionName: API_CONFIG.ajax_del_usuallyApp.functionName,
  242. aid: val,
  243. },
  244. ];
  245. this.$ajax
  246. .post(API_CONFIG.baseUrl, params)
  247. .then(() => {
  248. this.$message.success('删除成功')
  249. this.getData()
  250. })
  251. .catch((err) => {
  252. console.log(err);
  253. this.$message.error("删除失败");
  254. });
  255. }).catch(() => {
  256. // 取消操作
  257. });
  258. },
  259. handleClose(){
  260. this.usuallyList= []
  261. this.tab= []
  262. this.dialogVisible = false
  263. },
  264. // 弹框选择添加应用
  265. addApp(val){
  266. // let data = this.CocoFlowList.filter(e=>{
  267. // return e.id == val
  268. // })
  269. // if (data.length != 0) return this.$message.info('常用列表已添加')
  270. let kpl = [...this.tab,...this.CocoFlowList]
  271. // console.log(kpl);
  272. const index = this.tab.indexOf(val);
  273. if (index !== -1) {
  274. this.tab.splice(index, 1); // 删除第一个匹配项
  275. } else {
  276. if (kpl.length > 3) return this.$message.info('只能添加四个常用应用哦')
  277. this.tab.push(val); // 添加元素到末尾
  278. }
  279. },
  280. // 打开常见应用弹框
  281. openUsuallyApp(){
  282. this.dialogVisible = true
  283. this.loading = true
  284. let params = [
  285. {
  286. functionName: API_CONFIG.ajax_usuallyApp.functionName,
  287. uid: this.userinfo.userid,
  288. cn: this.userinfo.schoolArea ? this.userinfo.schoolArea : this.userinfo.orgArea, //学校id
  289. },
  290. ];
  291. this.$ajax
  292. .post(API_CONFIG.baseUrl, params)
  293. .then((res) => {
  294. this.usuallyList = res.data[0]
  295. this.loading = false
  296. })
  297. .catch((err) => {
  298. console.log(err);
  299. this.loading = false
  300. this.$message.error("获取工具数据失败");
  301. });
  302. },
  303. // 添加常用确定按钮
  304. async addUsuallyApp(){
  305. const uploadYn = async files => {
  306. for (let index = 0; index < files.length; index++) {
  307. await this.XAdd(files[index]);
  308. console.log(index);
  309. }
  310. }
  311. await uploadYn(this.tab);
  312. console.log('完成了');
  313. this.getData()
  314. this.handleClose()
  315. },
  316. // 循环添加用户选择常见应用
  317. XAdd(val){
  318. return new Promise((resolve) => {
  319. let params = [
  320. {
  321. functionName: API_CONFIG.ajax_add_usuallyApp.functionName,
  322. oid:this.userinfo.organizeid,
  323. aid: val,
  324. uid: this.userinfo.userid,
  325. },
  326. ];
  327. this.$ajax
  328. .post(API_CONFIG.baseUrl, params)
  329. .then(() => {
  330. resolve(1)
  331. })
  332. .catch((err) => {
  333. console.log(err);
  334. });
  335. })
  336. },
  337. // 获取已添加cocoFlow应用
  338. getData(){
  339. let params = [
  340. {
  341. functionName: API_CONFIG.ajax_addedUsuallyApp.functionName,
  342. uid: this.userinfo.userid,
  343. },
  344. ];
  345. this.$ajax
  346. .post(API_CONFIG.baseUrl, params)
  347. .then((res) => {
  348. this.CocoFlowList = res.data[0]
  349. })
  350. .catch((err) => {
  351. console.log(err);
  352. this.$message.error("获取工具数据失败");
  353. });
  354. },
  355. siftCoco(){
  356. let data = []
  357. let val = JSON.parse(JSON.stringify(this.fromL.admin.index.list))
  358. // 用户是管理员全部展示
  359. if (this.userinfo.type == 1 && this.userinfo.role == 1) {
  360. val.forEach( e =>{
  361. if (e.menuName || e.status == 0) {
  362. data.push(e)
  363. }
  364. })
  365. } else {
  366. // 用户不是管理员,判断是否为用户可见 isAdmin 0普通用户 status是否被删除
  367. val.forEach( e =>{
  368. if (e.menuName || (e.isAdmin == '0' && e.status == 0)) {
  369. data.push(e)
  370. }
  371. })
  372. }
  373. this.tabList = data
  374. console.log('this.tabList',this.tabList);
  375. },
  376. getAdmincocoFlow(){
  377. // 筛选可用平台工具
  378. this.siftCoco()
  379. // console.log('getAdmincocoFlow',this.fromL);
  380. let appList=["2d05a12a-f0e7-11ef-b508-005056924926",
  381. "38ee6402-0539-11f0-b508-005056924926",
  382. "1c83613c-ffb7-11ef-b508-005056924926",
  383. "0d3d87bd-00b6-11f0-b508-005056924926",
  384. "ee61f383-0311-11f0-b508-005056924926",
  385. "701615ab-ffe8-11ef-b508-005056924926",
  386. "d1edef14-ef6f-11ef-b508-005056924926",
  387. "a8781a86-00d8-11f0-b508-005056924926"]
  388. // 如果后台预设常用ai工具为0则不执行
  389. if (this.fromL.admin.cocoFlow.length == 0) return
  390. let params = [
  391. {
  392. functionName: API_CONFIG.ajax_AdminApp.functionName,
  393. con: appList.join(','),
  394. },
  395. ];
  396. this.$ajax
  397. .post(API_CONFIG.baseUrl, params)
  398. .then((res) => {
  399. this.admincocoFlow = res.data[0]
  400. })
  401. .catch((err) => {
  402. console.log(err);
  403. this.$message.error("获取工具数据失败");
  404. });
  405. },
  406. // 打开平台应用
  407. async openApp(val){
  408. // 点击相同应用不刷新
  409. if (this.appSign == val.toolId) return
  410. // 更新标识
  411. await store.commit('user/SET_AppSIGN', val.toolId)
  412. let url = ''
  413. val.url.forEach(e => {
  414. // if (e.region == this.userinfo.schoolArea || e.region == this.userinfo.orgArea) {
  415. if (e.region == this.$region) {
  416. url = e.url
  417. }
  418. });
  419. let _userinfo = this.userinfo, //登录用户信息
  420. { userid: _userid, organizeid: _oid, type: _type, org: _org, role: _role, classid: _classId } = _userinfo; // 解构赋值获取用户信息
  421. const _TscreenType = 1, _SscreenType = 3; // 常量定义
  422. let queryString = ''
  423. if(val.argumentList && val.argumentList.length){
  424. const paramsMap = {
  425. userid: _userid,
  426. org: _org,
  427. oid: _oid,
  428. tType: _type,
  429. role: _role,
  430. classId: _classId,
  431. TscreenType: _TscreenType,
  432. SscreenType: _SscreenType
  433. };
  434. const canshu = val.argumentList
  435. .filter(param => paramsMap[param] !== undefined)
  436. .map(param => `${param}=${paramsMap[param]}`);
  437. queryString = canshu.length ? (url.includes('?') ? '&' : '?') + canshu.join('&') : ''; // 生成查询字符串
  438. }
  439. let _url = url + queryString
  440. console.log('_url',_url);
  441. let kpl = ` <iframe
  442. v-if="appSign && urlAddress"
  443. allow= "camera *; microphone *;display-capture;midi;encrypted-media;"
  444. frameborder="no"
  445. border="0"
  446. style="border:0;width:100%;height:100%;"
  447. src="${_url}"
  448. ref="pageCon"
  449. >
  450. </iframe>`
  451. let pl = {json:kpl ,stateL :true,toolId :val.toolId}
  452. // this.$emit('AddAppJson',pl)
  453. this.$emit('cutUrl',pl)
  454. // document.querySelector('#pageCon').innerHTML = '';
  455. // window.topU.U.MD.D.I.openApplicationWai(val.toolId, url, dom,val.argumentList)
  456. },
  457. // 打开CocoFlow应用
  458. openNewWindow(val) {
  459. console.log(val);
  460. // // 基本用法:打开指定 URL
  461. window.open(val.url, "_blank");
  462. },
  463. },
  464. }
  465. </script>
  466. <style scoped>
  467. /* 顶部区域 */
  468. .topBlock{
  469. display: flex;
  470. flex-direction: column;
  471. justify-content: space-between;
  472. }
  473. .topTit{
  474. font-size: 30px;
  475. height: 100%;
  476. color: #000;
  477. font-weight: 600;
  478. }
  479. .topDetail{
  480. color: #64748B;
  481. margin-top: 16px;
  482. }
  483. /* 平台应用 */
  484. .TabList{
  485. display: grid;
  486. grid-template-columns: repeat(3, 1fr);
  487. gap: 20px; /* 网格间距 */
  488. margin-bottom: 16px;
  489. }
  490. .TabListAll{
  491. position: relative !important;
  492. display: flex;
  493. justify-content: flex-end;
  494. }
  495. .imgApp{
  496. width: 120px;
  497. height: 140px;
  498. object-fit: contain;
  499. position: absolute;
  500. top: 50%;
  501. transform: translate(0,-50%) !important;
  502. left: 0px;
  503. }
  504. .TabListCon{
  505. width: 170px;
  506. height: 140px;
  507. padding: 24px;
  508. box-sizing: border-box;
  509. background-color: #fff;
  510. border-radius: 10px;
  511. width: calc(100% - 60px);
  512. transition: all 0.3s ease; /* 统一过渡效果 */
  513. background-size: 20px 20px;
  514. cursor: pointer;
  515. box-shadow: 0px 4px 10px 0px #0000000D;
  516. display: flex;
  517. flex-direction: column;
  518. justify-content: flex-end;
  519. align-items: end;
  520. }
  521. .TabListCon:hover{
  522. width: calc(100% - 50px);
  523. height: 125px;
  524. margin-right: 10px;
  525. box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
  526. }
  527. .TabListCon:hover TabListBri{
  528. -webkit-line-clamp: 2;
  529. width: 150px;
  530. }
  531. .TabListName{
  532. color: #1f2937;
  533. font-size: 16px;
  534. font-weight: 600;
  535. padding: 5px 0;
  536. margin-bottom: 4px;
  537. -webkit-line-clamp: 2;
  538. display: -webkit-box;
  539. -webkit-box-orient: vertical;
  540. overflow: hidden;
  541. text-overflow: ellipsis;
  542. }
  543. .TabListBri{
  544. color: #4b5563;
  545. font-size: 12px;
  546. -webkit-line-clamp: 1;
  547. display: -webkit-box;
  548. -webkit-box-orient: vertical;
  549. overflow: hidden;
  550. text-overflow: ellipsis;
  551. }
  552. .tabCon{
  553. transition: all 0.3s ease; /* 统一过渡效果 */
  554. border-radius: 10px;
  555. cursor: pointer;
  556. }
  557. /* 常见应用样式 */
  558. .footCon{
  559. display: flex;
  560. height: 350px;
  561. justify-content: space-between;
  562. box-sizing: border-box;
  563. border-radius: 10px;
  564. margin: 80px 0;
  565. /* background-image: radial-gradient(#E6F0FF 1px, transparent 1px); */
  566. background-size: 20px 20px;
  567. }
  568. /* 图片 */
  569. .footConLeft{
  570. width: 400px;
  571. box-sizing: border-box;
  572. display: flex;
  573. justify-content: center;
  574. align-items: center;
  575. }
  576. .footConLeft img{
  577. object-fit: contain;
  578. }
  579. /* 中间后面设置应用 */
  580. .footList{
  581. display: grid;
  582. grid-template-columns: repeat(4, 1fr);
  583. grid-template-rows: repeat(2, 1fr); /* 创建两行,每行高度相等 */
  584. gap: 16px; /* 网格间距 */
  585. flex: 2;
  586. }
  587. .footListCon{
  588. background-color: #fff;
  589. border-radius: 10px;
  590. box-shadow: 0px 0px 22.4px 0px #0000000D;
  591. padding: 16px;
  592. box-sizing: border-box;
  593. transition: all 0.3s ease; /* 统一过渡效果 */
  594. cursor: pointer;
  595. }
  596. .footListCon6{
  597. background-color: #fff;
  598. border-radius: 10px;
  599. box-shadow: 0px 0px 22.4px 0px #0000000D;
  600. padding: 16px;
  601. box-sizing: border-box;
  602. cursor: pointer;
  603. position: relative;
  604. }
  605. .footListCon6:hover .cha{
  606. display: block;
  607. }
  608. .footListCon:hover{
  609. transform: translate(-5px,-10px); /* 向上位移 */
  610. box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1);
  611. }
  612. .footListConimg{
  613. height: 40%;
  614. padding-top: 8px;
  615. box-sizing: border-box;
  616. }
  617. .cha{
  618. display: none;position: absolute;top: 10px;right: 10px;
  619. }
  620. .footListCon:hover .cha{
  621. display: block;
  622. }
  623. /* 添加常见应用区域 */
  624. .footList2{
  625. display: grid;
  626. grid-template-columns: repeat(2, 1fr);
  627. grid-template-rows: repeat(2, 1fr); /* 创建两行,每行高度相等 */
  628. gap: 16px;
  629. flex: 1;
  630. position: relative;
  631. }
  632. .footList2Tit{
  633. position: absolute;
  634. top: -30px;
  635. left: 0;
  636. font-family: PingFang SC;
  637. color: #000;
  638. }
  639. .footListCon2{
  640. display: flex;
  641. cursor: pointer;
  642. justify-content: center;
  643. flex-direction: column;
  644. align-items: center;
  645. border: 1px dashed #000000;
  646. box-sizing: border-box;
  647. border-radius: 12px;
  648. border-width: 1px;
  649. background-color: #E5E5E5;
  650. }
  651. .footListCon2:hover {
  652. background: #C9C9C9;
  653. }
  654. /* 弹框 */
  655. .moreDia >>> .el-dialog{
  656. border-radius: 10px;
  657. }
  658. .moreDia >>> .el-dialog__body{
  659. height: 345px;
  660. /* overflow: auto; */
  661. border-top: 1px #e7e7e7 solid;
  662. }
  663. /* 对号 */
  664. .top{
  665. display: flex;
  666. min-height: 144px;
  667. justify-content: space-between;
  668. background-color: #fff;
  669. align-items: center;
  670. padding: 24px;
  671. box-sizing: border-box;
  672. margin-bottom: 32px;
  673. border-radius: 10px;
  674. box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1)
  675. }
  676. .AppList{
  677. flex-wrap: wrap;display: flex;
  678. justify-content: space-between;
  679. border: 1px rgb(243 244 246 / var(--tw-border-opacity, 1)) solid;
  680. border-radius: 10px;padding: 16px;box-sizing: border-box;
  681. position: relative;
  682. }
  683. .appImg{
  684. width: 48px;
  685. height: 48px;
  686. border-radius: 50%;
  687. object-fit: cover;
  688. }
  689. .con{
  690. flex: 1;
  691. margin-left: 12px;
  692. display: flex;
  693. flex-direction: column;
  694. justify-content: center;
  695. }
  696. .tit{
  697. color: #1f2937;font-size: 16px;height: 24px;line-height: 24px;
  698. -webkit-line-clamp: 1;
  699. display: -webkit-box;
  700. -webkit-box-orient: vertical;
  701. overflow: hidden;
  702. text-overflow: ellipsis;
  703. }
  704. .bri{
  705. color: #6b7280;font-size: 12px;height: 16px;line-height: 16px;
  706. overflow: hidden;
  707. -webkit-line-clamp: 1;
  708. display: -webkit-box;
  709. -webkit-box-orient: vertical;
  710. overflow: hidden;
  711. text-overflow: ellipsis;
  712. }
  713. </style>