topPage.vue 36 KB

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