Compare commits

...

22 Commits

  1. 3
      App.vue
  2. 67
      common/meeting_common.js
  3. 163
      components/meet-navbar/meet-navbar.vue
  4. 165
      components/meet-pop/meet-pop.vue
  5. 37
      components/meet-sticky/meet-sticky.vue
  6. 4
      main.js
  7. 42
      meeting/common.scss
  8. 96
      meeting/components/record.vue
  9. 32
      meeting/index/index.vue
  10. 176
      meeting/login/index.vue
  11. 263
      meeting/online/index.vue
  12. 157
      meeting/onlineDetails/index.vue
  13. 43
      meeting/record/index.vue
  14. 266
      meeting/summary/index.vue
  15. 105
      meeting/user/about.vue
  16. 95
      meeting/user/doc.vue
  17. 128
      meeting/user/file.vue
  18. 134
      meeting/user/index.vue
  19. 166
      meeting/user/opinion.vue
  20. 33
      meeting/user/txt.vue
  21. 30
      meeting/utils/systeminfo.js
  22. 107
      pages.json
  23. 2
      pages/index/index.vue
  24. 20
      request/api.js
  25. 101
      request/index.js
  26. 161
      request/websocket.js
  27. BIN
      static/image/bg.png
  28. BIN
      static/image/login/icon1.png
  29. BIN
      static/image/login/icon2.png
  30. BIN
      static/image/login/icon3.png
  31. BIN
      static/image/login/icon4.png
  32. BIN
      static/image/login/icon5.png
  33. BIN
      static/image/login/icon6.png
  34. BIN
      static/image/online/bg.png
  35. BIN
      static/image/online/online.gif
  36. BIN
      static/image/online/pause.png
  37. BIN
      static/image/online/play.png
  38. BIN
      static/image/online/stop.png
  39. BIN
      static/image/online/toast.png
  40. BIN
      static/image/onlineDetails/ai.png
  41. BIN
      static/image/onlineDetails/list.png
  42. BIN
      static/image/onlineDetails/next.png
  43. BIN
      static/image/onlineDetails/play.png
  44. BIN
      static/image/onlineDetails/prev.png
  45. BIN
      static/image/onlineDetails/stop.png
  46. BIN
      static/image/onlineDetails/upload.png
  47. BIN
      static/image/summary/abstract.png
  48. BIN
      static/image/summary/add.png
  49. BIN
      static/image/summary/attendee .png
  50. BIN
      static/image/summary/btn_bg.png
  51. BIN
      static/image/summary/close.png
  52. BIN
      static/image/summary/edit.png
  53. BIN
      static/image/summary/key_word.png
  54. BIN
      static/image/summary/meet_title.png
  55. BIN
      static/image/summary/op.png
  56. BIN
      static/image/summary/points.png
  57. BIN
      static/image/summary/summary.png
  58. BIN
      static/image/summary/upcloud.png
  59. BIN
      static/image/user/alert-circle.png
  60. BIN
      static/image/user/doc.png
  61. BIN
      static/image/user/edit.png
  62. BIN
      static/image/user/flie.png
  63. BIN
      static/image/user/more.png
  64. BIN
      static/image/user/push.png
  65. BIN
      static/image/user/right.png
  66. BIN
      static/image/user/share.png
  67. BIN
      static/image/user/shear.png

@ -2,6 +2,9 @@
/* 注意要写在第一行,同时给style标签加入lang="scss"属性 */
@import "@/uni_modules/uview-ui/index.scss";
@import "@/static/css/iconfont.css";
page {
height: 100%;
}
</style>
<script>
export default {

@ -0,0 +1,67 @@
/**
* 页面跳转
* @author 深圳前海万联科技有限公司 <www.wanlshop.com>
*
* @param {Object} url 需要跳转的应用内非 tabBar 的页面的路径
* @param {Object} animationType 窗口显示的动画效果
* @param {Object} animationDuration 窗口动画持续时间单位为 ms
*/
export const to = (url, animationType = 'pop-in', animationDuration = 300) => {
on(url);
};
/**
* 打开任意链接
* @author 深圳前海万联科技有限公司 <www.wanlshop.com>
*
* @param {Object} url 页面地址
*/
export const on = (url, replace = false, reLaunch = false) => {
// url = decodeURIComponent(url);
console.log('onnnnn', url);
if (url.indexOf('pages') === 0) {
url = `/${url}`;
}
if (!/^\/?pages/.test(url) && url.indexOf('./') === -1) {
url = `./${url}`;
}
// const in_tabar = PAGES_JSON.tabBar.list.find((v, idx, obj) => {
// return url.replace('/pages', 'pages') == v.pagePath;
// });
// 关闭所有页面,跳转链接
console.log(in_tabar, url);
const in_tabar =false
if (in_tabar) {
uni.switchTab({
url: url,
});
} else {
const animationType = 'pop-in';
const animationDuration = 300;
let param = {
url,
animationType,
animationDuration,
success: function (res) {
// wanlshop_config.debug ? console.log(res) : '';
},
fail: function (e) {
// wanlshop_config.debug ? console.log(e) : '';
},
};
if (replace) {
uni.redirectTo(param);
} else if (reLaunch) {
uni.reLaunch(param);
} else {
uni.navigateTo(param);
}
}
};
export default {
to,
on,
}

@ -0,0 +1,163 @@
<template>
<view
class="top-nav"
:class="[isFixed ? 'pf' : 'p-relative']"
:style="{
backgroundColor: backgroundColor,
}"
>
<!-- 顶部 -->
<view class="nav" :style="{ height: navHeight + 'px' }">
<view
:style="{
paddingTop: statusHeight + 'px',
color: color,
}"
class="title"
>
<view class="content">
<!-- <image
v-if="iconType == 1"
class="left-jiantou"
:src="$metaCommon.static_url('left_back01.png')"
mode="aspectFill"
@click="goBack"
/>
<image
v-if="iconType == 2"
class="left-jiantou"
:src="$metaCommon.static_url('left_back02.png')"
mode="aspectFill"
@click="goBack"
/>
<image
v-if="iconType == 3"
class="left-jiantou"
:src="$metaCommon.static_url('left_back03.png')"
mode="aspectFill"
@click="goBack"
/> -->
<text v-if="iconType == 1" class="left-jiantou">1</text>
<text v-if="iconType == 2" class="left-jiantou">2</text>
<text v-if="iconType == 3" class="left-jiantou">3</text>
</view>
<view
class="font-700 font-size-34rpx"
:style="{
lineHeight: titleHeight + 'px',
}"
>
{{ title }}
<slot></slot>
</view>
<view class="right-content">
<slot name="right"></slot>
</view>
</view>
</view>
</view>
</template>
<script>
/**
* shoproEmpty- 数据为空页
* @property {String} title - 标题
* @property {String} color - 标题颜色
* @property {String} iconType - 返回箭头的类型选择 (1==透明 2==黑色)
* @property {String} delta - 返回的层级
* @property {Boolean} status - 是否启用自定义事件
* @property {Boolean} isFixed - 是否启用顶部固定定位
*/
import { sysInfo } from "../../meeting/utils/systeminfo"
export default {
name: "",
data() {
return {
navHeight: sysInfo.customBarHeight,
statusHeight: sysInfo.statusBarHeight,
titleHeight: sysInfo.titleBarHeight,
};
},
props: {
title: {
type: String,
default: "",
},
color: {
type: String,
default: "",
},
iconType: {
type: [String, Number],
default: 1,
},
delta: {
type: [Number, String],
default: 1,
},
status: {
type: Boolean,
default: true,
},
isFixed: {
type: Boolean,
default: true,
},
backgroundColor: {
type: String,
default: "none",
},
},
methods: {
goBack() {
if (this.status) {
uni.navigateBack({
delta: Number(this.delta),
});
} else {
this.$emit("goBack");
}
},
},
};
</script>
<style lang="scss" scoped>
.content {
position: relative;
}
.left-jiantou {
position: absolute;
width: 48rpx;
height: 48rpx;
left: 24rpx;
top: 20rpx;
}
.top-nav {
width: 100%;
// position: fixed;
z-index: 100001;
box-sizing: border-box;
}
.pf {
position: fixed;
}
.p-relative {
position: relative;
}
.title {
text-align: center;
}
.right-content {
position: absolute;
right: 24rpx;
top: 20rpx;
}
</style>

@ -0,0 +1,165 @@
<template>
<view class="mask" v-if="dialogShow" @click="handleHide">
<view class="content">
<view class="bg">
<view class="title">{{ dialogTitle }}</view>
<rich-text
class="text-[#4B4C50] text-[28rpx]"
:nodes="dialogContent"
:style="{
textAlign: textAlign,
}"
></rich-text>
</view>
<slot></slot>
<view
v-if="btnType == 1"
class="bg-[#D6B184] text-[#24272A] text-center rounded-md h-[80rpx] leading-[80rpx] font-bold mt-[48rpx]"
@click="handleHide"
>确定</view
>
<view class="flex justify-between pt-44" v-if="btnType == 2">
<view class="btn cancel-btn" @click="handleCancel">
{{ CancelText }}</view
>
<view
class="btn"
:style="{
background: backgroundColor,
color: color,
}"
@click="handleConfirm"
>
{{ ConfirmText }}</view
>
</view>
<!-- 登陆弹框 -->
<view class="flex justify-between mt-[50rpx]" v-if="btnType == 3">
<button
class="w-[226rpx] h-[80rpx] rounded-xl text-[30rpx] font-bold text-center leading-[80rpx]"
:style="{
background: backgroundColor,
color: color,
}"
open-type="getPhoneNumber"
@getphonenumber="getUserPhone"
>
确认
</button>
</view>
</view>
</view>
</template>
<script>
export default {
props: {
dialogShow: {
type: Boolean,
default: false,
},
dialogTitle: {
type: String,
default: "",
},
dialogContent: {
type: String,
default: "",
},
btnType: {
type: Number,
default: 1,
},
CancelText: {
type: String,
default: "取消",
},
ConfirmText: {
type: String,
default: "确定",
},
backgroundColor: {
type: String,
default: "#1467FF",
},
color: {
type: String,
default: "#fff",
},
textAlign: {
type: String,
default: "left",
},
},
data() {
return {};
},
methods: {
handleHide() {
this.$emit("handleHide");
},
handleCancel() {
this.$emit("handleCancel");
},
handleConfirm() {
this.$emit("handleConfirm");
},
getUserPhone(e) {
this.$emit("getUserPhone", e);
},
},
};
</script>
<style lang="scss" scoped>
@import "../../meeting/common.scss";
.title {
// text-[#202124] text-[30rpx] font-bold text-center mb-[32rpx]
color: #23262b;
font-size: 30rpx;
font-weight: bold;
text-align: center;
margin-bottom: 32rpx;
}
.btn {
width: 226rpx;
height: 80rpx;
line-height: 80rpx;
text-align: center;
font-weight: 700;
font-size: 30rpx;
border-radius: 16rpx;
box-sizing: border-box;
}
.cancel-btn {
border: 4rpx solid #1467ff;
color: #1467ff;
}
.mask {
position: fixed;
width: 100%;
height: 100%;
background: rgba(0, 0, 0, 0.5);
top: 0;
left: 0;
z-index: 100002;
.content {
width: 600rpx;
border-radius: 24rpx;
background: #fff;
box-sizing: border-box;
padding: 48rpx 60rpx 32rpx;
// background-image: url(#{$uni-base-url}icon28.png);
background-size: 100% 214rpx;
background-position: top;
background-repeat: no-repeat;
margin: 0 auto;
margin-top: 500rpx;
}
.borderColor {
border: 2rpx solid #d6b184;
}
}
</style>

@ -0,0 +1,37 @@
<template>
<u-sticky :customNavHeight="0">
<view
:style="{
background: bg,
}"
:class="isPadding ? 'px-[24rpx]' : ''"
class="mb-[20rpx]"
>
<slot></slot>
</view>
</u-sticky>
</template>
<script>
export default {
name: "",
data() {
return {};
},
props: {
bg: {
type: String,
default: "transparent",
},
isPadding: {
type: Boolean,
default: true,
},
},
onLoad(options) {},
methods: {},
};
</script>
<style lang="scss" scoped></style>

@ -18,7 +18,8 @@ import user from '@/config/user.js';
Vue.prototype.$user = user;
import com from '@/config/com.js';
Vue.prototype.$com = com;
import meeting_common from '@/common/meeting_common';
Vue.prototype.$meeting_common = meeting_common;
// #ifdef H5
import wechat from '@/config/wechat.js'
@ -27,6 +28,7 @@ Vue.prototype.$wechat =wechat;
// #ifndef VUE3
import Vue from 'vue'
import VueI18n from 'vue-i18n'

@ -0,0 +1,42 @@
.mb-20{
margin-bottom: 20rpx;
}
.mb-24{
margin-bottom: 24rpx;
}
.mb-30{
margin-bottom: 30rpx;
}
.mb-40{
margin-bottom: 40rpx;
}
.mb-48{
margin-bottom: 48rpx;
}
.pt-44{
padding-top: 44rpx;
}
/* ========布局========== */
.flex{
display: flex;
}
.justify-center{
justify-content: center;
}
.justify-between{
justify-content: space-between;
}
.items-center{
align-items: center;
}
/* -=======背景======= */
// .bg{
// min-height: 100vh;
// background-image: url('/static/image/bg.png');
// background-repeat: no-repeat;
// background-size: cover;
// }

@ -0,0 +1,96 @@
<template>
<view>
<view class="record-item mb-24">
<view class="flex justify-between items-center">
<view class="mb-20 title">
这是一个标题
<text class="status" :class="status[1]"> 这是状态 </text>
</view>
<view @click.stop="upMask"> 1111 </view>
</view>
<view class="flex justify-between items-center txt">
<view> 这是时间 </view>
<view class="">这是时长</view>
</view>
<view class="mask" v-if="popup">
<view>导出</view>
<view>重命名</view>
<view>删除</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
status: ["wait", "success"],
popup: false,
};
},
methods: {
upMask() {
this.popup = !this.popup;
},
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.status {
// line-height: 40rpx;
padding: 4rpx 16rpx;
border: 1rpx solid;
border-radius: 8rpx;
margin-left: 12rpx;
font-weight: 400;
font-size: 24rpx;
}
.wait {
border: #1467ff 1rpx solid;
color: #1467ff;
background-color: #1466ff11;
}
.success {
border: #1eb066 1rpx solid;
color: #1eb066;
background-color: #1eb06611;
}
.mask {
position: absolute;
width: 168rpx;
height: 232rpx;
background-color: #fff;
border-radius: 16rpx;
top: 80rpx;
right: 16rpx;
padding: 24rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.record-item {
position: relative;
// height: 168rpx;
border-radius: 24rpx;
border: 2rpx #fff solid;
padding: 32rpx 24rpx;
padding-bottom: 36rpx;
.title {
font-weight: 700;
font-size: 28rpx;
color: #23262b;
line-height: 40rpx;
}
.txt {
font-weight: 400;
font-size: 28rpx;
color: #4b5158;
}
}
</style>

@ -0,0 +1,32 @@
<template>
<div>
<meet-navbar title="Ai会议助手" :isFixed="false"></meet-navbar>
<div>
<u-button :customStyle="customStyle1">立即开始会议</u-button>
</div>
</div>
</template>
<script>
export default {
data() {
return {
customStyle1: {
width: "558rpx",
height: "80rpx",
borderRadius: "16rpx",
backgroundColor: "#1467FF",
color: '#fff',
fontSize: "30rpx",
fontWeight: "700",
},
};
},
};
</script>
<style>
</style>

@ -0,0 +1,176 @@
<template>
<view class="bg container">
<meet-sticky :bg="bg">
<meet-navbar title="" :isFixed="false"></meet-navbar>
</meet-sticky>
<view class="content">
<view v-if="type == 1">
<view class="text-1">密码登录</view>
<view class="input-1">
<image class="img" src="/static/image/login/icon1.png"></image>
<u--input placeholder="请输入手机号" border="surround" v-model="mobile" clearable></u--input>
</view>
<view class="input-1">
<image class="img" src="/static/image/login/icon2.png"></image>
<u--input placeholder="请输入密码" border="surround" v-model="mobile" clearable></u--input>
</view>
<view class="loginBtn">登陆</view>
<view class="text-2">验证码登录</view>
</view>
<view v-if="type == 2">
<view class="text-1 mb-16">验证码登录</view>
<view class="text-4">若手机号未注册我们将为您自动注册</view>
<view class="input-1">
<image class="img" src="/static/image/login/icon1.png"></image>
<u--input placeholder="请输入手机号" border="surround" v-model="mobile" clearable></u--input>
</view>
<view class="input-1">
<image class="img" src="/static/image/login/icon6.png"></image>
<u--input placeholder="请输入验证码" border="surround" v-model="mobile" clearable></u--input>
<view class="text-3">获取验证码</view>
</view>
<view class="loginBtn">登陆</view>
<view class="text-2">密码登录</view>
</view>
</view>
<!-- footer -->
<view class="footer">
<image class="img01" src="/static/image/login/icon3.png"></image>
<view class="footer-text">使用微信登录</view>
<view class="footer-icon">
<image class="img02" src="/static/image/login/icon4.png"></image>
<view class="footer-text-1">已阅读并接受AI会议助手隐私用户协议</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
bg: "",
mobile: "",
type: 2,//1 2
};
},
methods: {
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.container {
min-height: 100vh;
background-color: #d1dcfe;
padding: 20rpx 0;
.content {
box-sizing: border-box;
padding: 0 64rpx;
padding-top: 100rpx;
.text-1 {
font-size: 40rpx;
font-weight: bold;
color: #23262B;
margin-bottom: 48rpx;
}
.input-1 {
border: 1px solid #fff;
border-radius: 24rpx;
height: 88rpx;
background: #F0F7FF;
display: flex;
align-items: center;
box-sizing: border-box;
padding: 0 32rpx;
margin-bottom: 32rpx;
.img {
width: 36rpx;
height: 36rpx;
}
::v-deep .u-input {
border: 0;
}
.text-3 {
color: #1467FF;
font-size: 28rpx;
width: 150rpx;
display: block;
}
}
.text-4 {
color: #4B5158;
font-size: 28rpx;
margin-bottom: 48rpx;
}
.mb-16 {
margin-bottom: 16rpx;
}
.loginBtn {
background: #1467FF;
border-radius: 16rpx;
height: 80rpx;
line-height: 80rpx;
text-align: center;
color: #fff;
font-size: 30rpx;
margin-top: 88rpx;
}
.text-2 {
text-align: center;
color: #1467FF;
font-size: 28rpx;
margin-top: 40rpx;
}
}
.footer {
position: fixed;
bottom: 100rpx;
width: 100%;
box-sizing: border-box;
.img01 {
width: 64rpx;
height: 64rpx;
display: block;
margin: 0 auto;
}
.footer-text {
text-align: center;
margin-top: 6rpx;
color: #4B5158;
font-size: 28rpx;
}
.footer-icon{
padding: 0 64rpx;
display: flex;
box-sizing: border-box;
align-items: center;
margin-top: 40rpx;
.img02{
width: 32rpx;
height: 32rpx;
margin-right: 16rpx;
}
.footer-text-1{
color: #4B5158;
font-size: 28rpx;
}
}
}
}
</style>

@ -0,0 +1,263 @@
<template>
<div class="container">
<meet-sticky :bg="bg">
<meet-navbar title="会议中" :isFixed="false"></meet-navbar>
</meet-sticky>
<view class="list" v-for="(item, index) in 10">
<view class="flex-left color-1">1</view>
<view class="flex-child">
<view class="flex-center">我公司碳中和具体的应用场景包括以下几方面:1.碳丝路APP-全民低碳场景的数据收集 碳普惠应用 2.全国性碳交易平台数据</view>
<view class="flex-right">5"</view>
</view>
</view>
<view class="footer">
<image class="icon01" src="/static/image/online/online.gif"></image>
<view class="footer-center">
<view class="text-1">正在录音中</view>
<view class="text-2"><span>00:12</span>/02:00:00</view>
</view>
<view class="footer-icon" @click="startRecord()" v-if="isRecording == false">
<image class="img" src="/static/image/online/play.png"></image>
<view class="text-1">开始</view>
</view>
<view class="footer-icon" @click="endRecord()" v-if="isRecording == true">
<image class="img" src="/static/image/online/pause.png"></image>
<view class="text-1">结束</view>
</view>
<view class="footer-icon">
<image class="img" src="/static/image/online/stop.png"></image>
<view class="text-1">结束</view>
</view>
</view>
<!-- 弹框 -->
<meet-pop :dialogShow="popConfig.show" :btnType="popConfig.btnType" :dialogTitle="popConfig.title"
:CancelText="popConfig.CancelText" :ConfirmText="popConfig.ConfirmText" @handleConfirm="confirm"
@handleCancel="cancel">
<view class="popClass">
结束后无法在本记录继续录音
</view>
</meet-pop>
</div>
</template>
<script>
const recorderManager = uni.getRecorderManager();
const innerAudioContext = uni.createInnerAudioContext();
innerAudioContext.autoplay = true;
export default {
components: {
},
data() {
return {
list: [],
popConfig: {
show: false,
btnType: 2,
title: "确定结束录音吗?",
CancelText: "在考虑下",
ConfirmText: "结束录音"
},
//
recorderManager: null,
innerAudioContext: {},
isRecording: false,
ws: null,
webSocketUrl: "",
VITE_APP_WS: "wss://u140106-8027-537a5c07.westx.seetacloud.com:8443/api/stt/service"
};
},
onLoad() {
// this.recorderManager = uni.getRecorderManager();
// console.log('recorderManager', this.recorderManager);
// innerAudioContext.autoplay = true;
// console.log("uni.getRecorderManager()", uni.getRecorderManager())
// console.log("uni.createInnerAudioContext()", uni.createInnerAudioContext())
// let self = this;
// recorderManager.onStop(function (res) {
// console.log('recorder stop' + JSON.stringify(res));
// self.voicePath = res.tempFilePath;
// });
this.initWebSocket();
},
methods: {
async initWebSocket() {
let url = this.VITE_APP_WS;
var audio_type = "mic_stream";
var hot_words = "碳丝路 元梦空间";
var hot_words2 = "碳丝路元梦空间";
var language = "zh";
var sample_rate = "16000";
var timestamp = Math.floor(Date.now() / 1000);
var api_key = "AT_syAHhLp3vqOA!@+T9Cocxc0^6z@^9";
var auth = `api_key=${api_key}&audio_type=${audio_type}&hot_words=${hot_words2}&language=${language}&sample_rate=${sample_rate}&stream=True&timestamp=${timestamp}`;
const sign = await this.sha256(auth);
url = `${url}?audio_type=${audio_type}&hot_words=${encodeURIComponent(hot_words)}&language=${language}&sample_rate=${sample_rate}&timestamp=${timestamp}&api_key=${encodeURIComponent(api_key)}&auth=${sign}`;
createdWebSocket(url);
},
async sha256(str) {
//
const encoder = new TextEncoder();
const data = encoder.encode(str);
// SubtleCrypto APISHA-256
return crypto.subtle.digest("SHA-256", data).then(buffer => {
//
const hexArray = Array.from(new Uint8Array(buffer));
const hexString = hexArray
.map(byte => byte.toString(16).padStart(2, "0"))
.join("");
return hexString;
});
},
confirm() {
this.popConfig.show = false;
},
cancel() {
this.popConfig.show = false;
},
startRecord() {
console.log('开始录音');
if (this.isRecording) return;
this.isRecording = true;
// const recorderManager = this.recorderManager;
const options = {
duration: 60000, // ms
sampleRate: 8000, //
numberOfChannels: 1, // channel
encodeBitRate: 44100, //
format: 'mp3', // 'aac' 'mp3'
frameSize: 20
};
recorderManager.start(options);
recorderManager.onStart(() => {
console.log('录音开始');
});
recorderManager.onFrameRecorded((res) => {
//
const { frameBuffer } = res;
console.log(frameBuffer);
});
},
endRecord() {
this.isRecording = false;
// const recorderManager = this.recorderManager;
recorderManager.onStop((res) => {
console.log('录音结束', res.tempFilePath);
});
},
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.container {
min-height: 100vh;
background-color: #d1dcfe;
padding: 20rpx 0;
padding-bottom: 200rpx;
.list {
display: flex;
margin-top: 36rpx;
padding: 0 24rpx;
.flex-left {
width: 56rpx;
height: 56rpx;
font-size: 36rpx;
line-height: 56rpx;
text-align: center;
border-radius: 50%;
color: #fff;
font-weight: bold;
}
.color-1 {
background-color: #70CD9E;
}
.flex-child {
display: flex;
align-items: flex-end;
flex: 1;
.flex-center {
margin: 0 16rpx 0 16rpx;
border: 1px solid #fff;
background-color: rbga(255, 255, 255, 0.5);
border-radius: 16rpx;
box-sizing: border-box;
padding: 16rpx 24rpx;
}
.flex-right {
color: #23262B;
font-size: 28rpx;
}
}
}
.footer {
background: rgba(255, 255, 255, 1);
border-top-right-radius: 40rpx;
border-top-left-radius: 40rpx;
position: fixed;
bottom: 0;
width: 100%;
height: 180rpx;
display: flex;
box-sizing: border-box;
padding: 12rpx 24rpx;
.icon01 {
width: 88rpx;
height: 88rpx;
border-radius: 24rpx;
margin-right: 24rpx;
}
.footer-center {
flex: 1;
.text-1 {
color: #23262B;
font-size: 28rpx;
}
.text-2 {
color: #93999F;
font-size: 24rpx;
span {
color: #23262B;
}
}
}
.footer-icon {
margin-right: 56rpx;
.img {
width: 48rpx;
height: 48rpx;
}
.text-1 {
color: #23262B;
font-size: 22rpx;
}
}
}
.popClass {
text-align: center;
color: #4B5158;
font-size: 28rpx;
}
}
</style>

@ -0,0 +1,157 @@
<template>
<div class="container">
<meet-sticky :bg="bg">
<meet-navbar title="会议中" :isFixed="false"></meet-navbar>
</meet-sticky>
<view class="list" v-for="(item, index) in 10" @click="">
<view class="flex-left color-1">1</view>
<view class="flex-child">
<view class="flex-center">我公司碳中和具体的应用场景包括以下几方面:1.碳丝路APP-全民低碳场景的数据收集 碳普惠应用 2.全国性碳交易平台数据</view>
<view class="flex-right">5"</view>
</view>
</view>
<view class="footer">
<view class="flex-1">
<image class="img" src="/static/image/onlineDetails/list.png"></image>
<view class="text">会议总结</view>
<image class="img-top" src="/static/image/onlineDetails/ai.png"></image>
<view class="time">00:05/01:55</view>
</view>
<image class="img01" src="/static/image/onlineDetails/prev.png"></image>
<image class="img02" src="/static/image/onlineDetails/play.png"></image>
<image class="img01" src="/static/image/onlineDetails/next.png"></image>
<view class="flex-1">
<image class="img" src="/static/image/onlineDetails/upload.png"></image>
<view class="text">导出</view>
</view>
</view>
</div>
</template>
<script>
export default {
components: {
},
data() {
return {
list: [],
};
},
methods: {
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.container {
min-height: 100vh;
background-color: #d1dcfe;
padding: 20rpx 0;
padding-bottom: 200rpx;
.list {
display: flex;
margin-top: 36rpx;
padding: 0 24rpx;
.flex-left {
width: 56rpx;
height: 56rpx;
font-size: 36rpx;
line-height: 56rpx;
text-align: center;
border-radius: 50%;
color: #fff;
font-weight: bold;
}
.color-1 {
background-color: #70CD9E;
}
.flex-child {
display: flex;
align-items: flex-end;
flex: 1;
.flex-center {
margin: 0 16rpx 0 16rpx;
border: 1px solid #fff;
background-color: rbga(255, 255, 255, 0.5);
border-radius: 16rpx;
box-sizing: border-box;
padding: 16rpx 24rpx;
}
.flex-right {
color: #23262B;
font-size: 28rpx;
}
}
}
.footer {
background: rgba(255, 255, 255, 1);
border-top-right-radius: 40rpx;
border-top-left-radius: 40rpx;
position: fixed;
bottom: 0;
width: 100%;
height: 180rpx;
display: flex;
box-sizing: border-box;
padding: 12rpx 48rpx;
align-items: center;
justify-content:space-between;
.flex-1{
position: relative;
.img{
width: 48rpx;
height: 48rpx;
display: block;
margin: 0 auto;
}
.img-top{
position: absolute;
top: -30rpx;
right: -50rpx;
width: 84rpx;
height: 34rpx;
}
.time{
position: absolute;
box-sizing: border-box;
padding: 8rpx 20rpx;
text-align: center;
color: #23262B;
font-size: 24rpx;
border: 1px solid #fff;
background: #E9EBF4;
border-top-left-radius: 16rpx;
border-top-right-radius: 16rpx;
top: -100rpx;
right: -90rpx;
}
}
.img01{
width:48rpx ;
height: 48rpx;
}
.img02{
width: 80rpx;
height: 80rpx;
}
.text{
color: #23262B;
font-weight: bold;
font-size: 22rpx;
text-align: center;
}
}
}
</style>

@ -0,0 +1,43 @@
<template>
<div class="container">
<meet-sticky :bg="bg">
<meet-navbar title="会议记录" :isFixed="false"></meet-navbar>
</meet-sticky>
<div>
<div class="mb-30">
<u-search
placeholder="日照香炉生紫烟"
v-model="keyword"
:showAction="false"
></u-search>
</div>
<view>
<record-item v-for="item in 1" :key="item"></record-item>
</view>
</div>
</div>
</template>
<script>
import recordItem from "../components/record.vue";
export default {
components: {
recordItem,
},
data() {
return {
keyword: "遥看瀑布挂前川",
bg: "",
};
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.container {
min-height: 100vh;
background-color: #d1dcfe;
padding: 20rpx 24rpx;
}
</style>

@ -0,0 +1,266 @@
<template>
<view class="bg container">
<meet-sticky :bg="bg">
<meet-navbar title="会议总结" :isFixed="false"></meet-navbar>
</meet-sticky>
<view class="content">
<!-- 会议标题 -->
<view class="border-item">
<image
src="/static/image/summary/meet_title.png"
mode="scaleToFill"
class="img-item"
/>
<view class="title"> 00 </view>
</view>
<!-- 关键词 -->
<view class="border-item">
<image
src="/static/image/summary/key_word.png"
mode="scaleToFill"
class="img-item"
/>
<view class="flex key-box">
<view class="key-item flex items-center">
<view>蔡徐坤</view>
<image
src="/static/image/summary/close.png"
mode="scaleToFill"
class="close"
/>
</view>
<image
src="/static/image/summary/add.png"
mode="scaleToFill"
class="add"
@click="add"
/>
</view>
</view>
<!-- 参会人 -->
<view class="border-item">
<image
src="/static/image/summary/attendee .png"
mode="scaleToFill"
class="img-item"
/>
<view class="flex key-box">
<view class="key-item flex items-center">
<view>蔡徐坤</view>
<image
src="/static/image/summary/edit.png"
mode="scaleToFill"
class="close"
@click="edit"
/>
</view>
</view>
</view>
<!-- 会议总结 -->
<view class="border-item">
<image
src="/static/image/summary/summary.png"
mode="scaleToFill"
class="img-item"
/>
<view class="title">
AI会议智能助手需求评审会AI会议智能助手需求评审会AI会议智能助手需求评审会AI会议智能助手需求评审会
</view>
</view>
<!-- 会议摘要 -->
<view class="border-item">
<image
src="/static/image/summary/abstract.png"
mode="scaleToFill"
class="img-item"
/>
<view class="title">
AI会议智能助手需求评审会AI会议智能助手需求评审会AI会议智能助手需求评审会AI会议智能助手需求评审会
</view>
</view>
<!-- 会议要点-->
<view class="border-item">
<image
src="/static/image/summary/points.png"
mode="scaleToFill"
class="img-item"
/>
<view class="title">
AI会议智能助手需求评审会AI会议智能助手需求评审会AI会议智能助手需求评审会AI会议智能助手需求评审会
</view>
</view>
<!-- 底部 -->
<view class="footer flex">
<view class="btn push">
<image
src="/static/image/summary/upcloud.png"
mode="scaleToFill"
class="icon"
/>
<view>导出</view>
</view>
<view class="btn op">
<image
src="/static/image/summary/op.png"
mode="scaleToFill"
class="icon"
/>
<view>格式优化</view>
</view>
</view>
<!-- 弹窗 -->
<meet-pop
:dialogShow="popConfig.show"
:btnType="popConfig.btnType"
:dialogTitle="popConfig.title"
@handleConfirm="confirm"
@handleCancel="cancel"
>
<view>
<u-input v-model="popConfig.value"></u-input>
</view>
</meet-pop>
</view>
</view>
</template>
<script>
export default {
data() {
return {
bg: "",
meetData: {},
popConfig: {
show: false,
title: "编辑参会人",
btnType: 2,
value: "",
},
};
},
methods: {
add() {
this.popConfig.show = true;
this.popConfig.title = "编辑参会人";
},
edit() {
this.popConfig.show = true;
this.popConfig.title = "添加关键词";
},
confirm() {
this.popConfig.show = false;
},
cancel() {
this.popConfig.show = false;
},
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.footer {
height: 180rpx;
width: 100%;
position: fixed;
bottom: 0;
left: 0;
background-color: #f2f7fe;
border-top: 4rpx #fff solid;
box-sizing: border-box;
padding: 0 24rpx;
padding-top: 16rpx;
.btn {
height: 80rpx;
line-height: 80rpx;
font-weight: 700;
font-size: 30rpx;
box-sizing: border-box;
display: flex;
align-content: center;
border-radius: 20rpx;
display: flex;
justify-content: center;
align-items: center;
}
.push {
margin-right: 20rpx;
color: #1467ff;
width: 248rpx;
border: 2rpx solid #1467ff;
}
.op {
background-color: #1467ff;
width: 434rpx;
color: #fff;
}
.icon {
width: 40rpx;
height: 40rpx;
margin-right: 12rpx;
}
}
.content {
padding-bottom: 200rpx;
}
.container {
padding: 24rpx;
background-color: #e3edfe;
}
.add {
width: 148rpx;
height: 72rpx;
}
.key-box {
flex-wrap: wrap;
}
.key-item {
padding: 16rpx 24rpx;
background-color: #fff;
border-radius: 12rpx;
margin-right: 16rpx;
}
.close {
width: 32rpx;
height: 32rpx;
margin-left: 16rpx;
}
.border-item {
padding: 24rpx;
border: 2rpx solid #fff;
border-radius: 24rpx;
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
);
margin-bottom: 20rpx;
.title {
padding: 20rpx;
background-color: #fff;
border-radius: 20rpx;
line-height: 1.6;
}
}
.img-item {
width: 164rpx;
height: 40rpx;
margin-bottom: 16rpx;
}
::v-deep .u-border {
border-style: none !important;
height: 80rpx;
background-color: #e9f1fd;
border-radius: 16rpx;
font-weight: 400;
font-size: 28rpx;
color: #93999f;
box-sizing: border-box;
}
</style>

@ -0,0 +1,105 @@
<template>
<view>
<meet-navbar title="关于我们" :isFixed="false" :iconType="2"></meet-navbar>
<view class="content">
<image
src="/static/image/user/shear.png"
mode="scaleToFill"
class="icon"
/>
<view class="mb-48">
<view class="title">title</view>
<view class="num">版本号:444545</view>
</view>
<view class="menu">
<view class="flex items-center menu-item" @click="toTxt(1)">
<view class="name">隐私政策</view>
<image
src="/static/image/user/right.png"
mode="scaleToFill"
class="right"
/>
</view>
<view class="flex items-center menu-item" @click="toTxt(1)">
<view class="name">用户协议</view>
<image
src="/static/image/user/right.png"
mode="scaleToFill"
class="right"
/>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data(){
return{
}
},
methods: {
toTxt(){
this.$meeting_common.to('/meeting/user/txt')
},
}
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.num {
font-weight: 400;
font-size: 24rpx;
color: #4b5158;
line-height: 2;
}
.title {
font-weight: 700;
font-size: 32rpx;
color: #23262b;
}
.content {
text-align: center;
padding: 24rpx;
padding-top: 80rpx;
}
.icon {
width: 176rpx;
height: 176rpx;
border-radius: 40rpx;
margin-bottom: 24rpx;
}
.menu {
background-color: #eef7fe;
border: 4rpx solid #fff;
border-radius: 24rpx;
padding: 0 24rpx;
padding-top: 48rpx;
.right {
width: 36rpx;
height: 36rpx;
}
.name {
font-weight: 400;
font-size: 30rpx;
color: #23262b;
flex: 1;
text-align: left;
}
.icon {
width: 36rpx;
height: 36rpx;
margin-right: 24rpx;
}
.menu-item {
margin-bottom: 48rpx;
}
}
</style>

@ -0,0 +1,95 @@
<template>
<view>
<meet-sticky :bg="bg">
<meet-navbar title="帮助文档" :isFixed="false"></meet-navbar>
</meet-sticky>
<view class="container">
<view class="title"> 问题反馈 </view>
<view class="content">
<u-collapse accordion>
<u-collapse-item
:title="item.title"
v-for="(item, index) in docList"
:key="index"
>
<view class="collapse-item">
<view v-for="(t, i) in item.explain" :key="i">
<view>{{ t }}</view>
</view>
</view>
</u-collapse-item>
</u-collapse>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
docList: [
{
title: "1.文字处理时间",
explain: ["11111111111", "222222222222"],
},
{
title: "2.支持的语言",
explain: ["11111111111", "222222222222"],
},
],
};
},
};
</script>
<style lang="scss" scoped>
.collapse-item {
background: #ffffff;
border-radius: 16rpx 16rpx 16rpx 16rpx;
padding: 20rpx;
line-height: 1.8;
}
.content {
background: #f4f7ff;
border-radius: 24rpx 24rpx 24rpx 24rpx;
border: 2rpx solid #ffffff;
flex: 1;
}
.container {
padding: 24rpx;
height: 85vh;
display: flex;
flex-direction: column;
}
.u-page {
padding: 0;
&__item {
&__title {
color: $u-tips-color;
background-color: $u-bg-color;
padding: 15px;
font-size: 15px;
&__slot-title {
color: $u-primary;
font-size: 14px;
}
}
}
}
.title {
font-weight: 700;
font-size: 32rpx;
color: #23262b;
margin-bottom: 24rpx;
}
.u-collapse-content {
color: $u-tips-color;
font-size: 14px;
}
::v-deep .u-line {
border-bottom-style: none !important;
}
</style>

@ -0,0 +1,128 @@
<template>
<div class="container">
<meet-sticky :bg="bg">
<meet-navbar title="会议记录" :isFixed="false"></meet-navbar>
</meet-sticky>
<div>
<div class="mb-30">
<u-search
placeholder="日照香炉生紫烟"
v-model="keyword"
:showAction="false"
:customStyle="customStyle1"
></u-search>
</div>
<view>
<view class="record-item mb-24">
<view class="flex justify-between items-center">
<view class="title"> 这是一个标题 </view>
<view>
<image
src="/static/image/user/share.png"
mode="scaleToFill"
class="icon"
/>
<image
src="/static/image/user/more.png"
mode="scaleToFill"
class="icon"
@click.stop="upMask"
/>
</view>
</view>
<view class="mask" v-if="popup">
<view>导出</view>
<view>重命名</view>
<view>删除</view>
</view>
</view>
</view>
</div>
</div>
</template>
<script>
export default {
data() {
return {
keyword: "遥看瀑布挂前川",
bg: "",
popup: false,
customStyle1: {
background:
"linear-gradient( 180deg, rgba(255,255,255,0.4) 0%, rgba(255,255,255,0.6) 100%)",
borderRadius: "40rpx",
border: " 2rpx solid #FFFFFF",
},
};
},
methods: {
upMask() {
this.popup = !this.popup;
},
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.icon {
width: 40rpx;
height: 40rpx;
margin-left: 16rpx;
}
.mask {
position: absolute;
width: 168rpx;
height: 232rpx;
background-color: #fff;
border-radius: 16rpx;
top: 80rpx;
right: 16rpx;
padding: 24rpx;
box-sizing: border-box;
display: flex;
flex-direction: column;
justify-content: space-around;
}
.record-item {
position: relative;
// height: 168rpx;
border-radius: 24rpx;
border: 2rpx #fff solid;
padding: 32rpx 24rpx;
// padding-bottom: 36rpx;
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
);
.title {
font-weight: 700;
font-size: 28rpx;
color: #23262b;
// line-height: 40rpx;
}
}
.container {
min-height: 100vh;
background-color: #d1dcfe;
padding: 20rpx 24rpx;
}
::v-deep .u-search__content {
background-color: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
) !important;
}
::v-deep .u-search__content__input {
background-color: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
) !important;
}
</style>

@ -0,0 +1,134 @@
<template>
<view class="container">
<meet-navbar title="我的" :isFixed="false" :iconType="0"></meet-navbar>
<view>
<!-- touxiang -->
<view class="flex items-center mb-40">
<view class="avatar-box">
<image src="/static/image/bg.png" mode="scaleToFill" class="avatar" />
</view>
<view>
<view class="nickname">用户名</view>
<view class="status">未登录</view>
</view>
</view>
<!-- 分享 -->
<view>
<image
src="/static/image/user/shear.png"
mode="scaleToFill"
class="shear"
/>
</view>
<!-- menu -->
<view class="menu">
<view class="flex items-center menu-item" v-for="item in menuList" :key="item">
<image :src="item.icon" mode="scaleToFill" class="icon" />
<view class="name">{{ item.n }}</view>
<image
src="/static/image/user/right.png"
mode="scaleToFill"
class="right"
/>
</view>
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
menuList: [
{
icon: "/static/image/user/flie.png",
n: "我的附件",
url: "",
},
{
icon: "/static/image/user/edit.png",
n: "意见反馈",
url: "",
},
{
icon: "/static/image/user/doc.png",
n: "帮助文档",
url: "",
},
{
icon: "/static/image/user/alert-circle.png",
n: "帮助文档",
url: "",
},
],
};
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.menu {
background-color: #EEF7FE;
border: 4rpx solid #fff;
border-radius: 24rpx;
padding: 0 24rpx;
padding-top: 48rpx;
.right {
width: 36rpx;
height: 36rpx;
}
.name {
font-weight: 400;
font-size: 30rpx;
color: #23262b;
flex: 1;
}
.icon {
width: 36rpx;
height: 36rpx;
margin-right: 24rpx;
}
.menu-item{
margin-bottom: 48rpx;
}
}
.shear {
width: 100%;
height: 160rpx;
margin-bottom: 24rpx;
}
.status {
font-weight: 400;
font-size: 28rpx;
color: #93999f;
}
.nickname {
font-weight: 700;
font-size: 36rpx;
color: #23262b;
line-height: 1.8;
}
.avatar {
width: 144rpx;
height: 144rpx;
border-radius: 26rpx;
}
.avatar-box {
width: 176rpx;
height: 176rpx;
padding: 16rpx;
border-radius: 26rpx;
background-color: #fff;
box-sizing: border-box;
margin-right: 24rpx;
}
.container {
min-height: 100vh;
background-color: #d1dcfe;
padding: 20rpx 24rpx;
box-sizing: border-box;
}
</style>

@ -0,0 +1,166 @@
<template>
<view class="container">
<meet-sticky :bg="bg">
<meet-navbar title="意见反馈" :isFixed="false"></meet-navbar>
</meet-sticky>
<view class="content">
<view class="title"> 问题反馈 </view>
<view class="mb-24">
<u--textarea
v-model="value2"
placeholder="请输入内容"
count
:maxlength="150"
:height="215"
:border="border"
></u--textarea>
</view>
<view class="mb-48">
<u-upload
:fileList="fileList6"
@afterRead="afterRead"
@delete="deletePic"
name="6"
multiple
:maxCount="1"
width="156"
height="156"
>
<view class="push">
<image
src="/static/image/user/push.png"
mode="scaleToFill"
class="icon"
/>
<view class="txt">添加截图</view>
</view>
</u-upload>
</view>
<view class="title"> 联系方式 </view>
<view>
<u--input
placeholder="请输入手机号"
border="surround"
v-model="value"
clearable
></u--input>
</view>
<!-- <view class="mb-30">
<u-search
placeholder="日照香炉生紫烟"
v-model="keyword"
:showAction="false"
:bgColor="bgColor"
borderColor="#fff"
></u-search>
</view> -->
</view>
</view>
</template>
<script>
export default {
data() {
return {
value2: "",
value: "",
border: "none",
keyword: "遥看瀑布挂前川",
bg: "",
popup: false,
bgColor: "#eef8fe05",
fileList6: [],
};
},
methods: {
upMask() {
this.popup = !this.popup;
},
afterRead(e) {
console.log(e);
},
deletePic(e) {
console.log(e);
},
},
};
</script>
<style lang="scss" scoped>
@import "../common.scss";
.push {
width: 156rpx;
height: 156rpx;
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
);
border: 2rpx solid #ffffff;
border-radius: 24rpx;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
.txt {
font-weight: 400;
font-size: 24rpx;
color: #93999f;
}
}
.title {
font-weight: 700;
font-size: 32rpx;
color: #23262b;
margin-bottom: 24rpx;
}
.icon {
width: 40rpx;
height: 40rpx;
}
.content {
padding: 0 24rpx;
}
.container {
min-height: 100vh;
background-color: #d1dcfe;
padding: 20rpx 0;
}
::v-deep .u-search__content {
background-color: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
) !important;
}
::v-deep .u-search__content__input {
background-color: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
) !important;
}
::v-deep .u-textarea {
border-radius: 24rpx !important;
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
) !important;
border: 2rpx solid #ffffff;
}
::v-deep .u-textarea__count {
background-color: transparent !important;
}
::v-deep .u-input {
background: linear-gradient(
180deg,
rgba(255, 255, 255, 0.4) 0%,
rgba(255, 255, 255, 0.6) 100%
) !important;
border-radius: 24rpx !important;
border: 2rpx solid #ffffff !important;
height: 96rpx !important;
box-sizing: border-box !important;
}
</style>

@ -0,0 +1,33 @@
<template>
<view class="container">
<meet-sticky :bg="bg">
<meet-navbar title="title" :isFixed="false"></meet-navbar>
</meet-sticky>
<view class="content"> </view>
</view>
</template>
<script>
export default {
data() {
return {
bg: "",
};
},
};
</script>
<style lang="scss" scoped>
.container{
height: 100%;
display: flex;
flex-direction: column;
}
.content {
padding: 24rpx;
background-color: #fff;
border-radius: 24rpx 24rpx 0 0;
flex: 1;
}
</style>

@ -0,0 +1,30 @@
let _sysInfo = uni.getSystemInfoSync();
let statusBarHeight = 0; //状态栏高度
let titleBarHeight = 0; //导航栏高度
let customBarHeight = 0; //导航栏高度+导航栏高度
statusBarHeight = _sysInfo.statusBarHeight;
// #ifndef MP
if (_sysInfo.platform == 'android') {
titleBarHeight = 50;
} else {
titleBarHeight = 45;
}
// #endif
// #ifdef MP-WEIXIN
let custom = wx.getMenuButtonBoundingClientRect();
// 导航栏高度(标题栏高度) = 胶囊高度 + (顶部距离 - 状态栏高度) * 2
titleBarHeight = custom.height + (custom.top - _sysInfo.statusBarHeight) * 2;
// customBarHeight = custom.bottom + custom.top - statusBarHeight;
// #endif
// #ifdef MP-ALIPAY
titleBarHeight = _sysInfo.titleBarHeight;
// #endif
customBarHeight = statusBarHeight + titleBarHeight;
_sysInfo.titleBarHeight = titleBarHeight;
_sysInfo.statusBarHeight = statusBarHeight;
_sysInfo.customBarHeight = customBarHeight;
export const sysInfo = _sysInfo;

@ -57,7 +57,8 @@
}
],
"subPackages": [{
"subPackages": [
{
"root": "pagesA",
"pages": [{
"path": "photo/photo_1",
@ -149,10 +150,108 @@
"navigationStyle": "custom"
}
}
]
}],
},
{
"root":"meeting",
"pages":[
{
"path":"index/index",
"style": {
"navigationBarTitleText": "首页",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
},
{
"path":"online/index",
"style": {
"navigationBarTitleText": "会议中",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
},
{
"path":"summary/index",
"style": {
"navigationBarTitleText": "会议总结",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
},
{
"path":"user/index",
"style": {
"navigationBarTitleText": "我的",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
},
{
"path":"user/file",
"style": {
"navigationBarTitleText": "我的附件",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
},
{
"path":"user/opinion",
"style": {
"navigationBarTitleText": "意见反馈",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
}
,
{
"path":"user/doc",
"style": {
"navigationBarTitleText": "帮助文档",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
}
,
{
"path":"user/about",
"style": {
"navigationBarTitleText": "关于我们",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
}
,
{
"path":"user/txt",
"style": {
"navigationBarTitleText": "协议",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
}
,{
"path":"onlineDetails/index",
"style": {
"navigationBarTitleText": "会议详情",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
},{
"path":"login/index",
"style": {
"navigationBarTitleText": "登陆",
"navigationStyle": "custom",
"enablePullDownRefresh":false
}
}
]
}
],
"globalStyle": {
"navigationBarTextStyle": "black",
"navigationBarTitleText": "%app.name%",

@ -5,7 +5,7 @@
<u-swiper
:list="banner"
keyName="image"
:showTitle="false"
:showTitle="false"
:autoplay="true"
circular
height="280"

@ -0,0 +1,20 @@
// 引入 request 文件
import request from './index.js'
// GET
export const getDemo = (params) => {
return request({
url: `/getDemo?id=${id}`,
method: 'get',
data: params,
header: {} // 自定义
})
}
// POST
export const PostDemo = (data) => {
return request({
url: `/postDemo`,
method: 'post',
data:data,
})
}

@ -0,0 +1,101 @@
// 全局请求封装 请求地址
const base_url = 'http://localhost:996'
// 请求超出时间
const timeout = 5000
// 需要修改token,和根据实际修改请求头
export default (params) => {
let url = params.url;
let method = params.method || "get";
let data = params.data || {};
let header = {
'Token': uni.getStorageSync('token') || '',
// 'Content-Type': 'application/json;charset=UTF-8',
// 'Authorization': 'Basic c2FiZXI6c2FiZXJfc2VjcmV0',
// 'Tenant-Id': uni.getStorageSync('tenantId') || 'xxx', // avue配置相关
...params.header
}
if (method == "post") {
header = {
'Content-Type': 'application/json'
};
}
return new Promise((resolve, reject) => {
uni.request({
url: base_url + url,
method: method,
header: header,
data: data,
timeout,
success(response) {
const res = response
// 根据返回的状态码做出对应的操作
//获取成功
// console.log(res.statusCode);
if (res.statusCode == 200) {
resolve(res.data);
} else {
uni.clearStorageSync()
switch (res.statusCode) {
case 401:
uni.showModal({
title: "提示",
content: "请登录",
showCancel: false,
success() {
setTimeout(() => {
uni.navigateTo({
url: "/pages/login/index",
})
}, 1000);
},
});
break;
case 404:
uni.showToast({
title: '请求地址不存在...',
duration: 2000,
})
break;
default:
uni.showToast({
title: '请重试...',
duration: 2000,
})
break;
}
}
},
fail(err) {
console.log(err)
if (err.errMsg.indexOf('request:fail') !== -1) {
uni.showToast({
title: '网络异常',
icon: "error",
duration: 2000
})
} else {
uni.showToast({
title: '未知异常',
duration: 2000
})
}
reject(err);
},
complete() {
// 不管成功还是失败都会执行
uni.hideLoading();
uni.hideToast();
}
});
}).catch(() => { });
};
// 使用方法
// import { pageStudyInfo } from '@/request/api.js'
// // 获取学习列表详情信息
// pageStudyInfo (data).then((res) => {
// console.log('成功', res);
// }).catch((err) => {
// console.error('失败', err);
// });

@ -0,0 +1,161 @@
function pickJsonObj(value) {
try {
return JSON.parse(value)
} catch (e) {
return null;
}
}
class WebSocketClient {
constructor(url) {
this.url = url;
this.socket = null;
this.isReconnecting = false;
this.reconnectInterval = 3000; // 重连间隔,单位毫秒
this.heartBeatInterval = 5000; // 心跳间隔,单位毫秒
this.pingTimeoutDuration = 1000; // 超过这个时间,后端没有返回pong,则判定后端断线了。
this.heartBeatTimer = null;
this.destroy = false; // 是否销毁
}
connect() {
this.socket = uni.connectSocket({
url: this.url,
complete: () => { }
});
this.initEventListeners();
}
initEventListeners() {
this.socket.onOpen(() => {
// WebSocket连接已打开
this.onConnected();
this.startHeartBeat();
});
this.socket.onMessage((res) => {
const obj = pickJsonObj(res.data);
if (obj.type === 'pong') {
// 收到pong消息,心跳正常,无需处理
this.resetPingTimeout(); // 重置计时
} else {
// 处理其他消息
this.onMessage(res.data);
}
});
this.socket.onClose((res) => {
// WebSocket连接已关闭
if (this.destroy) {
this.onClosed()
return;
}
this.stopHeartBeat();
if (!this.isReconnecting) {
this.reconnect();
}
});
}
sendMessage(message) {
if (this.socket) {
this.socket.send({
data: message
});
}
}
onMessage(message) {
// 处理收到的消息
console.log('message:', message)
}
startHeartBeat() {
this.heartBeatTimer = setInterval(() => {
this.sendMessage(JSON.stringify({
type: 'ping'
})); // 发送ping消息
this.pingTimeout = setTimeout(() => {
// 未收到pong消息,尝试重连...
this.reconnect();
}, this.pingTimeoutDuration);
}, this.heartBeatInterval);
}
stopHeartBeat() {
if (this.heartBeatTimer) {
clearInterval(this.heartBeatTimer);
}
}
reconnect() {
this.isReconnecting = true;
setTimeout(() => {
this.onReconnect();
this.connect();
this.isReconnecting = false;
}, this.reconnectInterval);
}
resetPingTimeout() {
clearTimeout(this.pingTimeout); // 重置计时
}
close() {
this.destroy = true;
this.stopHeartBeat();
if (this.socket) {
this.socket.close();
this.socket = null;
}
}
/**
* 重连时触发
*/
onReconnect() {
console.log('尝试重连...')
}
/**
* 连接成功时触发
*/
onConnected() {
console.log('WebSocket连接已打开');
}
/**
* 断开时触发
*/
onClosed() {
console.log('已断开连接')
}
}
export default WebSocketClient;
// websocket 使用
// import WebSocketClient from '@/utils/websocket.js'
// // 创建WebSocket实例
// ws.value = new WebSocketClient('ws://这里填写你的服务地址');
// // 连接WebSocket
// ws.value.connect();
// // 接收消息时触发
// ws.value.onMessage = (value) => {
// const obj = JSON.parse(value)
// if (obj.type === 'message') {
// list.value.push({
// time: new Date().toLocaleString(),
// value: obj.value
// })
// }
// }
// // 重连时触发
// ws.value.onReconnect = () => {
// netStatus.value = 2;
// }
// // 连接成功后触发
// ws.value.onConnected = () => {
// netStatus.value = 1;
// }
// // 关闭后触发(直接销毁了,不会继续重连)
// ws.value.onClosed = () => {
// netStatus.value = 0;
// }

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 515 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 815 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 392 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 336 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 822 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 911 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 559 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 620 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 644 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 639 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 346 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 273 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Loading…
Cancel
Save