topPage.vue 33 KB

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