congming_huose-apk/pages/room/editroom.vue

607 lines
13 KiB
Vue
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<view class="device-detail">
<view class="bj"></view>
<!-- 头部保持原样 -->
<view class="tabback">
<view class="" @click="onCancel">
{{ $i18n.t('cancel') }}
</view>
<view class="name">{{ $i18n.t('editRoom') }}</view>
<view class="add-btn" :class="{ active: canAdd }" @click="onAdd">
{{ $i18n.t('edit') }}
</view>
</view>
<view class="content-container" style="background-color: #F3F5F6;">
<!-- 说明 -->
<view class="instruction-section">
<view class="" @click="btnimgava">
<image class="da" :src="userImgs" mode="aspectFill"></image>
<image class="xiao" src="https://api.ccttiot.com/smartmeter/img/static/uGLlOMNCblf2uDmECVKK"
mode="aspectFill"></image>
</view>
</view>
<!-- 输入区域 -->
<view class="input-section">
<view class="input-group">
<text class="input-label">{{ $i18n.t('roomName') }}</text>
<input class="code-input" type="text" v-model="spaceName"
:placeholder="$i18n.t('roomNamePlaceholder')" />
</view>
</view>
<!-- 提示 -->
<view class="help-section">
<text class="help-text">{{ $i18n.t('roomEditHelp') }}</text>
</view>
<!-- 自定义底部选择弹窗 -->
<view class="action-sheet" v-if="showActionSheet" @click="hideActionSheet">
<view class="action-sheet-content" @click.stop>
<view class="action-sheet-item" @click="takePhoto">
<text class="action-sheet-text">{{ $i18n.t('takePhoto') }}</text>
</view>
<view class="action-sheet-item" @click="chooseFromAlbum">
<text class="action-sheet-text">{{ $i18n.t('chooseFromAlbum') }}</text>
</view>
<view class="action-sheet-cancel" @click="hideActionSheet">
<text class="action-sheet-text">{{ $i18n.t('actionSheetCancel') }}</text>
</view>
</view>
</view>
<view class="delbtn" @click="btndel">
{{ $i18n.t('deleteRoom') }}
</view>
</view>
</view>
</template>
<script>
export default {
data() {
return {
spaceName: '',
showActionSheet: false,
userImgs: 'https://api.ccttiot.com/smartmeter/img/static/uKFO4XdQVUgGYJHt4gwn',
cropImageSrc: '',
kjid:'',
roomid:'',
fangdouflag:true
}
},
computed: {
canAdd() {
return this.spaceName && this.spaceName.trim().length > 0
}
},
onLoad(option) {
this.kjid = uni.getStorageSync('kjid')
this.roomid= option.roomid
this.getxq()
this.getQiniuToken()
},
methods: {
// 点击删除房间
btndel(){
// 显示确认删除弹窗
uni.showModal({
title: this.$i18n.t('confirmDelete'),
content: `${this.$i18n.t('confirmDeleteRoom')}"${this.spaceName}"${this.$i18n.t('questionMark')}`,
confirmText: this.$i18n.t('confirm'),
cancelText: this.$i18n.t('cancel'),
success: (res) => {
if (res.confirm) {
// 用户确认删除,执行删除操作
this.performDelete();
}
}
});
},
// 点击执行删除操作
performDelete(){
this.$http.delete(`/bst/room/${this.roomid}`).then((res) => {
if (res.code == 200) {
uni.showToast({
title: res.msg,
icon: 'success',
duration: 3000
})
// 发送房间更新事件通知RoomTab页面刷新数据
uni.$emit('roomUpdated', {
roomId: this.roomid,
roomName: this.spaceName,
roomPicture: this.userImgs
});
setTimeout(() => {
uni.navigateBack()
}, 1500)
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 3000
})
}
})
},
// 请求房间详情
getxq(){
this.$http.get(`/bst/room/${this.roomid}`).then((res) => {
if (res.code == 200) {
this.userImgs = res.data.picture
this.spaceName = res.data.name
}
})
},
// 点击上传图片
btnimgava() {
this.showActionSheet = true
},
// 点击隐藏弹窗
hideActionSheet() {
this.showActionSheet = false
},
// 点击进行拍照
takePhoto() {
this.hideActionSheet()
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['camera'],
success: (imgRes) => {
this.cropImageSrc = imgRes.tempFilePaths[0]
let _this = this
let math = 'static/' + _this.generateGuid(20)
// 上传裁剪后的图片到七牛云
uni.uploadFile({
url: 'https://up-z2.qiniup.com',
name: 'file',
filePath: _this.cropImageSrc,
formData: {
token: this.token, // 后端返回的token
key: 'smartmeter/img/' + math
},
success: function(res) {
uni.hideLoading()
let str = JSON.parse(res.data)
_this.userImgs = 'https://api.ccttiot.com/' + str.key
console.log('最终图片路径:', _this.userImgs)
uni.showToast({
title: _this.$i18n.t('imageSelectedSuccess'),
icon: 'success',
duration: 3000
})
},
fail: function(err) {
uni.hideLoading()
console.error('上传失败:', err)
uni.showToast({
title: _this.$i18n.t('uploadFailed'),
icon: 'none',
})
}
})
},
fail: (err) => {
console.error('拍照失败:', err)
uni.showToast({
title: this.$i18n.t('imageOperationCancelled'),
icon: 'none',
duration: 3000
})
}
})
},
// 点击从相册选择
chooseFromAlbum() {
this.hideActionSheet()
uni.chooseImage({
count: 1,
sizeType: ['compressed'],
sourceType: ['album'],
success: (imgRes) => {
this.cropImageSrc = imgRes.tempFilePaths[0]
let _this = this
let math = 'static/' + _this.generateGuid(20)
// 上传裁剪后的图片到七牛云
uni.uploadFile({
url: 'https://up-z2.qiniup.com',
name: 'file',
filePath: _this.cropImageSrc,
formData: {
token: this.token, // 后端返回的token
key: 'smartmeter/img/' + math
},
success: function(res) {
uni.hideLoading()
let str = JSON.parse(res.data)
_this.userImgs = 'https://api.ccttiot.com/' + str.key
console.log('最终图片路径:', _this.userImgs)
uni.showToast({
title: _this.$i18n.t('imageSelectedSuccess'),
icon: 'success'
})
},
fail: function(err) {
uni.hideLoading()
console.error('上传失败:', err)
uni.showToast({
title: _this.$i18n.t('uploadFailed'),
icon: 'none'
})
}
})
},
fail: (err) => {
console.error('选择图片失败:', err)
uni.showToast({
title: this.$i18n.t('imageOperationCancelled'),
icon: 'none',
duration: 3000
})
}
})
},
// 生成随机字符串(替代$u.guid方法
generateGuid(length) {
const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'
let result = ''
for (let i = 0; i < length; i++) {
result += chars.charAt(Math.floor(Math.random() * chars.length))
}
return result
},
// 获取上传七牛云token
getQiniuToken() {
this.$http.get("/common/qiniuToken").then((res) => {
if (res.code == 200) {
this.token = res.data
}
})
},
// 点击跳转到验证
btnyz() {
uni.navigateTo({
url: '/pages/login/twodl'
})
},
// 点击进行请求修改接口
onAdd() {
if (!this.canAdd) {
uni.showToast({
title: this.$i18n.t('pleaseEnterSpaceName'),
icon: 'none',
duration: 3000
})
return
}
let data = {
id:this.roomid,
name: this.spaceName,
picture: this.userImgs,
// spaceId: this.kjid
}
if(this.fangdouflag == true){
this.fangdouflag = false
this.$http.put("/bst/room", data).then((res) => {
if (res.code == 200) {
uni.showToast({
title: res.msg,
icon: 'success',
duration: 3000
})
// 发送房间更新事件通知RoomTab页面刷新数据
uni.$emit('roomUpdated', {
roomId: this.roomid,
roomName: this.spaceName,
roomPicture: this.userImgs
});
setTimeout(() => {
this.fangdouflag = true
uni.navigateBack()
}, 1500)
}else{
uni.showToast({
title: res.msg,
icon: 'none',
duration: 3000
})
this.fangdouflag = true
}
})
}
},
// 点击返回上一级
onCancel() {
uni.navigateBack({
delta: 1
})
}
}
}
</script>
<style scoped lang="less">
.delbtn{
width: 680rpx;
margin: auto;
height: 100rpx;
background-color: #de4e4e;
color: #fff;
border: none;
border-radius: 50rpx;
font-size: 36rpx;
font-weight: 500;
display: flex;
align-items: center;
justify-content: center;
transition: all 0.3s ease;
position: fixed;
left: 50%;
transform: translateX(-50%);
bottom: 50rpx;
}
/* 自定义底部弹窗样式 */
.action-sheet {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: rgba(0, 0, 0, 0.5);
z-index: 9999;
display: flex;
align-items: flex-end;
justify-content: center;
}
.action-sheet-content {
width: 100%;
background-color: #fff;
border-radius: 20rpx 20rpx 0 0;
padding-bottom: 40rpx;
animation: slideUp 0.3s ease-out;
}
@keyframes slideUp {
from {
transform: translateY(100%);
}
to {
transform: translateY(0);
}
}
.action-sheet-item {
padding: 30rpx 40rpx;
border-bottom: 1rpx solid #f0f0f0;
text-align: center;
}
.action-sheet-item:active {
background-color: #f5f5f5;
}
.action-sheet-cancel {
padding: 30rpx 40rpx;
text-align: center;
margin-top: 20rpx;
background-color: #f8f8f8;
}
.action-sheet-cancel:active {
background-color: #e8e8e8;
}
.action-sheet-text {
font-size: 32rpx;
color: #333;
}
.action-sheet-cancel .action-sheet-text {
color: #666;
}
/* 图片裁剪弹窗样式 */
.image-crop-modal {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background-color: #000;
z-index: 10000;
display: flex;
flex-direction: column;
}
.crop-container {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
background-color: #000;
}
.bj {
width: 100%;
height: 50vh;
position: fixed;
top: 0;
z-index: -1;
background-color: #0F0F0F;
}
.tabback {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
height: 126rpx;
padding: 0 20rpx;
box-sizing: border-box;
background-color: #fff;
margin-top: 102rpx;
border-radius: 30rpx 30rpx 0 0;
.rtjt {
font-size: 36rpx;
color: #333;
}
.name {
font-size: 36rpx;
font-weight: bold;
color: #333;
margin: 0 auto;
}
.add-btn {
font-size: 32rpx;
color: #ccc;
transition: color 0.3s;
&.active {
color: #333;
}
}
}
.device-detail {
min-height: 100vh;
}
.content-container {
display: flex;
flex-direction: column;
min-height: calc(100vh - 228rpx);
}
.instruction-section {
background: #f3f5f6;
text-align: center;
width: 100%;
height: 448rpx;
view {
position: relative;
left: 50%;
transform: translateX(-50%);
width: 272rpx;
margin-top: 88rpx;
}
.da {
width: 272rpx;
height: 272rpx;
border-radius: 50%;
}
.xiao {
width: 116rpx;
height: 72rpx;
position: absolute;
right: 0;
bottom: 0;
}
.instruction-text {
font-size: 28rpx;
color: #666;
line-height: 1.6;
margin-top: 30rpx;
}
}
.input-section {
background: #fff;
padding: 40rpx 32rpx;
margin-top: 40rpx;
.input-group {
margin-bottom: 40rpx;
}
.input-label {
display: block;
font-size: 28rpx;
color: #666;
margin-bottom: 20rpx;
}
.code-input {
width: 100%;
height: 80rpx;
border: none;
border-bottom: 2rpx solid #e5e5e5;
font-size: 32rpx;
color: #333;
background: transparent;
padding: 0;
&::placeholder {
color: #bbb;
letter-spacing: 8rpx;
}
&:focus {
border-bottom-color: #000;
outline: none;
}
}
}
.help-section {
background: #f3f5f6;
padding: 40rpx 0;
padding-top: 20rpx;
padding-left: 48rpx;
}
.help-text {
font-size: 28rpx;
color: #727272;
}
.button-section {
margin-top: auto;
padding-top: 42rpx;
display: flex;
flex-direction: column;
align-items: center;
width: 750rpx;
height: 220rpx;
background: #FFFFFF;
border-radius: 0rpx 0rpx 0rpx 0rpx;
position: fixed;
left: 50%;
transform: translateX(-50%);
bottom: 0;
.continue-btn {
width: 674rpx;
height: 80rpx;
line-height: 80rpx;
background: #BBBBBB;
color: #fff;
border: none;
border-radius: 50rpx;
font-size: 32rpx;
font-weight: 600;
}
.continue-btn.active {
background: #000;
}
.cancel-btn {
margin-top: 34rpx;
font-size: 28rpx;
color: #000;
}
}
</style>