1
This commit is contained in:
parent
56c43a74e0
commit
73e46f8ec1
@ -10,7 +10,7 @@
|
||||
</view> -->
|
||||
<view class="nav-item" @click="navigateTo('chat')">
|
||||
<image src="/static/imgs/footer/ai.png" mode="aspectFit" ></image>
|
||||
<text>AI助手</text>
|
||||
<text>在线问答</text>
|
||||
</view>
|
||||
<!-- <view class="nav-item" @click="navigateTo('service')">
|
||||
<image src="/static/imgs/footer/chat.png" mode="aspectFit"></image>
|
||||
|
||||
14
pages.json
14
pages.json
@ -9,8 +9,7 @@
|
||||
"path": "pages/index/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "近山社区",
|
||||
"navigationStyle": "default",
|
||||
"usingComponents": {}
|
||||
"navigationStyle": "default"
|
||||
}
|
||||
},
|
||||
// AI助手页面
|
||||
@ -172,12 +171,11 @@
|
||||
},
|
||||
// 会议室预定
|
||||
{
|
||||
"path": "pages/meetingList/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "近山社区",
|
||||
"navigationStyle": "default",
|
||||
"usingComponents": {}
|
||||
}
|
||||
"path": "pages/meetingList/index",
|
||||
"style": {
|
||||
"navigationBarTitleText": "近山社区",
|
||||
"navigationStyle": "custom" // 隐藏原生导航栏
|
||||
}
|
||||
},
|
||||
// 会议室详情
|
||||
{
|
||||
|
||||
@ -32,7 +32,7 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view><Footer></Footer></view>
|
||||
<view> <Copyright/><Footer></Footer></view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@ -50,9 +50,10 @@
|
||||
formatRelativeTime
|
||||
} from '@/utils/timeFormat';
|
||||
import Footer from '@/components/footer_common.vue';
|
||||
import Copyright from '@/components/gx-copyright.vue';
|
||||
|
||||
export default {
|
||||
components:{Footer},
|
||||
components:{Footer,Copyright},
|
||||
data() {
|
||||
return {
|
||||
formatTime,
|
||||
|
||||
@ -1,353 +0,0 @@
|
||||
<template>
|
||||
<view class="chat-container">
|
||||
<!-- 聊天消息区域 -->
|
||||
<scroll-view scroll-y :scroll-top="scrollTop" class="chat-messages" :scroll-with-animation="true"
|
||||
@scroll="onScroll">
|
||||
<view v-for="(msg, index) in messages" :key="index"
|
||||
:class="['message', msg.sender === 'me' ? 'sent' : 'received']">
|
||||
<image v-if="msg.sender !== 'me'" :src="botAvatar" class="avatar"></image>
|
||||
|
||||
<view :class="['message-bubble', msg.sender === 'me' ? 'me' : '']">
|
||||
<text class="message-text">{{ msg.content }}</text>
|
||||
<view class="typing-indicator" v-if="msg.isTyping">
|
||||
<view class="dot"></view>
|
||||
<view class="dot"></view>
|
||||
<view class="dot"></view>
|
||||
<text class="typing-text">对方正在输入...</text>
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<image v-if="msg.sender === 'me'" :src="userAvatar" class="avatar"></image>
|
||||
</view>
|
||||
</scroll-view>
|
||||
|
||||
<!-- 输入区域 -->
|
||||
<view class="chat-input">
|
||||
<input class="input-field" placeholder="输入消息..." v-model="inputMsg" @confirm="sendMessage"
|
||||
confirm-type="send" />
|
||||
<button class="send-btn" :disabled="!inputMsg.trim()" @click="sendMessage">
|
||||
发送
|
||||
</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
BASE_URL
|
||||
} from '@/utils/config';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
inputMsg: '',
|
||||
scrollTop: 0,
|
||||
userAvatar: require('../../static/imgs/index/nav.png'),
|
||||
botAvatar: require('../../static/imgs/ai/chuandaguwen.png'),
|
||||
messages: [],
|
||||
socketTask: null, // 微信小程序的 WebSocket 任务对象
|
||||
isConnected: false,
|
||||
reconnectAttempts: 0,
|
||||
maxReconnectAttempts: 5,
|
||||
reconnectDelay: 3000,
|
||||
userId: null,
|
||||
userName: '默认用户',
|
||||
apiKey: '',
|
||||
serviceUrl: ''
|
||||
}
|
||||
},
|
||||
|
||||
onLoad(options) {
|
||||
this.serviceUrl = options.serviceUrl || '';
|
||||
this.apiKey = options.apiKey || '';
|
||||
this.botAvatar = options.icon || this.botAvatar;
|
||||
|
||||
const userInfo = wx.getStorageSync('userInfo') || {};
|
||||
this.userId = userInfo.id || Date.now().toString();
|
||||
this.userName = userInfo.name || '默认用户';
|
||||
this.userAvatar = userInfo.avatar || this.userAvatar;
|
||||
|
||||
uni.setNavigationBarTitle({
|
||||
title: options.name || 'AI助手'
|
||||
});
|
||||
|
||||
this.initWebSocket();
|
||||
},
|
||||
|
||||
onUnload() {
|
||||
this.closeWebSocket();
|
||||
},
|
||||
|
||||
methods: {
|
||||
// 初始化WebSocket连接
|
||||
initWebSocket() {
|
||||
if (this.isConnected) return;
|
||||
|
||||
// 微信小程序中使用 wx.connectSocket
|
||||
this.socketTask = wx.connectSocket({
|
||||
url: `ws://10.10.1.6:8071/api/v1/ws/ai?apiUrl=${encodeURIComponent(this.serviceUrl)}&apiToken=${this.apiKey}&userName=${this.userName}`,
|
||||
success: () => {
|
||||
console.log('WebSocket连接创建成功');
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('WebSocket连接创建失败', err);
|
||||
this.handleReconnect();
|
||||
}
|
||||
});
|
||||
|
||||
// 监听 WebSocket 事件
|
||||
this.socketTask.onOpen(() => {
|
||||
console.log('WebSocket连接已打开');
|
||||
this.isConnected = true;
|
||||
this.reconnectAttempts = 0;
|
||||
this.addMessage('bot', '连接已建立,请问有什么可以帮您?');
|
||||
});
|
||||
|
||||
this.socketTask.onMessage((res) => {
|
||||
console.log('收到WebSocket消息:', res.data);
|
||||
this.processBotMessage(res.data);
|
||||
});
|
||||
|
||||
this.socketTask.onError((err) => {
|
||||
console.error('WebSocket发生错误:', err);
|
||||
this.isConnected = false;
|
||||
this.addMessage('bot', '连接出错,请稍后再试');
|
||||
this.handleReconnect();
|
||||
});
|
||||
|
||||
this.socketTask.onClose(() => {
|
||||
console.log('WebSocket连接已关闭');
|
||||
this.isConnected = false;
|
||||
this.handleReconnect();
|
||||
});
|
||||
},
|
||||
|
||||
// 处理机器人消息
|
||||
processBotMessage(data) {
|
||||
// 移除思考状态的消息
|
||||
this.messages = this.messages.filter(msg => !msg.isTyping);
|
||||
|
||||
// 处理不同类型的消息
|
||||
if (data.startsWith('<think>')) {
|
||||
// 机器人正在思考
|
||||
this.addMessage('bot', '', true);
|
||||
} else if (data.startsWith('<answer>')) {
|
||||
// 正式回答
|
||||
const content = data.replace(/<answer>/g, '').replace(/<\/answer>/g, '');
|
||||
this.addMessage('bot', content);
|
||||
} else if (data.includes('</think>')) {
|
||||
// 思考结束,不做特殊处理
|
||||
} else {
|
||||
// 普通消息
|
||||
this.addMessage('bot', data);
|
||||
}
|
||||
},
|
||||
|
||||
// 添加消息到聊天列表
|
||||
addMessage(sender, content, isTyping = false) {
|
||||
const message = {
|
||||
sender: sender === 'bot' ? 'other' : 'me',
|
||||
content,
|
||||
isTyping,
|
||||
timestamp: Date.now()
|
||||
};
|
||||
|
||||
this.messages.push(message);
|
||||
this.scrollToBottom();
|
||||
},
|
||||
|
||||
// 发送消息
|
||||
sendMessage() {
|
||||
const content = this.inputMsg.trim();
|
||||
if (!content || !this.isConnected) return;
|
||||
|
||||
this.addMessage('me', content);
|
||||
|
||||
// 微信小程序中使用 socketTask.send
|
||||
this.socketTask.send({
|
||||
data: content,
|
||||
success: () => {
|
||||
console.log('消息发送成功');
|
||||
// 添加机器人正在输入的提示
|
||||
this.addMessage('bot', '', true);
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('消息发送失败', err);
|
||||
this.addMessage('bot', '消息发送失败,请重试');
|
||||
}
|
||||
});
|
||||
|
||||
this.inputMsg = '';
|
||||
},
|
||||
|
||||
// 处理重连逻辑
|
||||
handleReconnect() {
|
||||
if (this.reconnectAttempts >= this.maxReconnectAttempts) {
|
||||
console.log('已达到最大重连次数');
|
||||
this.addMessage('bot', '连接已断开,请刷新页面重试');
|
||||
return;
|
||||
}
|
||||
|
||||
this.reconnectAttempts++;
|
||||
console.log(`尝试重新连接,第${this.reconnectAttempts}次`);
|
||||
|
||||
setTimeout(() => {
|
||||
this.initWebSocket();
|
||||
}, this.reconnectDelay);
|
||||
},
|
||||
|
||||
// 关闭WebSocket连接
|
||||
closeWebSocket() {
|
||||
if (this.socketTask) {
|
||||
this.socketTask.close({
|
||||
success: () => {
|
||||
console.log('WebSocket已主动关闭');
|
||||
},
|
||||
fail: (err) => {
|
||||
console.error('关闭WebSocket失败', err);
|
||||
}
|
||||
});
|
||||
this.socketTask = null;
|
||||
}
|
||||
this.isConnected = false;
|
||||
},
|
||||
|
||||
// 滚动到底部
|
||||
scrollToBottom() {
|
||||
this.$nextTick(() => {
|
||||
this.scrollTop = 99999; // 足够大的值确保滚动到底部
|
||||
});
|
||||
},
|
||||
|
||||
onScroll(e) {
|
||||
// 可以在这里实现加载历史消息
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.chat-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
height: 100vh;
|
||||
background-color: #f0f0f0;
|
||||
}
|
||||
|
||||
.chat-messages {
|
||||
flex: 1;
|
||||
padding: 15px;
|
||||
background-color: #e5ddd5;
|
||||
overflow-y: auto;
|
||||
}
|
||||
|
||||
.message {
|
||||
display: flex;
|
||||
margin-bottom: 15px;
|
||||
}
|
||||
|
||||
.sent {
|
||||
justify-content: flex-end;
|
||||
}
|
||||
|
||||
.received {
|
||||
justify-content: flex-start;
|
||||
}
|
||||
|
||||
.avatar {
|
||||
width: 36px;
|
||||
height: 36px;
|
||||
border-radius: 50%;
|
||||
margin: 0 8px;
|
||||
}
|
||||
|
||||
.message-bubble {
|
||||
max-width: 70%;
|
||||
padding: 10px 15px;
|
||||
border-radius: 18px;
|
||||
background-color: white;
|
||||
box-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.me {
|
||||
background-color: #dcf8c6;
|
||||
}
|
||||
|
||||
.message-text {
|
||||
font-size: 16px;
|
||||
line-height: 1.4;
|
||||
}
|
||||
|
||||
.chat-input {
|
||||
display: flex;
|
||||
padding: 10px;
|
||||
background-color: white;
|
||||
border-top: 1px solid #ddd;
|
||||
}
|
||||
|
||||
.input-field {
|
||||
flex: 1;
|
||||
padding: 8px 15px;
|
||||
border-radius: 20px;
|
||||
background-color: #f0f0f0;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.send-btn {
|
||||
padding: 0 20px;
|
||||
border-radius: 20px;
|
||||
background-color: #07C160;
|
||||
color: white;
|
||||
}
|
||||
|
||||
.send-btn:disabled {
|
||||
opacity: 0.5;
|
||||
}
|
||||
|
||||
/* 对方正在输入提示 */
|
||||
.typing-indicator {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.dot {
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 50%;
|
||||
background-color: #7f8c8d;
|
||||
margin: 0 3px;
|
||||
animation: typing 1.4s infinite ease-in-out;
|
||||
}
|
||||
|
||||
.dot:nth-child(1) {
|
||||
animation-delay: 0s;
|
||||
}
|
||||
|
||||
.dot:nth-child(2) {
|
||||
animation-delay: 0.2s;
|
||||
}
|
||||
|
||||
.dot:nth-child(3) {
|
||||
animation-delay: 0.4s;
|
||||
}
|
||||
|
||||
.typing-text {
|
||||
font-size: 12px;
|
||||
margin-left: 8px;
|
||||
color: #555;
|
||||
}
|
||||
|
||||
@keyframes typing {
|
||||
|
||||
0%,
|
||||
60%,
|
||||
100% {
|
||||
transform: translateY(0);
|
||||
}
|
||||
|
||||
30% {
|
||||
transform: translateY(-5px);
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -2,9 +2,9 @@
|
||||
<view class="aiHelper">
|
||||
<view class="aiHelperContainer">
|
||||
<!-- 标题区域 -->
|
||||
<view class="aiHelperTitle" :style="{'background-image': `url(${aiHelperTitleBackground})`}">
|
||||
<!-- <view class="aiHelperTitle" :style="{'background-image': `url(${aiHelperTitleBackground})`}">
|
||||
{{ aiHelperTitle }}
|
||||
</view>
|
||||
</view> -->
|
||||
|
||||
<!-- AI类型卡片容器 -->
|
||||
<view class="aiBox">
|
||||
@ -22,18 +22,22 @@
|
||||
</view>
|
||||
</view>
|
||||
|
||||
<view><Footer></Footer></view>
|
||||
|
||||
<Copyright/>
|
||||
<Footer></Footer>
|
||||
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Footer from '@/components/footer_common.vue';
|
||||
import Copyright from '@/components/gx-copyright.vue';
|
||||
import { get, post } from '@/utils/request';
|
||||
import { IMAGE_BASE_URL, BASE_URL } from '@/utils/config';
|
||||
import {navigateTo} from '@/utils/router.js'
|
||||
export default {
|
||||
name: 'aiHelper',
|
||||
components: { Footer },
|
||||
components: { Footer,Copyright},
|
||||
data() {
|
||||
return {
|
||||
aiHelperTitle: 'AI智能助手',
|
||||
@ -82,9 +86,9 @@
|
||||
|
||||
.aiHelper {
|
||||
// 使用安全区域适配,避免底部被遮挡
|
||||
padding-bottom: constant(safe-area-inset-bottom);
|
||||
padding-bottom: env(safe-area-inset-bottom);
|
||||
|
||||
// padding-bottom: constant(safe-area-inset-bottom);
|
||||
// padding-bottom: env(safe-area-inset-bottom);
|
||||
height: 83vh;
|
||||
.aiHelperContainer {
|
||||
padding: 30rpx; // 使用rpx单位适配不同屏幕
|
||||
box-sizing: border-box; // 确保padding不会增加总宽度
|
||||
|
||||
@ -111,12 +111,15 @@
|
||||
</view>
|
||||
</view>
|
||||
|
||||
|
||||
<Copyright/>
|
||||
<!-- 底部导航 -->
|
||||
<Footer></Footer>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Copyright from '@/components/gx-copyright.vue';
|
||||
import Footer from '@/components/footer_common.vue';
|
||||
import {
|
||||
get,
|
||||
@ -129,7 +132,7 @@
|
||||
|
||||
export default {
|
||||
components: {
|
||||
Footer
|
||||
Footer,Copyright
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@ -258,10 +258,10 @@
|
||||
startTime: '开始时间',
|
||||
endTime: '结束时间'
|
||||
},
|
||||
userName: '',
|
||||
userPhone: "",
|
||||
userCardId: '',
|
||||
userAddress: '',
|
||||
userName: '谢雨晴',
|
||||
userPhone: "15189809052",
|
||||
userCardId: '32068319950902002X',
|
||||
userAddress: '江苏省南通市紫琅科技城3号楼',
|
||||
counter: '',
|
||||
num: '',
|
||||
// 会议室图片数组
|
||||
@ -299,16 +299,24 @@
|
||||
endTimePickerValue: ``,
|
||||
applyInfo:{},
|
||||
// 日期相关
|
||||
selectedDate: `${year}-${month}-${day}`,
|
||||
minDate: `${year}-${month}-${day}`,
|
||||
maxDate: `${year + 1}-12-31`,
|
||||
// selectedDate: `${year}-${month}-${day}`,
|
||||
// minDate: `${year}-${month}-${day}`,
|
||||
// maxDate: `${year + 1}-12-31`,
|
||||
selectedDate: `2025-08-11`, // 默认选中8月1日
|
||||
minDate: `2025-08-01`, // 最小可选8月1日
|
||||
maxDate: `2025-08-31`, // 最大可选8月31日
|
||||
|
||||
// 时间相关
|
||||
startTime: ``,
|
||||
endTime: ``,
|
||||
startTimeValue: `${startHours.toString().padStart(2, '0')}:${startMinutes.toString().padStart(2, '0')}`,
|
||||
endTimeValue: `${endHours.toString().padStart(2, '0')}:${endMinutes.toString().padStart(2, '0')}`,
|
||||
|
||||
// startTime: `2025-08`,
|
||||
// endTime: `2025-08`,
|
||||
// startTimeValue: `${startHours.toString().padStart(2, '0')}:${startMinutes.toString().padStart(2, '0')}`,
|
||||
// endTimeValue: `${endHours.toString().padStart(2, '0')}:${endMinutes.toString().padStart(2, '0')}`,
|
||||
startTime: `2025-08-11 09:00`, // 默认开始时间
|
||||
endTime: `2025-08-11 10:00`, // 默认结束时间
|
||||
startTimeValue: `09:00`,
|
||||
endTimeValue: `10:00`,
|
||||
startTimePickerValue: `2025-08-11 09:00`,
|
||||
endTimePickerValue: `2025-08-11 10:00`,
|
||||
// 新增备注字段
|
||||
remark: '',
|
||||
|
||||
@ -441,9 +449,12 @@
|
||||
:
|
||||
`${year}-${month}-${day} ${hours}:00`; // 完整模式:2023-01-02 09:00
|
||||
|
||||
this.startTime = dateString;
|
||||
this.startTimePickerValue = dateString;
|
||||
this.showStartTimePicker = false;
|
||||
// this.startTime = dateString;
|
||||
// this.startTimePickerValue = dateString;
|
||||
// this.showStartTimePicker = false;
|
||||
this.startTime = `2025-08-${e.day} ${e.hour}:00`;
|
||||
this.startTimePickerValue = this.startTime;
|
||||
this.showStartTimePicker = false;
|
||||
},
|
||||
|
||||
handleEndTimeConfirm(e) {
|
||||
@ -462,9 +473,12 @@
|
||||
:
|
||||
`${year}-${month}-${day} ${hours}:00`; // 完整模式:2023-01-02 09:00
|
||||
|
||||
this.endTime = dateString;
|
||||
this.endTimePickerValue = dateString;
|
||||
this.showEndTimePicker = false;
|
||||
// this.endTime = dateString;
|
||||
// this.endTimePickerValue = dateString;
|
||||
// this.showEndTimePicker = false;
|
||||
this.endTime = `2025-08-${e.day} ${e.hour}:00`;
|
||||
this.endTimePickerValue = this.endTime;
|
||||
this.showEndTimePicker = false;
|
||||
|
||||
console.log('格式化后的结束时间:', this.endTime);
|
||||
// this.validateTime(); // 如果需要验证时间范围,取消注释
|
||||
|
||||
@ -1,5 +1,14 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<!-- 自定义导航栏 -->
|
||||
<view class="nav-bar">
|
||||
<view class="nav-left" @click="handleBack">
|
||||
<u-icon name="arrow-left" size="44"></u-icon>
|
||||
<!-- <text>返回</text> -->
|
||||
</view>
|
||||
<text class="nav-title">近山社区</text>
|
||||
</view>
|
||||
|
||||
<view v-if="tabsReady">
|
||||
<u-tabs :list="tabList" :current="currentTab" @change="handleTabChange" border="false"
|
||||
active-color="#1989fa" bg-color="#f8f8f8"></u-tabs>
|
||||
@ -95,6 +104,7 @@
|
||||
<instructionVue @change='readChange'/>
|
||||
<u-button type="primary" text="我已知晓" :disabled="hasReaded" @click="show=false"></u-button>
|
||||
</u-popup> -->
|
||||
<Copyright/>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
@ -114,6 +124,7 @@
|
||||
} from '@/utils/timeFormat';
|
||||
import instructionVue from '../../components/instruction.vue';
|
||||
import noData from '../../components/noData.vue'
|
||||
import Copyright from '@/components/gx-copyright.vue';
|
||||
import {
|
||||
applyType,
|
||||
usages,
|
||||
@ -122,7 +133,8 @@
|
||||
export default {
|
||||
components: {
|
||||
instructionVue,
|
||||
noData
|
||||
noData,
|
||||
Copyright
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
@ -182,6 +194,10 @@
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleBack() {
|
||||
// 固定跳转首页
|
||||
uni.redirectTo({ url: '/pages/mine/index' });
|
||||
},
|
||||
formatName(value){
|
||||
return thingThemes.getName(value)
|
||||
},
|
||||
@ -357,6 +373,28 @@
|
||||
min-height: 100vh;
|
||||
background-color: $bg-color;
|
||||
|
||||
.nav-bar {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 15px;
|
||||
// background-color: #fff;
|
||||
border-bottom: 1px solid #f5f5f5;
|
||||
margin-top: 84rpx;
|
||||
}
|
||||
|
||||
.nav-left {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.nav-title {
|
||||
flex: 1;
|
||||
text-align: center;
|
||||
// font-weight: bold;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.loading-container {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
@ -103,12 +103,14 @@
|
||||
<text class="phone-number">{{communityPhone}}</text>
|
||||
</view>
|
||||
</u-modal>
|
||||
<Copyright/>
|
||||
<Footer></Footer>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Footer from '@/components/footer_common.vue';
|
||||
import Copyright from '@/components/gx-copyright.vue';
|
||||
import {
|
||||
get,
|
||||
post
|
||||
@ -119,7 +121,7 @@
|
||||
} from '@/utils/config';
|
||||
export default {
|
||||
components: {
|
||||
Footer
|
||||
Footer,Copyright
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
|
||||
@ -23,18 +23,20 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<Copyright/>
|
||||
<Footer></Footer>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Footer from '@/components/footer_common.vue';
|
||||
import Copyright from '@/components/gx-copyright.vue';
|
||||
import { get, post } from '@/utils/request';
|
||||
import { IMAGE_BASE_URL, BASE_URL } from '@/utils/config';
|
||||
import { formatTime, formatRelativeTime } from '@/utils/timeFormat';
|
||||
|
||||
export default {
|
||||
components: { Footer },
|
||||
components: { Footer,Copyright },
|
||||
data() {
|
||||
return {
|
||||
IMAGE_BASE_URL,
|
||||
|
||||
@ -50,6 +50,7 @@
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<Copyright/>
|
||||
</view>
|
||||
|
||||
<!-- 底部导航 -->
|
||||
@ -62,9 +63,10 @@
|
||||
import { IMAGE_BASE_URL } from '@/utils/config';
|
||||
import { formatTime } from '@/utils/timeFormat';
|
||||
import Footer from '@/components/footer_common.vue';
|
||||
import Copyright from '@/components/gx-copyright.vue';
|
||||
|
||||
export default {
|
||||
components: { Footer },
|
||||
components: { Footer,Copyright },
|
||||
data() {
|
||||
return {
|
||||
formatTime,
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user