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. 16
      config/env.js
  7. 4
      main.js
  8. 6
      manifest.json
  9. 42
      meeting/common.scss
  10. 96
      meeting/components/record.vue
  11. 32
      meeting/index/index.vue
  12. 176
      meeting/login/index.vue
  13. 263
      meeting/online/index.vue
  14. 157
      meeting/onlineDetails/index.vue
  15. 43
      meeting/record/index.vue
  16. 266
      meeting/summary/index.vue
  17. 105
      meeting/user/about.vue
  18. 95
      meeting/user/doc.vue
  19. 128
      meeting/user/file.vue
  20. 134
      meeting/user/index.vue
  21. 166
      meeting/user/opinion.vue
  22. 33
      meeting/user/txt.vue
  23. 30
      meeting/utils/systeminfo.js
  24. 151
      pages.json
  25. 207
      pages/index/index.vue
  26. 79
      pages/user/account/index.vue
  27. 17
      pages/user/account/logout.vue
  28. 176
      pages/user/auth/login.vue
  29. 205
      pages/user/auth/regist.vue
  30. 219
      pages/user/index.vue
  31. 275
      pages/user/photo/ai.vue
  32. 279
      pages/user/photo/cartoon.vue
  33. 249
      pages/user/photo/color.vue
  34. 53
      pages/user/photo/merge.vue
  35. 61
      pages/user/portrait/detail.vue
  36. 27
      pagesA/color/index.vue
  37. 4
      pagesA/merge/face_1.vue
  38. 8
      pagesA/merge/index.vue
  39. 66
      pagesA/photo/cartoon_1.vue
  40. 141
      pagesA/photo/cartoon_2.vue
  41. 60
      pagesA/photo/cartoon_3.vue
  42. 77
      pagesA/photo/cartoon_4.vue
  43. 4
      pagesA/photo/face.vue
  44. 2
      pagesA/photo/photo_1.vue
  45. 376
      pagesA/photo/photo_2.vue
  46. 20
      request/api.js
  47. 101
      request/index.js
  48. 161
      request/websocket.js
  49. BIN
      static/image/bg.png
  50. BIN
      static/image/login/icon1.png
  51. BIN
      static/image/login/icon2.png
  52. BIN
      static/image/login/icon3.png
  53. BIN
      static/image/login/icon4.png
  54. BIN
      static/image/login/icon5.png
  55. BIN
      static/image/login/icon6.png
  56. BIN
      static/image/online/bg.png
  57. BIN
      static/image/online/online.gif
  58. BIN
      static/image/online/pause.png
  59. BIN
      static/image/online/play.png
  60. BIN
      static/image/online/stop.png
  61. BIN
      static/image/online/toast.png
  62. BIN
      static/image/onlineDetails/ai.png
  63. BIN
      static/image/onlineDetails/list.png
  64. BIN
      static/image/onlineDetails/next.png
  65. BIN
      static/image/onlineDetails/play.png
  66. BIN
      static/image/onlineDetails/prev.png
  67. BIN
      static/image/onlineDetails/stop.png
  68. BIN
      static/image/onlineDetails/upload.png
  69. BIN
      static/image/summary/abstract.png
  70. BIN
      static/image/summary/add.png
  71. BIN
      static/image/summary/attendee .png
  72. BIN
      static/image/summary/btn_bg.png
  73. BIN
      static/image/summary/close.png
  74. BIN
      static/image/summary/edit.png
  75. BIN
      static/image/summary/key_word.png
  76. BIN
      static/image/summary/meet_title.png
  77. BIN
      static/image/summary/op.png
  78. BIN
      static/image/summary/points.png
  79. BIN
      static/image/summary/summary.png
  80. BIN
      static/image/summary/upcloud.png
  81. BIN
      static/image/user/alert-circle.png
  82. BIN
      static/image/user/doc.png
  83. BIN
      static/image/user/edit.png
  84. BIN
      static/image/user/flie.png
  85. BIN
      static/image/user/more.png
  86. BIN
      static/image/user/push.png
  87. BIN
      static/image/user/right.png
  88. BIN
      static/image/user/share.png
  89. BIN
      static/image/user/shear.png
  90. BIN
      static/img/common/common_21.png
  91. BIN
      static/img/common/common_22.png
  92. BIN
      static/img/common/home.png
  93. BIN
      static/img/common/home_HL.png
  94. BIN
      static/img/common/photo_c1.png
  95. BIN
      static/img/common/photo_c2.png
  96. BIN
      static/img/common/photo_common_21.png
  97. BIN
      static/img/common/user.png
  98. BIN
      static/img/common/user_HL.png
  99. BIN
      static/img/index/aixz.png
  100. BIN
      static/img/index/duigou.png
  101. Some files were not shown because too many files have changed in this diff Show More

@ -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>

@ -1,17 +1,17 @@
//api接口环境配置
// production正式/development线上测试/local本地开发
var NowENV = 'production';
var NowENV = 'development';
var ENV_API_URL = {
production:'https://takephoto.tsl3060.com/', //正式环境
production:'https://netcharge.spacechong.com/', //正式环境
development:'http://photo.internal.com/', //开发测试环境
local:'https://photo.internal.com/',//本地调试环境
local:'http://192.168.10.123:8901/',//本地调试环境
}
//CdnUrl 环境配置[都默认为线上都行]
var ENV_BASE_URL = {
production:'https://takephoto.tsl3060.com', //正式环境
development:'http://photo.internal.com', //开发测试环境
local:'https://photo.internal.com',//本地调试环境
production:'https://netcharge.spacechong.com', //正式环境
development:'https://photo.internal.com', //开发测试环境
local:'https://netcharge.spacechong.com',//本地调试环境
}
@ -23,10 +23,10 @@ var ENV = {
appData:function() {
var data = {}; //版本号
data.i_app_version = '1.0.0';
data.i_app_version = '2.1.2';
return data;
},
QQmapkey:'',
QQmapkey:'2EBBZ-RAL33-TLM3A-3KVVR-V2LMO-3TFQ4',
}

@ -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'

@ -58,7 +58,11 @@
"minified" : true
},
"usingComponents" : true,
"permission" : {},
"permission" : {
"scope.userLocation" : {
"desc" : "你的位置信息将用于小程序位置接口的效果展示"
}
},
"requiredPrivateInfos" : [ "getLocation", "chooseLocation" ],
"libVersion" : "latest"
},

@ -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;

@ -26,8 +26,7 @@
"path": "pages/user/account/index",
"style": {
"navigationBarTitleText": "账户设置",
"navigationStyle": "custom"
"enablePullDownRefresh": false
}
},
{
@ -40,15 +39,13 @@
{
"path": "pages/user/portrait/detail",
"style": {
"navigationBarTitleText": "面部档案",
"navigationStyle": "custom"
"navigationBarTitleText": "面部档案"
}
},
{
"path": "pages/user/photo/merge",
"style": {
"navigationBarTitleText": "合照详情",
"navigationStyle": "custom"
"navigationBarTitleText": "照片详情"
}
},
{
@ -57,34 +54,11 @@
"navigationBarTitleText": "注销账号",
"navigationStyle": "custom"
}
},
{
"path" : "pages/user/photo/color",
"style" :
{
"navigationBarTitleText" : "照片换底色详情",
"navigationStyle": "custom"
}
},
{
"path" : "pages/user/photo/ai",
"style" :
{
"navigationBarTitleText" : "AI写真",
"navigationStyle": "custom"
}
},
{
"path" : "pages/user/photo/cartoon",
"style" :
{
"navigationBarTitleText" : "卡通画风",
"navigationStyle": "custom"
}
}
],
"subPackages": [{
"subPackages": [
{
"root": "pagesA",
"pages": [{
"path": "photo/photo_1",
@ -129,6 +103,13 @@
"navigationStyle": "custom"
}
},
{
"path": "photo/cartoon_4",
"style": {
"navigationBarTitleText": "",
"navigationStyle": "custom"
}
},
{
"path" : "color/index",
"style" :
@ -157,7 +138,7 @@
"path" : "merge/idcard",
"style" :
{
"navigationBarTitleText" : "证件照",
"navigationBarTitleText" : "二寸证件照",
"navigationStyle": "custom"
}
},
@ -169,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%",
@ -196,8 +275,6 @@
"selectedIconPath": "static/img/common/user_HL.png",
"text": "%tabbar.user%"
}
]
},
"uniIdRouter": {}

@ -5,7 +5,7 @@
<u-swiper
:list="banner"
keyName="image"
:showTitle="false"
:showTitle="false"
:autoplay="true"
circular
height="280"
@ -64,9 +64,9 @@
<view class="picList">
<scroll-view class="scrollBox" scroll-x="true" @scroll="scroll1" scroll-left="0">
<view class="picBox" v-for="(item,index) in album_list" :key="index" @click="viewAlbum(item.id)">
<view class="picBox" v-for="(item,index) in album_list" :key="index">
<view class="pic">
<image :src="item.face" mode="scaleToFill"></image>
<image :src="item.face" mode="widthFix"></image>
</view>
<view class="pic_title">{{item.title}}</view>
</view>
@ -78,11 +78,11 @@
<image src="/static/img/index/title_kt.png" mode="widthFix"></image>
</view>
<view class="picList" style="margin-bottom: 80rpx;">
<view class="picList">
<scroll-view class="scrollBox" scroll-x="true" @scroll="scroll2" scroll-left="0">
<view class="picBox" v-for="(item,index) in cartoon_list" :key="index" @click="viewCartoon(item.id)">
<view class="picBox" v-for="(item,index) in cartoon_list" :key="index">
<view class="pic">
<image :src="item.face" mode="scaleToFill"></image>
<image :src="item.face" mode="widthFix"></image>
</view>
<view class="pic_title">{{item.title}}</view>
</view>
@ -92,25 +92,7 @@
</view>
<u-popup :show="tips_show" :round="10" mode="center" bgColor="transparent" @close="close('tips_show')" @open="open('tips_show')">
<view class="popupBox">
<view class="popupTop">
{{tips_title}}
</view>
<view class="popupDesc1">
<u-parse :content="content" :tagStyle="style"></u-parse>
</view>
<view class="popupBtn">
<view class="sbtnBox1 a1" @click="close('tips_show')">取消</view>
<view class="sbtnBox1 a2" @click="submit('tips_show')">确认</view>
</view>
</view>
</u-popup>
<view class="spaceBox"></view>
</view>
</template>
@ -139,19 +121,6 @@
specs_list:[],//
album_list:[],//
cartoon_list:[],//
//
tips_title:'隐私协议',
tips_show: false,
content: `<p>在使用【合成照相馆】小程序服务之前,</p>
<p>请仔细阅读合成照相馆隐私协议</p>
<p>如你同意该协议,请点击同意开始使用合成照相馆</p>`,
style: {
//
p: 'font-weight: 400;font-size: 28rpx;color: #555555;line-height: 60rpx;',
},
}
},
onPageScroll(e) {
@ -166,27 +135,16 @@
},
onLoad() {
var _this = this;
var show_agreement = _this.$user.session('show_agreement');
console.log('show_agreement',show_agreement);
if(_this.$com.isNull(show_agreement))
{
_this.agreement();
_this.tips_show = true;
}
//banner
_this.getBannerList();
//
_this.getSceneMenu();
//
_this.getHotList();
//1
setTimeout(function(res){
_this.getUploadConfig();
//banner
_this.getBannerList();
//
_this.getSceneMenu();
//
_this.getHotList();
},1000);
},
onShareAppMessage() {
@ -332,48 +290,7 @@
_this.$user.session('sceneList',sceneList);
});
},
//
viewAlbum(id){
uni.navigateTo({
url:'/pagesA/photo/photo_2?id='+id,
})
},
//
viewCartoon(id)
{
uni.navigateTo({
url:'/pagesA/photo/cartoon_2?id='+id,
})
},
open(key) {
console.log('open',key);
},
close(key) {
var _this = this;
_this[key] = false;
},
//
agreement(){
var _this = this;
var post = {
type:'user_protocol',
};
_this.$api.get('api/treatyInfo',post,function(rs){
console.log('协议',rs);
_this.content = rs.content;
_this.tips_show = true;
},function(err){
console.log(err);
});
},
submit(key)
{
var _this = this;
_this.$user.session('show_agreement',1);
_this.close(key);
},
}
}
</script>
@ -465,12 +382,12 @@
.topRight .distance image{ width: 32rpx; height: 32rpx; margin-right: 24rpx;}
.picList{ width: 100%; height: auto; }
.picList{ width: 100%; height: 360rpx; }
.scrollBox {
margin-top: 20rpx;
width: 100%;
height: 390rpx;
height: 360rpx;
white-space: nowrap;
}
@ -478,7 +395,7 @@
.picBox {
display: inline-block;
width:260rpx;
height: 390rpx;
height: 360rpx;
text-align: center;
position: relative;
margin-left: 20rpx;
@ -487,13 +404,13 @@
.picBox .pic{
position: absolute;
width:100%;
height: 390rpx;
height: 360rpx;
}
.picBox .pic image{
width:100%;
height: 390rpx;
width:260rpx;
height: 360rpx;
border-radius:24rpx;
}
.picBox .pic_title{
@ -511,88 +428,4 @@
text-overflow: ellipsis; //
}
.popupBox{
width: 600rpx;
height: auto;
border-radius: 24rpx;
background-color: #FFFFFF;
}
.popupTop{
width: 600rpx;
height: 140rpx;
background: linear-gradient(to bottom, #D3D5FF 20%, #FFFFFF 50%);
border-radius: 24rpx 24rpx 0rpx 0rpx;
line-height: 140rpx;
text-align: center;
font-weight: 700;
font-size: 30rpx;
color: #333333;
}
.popupBtn{ width: 100%; height: auto;
display: flex; flex-wrap: wrap;
justify-content: space-around; /* 使子元素在容器中均匀分布 */
align-items: center; /* 如果需要垂直居中子元素 */
}
.sbtnBox{
margin: 30rpx auto;
width: 478rpx;
height: 80rpx;
font-weight: 700;
font-size: 30rpx;
line-height: 80rpx;
border: 2rpx solid #4D94FF;
text-align: center;
border-radius: 44rpx;
}
.popupDesc{
width:560rpx;
font-weight: 400;
font-size: 28rpx;
color: #555555;
height: auto;
padding: 0rpx 20rpx;
}
.popupDesc1{
width:480rpx;
font-weight: 400;
font-size: 28rpx;
color: #555555;
height: 700rpx;
overflow-x: hidden;
overflow-y: scroll;
padding: 0rpx 60rpx;
}
.sbtnBox1{
margin: 30rpx auto;
width: 226rpx;
height: 80rpx;
font-weight: 700;
font-size: 30rpx;
line-height: 80rpx;
border: 2rpx solid #4D94FF;
text-align: center;
border-radius: 44rpx;
}
.a1{
background: linear-gradient( 270deg, rgba(46,87,241,0.15) 0%, rgba(131,88,246,0.15) 100%);
color:#7A74F0;
}
.a2{
background: linear-gradient( 270deg, #2E57F1 0%, #8358F6 100%);
color:#FFFFFF;
}
.a3{
background: linear-gradient( 270deg, #2E57F1 0%, #8358F6 100%);
color:#FFFFFF;
}
</style>

@ -1,8 +1,8 @@
<template>
<view class="container">
<custom_navbar :title="navbar_title" @getNavHeight="getNavHeight" :theme="theme" left="true" />
<view class="form" :style="'margin-top:'+margin_top+'px'">
<view class="form">
<!--input box start-->
<view class='input_box'>
<view class='i_box_1'>头像</view>
@ -66,27 +66,8 @@
<!--input box end-->
<!--input box start-->
<view class='input_box' @click="agreement('user_protocol')">
<view class='i_box_1'>隐私协议</view>
<view class='i_box_2'></view>
<view class='i_box_3x'>
</view>
<view class='i_box_5'>
<view class="up">
<view class="img">
</view>
<view class="icon" >
<u-icon name="arrow-right" top="5"></u-icon>
</view>
</view>
</view>
</view>
<!--input box end-->
<!--input box start-->
<view class='input_box' @click="agreement('privacy_policy')">
<view class='i_box_1'>用户协议</view>
<view class='input_box' @click="agreement">
<view class='i_box_1'>协议与说明</view>
<view class='i_box_2'></view>
<view class='i_box_3x'>
@ -131,7 +112,7 @@
<u-popup :show="show" :round="10" mode="center" bgColor="transparent" @close="close" @open="open">
<view class="popupBox">
<view class="popupTop">
{{tips_title}}
协议与说明
</view>
<view class="popupDesc">
<u-parse :content="content" :tagStyle="style"></u-parse>
@ -169,20 +150,10 @@
</template>
<script>
import custom_navbar from "../../index/components/header.vue";
export default {
components: {
custom_navbar
},
data() {
return {
navbar_title: '账户设置',
theme: "blue",
margin_top: 0,
//form
info: {
nick_name:'',
@ -191,7 +162,6 @@
},
uploadImg: [],
//
tips_title:'',
show: false,
content:'',
style: {
@ -209,20 +179,8 @@
_this.getUserInfo();
},
onPageScroll(e) {
if (e.scrollTop > 50) {
this.theme = 'white';
} else {
this.theme = 'blue';
}
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
//
getUserInfo()
{
@ -309,18 +267,10 @@
});
},
//
agreement(type){
agreement(){
var _this = this;
if(type == 'privacy_policy')
{
_this.tips_title = '用户协议';
}
else
{
_this.tips_title = '隐私协议';
}
var post = {
type:type,
type:'user_protocol',
};
_this.$api.get('api/treatyInfo',post,function(rs){
console.log('协议',rs);
@ -364,13 +314,10 @@
</script>
<style lang="scss">
.container{width: 100%; padding-top: 20rpx;}
.form{
width: 670rpx;
margin: 0rpx auto;
padding:0rpx 20rpx;
background: #FFFFFF;
border-radius: 24rpx 24rpx 24rpx 24rpx;
.container{padding:10rpx 20rpx;}
.form{ padding:0rpx 20rpx;
background: #FFFFFF;
border-radius: 24rpx 24rpx 24rpx 24rpx;
}
/*form基本元素*/
/*input_box*/

@ -87,23 +87,6 @@
},
yes(){
this.close();
//api/photo_album/del
_this.$com.confirm('确认注销账户,清空所有信息吗?',function(res){
var post = {
id:id,
};
_this.$api.post('api/user/logOut', post,function(rs){
console.log(rs);
uni.reLaunch({
url: '/pages/index/index'
});
});
},'警告');
},
}
}

@ -0,0 +1,176 @@
<template>
<view class="container">
<view class="input_box">
<text class="input_title">{{$t('pages.user.auth.login.mobile')}}</text>
<view class="input_content">
<u--input
:placeholder="$t('pages.user.auth.login.input_mobile')"
prefixIcon="phone"
prefixIconStyle="font-size: 24rpx;color: #909399"
v-model="form.mobile"
@change="mobileChange"
></u--input>
</view>
</view>
<view class="input_box">
<text class="input_title">{{$t('pages.user.auth.login.password')}}</text>
<view class="input_content">
<u--input
:placeholder="$t('pages.user.auth.login.input_password')"
prefixIcon="lock"
prefixIconStyle="font-size: 24rpx;color: #909399"
border="surround"
password
clearable
v-model="form.password"
@change="pwdChange"
></u--input>
</view>
</view>
<view class="button_box">
<view class="submit">
<u-button type="primary" :plain="true" :hairline="true" :text="$t('locale.login')" size="normal" @click="login"></u-button>
</view>
</view>
<view class="footer">
<!-- <text class="footer-text">找回密码</text> -->
<text class="footer-text" @click="regist">{{$t('locale.regist')}}</text>
<!-- <text class="footer-text">投诉建议</text> -->
</view>
</view>
</template>
<script>
export default {
components: {
},
data() {
return {
form:{
mobile:'',
password:'',
},
};
},
onShow() {
var _this =this;
},
methods:{
//
regist(){
uni.$u.route({
type:'redirectTo',
url: 'pages/user/auth/regist',
params: {}
});
},
//
mobileChange(e)
{
var _this = this;
_this.form['mobile'] = e;
},
//
pwdChange(e)
{
var _this = this;
_this.form['password'] = e;
},
login(){
var _this =this;
var form = _this.form;
if(!_this.$com.check(form.mobile,'mobile'))
{
uni.$u.toast(_this.$t('pages.user.auth.login.mobile_must'));
return false;
}
if(form.password.length < 6)
{
uni.$u.toast(_this.$t('pages.user.auth.login.password_must'));
return false;
}
var post = form;
_this.$api.post('user/log',post,function(rs){
console.log(rs);
_this.$user.session('userInfo',rs.userinfo);
_this.$user.session('token',rs.token);
uni.$u.route({
type:'navigateBack',
delta:2,
params: {}
});
},function(err){
console.log(err);
});
},
},
};
</script>
<style scoped lang="scss">
/*输入框*/
.input_box{
width: 90%;
margin: 40rpx auto 40rpx auto;
height: auto;
}
.input_title{
font-size: 30rpx;
color: #ABABAB;
height: 50rpx;
line-height: 50rpx;
margin: 10rpx auto;
display: block;
}
.button_box {
width: 90%;
margin: 40rpx auto 20rpx auto;
}
.submit {
width: 100%;
background-color: #4CAF50;
justify-content: center;
align-items: center;
border-radius: 10rpx;
}
.submit-text {
color: white;
padding: 30rpx;
}
.submit:active {
background-color: green;
opacity: 0.5;
}
.footer {
flex-direction: row;
justify-content: center;
text-align: center;
align-items: center;
margin-top: 100rpx;
}
.footer-text {
font-size: 28rpx;
color: #296db5;
padding: 30rpx;
}
</style>

@ -0,0 +1,205 @@
<template>
<view class="container">
<view class="input_box">
<text class="input_title">{{$t('pages.user.auth.login.mobile')}}</text>
<view class="input_content">
<u--input
:placeholder="$t('pages.user.auth.login.input_mobile')"
prefixIcon="phone"
prefixIconStyle="font-size: 24rpx;color: #909399"
type="number"
v-model="form.mobile"
@change="mobileChange"
></u--input>
</view>
</view>
<view class="input_box">
<text class="input_title">{{$t('pages.user.auth.login.password')}}</text>
<view class="input_content">
<u--input
:placeholder="$t('pages.user.auth.login.input_password')"
prefixIcon="lock"
prefixIconStyle="font-size: 24rpx;color: #909399"
border="surround"
password
clearable
v-model="form.password"
@change="pwdChange"
></u--input>
</view>
</view>
<view class="input_box">
<text class="input_title">{{$t('pages.user.auth.login.email')}}</text>
<view class="input_content">
<u--input
:placeholder="$t('pages.user.auth.login.input_email')"
prefixIcon="email"
prefixIconStyle="font-size: 24rpx;color: #909399"
v-model="form.email"
@change="emailChange"
></u--input>
</view>
</view>
<view class="button_box">
<view class="submit">
<u-button type="primary" :plain="true" :hairline="true" :text="$t('locale.regist')" size="normal" @click="regist"></u-button>
</view>
</view>
<view class="footer">
<!-- <text class="footer-text">找回密码</text> -->
<text class="footer-text" @click="login">{{$t('locale.login')}}</text>
<!-- <text class="footer-text">投诉建议</text> -->
</view>
</view>
</template>
<script>
export default {
components: {
},
data() {
return {
form:{
mobile:'',
password:'',
email:'',
},
};
},
onShow() {
var _this =this;
},
methods:{
//
login(){
uni.$u.route({
type:'redirectTo',
url: 'pages/user/auth/login',
params: {}
});
},
//
mobileChange(e)
{
var _this = this;
_this.form['mobile'] = e;
},
//
pwdChange(e)
{
var _this = this;
_this.form['password'] = e;
},
//email
emailChange(e)
{
var _this = this;
_this.form['email'] = e;
},
regist()
{
var _this =this;
var form = _this.form;
if(!_this.$com.check(form.mobile,'mobile'))
{
uni.$u.toast(_this.$t('pages.user.auth.login.mobile_must'));
return false;
}
if(form.password.length < 6)
{
uni.$u.toast(_this.$t('pages.user.auth.login.password_must'));
return false;
}
if(!_this.$com.check(form.email,'email'))
{
uni.$u.toast(_this.$t('pages.user.auth.login.email_must'));
return false;
}
var post = form;
_this.$api.post('user/reg',post,function(rs){
console.log(rs);
uni.showModal({
title: _this.$t('locale.tips'),
content: _this.$t('pages.user.auth.regist.regist_success'),
success: function (res) {
if (res.confirm) {
console.log('用户点击确定');
_this.login();
} else if (res.cancel) {
console.log('用户点击取消');
}
}
});
},function(err){
console.log(err);
});
},
},
};
</script>
<style scoped lang="scss">
/*输入框*/
.input_box{
width: 90%;
margin: 40rpx auto 40rpx auto;
height: auto;
}
.input_title{
font-size: 30rpx;
color: #ABABAB;
height: 50rpx;
line-height: 50rpx;
margin: 10rpx auto;
display: block;
}
.button_box {
width: 90%;
margin: 40rpx auto 20rpx auto;
}
.submit {
width: 100%;
background-color: #4CAF50;
justify-content: center;
align-items: center;
border-radius: 10rpx;
}
.submit-text {
color: white;
padding: 30rpx;
}
.submit:active {
background-color: green;
opacity: 0.5;
}
.footer {
flex-direction: row;
justify-content: center;
text-align: center;
align-items: center;
margin-top: 100rpx;
}
.footer-text {
font-size: 28rpx;
color: #296db5;
padding: 30rpx;
}
</style>

@ -27,7 +27,7 @@
</view>
<view class="mright">
<view class="mbItem" v-for="(item,index) in portraitList" :key="index">
<image v-if="item.can == true" :src="item.image" mode="widthFix" @click="goTo('/pages/user/portrait/detail?id='+item.id)"></image>
<image v-if="item.can == true" :src="item.image" mode="widthFix" @click="goTo('/pages/user/archives/detail?id='+item.id)"></image>
<image v-if="item.can == false" :src="item.image" mode="widthFix" @click="showShare"></image>
</view>
<!-- <view class="mbItem">
@ -55,15 +55,13 @@
:activeStyle="{
color: '#000000',
fontWeight: 'bold',
transform: 'scale(1.05)',
fontSize:'28rpx',
transform: 'scale(1.05)'
}"
:inactiveStyle="{
color: '#000000',
transform: 'scale(1)',
fontSize:'28rpx',
transform: 'scale(1)'
}"
itemStyle="padding: 20rpx 15rpx 0rpx 15rpx; width:157rpx; height: 88rpx;"
itemStyle="padding-left: 15rpx; padding-right: 15rpx; width:157rpx; height: 68rpx;"
@click="tabChange"></u-tabs>
<view class="datalist">
@ -131,84 +129,24 @@
</view>
</view> -->
<view class="imgBox" v-if="tabList[current].type == 1" v-for="(item,index) in dataList" :key="index" @click="viewDetail(item)">
<view class="imgBox" v-for="(item,index) in dataList" :key="index" @click="viewDetail(item)">
<view class="p_left">
<image class="p_bg" :src="item.merge_thumbnail" mode="aspectFill"></image>
<image v-if="item.status != 3" class="p_pic" src="/static/img/user/ing.png" mode="widthFix"></image>
<image class="p_bg" src="/static/img/index/zj_icon.png" mode="aspectFill"></image>
</view>
<view class="p_center">
<view class="p_title">{{item.specs.title}}</view>
<view class="p_desc" v-if="item.specs.w_h_mm.w == 0 && item.specs.w_h_px.w == 0">{{item.custom_kb.min}}-{{item.custom_kb.max}}kb | {{item.custom_w_h_px.w}}×{{item.custom_w_h_px.h}}px</view>
<view class="p_desc" v-else>{{item.specs.w_h_mm.w}}×{{item.specs.w_h_mm.h}}mm | {{item.specs.w_h_px.w}}×{{item.specs.w_h_px.h}}px</view>
<view class="p_desc">25×35mm | 295×413px</view>
</view>
<view class="p_right">
<view class="distance">
<image src="/static/img/index/right.png" mode="widthFix" v-if="item.status == 3"></image>
<view class="ing" v-if="item.status == 1">排队中...</view>
<view class="ing" v-if="item.status == 2">生成中...</view>
<view class="ing" v-if="item.status == 4">生成失败</view>
<view class="ing" v-if="item.status == 2">生成失败</view>
</view>
</view>
</view>
<view class="picBox" v-if="tabList[current].type == 2" v-for="(item,index) in dataList" :key="index" @click="viewDetail(item)">
<view class="p_left">
<image class="p_bg" :src="item.merge_thumbnail" mode="aspectFill"></image>
<image v-if="item.status != 3" class="p_pic" src="/static/img/user/ing.png" mode="widthFix"></image>
</view>
<view class="p_center">
<view class="p_title">{{item.create_time}}</view>
</view>
<view class="p_right">
<view class="distance">
<image src="/static/img/index/right.png" mode="widthFix" v-if="item.status == 3"></image>
<view class="ing" v-if="item.status == 1">排队中...</view>
<view class="ing" v-if="item.status == 2">生成中...</view>
<view class="ing" v-if="item.status == 4">生成失败</view>
</view>
</view>
</view>
<view class="picBox" v-if="tabList[current].type == 3" v-for="(item,index) in dataList" :key="index" @click="viewDetail(item)">
<view class="p_left">
<image class="p_bg" :src="item.album.face" mode="aspectFill"></image>
<image v-if="item.status != 2" class="p_pic" src="/static/img/user/ing.png" mode="widthFix"></image>
</view>
<view class="p_center">
<view class="p_title">{{item.album.title}}</view>
</view>
<view class="p_right">
<view class="distance">
<image src="/static/img/index/right.png" mode="widthFix" v-if="item.status == 2"></image>
<view class="ing" v-if="item.status == 1">排队中...</view>
</view>
</view>
</view>
<view class="picBox" v-if="tabList[current].type == 4" v-for="(item,index) in dataList" :key="index" @click="viewDetail(item)">
<view class="p_left">
<image class="p_bg" :src="item.cartoon.face" mode="aspectFill"></image>
<image v-if="item.status != 3" class="p_pic" src="/static/img/user/ing.png" mode="widthFix"></image>
</view>
<view class="p_center">
<view class="p_title">{{item.cartoon.title}}</view>
</view>
<view class="p_right">
<view class="distance">
<image src="/static/img/index/right.png" mode="widthFix" v-if="item.status == 3"></image>
<view class="ing" v-if="item.status == 1">排队中...</view>
<view class="ing" v-if="item.status == 2">生成中...</view>
<view class="ing" v-if="item.status == 4">生成失败</view>
</view>
</view>
</view>
</view>
@ -269,7 +207,7 @@ export default {
},
sceneList:[], //
tabList: [
/* {
{
type:1,
name: '证件照合成',
}, {
@ -281,7 +219,7 @@ export default {
}, {
type:4,
name: '卡通风格'
} */
}
],
current:0,
//
@ -315,7 +253,7 @@ export default {
},
onReady: function (res) {
var _this = this;
//console.log('/pages/user/photo/merge?url='+encodeURIComponent('https://resourcedev.aicverse.com/ai_tour/spot_template/2.jpg'));
console.log('/pages/user/photo/merge?url='+encodeURIComponent('https://resourcedev.aicverse.com/ai_tour/spot_template/2.jpg'));
},
onShow() {
var _this =this;
@ -324,15 +262,8 @@ export default {
_this.getSceneMenu();
//
_this.getPortraitList();
var _this =this;
setTimeout(function(res){
_this.tabChange({index:_this.current});
},1000);
_this.tabChange({index:0});
},
onLoad() {
},
onReachBottom () {
@ -432,60 +363,24 @@ export default {
_this.loadDataList('api/photo_synthesis/list');
break;
case 2:
_this.loadDataList('api/photo_back_color/list');
_this.loadDataList('/api/photo_back_color/list');
break;
case 3:
_this.loadDataList('api/photo_album/list');
break;
case 4:
_this.loadDataList('api/photo_cartoon/list');
break;
}
},
loadDataList(url)
{
var _this = this;
var type = _this.tabList[_this.current].type;
var post = {page:_this.page,limit:10};
_this.$api.get(url, post, function(res) {
//console.log(res);
var d = res;
var Data = d.data;
Data.forEach((item, index) => {
switch(type)
{
case 1:
if(!_this.$com.isNull(item.merge_thumbnail))
{
Data[index].merge_thumbnail = _this.$api.ossurl(item.merge_thumbnail);
}
else
{
Data[index].merge_thumbnail = '/static/img/index/zj_icon.png';
}
break;
case 2:
if(!_this.$com.isNull(item.merge_thumbnail))
{
Data[index].merge_thumbnail = _this.$api.ossurl(item.merge_thumbnail);
}
else
{
Data[index].merge_thumbnail = _this.$api.ossurl(item.users_image);
}
break;
case 3:
Data[index].album.face = _this.$api.ossurl(item.album.face);
break;
case 4:
Data[index].cartoon.face = _this.$api.ossurl(item.cartoon.face);
break;
}
});
_this.dataList = _this.dataList.concat(Data);
_this.dataList = _this.dataList.concat(d.data);
});
},
@ -572,79 +467,32 @@ export default {
viewDetail(item){
var _this =this;
var type = _this.tabList[_this.current].type;
var status = item.status;
if(item.status != 3)
{
_this.$com.showError('照片生成中,请等待');
return;
}
switch(type)
{
case 1:
//1234
switch(item.status)
{
case 1:
_this.$com.showError('照片排队中,请等待');
return;
break;
case 2:
_this.$com.showError('照片生成中,请等待');
return;
break;
}
uni.navigateTo({
url:'/pages/user/photo/merge?id='+item.id+'&url='+encodeURIComponent(_this.$api.ossurl(item.download_image)),
})
uni.navigateTo({
url:'/pages/user/photo/merge?url='+encodeURIComponent(_this.$api.ossurl(item.merge_image)),
})
break;
case 2:
//1234
switch(item.status)
{
case 1:
_this.$com.showError('照片排队中,请等待');
return;
break;
case 2:
_this.$com.showError('照片生成中,请等待');
return;
break;
}
uni.navigateTo({
url:'/pages/user/photo/color?id='+item.id+'&url='+encodeURIComponent(_this.$api.ossurl(item.merge_image)),
})
uni.navigateTo({
url:'/pagesA/color/index',
})
break;
case 3:
//12
switch(item.status)
{
case 1:
_this.$com.showError('照片排队中,请等待');
return;
break;
}
uni.navigateTo({
url:'/pages/user/photo/ai?id='+item.id,
url:'/pagesA/photo/photo_1',
})
break;
case 4:
//1234
switch(item.status)
{
case 1:
_this.$com.showError('照片排队中,请等待');
return;
break;
case 2:
_this.$com.showError('照片生成中,请等待');
return;
break;
}
uni.navigateTo({
url:'/pages/user/photo/cartoon?id='+item.id,
})
uni.navigateTo({
url:'/pagesA/photo/cartoon_1',
})
break;
}
},
@ -746,10 +594,7 @@ height: 50rpx;
font-size: 30rpx;
font-weight: bold;
}
.tabList{
width: 100%; height: auto;
}
.datalist{ width: 100%; height: auto;}
.picBox{
width: 702rpx;

@ -1,275 +0,0 @@
<template>
<view class="container">
<custom_navbar :title="navbar_title" @getNavHeight="getNavHeight" :theme="theme" left="true" />
<view class="xcontent" :style="'margin-top:'+margin_top+'px'">
<view class="imgList">
<!--如果是多个就用imgBox-->
<view class="imgBox" v-for="(item,index) in info.album_series" :key="index">
<image :src="item.merge_image" mode="aspectFill"></image>
</view>
</view>
<view class="btnList">
<view class="btnBox a1">
<view class="btnImg">
<image src="/static/img/user/delete.png" mode="widthFix"></image>
</view>
<view class="btnTxt" @click="deletePic">删除照片</view>
</view>
<view class="btnBox a2">
<view class="btnImg">
<image src="/static/img/user/download.png" mode="widthFix"></image>
</view>
<view class="btnTxt" @click="savePic">保存到相册</view>
</view>
</view>
</view>
</view>
</template>
<script>
import custom_navbar from "../../index/components/header.vue";
export default {
components: {
custom_navbar
},
data() {
return {
id:0,
info:'', //
navbar_title: 'AI合影',
theme: "blue",
margin_top: 0,
}
},
onLoad(option) {
//
var _this =this;
var id = option.id;
if(_this.$com.isNull(id))
{
uni.navigateBack({
delta:1,
})
}
_this.id = id;
_this.getDetail();
},
onShow() {
var _this = this;
_this.checkAuth();
},
onPageScroll(e) {
if (e.scrollTop > 50) {
this.theme = 'white';
} else {
this.theme = 'blue';
}
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
//
checkAuth() {
var _this = this;
console.log('已授权---');
uni.authorize({
scope: 'scope.writePhotosAlbum',
success(res) {
console.log('已授权', res);
},
fail(err) {
uni.showModal({
title: '授权失败',
content: '请在设置界面打开存储相关权限',
success: (res) => {
if (res.confirm) {
uni.openSetting()
}
}
})
},
})
},
deletePic()
{
var _this = this;
var id = _this.id;
_this.$com.confirm('确认删除此次写真集吗?',function(res){
var post = {
id:id,
};
_this.$api.post('api/photo_album/del', post,function(rs){
console.log(rs);
uni.navigateBack({
delta:1,
})
});
},'提示');
},
//
savePic(){
var _this =this;
var ai_list = _this.info.album_series;
ai_list.forEach((item, index) => {
var url = item.merge_image;
uni.getSetting({
success(res) {
console.log(res.authSetting);
if(!res.authSetting['scope.writePhotosAlbum'])
{
uni.openSetting();
}
else
{
//
uni.downloadFile({
url: url,
success: downloadResult => {
if (downloadResult.statusCode === 200) {
//
uni.saveImageToPhotosAlbum({
filePath: downloadResult.tempFilePath,
success: () => {
uni.showToast({
title: '保存成功'
});
},
fail: () => {
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
});
}
},
fail: () => {
uni.showToast({
title: '下载失败',
icon: 'none'
});
}
});
}
}
})
});
},
getDetail()
{
var _this = this;
var id = _this.id;
if(id == 0)
{
uni.navigateBack({
delta:1,
});
return;
}
var post = {
id:id,
};
_this.$api.get('api/photo_album/details', post,function(rs){
console.log(rs);
var Data = rs;
Data.album_series.forEach((item, index) => {
if(item.status == 3)
{
Data.album_series[index].merge_image = _this.$api.ossurl(item.merge_image);
}
else
{
Data.album_series[index].merge_image = _this.$api.ossurl(item.back_image);
}
});
_this.info = Data;
});
},
}
}
</script>
<style lang="scss">
.container{width: 100%; padding-top: 20rpx;}
.xcontent{ width: 710rpx; height: auto; margin: 0rpx auto;}
.imgList{width: 100%; height: auto;
display: flex; flex-wrap: wrap;
justify-content: space-between;
align-items: center; /* 如果需要垂直居中子元素 */
}
.imgBox{width: 340rpx; height: 440rpx; margin-bottom: 20rpx; }
.imgBox image{width: 340rpx; height: 440rpx; border-radius: 24rpx;}
.picBox{width: 660rpx; height: 770rpx; margin-top: 20rpx;margin-bottom: 20rpx; }
.picBox image{width: 660rpx; height: 770rpx; border-radius: 24rpx;}
.btnList{
width: 100%; height: 88rpx;
display: flex; flex-wrap: wrap;
justify-content: space-around; /* 使子元素在容器中均匀分布 */
align-items: center; /* 如果需要垂直居中子元素 */
}
.btnBox{
width: 340rpx; height: 88rpx;
border-radius: 44rpx;
display: flex;
}
.btnBox .btnImg{
width:126rpx ;
height: 88rpx;
}
.btnBox .btnImg image{
width:30rpx ;
height: 30rpx;
margin-top: 29rpx;
margin-left: 80rpx;
}
.btnBox .btnTxt{
width:214rpx ;
height: 88rpx;
font-weight: 700;
font-size: 30rpx;
line-height: 88rpx;
}
.a1{
background: linear-gradient( 270deg, rgba(46,87,241,0.15) 0%, rgba(131,88,246,0.15) 100%);
color:#7A74F0;
}
.a2{
background: linear-gradient( 270deg, #2E57F1 0%, #8358F6 100%);
color:#FFFFFF;
}
</style>

@ -1,279 +0,0 @@
<template>
<view class="container">
<custom_navbar :title="navbar_title" @getNavHeight="getNavHeight" :theme="theme" left="true" />
<view class="xcontent" :style="'margin-top:'+margin_top+'px'">
<view class="imgList">
<!--如果是多个就用imgBox-->
<!-- <view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view>
<view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view>
<view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view>
<view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view> -->
<!--如果是一个就用picBox-->
<view class="picBox">
<image :src="xurl" mode="aspectFill"></image>
</view>
</view>
<view class="btnList">
<view class="btnBox a1">
<view class="btnImg">
<image src="/static/img/user/delete.png" mode="widthFix"></image>
</view>
<view class="btnTxt" @click="deletePic">删除照片</view>
</view>
<view class="btnBox a2">
<view class="btnImg">
<image src="/static/img/user/download.png" mode="widthFix"></image>
</view>
<view class="btnTxt" @click="savePic">保存到相册</view>
</view>
</view>
</view>
</view>
</template>
<script>
import custom_navbar from "../../index/components/header.vue";
export default {
components: {
custom_navbar
},
data() {
return {
id:0,
info:'', //
xurl:'',
navbar_title: '卡通画风',
theme: "blue",
margin_top: 0,
}
},
onLoad(option) {
//
var _this =this;
var id = option.id;
if(_this.$com.isNull(id))
{
uni.navigateBack({
delta:1,
})
}
_this.id = id;
_this.getDetail();
},
onShow() {
var _this = this;
_this.checkAuth();
},
onPageScroll(e) {
if (e.scrollTop > 50) {
this.theme = 'white';
} else {
this.theme = 'blue';
}
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
//
checkAuth() {
var _this = this;
console.log('已授权---');
uni.authorize({
scope: 'scope.writePhotosAlbum',
success(res) {
console.log('已授权', res);
},
fail(err) {
uni.showModal({
title: '授权失败',
content: '请在设置界面打开存储相关权限',
success: (res) => {
if (res.confirm) {
uni.openSetting()
}
}
})
},
})
},
deletePic()
{
var _this = this;
var id = _this.id;
_this.$com.confirm('确认删除此张卡通风吗?',function(res){
var post = {
id:id,
};
_this.$api.post('api/photo_cartoon/del', post,function(rs){
console.log(rs);
uni.navigateBack({
delta:1,
})
});
},'提示');
},
//
savePic(){
var _this =this;
var url = _this.xurl;
uni.getSetting({
success(res) {
console.log(res.authSetting);
if(!res.authSetting['scope.writePhotosAlbum'])
{
uni.openSetting();
}
else
{
//
uni.downloadFile({
url: url,
success: downloadResult => {
if (downloadResult.statusCode === 200) {
//
uni.saveImageToPhotosAlbum({
filePath: downloadResult.tempFilePath,
success: () => {
uni.showToast({
title: '保存成功'
});
},
fail: () => {
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
});
}
},
fail: () => {
uni.showToast({
title: '下载失败',
icon: 'none'
});
}
});
}
}
})
},
getDetail()
{
var _this = this;
var id = _this.id;
if(id == 0)
{
uni.navigateBack({
delta:1,
});
return;
}
var post = {
id:id,
};
_this.$api.get('api/photo_cartoon/details', post,function(rs){
console.log(rs);
var Data = rs;
if(Data.status == 3)
{
_this.xurl = _this.$api.ossurl(Data.merge_image);
}
else
{
_this.xurl = _this.$api.ossurl(Data.users_image);
}
Data.merge_image = _this.$api.ossurl(Data.merge_image);
Data.users_image = _this.$api.ossurl(Data.users_image);
_this.info = Data;
});
},
}
}
</script>
<style lang="scss">
.container{width: 100%; padding-top: 20rpx;}
.xcontent{ width: 710rpx; height: auto; margin: 0rpx auto;}
.imgList{width: 100%; height: auto;
display: flex; flex-wrap: wrap;
justify-content: space-around;
align-items: center; /* 如果需要垂直居中子元素 */
}
.imgBox{width: 340rpx; height: 440rpx; margin-bottom: 20rpx; }
.imgBox image{width: 340rpx; height: 440rpx; border-radius: 24rpx;}
.picBox{width: 660rpx; height: 770rpx; margin-top: 20rpx;margin-bottom: 20rpx; }
.picBox image{width: 660rpx; height: 770rpx; border-radius: 24rpx;}
.btnList{
width: 100%; height: 88rpx;
display: flex; flex-wrap: wrap;
justify-content: space-around; /* 使子元素在容器中均匀分布 */
align-items: center; /* 如果需要垂直居中子元素 */
}
.btnBox{
width: 340rpx; height: 88rpx;
border-radius: 44rpx;
display: flex;
}
.btnBox .btnImg{
width:126rpx ;
height: 88rpx;
}
.btnBox .btnImg image{
width:30rpx ;
height: 30rpx;
margin-top: 29rpx;
margin-left: 80rpx;
}
.btnBox .btnTxt{
width:214rpx ;
height: 88rpx;
font-weight: 700;
font-size: 30rpx;
line-height: 88rpx;
}
.a1{
background: linear-gradient( 270deg, rgba(46,87,241,0.15) 0%, rgba(131,88,246,0.15) 100%);
color:#7A74F0;
}
.a2{
background: linear-gradient( 270deg, #2E57F1 0%, #8358F6 100%);
color:#FFFFFF;
}
</style>

@ -1,249 +0,0 @@
<template>
<view class="container">
<custom_navbar :title="navbar_title" @getNavHeight="getNavHeight" :theme="theme" left="true" />
<view class="xcontent" :style="'margin-top:'+margin_top+'px'">
<view class="imgList">
<!--如果是多个就用imgBox-->
<!-- <view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view>
<view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view>
<view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view>
<view class="imgBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view> -->
<!--如果是一个就用picBox-->
<!-- <view class="picBox">
<image src="/static/img/index/pic.png" mode="aspectFill"></image>
</view> -->
<view class="picBox">
<image :src="xurl" mode="aspectFill"></image>
</view>
</view>
<view class="btnList">
<view class="btnBox a1">
<view class="btnImg">
<image src="/static/img/user/delete.png" mode="widthFix"></image>
</view>
<view class="btnTxt" @click="deletePic">删除照片</view>
</view>
<view class="btnBox a2">
<view class="btnImg">
<image src="/static/img/user/download.png" mode="widthFix"></image>
</view>
<view class="btnTxt" @click="savePic">保存到相册</view>
</view>
</view>
</view>
</view>
</template>
<script>
import custom_navbar from "../../index/components/header.vue";
export default {
components: {
custom_navbar
},
data() {
return {
id:0,
old_url:'',
xurl:'',
navbar_title: '换底色',
theme: "blue",
margin_top: 0,
}
},
onLoad(option) {
//
var _this =this;
var id = option.id;
var url = option.url;
if(_this.$com.isNull(url) || _this.$com.isNull(id))
{
uni.navigateBack({
delta:1,
})
}
_this.id = id;
_this.old_url = url;
_this.xurl = decodeURIComponent(url);
},
onShow() {
var _this = this;
_this.checkAuth();
},
onPageScroll(e) {
if (e.scrollTop > 50) {
this.theme = 'white';
} else {
this.theme = 'blue';
}
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
//
checkAuth() {
var _this = this;
console.log('已授权---');
uni.authorize({
scope: 'scope.writePhotosAlbum',
success(res) {
console.log('已授权', res);
},
fail(err) {
uni.showModal({
title: '授权失败',
content: '请在设置界面打开存储相关权限',
success: (res) => {
if (res.confirm) {
uni.openSetting()
}
}
})
},
})
},
deletePic()
{
var _this = this;
var id = _this.id;
_this.$com.confirm('确认删除此张换底色照吗?',function(res){
var post = {
id:id,
};
_this.$api.post('api/photo_back_color/del', post,function(rs){
console.log(rs);
uni.navigateBack({
delta:1,
})
});
},'提示');
},
//
savePic(){
var _this =this;
var url = _this.xurl;
uni.getSetting({
success(res) {
console.log(res.authSetting);
if(!res.authSetting['scope.writePhotosAlbum'])
{
uni.openSetting();
}
else
{
//
uni.downloadFile({
url: url,
success: downloadResult => {
if (downloadResult.statusCode === 200) {
//
uni.saveImageToPhotosAlbum({
filePath: downloadResult.tempFilePath,
success: () => {
uni.showToast({
title: '保存成功'
});
},
fail: () => {
uni.showToast({
title: '保存失败',
icon: 'none'
});
}
});
}
},
fail: () => {
uni.showToast({
title: '下载失败',
icon: 'none'
});
}
});
}
}
})
},
}
}
</script>
<style lang="scss">
.container{width: 100%; padding-top: 20rpx;}
.xcontent{ width: 710rpx; height: auto; margin: 0rpx auto;}
.imgList{width: 100%; height: auto;
display: flex; flex-wrap: wrap;
justify-content: space-around; /* 使子元素在容器中均匀分布 */
align-items: center; /* 如果需要垂直居中子元素 */
}
.imgBox{width: 340rpx; height: 440rpx; margin-bottom: 20rpx; }
.imgBox image{width: 340rpx; height: 440rpx; border-radius: 24rpx;}
.picBox{width: 660rpx; height: 770rpx; margin-top: 20rpx;margin-bottom: 20rpx; }
.picBox image{width: 660rpx; height: 770rpx; border-radius: 24rpx;}
.btnList{
width: 100%; height: 88rpx;
display: flex; flex-wrap: wrap;
justify-content: space-around; /* 使子元素在容器中均匀分布 */
align-items: center; /* 如果需要垂直居中子元素 */
}
.btnBox{
width: 340rpx; height: 88rpx;
border-radius: 44rpx;
display: flex;
}
.btnBox .btnImg{
width:126rpx ;
height: 88rpx;
}
.btnBox .btnImg image{
width:30rpx ;
height: 30rpx;
margin-top: 29rpx;
margin-left: 80rpx;
}
.btnBox .btnTxt{
width:214rpx ;
height: 88rpx;
font-weight: 700;
font-size: 30rpx;
line-height: 88rpx;
}
.a1{
background: linear-gradient( 270deg, rgba(46,87,241,0.15) 0%, rgba(131,88,246,0.15) 100%);
color:#7A74F0;
}
.a2{
background: linear-gradient( 270deg, #2E57F1 0%, #8358F6 100%);
color:#FFFFFF;
}
</style>

@ -1,7 +1,5 @@
<template>
<view class="container">
<custom_navbar :title="navbar_title" @getNavHeight="getNavHeight" :theme="theme" left="true" />
<view class="xcontent" :style="'margin-top:'+margin_top+'px'">
<view class="imgList">
<!--如果是多个就用imgBox-->
<!-- <view class="imgBox">
@ -40,40 +38,28 @@
<view class="btnTxt" @click="savePic">保存到相册</view>
</view>
</view>
</view>
</view>
</template>
<script>
import custom_navbar from "../../index/components/header.vue";
export default {
components: {
custom_navbar
},
data() {
return {
id:0,
old_url:'',
xurl:'',
navbar_title: '证件照合成',
theme: "blue",
margin_top: 0,
}
},
onLoad(option) {
//
var _this =this;
var id = option.id;
var url = option.url;
if(_this.$com.isNull(url) || _this.$com.isNull(id))
if(_this.$com.isNull(url))
{
uni.navigateBack({
delta:1,
})
}
_this.id = id;
_this.old_url = url;
_this.xurl = decodeURIComponent(url);
},
@ -81,20 +67,7 @@
var _this = this;
_this.checkAuth();
},
onPageScroll(e) {
if (e.scrollTop > 50) {
this.theme = 'white';
} else {
this.theme = 'blue';
}
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
//
checkAuth() {
var _this = this;
@ -122,24 +95,7 @@
deletePic()
{
var _this = this;
var id = _this.id;
_this.$com.confirm('确认删除此张合成照吗?',function(res){
var post = {
id:id,
};
_this.$api.post('api/photo_synthesis/del', post,function(rs){
console.log(rs);
uni.navigateBack({
delta:1,
})
});
},'提示');
_this.$com.showError('暂不支持删除');
},
//
savePic(){
@ -194,8 +150,7 @@
</script>
<style lang="scss">
.container{width: 100%; padding-top: 20rpx;}
.xcontent{ width: 710rpx; height: auto; margin: 0rpx auto;}
.container{padding: 20rpx 26rpx;}
.imgList{width: 100%; height: auto;
display: flex; flex-wrap: wrap;
justify-content: space-around; /* 使子元素在容器中均匀分布 */

@ -1,39 +1,24 @@
<template>
<view class="container">
<custom_navbar :title="navbar_title" @getNavHeight="getNavHeight" :theme="theme" left="true" />
<view class="xcontent" :style="'margin-top:'+margin_top+'px'">
<view class="imgList" v-if="imgList.length > 0">
<view class="imgBox" v-for="(item,index) in imgList" :key="index">
<image :src="item" mode="aspectFill"></image>
</view>
<view class="imgList" v-if="imgList.length > 0">
<view class="imgBox" v-for="(item,index) in imgList" :key="index">
<image :src="item" mode="aspectFill"></image>
</view>
<u-empty icon="/static/img/user/nodata.png" mode="list" text="你还没有面部档案" width="180rpx" marginTop="120px" v-if="imgList.length == 0"></u-empty>
<view class="newBtn" v-if="imgList.length == 0" @click="newInfo">去创建</view>
</view>
</view>
<u-empty icon="/static/img/user/nodata.png" mode="list" text="你还没有面部档案" width="180rpx" marginTop="120px" v-if="imgList.length == 0"></u-empty>
<view class="newBtn" v-if="imgList.length == 0" @click="newInfo">去创建</view>
</view>
</template>
<script>
import custom_navbar from "../../index/components/header.vue";
export default {
components: {
custom_navbar
},
data() {
return {
id:0,
imgList:[],
navbar_title: '面部档案',
theme: "blue",
margin_top: 0,
}
},
onLoad(options){
@ -42,20 +27,7 @@
_this.id = options.id;
_this.getDetail();
},
onPageScroll(e) {
if (e.scrollTop > 50) {
this.theme = 'white';
} else {
this.theme = 'blue';
}
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
getDetail()
{
var _this =this;
@ -76,11 +48,6 @@
}
},
newInfo(){
var _this =this;
if(_this.id == 0)
{
_this.$user.session('ai_face_success','');
}
uni.navigateTo({
url:'/pagesA/merge/face_1'
})
@ -90,14 +57,10 @@
</script>
<style lang="scss">
.container{width: 100%; padding-top: 20rpx;}
.xcontent{ width: 710rpx; height: auto; margin: 0rpx auto;}
.imgList{width: 100%; height: auto; display: flex; flex-wrap: wrap;
justify-content: space-between;
align-items: center; /* 如果需要垂直居中子元素 */
}
.container{padding: 20rpx 26rpx;}
.imgList{width: 100%; height: auto; display: flex; flex-wrap: wrap; gap:12rpx;}
.imgBox{width: 130rpx; height: 130rpx; margin-top: 10rpx;}
.imgBox image{width: 130rpx; height: 130rpx;}
.imgBox image{width: 140rpx; height: 140rpx;}
.newBtn{
width: 400rpx;

@ -106,7 +106,6 @@
onLoad() {
var _this = this;
_this.getColorList();
_this.getUserInfo();
},
onPageScroll(e) {
if (e.scrollTop > 50) {
@ -152,7 +151,6 @@
deletePic(event) {
var _this = this;
_this.uploadImg = [];
_this.users_image = '';
},
//
afterRead(event) {
@ -211,30 +209,13 @@
submit(){
var _this = this;
var color_id = _this.colorList[_this.selectIndex].id ?? 0;
if(color_id == 0)
{
_this.$com.showError('请选择背景颜色!');
return false;
}
var users_image = _this.users_image;
if(_this.$com.isNull(users_image))
{
_this.$com.showError('请上传需要换色的照片!');
return false;
}
var post = {
back_color_id:color_id,
users_image:users_image,
back_color_id:_this.colorList[_this.selectIndex].id,
users_image:_this.users_image,
};
_this.$com.showLoading('保存图片中');
_this.$api.post('api/color/append', post,function(rs){
console.log(rs);
_this.$com.hideLoading();
uni.navigateTo({
url:"/pagesA/merge/success"
});
console.log(rs);
});
},

@ -11,7 +11,7 @@
<view class="photo_main_face_2">
<view class="photo_main_face_2_1">上传5-10有效照片越多生成效果越好</view>
<view class="photo_main_face_2_2">
<image src="/static/img/index/tips.png" />
<image src="/static/img/common/common_21.png" />
</view>
</view>
@ -291,7 +291,7 @@
var upData = {
filePath: compress_path,
fileType: 'image',
scene: 'user_portrait'
scene: 'user_max'
};
_this.$api.ossUpload(upData, function(res) {

@ -156,7 +156,7 @@
<text v-if="item.status == 2">训练中</text>
<text v-if="item.status == 4">失败</text>
</view>
<image class="imgSelect" v-if="index == selectIndex && item.status == 3" src="/static/img/index/select.png" mode="widthFix"></image>
<image class="imgSelect" v-if="index == selectIndex" src="/static/img/index/select.png" mode="widthFix"></image>
</view>
<!-- <view class="imgBox">
@ -457,13 +457,7 @@
break;
//
case 'select_show':
_this.FormData.portrait_id = _this.selectList[_this.selectIndex].id;
if(_this.selectList[_this.selectIndex].status != 3)
{
_this.$com.showError('面部档案还在生成中,请稍后选择生成');
return;
}
_this.close(key);
var FormData = _this.FormData;
console.log(FormData);

File diff suppressed because one or more lines are too long

@ -5,7 +5,7 @@
<view class="photo_main" :style="'margin-top:'+margin_top+'px'" style="width:100%;margin-left: 0;">
<view class="photo_cartoon_2" v-if="loaded && cameraEnable">
<camera flash="auto" :device-position="devicePosition" @error="errorCamera"
<camera flash="auto" :device-position="devicePosition" @error="errorCamera"
style="width: 100%; height: 100%;">
</camera>
@ -17,13 +17,13 @@
</view>
<view class="photo_cartoon_2_2">
<view class="photo_cartoon_2_2_1" @click="viewAlbum">
<view class="photo_cartoon_2_2_1">
<image src="/static/img/photo/cartoon_4.png" />
</view>
<view class="photo_cartoon_2_2_2" @click="takePhoto">
<view class="photo_cartoon_2_2_2">
<image src="/static/img/photo/cartoon_3.png" />
</view>
<view class="photo_cartoon_2_2_1" @click="back2front">
<view class="photo_cartoon_2_2_1">
<image src="/static/img/photo/cartoon_5.png" />
</view>
</view>
@ -49,23 +49,26 @@
margin_top: 0,
loaded: false,
cameraEnable: true,
loop: false,
devicePosition: "back",
use_camera: 1,
cameraContext: {},
users_image:'', //
cartoon_id:0,
}
},
mounted() {
setTimeout(() => {
this.loaded = true;
this.loopGetCameraInfo();
}, 500);
},
onShow() {
var _this =this;
_this.checkAuth();
if (this.loaded && !this.loop) {
// cameraEnabletrue
this.loopGetCameraInfo();
}
},
onLoad(options) {
var _this =this;
console.log('options',options);
_this.cartoon_id = options.id;
onLoad() {
if (uni.createCameraContext) {
this.cameraContext = uni.createCameraContext()
} else {
@ -77,120 +80,10 @@
}
},
methods: {
//
checkAuth() {
var _this = this;
console.log('已授权---');
uni.authorize({
scope: 'scope.camera',
success(res) {
console.log('已授权', res);
_this.loaded=true;
_this.cameraEnable=true;
},
fail(err) {
uni.showModal({
title: '授权失败',
content: '请在设置界面打开摄像头相关权限',
success: (res) => {
if (res.confirm) {
uni.openSetting()
}
}
})
},
})
},
getNavHeight(e) {
this.margin_top += e;
},
goTo(url)
{
uni.navigateTo({
url:url,
})
},
errorCamera(e)
{
var _this =this;
_this.$com.alertDo('请打开摄像头权限',function(res){
_this.checkAuth();
});
},
//
viewAlbum(){
var _this =this;
uni.chooseMedia({
count: 1,
mediaType: ['image'],
sourceType: ['album'],
camera: 'back',
success(res) {
console.log('相册',res);
//console.log(res.tempFiles)
var edetail= res.tempFiles[0].tempFilePath;
//
var upData = {filePath:edetail,fileType:'image',scene:'user_centre'};
_this.$api.ossUpload(upData,function(res){
console.log('ossUpload success',res);
var d = res.data;
_this.users_image = d.file_url;
uni.navigateTo({
url:'/pagesA/photo/cartoon_3?cartoon_id='+_this.cartoon_id+'&users_image='+encodeURIComponent(_this.users_image),
})
},function(err){
console.log('ossUpload fail',err);
});
}
})
},
//
takePhoto(){
var _this =this;
const ctx = uni.createCameraContext();
ctx.takePhoto({
quality: 'high',
success: (res) => {
console.log('拍照',res);
var edetail= res.tempImagePath;
//
var upData = {filePath:edetail,fileType:'image',scene:'user_centre'};
_this.$api.ossUpload(upData,function(res){
console.log('ossUpload success',res);
var d = res.data;
_this.users_image = d.file_url;
uni.navigateTo({
url:'/pagesA/photo/cartoon_3?cartoon_id='+_this.cartoon_id+'&users_image='+encodeURIComponent(_this.users_image),
})
},function(err){
console.log('ossUpload fail',err);
});
}
});
},
back2front()
{
var _this =this;
if(_this.devicePosition == 'back')
{
_this.devicePosition = 'front';
console.log('切换----前');
}
else
{
_this.devicePosition = 'back';
console.log('切换----后')
}
},
}
}
</script>

@ -5,13 +5,13 @@
<view class="photo_main" :style="'margin-top:'+margin_top+'px'" style="width:100%;margin-left: 0;">
<view class="photo_cartoon_2">
<image
:src="root+users_image"
src="https://img30.360buyimg.com/sku/jfs/t1/221254/4/39390/74349/661e039aF46114279/48532008a0001dd0.jpg"
mode="aspectFill" />
</view>
<view class="photo_cartoon_3_2">
<view class="photo_cartoon_3_2_1 photo_full_blue_btn" @click="submit">提交生成</view>
<view class="photo_cartoon_3_2_2">剩余生成次数 <text style="color: #7A74F0;">{{cartoon_has}}</text>/{{all}}</view>
<view class="photo_cartoon_3_2_1 photo_full_blue_btn">提交生成</view>
<view class="photo_cartoon_3_2_2">剩余生成次数 <text style="color: #7A74F0;">1</text>/30</view>
</view>
</view>
@ -33,64 +33,24 @@
return {
navbar_title: '卡通画风',
margin_top: 0,
root:this.$api.getOssurl(),
//
cartoon_id:0,
users_image:'',
//
cartoon_has:0, //
all:0,//
}
},
mounted() {
},
onShow() {
var _this = this;
var sceneList = _this.$user.session('sceneList');
var all = sceneList[3].number;
console.log(all);
_this.all = all;
},
onLoad(options) {
var _this =this;
console.log('options',options);
_this.cartoon_id = options.cartoon_id;
_this.users_image = decodeURIComponent(options.users_image);
_this.getUserInfo();
onLoad() {
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
///api/userInfo
getUserInfo(){
var _this = this;
_this.$api.get('/api/userInfo',{},function(res){
_this.cartoon_has = res.attach.photo.cartoon_number;
});
},
submit(){
var _this = this;
var cartoon_id = _this.cartoon_id;
var users_image = _this.users_image;
var post = {
cartoon_id:cartoon_id,
users_image:users_image,
};
_this.$com.showLoading('保存图片中');
_this.$api.post('api/cartoon/append', post,function(rs){
console.log(rs);
_this.$com.hideLoading();
uni.navigateTo({
url:"/pagesA/merge/success"
});
});
},
}
}
</script>

@ -0,0 +1,77 @@
<template>
<view>
<view class="content ">
<custom_navbar :title="navbar_title" @getNavHeight="getNavHeight" :theme="theme" />
<view class="photo_main_face" :style="'margin-top:-'+margin_top+'px'">
<view class="photo_main_face_head"></view>
<view class="photo_success_1">
<image src="/static/img/common/photo_c1.png"/>
</view>
<view class="photo_success_2">生成已提交</view>
<view class="photo_success_3">
<view>目前排队人数较多请耐心等待</view>
<view>可去<text>我的</text>页面查看生成结果</view>
</view>
<view class="photo_success_4" @click="backIndex">
<image src="/static/img/common/photo_c2.png"/>
</view>
</view>
</view>
</view>
</template>
<script>
import custom_navbar from "./components/photo_header.vue";
export default {
components: {
custom_navbar
},
data() {
return {
navbar_title: '',
theme: "blue",
margin_top: 0,
}
},
mounted() {
},
onPageScroll(e) {
if (e.scrollTop > 50) {
this.theme = 'white';
} else {
this.theme = 'blue';
}
},
methods: {
getNavHeight(e) {
this.margin_top += e;
},
backIndex()
{
uni.switchTab({
url:'/pages/index/index',
})
},
}
}
</script>
<style lang="scss" scoped>
@import './this.scss';
</style>

@ -11,7 +11,7 @@
<view class="photo_main_face_2">
<view class="photo_main_face_2_1">上传5-10有效照片越多生成效果越好</view>
<view class="photo_main_face_2_2">
<image src="/static/img/index/tips.png" />
<image src="/static/img/common/common_21.png" />
</view>
</view>
@ -275,7 +275,7 @@
var upData = {
filePath: compress_path,
fileType: 'image',
scene: 'user_portrait'
scene: 'user_max'
};
_this.$api.ossUpload(upData, function(res) {

@ -41,7 +41,7 @@
<view class="photo_list_div_one_img" >
<image
:src="root+item.face"
:src="root+item.back_image"
mode="aspectFill" />
</view>
<view class="photo_list_div_one_text">

@ -6,11 +6,12 @@
<view class="photo_tem_1">
<view class="photo_tem_1_head">
<view class="photo_tem_1_head_1">
<image mode="aspectFill" :src="album.face"></image>
<image mode="aspectFill"
src="https://img30.360buyimg.com/sku/jfs/t1/221254/4/39390/74349/661e039aF46114279/48532008a0001dd0.jpg" />
</view>
<view class="photo_tem_1_head_2">
<view class="photo_tem_1_head_2_1">{{album.title}}</view>
<view class="photo_tem_1_head_2_2">{{album.describe}}</view>
<view class="photo_tem_1_head_2_1">复古港风</view>
<view class="photo_tem_1_head_2_2">走进中国香港90年代的繁华</view>
</view>
<view class="photo_tem_1_head_3">
<view class="y_btn">
@ -20,7 +21,7 @@
</view>
<view class="photo_tem_1_2">
<u-swiper :list="album.back_image"
<u-swiper :list="photo_list"
indicator indicatorMode="line"
circular
radius="24rpx"
@ -31,59 +32,65 @@
</view>
<view class="photo_tem_2" v-if="show_btn" @click="checkHave">
<view class="photo_tem_2" v-if="show_btn">
使用模板生成
</view>
</view>
</view>
<u-popup :show="select_show" :round="10" mode="center" bgColor="transparent" @close="close('select_show')" @open="open('select_show')">
<view class="popupBox">
<view class="popupTop">
请选择需要生成写真的面部档案
</view>
<view class="popupDesc">
<scroll-view class="scrollBox" scroll-x="true" @scroll="scroll" scroll-left="0">
<view class="imgBox" v-for="(item,index) in selectList" :key="index" @click="selectPortrait(index,item)">
<image class="imgBg" :src="item.model_image_thumbnail" mode="widthFix"></image>
<image class="imgLoadingImg" src="/static/img/index/loading.gif" mode="widthFix" v-if="item.status != 3"></image>
<view class="imgLoadingTxt" v-if="item.status != 3">
<text v-if="item.status == 1">排队中</text>
<text v-if="item.status == 2">训练中</text>
<text v-if="item.status == 4">失败</text>
</view>
<image class="imgSelect" v-if="index == selectIndex && item.status == 3" src="/static/img/index/select.png" mode="widthFix"></image>
</view>
</scroll-view>
</view>
<view class="popupBtn">
<view class="sbtnBox1 a1" @click="close('select_show')">取消</view>
<view class="sbtnBox1 a2" @click="submit('select_show')">确认</view>
</view>
</view>
</u-popup>
<u-popup :show="show_2" mode="center" bgColor="transparent" :round="12">
<view class="show_readme_div" style="height: 380rpx;">
<view class="show_readme_div_1">
提醒
</view>
<view class="show_readme_div_2">
<view>目前系统还未存入您的面部档案信息请先前往创建需要生成写真的面部档案</view>
</view>
<view class="show_readme_div_line">
<view class="show_readme_div_4" style="width: 220rpx;">
暂不生成
</view>
<view class="show_readme_div_3" style="width: 220rpx;">
前往创建
</view>
</view>
</view>
</u-popup>
<u-popup :show="tips_show" :round="10" mode="center" bgColor="transparent" @close="close('tips_show')" @open="open('tips_show')">
<view class="popupBox">
<view class="popupTop">
提醒
</view>
<view class="popupDesc1">
<u-parse :content="content" :tagStyle="style"></u-parse>
</view>
<view class="popupBtn">
<view class="sbtnBox1 a1" @click="close('tips_show')">暂不生成</view>
<view class="sbtnBox1 a2" @click="submit('tips_show')">前往创建</view>
<u-popup :show="show_3" mode="center" bgColor="transparent" :round="12">
<view class="show_readme_div" style="height: 440rpx;">
<view class="show_readme_div_1">
请选择需要生成写真的面部档案
</view>
<view class="show_readme_div_2" style="width: 520rpx;margin-left: 40rpx;">
<view class="show_readme_div_2_1">
<view class="show_readme_div_2_1_one" v-for="(item,index) in face_list" :key="index" @tap="selectThis(index,id)">
<view class="show_readme_div_2_1_one_1">
<image :src="item.url" />
</view>
<view class="show_readme_div_2_1_one_2" v-if="index == select_index">
<image src="/static/img/common/photo_common_21.png" />
</view>
</view>
</view>
</u-popup>
</view>
</view>
<view class="show_readme_div_line">
<view class="show_readme_div_4" style="width: 220rpx;">
暂不生成
</view>
<view class="show_readme_div_3" style="width: 220rpx;" @tap="goUrl('/pagesA/pohto/face')">
确定
</view>
</view>
</view>
</u-popup>
</view>
</template>
@ -100,48 +107,28 @@
navbar_title: 'AI写真',
theme: "white",
margin_top: 10,
album_id:0, //id
album:'',
portrait_id:0,
//
select_show:false,
//
tips_show: false,
content: `<p>目前系统还未存入您的面部档案信息,</p>
<p>请先前往创建需要生成写真的面部档案</p>
<p>创建成功后再次生成</p>`,
style: {
//
p: 'font-weight: 400;font-size: 28rpx;color: #555555;line-height: 60rpx;',
},
//
selectList:[],
selectIndex:0,//
photo_list: [
'https://img30.360buyimg.com/sku/jfs/t1/221254/4/39390/74349/661e039aF46114279/48532008a0001dd0.jpg',
'https://img30.360buyimg.com/sku/jfs/t1/221254/4/39390/74349/661e039aF46114279/48532008a0001dd0.jpg',
'https://img30.360buyimg.com/sku/jfs/t1/221254/4/39390/74349/661e039aF46114279/48532008a0001dd0.jpg',
],
has_face : 1 ,//
show_3:false,
show_2:false,
show_btn:false,
face_list :[],
select_index:0,
select_id:''
}
},
onLoad(option) {
//
var _this =this;
var id = option.id;
if(_this.$com.isNull(id))
{
uni.navigateBack({
delta:1,
})
}
_this.album_id = id;
_this.geAlbumtDetail();
//_this.getFace()
mounted() {
},
onLoad() {
this.getFace()
},
onShow() {
@ -154,122 +141,25 @@
this.margin_top += e;
}
,
getFace(){
if(this.has_face == 0){
this.show_2 = true
}else{
for(let n=0;n<3;n++){
let t = {};
t.url = '/static/img/index/banner.png';
this.face_list.push(t);
}
this.show_3 = true
}
},
selectThis(index,id){
this.select_id = id;
this.select_index = index;
},
geAlbumtDetail()
{
var _this =this;
var post = {
id:_this.album_id,
};
_this.$api.get('api/album/details',post,function(rs){
console.log(rs);
var Data = rs;
Data.face = _this.$api.ossurl(Data.face);
var back_image = Data.back_image;
back_image.forEach((item, index) => {
back_image[index] = _this.$api.ossurl(item);
});
Data.back_image = back_image;
_this.album = Data;
_this.show_btn = true;
});
},
checkHave()
{
var _this =this;
_this.getPortraitList();
},
//
getPortraitList(){
var _this =this;
var post = {};
_this.$api.get('api/portrait/list', post, function(res) {
var d = res;
console.log(d);
if(d.length == 0)
{
_this.tips_show = true;
}
else
{
var selectList = d;
selectList.forEach((item, index) => {
selectList[index].model_image = item.model_image ? _this.$api.ossurl(item.model_image): '/static/img/index/p_bg.png';
selectList[index].model_image_thumbnail = item.model_image_thumbnail ? _this.$api.ossurl(item.model_image_thumbnail) : '/static/img/index/p_bg.png';
});
_this.selectList = selectList;
_this.selectIndex = 0;
_this.select_show = true;
}
});
},
//
selectPortrait(index,item)
{
var _this =this;
if(item.status == 3)
{
_this.selectIndex = index;
}
}
},
open(key) {
console.log('open',key);
},
close(key) {
var _this = this;
_this[key] = false;
},
//
submit(key){
var _this =this;
switch(key)
{
//
case 'tips_show':
_this.close(key);
uni.navigateTo({
url:'/pagesA/merge/face_1'
});
break;
//
case 'select_show':
_this.portrait_id = _this.selectList[_this.selectIndex].id;
if(_this.selectList[_this.selectIndex].status != 3)
{
_this.$com.showError('面部档案还在生成中,请稍后选择生成');
return;
}
_this.close(key);
var album_id = _this.album_id;
var portrait_id = _this.portrait_id;
var post = {
album_id:album_id,
portrait_id:portrait_id,
};
_this.$com.showLoading('保存图片中');
_this.$api.post('api/album/append', post,function(rs){
console.log(rs);
_this.$com.hideLoading();
uni.navigateTo({
url:"/pagesA/merge/success"
});
});
break;
}
},
}
}
@ -277,96 +167,4 @@
<style lang="scss" scoped>
@import './this.scss';
.popupBox{
width: 600rpx;
height: auto;
border-radius: 24rpx;
background-color: #FFFFFF;
}
.popupTop{
width: 600rpx;
height: 140rpx;
background: linear-gradient(to bottom, #D3D5FF 20%, #FFFFFF 50%);
border-radius: 24rpx 24rpx 0rpx 0rpx;
line-height: 140rpx;
text-align: center;
font-weight: 700;
font-size: 30rpx;
color: #333333;
}
.popupBtn{ width: 100%; height: auto;
display: flex; flex-wrap: wrap;
justify-content: space-around; /* 使子元素在容器中均匀分布 */
align-items: center; /* 如果需要垂直居中子元素 */
}
.sbtnBox{
margin: 30rpx auto;
width: 478rpx;
height: 80rpx;
font-weight: 700;
font-size: 30rpx;
line-height: 80rpx;
border: 2rpx solid #4D94FF;
text-align: center;
border-radius: 44rpx;
}
.popupDesc{
width:560rpx;
font-weight: 400;
font-size: 28rpx;
color: #555555;
height: auto;
padding: 0rpx 20rpx;
}
.popupDesc1{
width:480rpx;
font-weight: 400;
font-size: 28rpx;
color: #555555;
height: auto;
padding: 0rpx 60rpx;
}
.sbtnBox1{
margin: 30rpx auto;
width: 226rpx;
height: 80rpx;
font-weight: 700;
font-size: 30rpx;
line-height: 80rpx;
border: 2rpx solid #4D94FF;
text-align: center;
border-radius: 44rpx;
}
.scrollBox {
width: 100%;
height: 160rpx;
white-space: nowrap;
}
.imgBox{width: 160rpx; height: 160rpx; position: relative; margin: 0rpx 0rpx 0rpx 20rpx; display: inline-block; overflow: hidden;}
.imgBox .imgBg{width: 160rpx; height: 160rpx; border-radius: 20rpx; position: absolute; left: 0; top: 0;}
.imgBox .imgLoadingImg{ width: 60rpx; height: 60rpx;position: absolute; left: 50rpx; top: 40rpx;}
.imgBox .imgLoadingTxt{ width: 100%; height: 40rpx; text-align: center; color:#FFFFFF; font-size: 24rpx;position: absolute; top: 100rpx;}
.imgBox .imgSelect{width: 40rpx; height: 34rpx;position: absolute; bottom: 0; right: 0; z-index: 5;}
.a1{
background: linear-gradient( 270deg, rgba(46,87,241,0.15) 0%, rgba(131,88,246,0.15) 100%);
color:#7A74F0;
}
.a2{
background: linear-gradient( 270deg, #2E57F1 0%, #8358F6 100%);
color:#FFFFFF;
}
.a3{
background: linear-gradient( 270deg, #2E57F1 0%, #8358F6 100%);
color:#FFFFFF;
}
</style>

@ -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

Binary file not shown.

After

Width:  |  Height:  |  Size: 750 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 588 B

After

Width:  |  Height:  |  Size: 491 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

After

Width:  |  Height:  |  Size: 865 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.2 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 18 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.7 KiB

After

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 733 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 866 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 764 B

After

Width:  |  Height:  |  Size: 1.9 KiB

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save