|
@@ -0,0 +1,473 @@
|
|
|
|
+<template>
|
|
|
|
+ <view class="page" :style="{'min-height':h+'px', 'padding-top':mt+'px'}">
|
|
|
|
+ <u-navbar title="对话" bgColor="transparent" :titleStyle="{'font-size':'32rpx','font-weight':'bold'}">
|
|
|
|
+ <view class="u-nav-slot" slot="left" style="display: flex;background-color: transparent;">
|
|
|
|
+ <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/10/2f7cc90a-848c-4369-b573-4448125591a9.png" style="width: 45rpx;height: 45rpx;" @tap="toBack"></image>
|
|
|
|
+ <!-- <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/10/3580b8d2-8ddb-4385-8516-fb6f47ce5fea.png" style="width: 42rpx;height: 42rpx;margin-left: 40rpx;" @tap="startNewDialog"></image> -->
|
|
|
|
+ <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/10/cb27247a-8924-4ea7-a750-238ec9debd28.png" style="width: 42rpx;height: 42rpx;margin-left: 40rpx;" @tap="startNewDialog"></image>
|
|
|
|
+ </view>
|
|
|
|
+ </u-navbar>
|
|
|
|
+ <template v-if="dialogList.length===0">
|
|
|
|
+ <div class="welcome">
|
|
|
|
+ <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/10/09ed81ea-ab7c-457b-a128-1d0ed43aaffd.png"></image>
|
|
|
|
+ <p>Hi,很高兴见到你~</p>
|
|
|
|
+ <p class="tip">我可以帮你读语文,写作各种创意内容,请把你的任务交给我吧~ </p>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <div class="dialogs container" ref="messageContainer">
|
|
|
|
+ <div class="d_answer init">
|
|
|
|
+ <div class="da_top adfac">
|
|
|
|
+ <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/10/09ed81ea-ab7c-457b-a128-1d0ed43aaffd.png"></image>
|
|
|
|
+ <text>AI智能终端</text>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="da_content">Hi,我可以帮你解答问题,写作各种创意内容,请把你的任务交给我吧~~</div>
|
|
|
|
+ </div>
|
|
|
|
+ <div v-for="(item,index) in dialogList" :key="index">
|
|
|
|
+ <div class="d_question">
|
|
|
|
+ <div class="dq_text">{{ item.question }}</div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="d_answer">
|
|
|
|
+ <div class="da_top adfac">
|
|
|
|
+ <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/10/09ed81ea-ab7c-457b-a128-1d0ed43aaffd.png"></image>
|
|
|
|
+ <text>AI智能终端</text>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="da_content">
|
|
|
|
+ <template v-if="item.think">
|
|
|
|
+ <view class="dac_think adfac">
|
|
|
|
+ <image src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/07/07/13c5dd16-2032-464a-8b1c-2722d201cfe2.gif"></image>
|
|
|
|
+ <text>正在思考中</text>
|
|
|
|
+ </view>
|
|
|
|
+ </template>
|
|
|
|
+ <template v-else>
|
|
|
|
+ <u-parse :content="item.answer"></u-parse>
|
|
|
|
+ </template>
|
|
|
|
+ <div class="dc_btns adfacjb" v-if="item.answer">
|
|
|
|
+ <div class="db_l">
|
|
|
|
+ <image :src="item.copy?require('@/static/copy_active.png'):require('@/static/copy.png')" @tap="toCopy(item,index)"></image>
|
|
|
|
+ <image :src="item.upvote?require('@/static/upvote_active.png'):require('@/static/upvote.png')" @tap="toUpvote(item,index)"></image>
|
|
|
|
+ <image :src="item.comment?require('@/static/comment_active.png'):require('@/static/comment.png')" @tap="toComment(item,index)"></image>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="db_r">
|
|
|
|
+ <!-- <image :src="item.share?require('@/static/share_active.png'):require('@/static/share.png')" @tap="toShare(item,index)"></image> -->
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </template>
|
|
|
|
+ <div class="ask_box" :style="{'bottom':fixBottom+'px'}">
|
|
|
|
+ <div class="ask">
|
|
|
|
+ <div class="a_inp">
|
|
|
|
+ <div class="ai_l">
|
|
|
|
+ <u-textarea v-model="question" placeholder="请输入您的问题" autoHeight :showConfirmBar="false" :adjustPosition="false" maxlength="999999"></u-textarea>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="ai_r">
|
|
|
|
+ <image @tap="sendQuestion" src="https://transcend.ringzle.com/xiaozhi-app/profile/2025/09/10/a4a2718d-733e-467a-8bc2-7dc1548d2767.png"></image>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ </div>
|
|
|
|
+ <div class="ask_memo">本服务为AI生成内容,结果仅供参考</div>
|
|
|
|
+ </div>
|
|
|
|
+ <u-modal :show="commentShow" title="评论" @confirm="commentConfirm" @cancel="commentCancel" @close="commentCancel" :showCancelButton="true">
|
|
|
|
+ <u-textarea v-model="content" placeholder="对于我们的回答您是否不满意,您有更好的答案建议吗?请在此输入."></u-textarea>
|
|
|
|
+ </u-modal>
|
|
|
|
+ </view>
|
|
|
|
+</template>
|
|
|
|
+
|
|
|
|
+<script>
|
|
|
|
+ var timer = null;
|
|
|
|
+ let requestTask = null;
|
|
|
|
+ import { BaseApi } from '../http/baseApi.js'
|
|
|
|
+ import * as TextEncoding from "text-encoding-shim";
|
|
|
|
+ export default {
|
|
|
|
+ data(){
|
|
|
|
+ return {
|
|
|
|
+ isDialog:false,
|
|
|
|
+ retryCount: 3, // 最大重试次数
|
|
|
|
+ currentRetry: 0, // 当前重试次数
|
|
|
|
+ isRequesting: false, // 请求状态锁
|
|
|
|
+ question:'',
|
|
|
|
+ streamingResponse:'',
|
|
|
|
+ receivedData:'',
|
|
|
|
+ dialogList:[],
|
|
|
|
+ windex:0,
|
|
|
|
+ commentShow:false,
|
|
|
|
+ content:'',
|
|
|
|
+ cindex:'',
|
|
|
|
+ chzq:false,
|
|
|
|
+ lwss:false,
|
|
|
|
+ fixBottom: 0
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ onReady() {
|
|
|
|
+ uni.onKeyboardHeightChange(res => {
|
|
|
|
+ this.fixBottom = res.height||0;
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ onUnload() {
|
|
|
|
+ uni.offKeyboardHeightChange();
|
|
|
|
+ this.fixBottom = 0;
|
|
|
|
+ },
|
|
|
|
+ methods:{
|
|
|
|
+ toBack(){
|
|
|
|
+ uni.reLaunch({
|
|
|
|
+ url:'/pages/home'
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ startNewDialog(){
|
|
|
|
+ clearInterval(timer)
|
|
|
|
+ this.dialogList = [];
|
|
|
|
+ this.question = '';
|
|
|
|
+ this.streamingResponse = '';
|
|
|
|
+ },
|
|
|
|
+ // 封装带重试机制的请求方法
|
|
|
|
+ async sendRequestWithRetry() {
|
|
|
|
+ if (this.isRequesting) return;
|
|
|
|
+ this.isRequesting = true;
|
|
|
|
+ this.currentRetry = 0;
|
|
|
|
+ try {
|
|
|
|
+ await this._executeRequest();
|
|
|
|
+ } catch (error) {
|
|
|
|
+ this.$showToast('请求失败,请稍后重试')
|
|
|
|
+ } finally {
|
|
|
|
+ this.isRequesting = false;
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ _executeRequest2(){
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ this.$api.post('/core/chat/sendChatMessageStream',{query:this.question},false).then(res=>{
|
|
|
|
+ if(res.data.code!==0) return this.$showToast(res.data.msg)
|
|
|
|
+ let answer = this.dialogList[this.dialogList.length-1].answer+res.data.data;
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'answer',answer);
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'think',false);
|
|
|
|
+ setTimeout(()=>{
|
|
|
|
+ this.scrollToBottom();
|
|
|
|
+ },100)
|
|
|
|
+ resolve()
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ // 实际执行请求的方法
|
|
|
|
+ _executeRequest() {
|
|
|
|
+ return new Promise((resolve, reject) => {
|
|
|
|
+ requestTask = uni.request({
|
|
|
|
+ url: `${BaseApi}/core/chat/sendChatMessageStream`,
|
|
|
|
+ method: 'POST',
|
|
|
|
+ timeout: 10000,
|
|
|
|
+ data:{
|
|
|
|
+ query: this.question,
|
|
|
|
+ identity:'被教练者',
|
|
|
|
+ },
|
|
|
|
+ header: {
|
|
|
|
+ 'Content-Type': 'application/json',
|
|
|
|
+ 'token': uni.getStorageSync('token') || ''
|
|
|
|
+ },
|
|
|
|
+ enableChunked: true, // 启用流式接收
|
|
|
|
+ responseType:'text',
|
|
|
|
+ success: (res) => {
|
|
|
|
+ if (res.statusCode === 200) {
|
|
|
|
+ this._handleSuccess(res.data);
|
|
|
|
+ resolve();
|
|
|
|
+ } else {
|
|
|
|
+ this._handleError(`状态码异常: ${res.statusCode}`, resolve, reject);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ fail: (err) => {
|
|
|
|
+ this._handleError(err.errMsg, resolve, reject);
|
|
|
|
+ },
|
|
|
|
+ complete: (com) => {
|
|
|
|
+ console.log('请求完成',com)
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ requestTask.onChunkReceived(async (res) => {
|
|
|
|
+ const uint8Array = new Uint8Array(res.data);
|
|
|
|
+ const decoder = new TextEncoding.TextDecoder("utf-8");
|
|
|
|
+ const decodedString = decoder.decode(uint8Array);
|
|
|
|
+ try {
|
|
|
|
+ let newtext = decodedString.replaceAll('data:','').replaceAll(':keepAlive','');
|
|
|
|
+ let ntArr = newtext.split('\n\n');
|
|
|
|
+ if(ntArr.length){
|
|
|
|
+ ntArr.forEach(n=>{
|
|
|
|
+ if(!n.trim()) return
|
|
|
|
+ let nj = JSON.parse(n);
|
|
|
|
+ if(nj.event=='message'){
|
|
|
|
+ let answer = this.dialogList[this.dialogList.length-1].answer+nj.answer?.replace(/(\r\n|\n|\r)+/g, '<br>');
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'answer',answer);
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'id',nj.id);
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'task_id',nj.task_id);
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'message_id',nj.message_id);
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'conversation_id',nj.conversation_id);
|
|
|
|
+ this.$set(this.dialogList[this.dialogList.length-1],'think',false);
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ setTimeout(()=>{
|
|
|
|
+ this.scrollToBottom();
|
|
|
|
+ },100)
|
|
|
|
+ }
|
|
|
|
+ } catch (e) {
|
|
|
|
+ console.error('解析失败', e, '原始数据:', decodedString);
|
|
|
|
+ }
|
|
|
|
+ });
|
|
|
|
+ });
|
|
|
|
+ },
|
|
|
|
+ // 成功处理
|
|
|
|
+ _handleSuccess(data) {
|
|
|
|
+ if (data) {
|
|
|
|
+ this.streamingResponse += data;
|
|
|
|
+ }
|
|
|
|
+ this.currentRetry = 0; // 重置重试计数器
|
|
|
|
+ },
|
|
|
|
+ // 错误处理
|
|
|
|
+ _handleError(errorMsg, resolve, reject) {
|
|
|
|
+ if (this._shouldRetry(errorMsg)) {
|
|
|
|
+ this.currentRetry++;
|
|
|
|
+ setTimeout(() => {
|
|
|
|
+ this._executeRequest().then(resolve).catch(reject);
|
|
|
|
+ }, this._getRetryDelay());
|
|
|
|
+ } else {
|
|
|
|
+ reject(errorMsg);
|
|
|
|
+ }
|
|
|
|
+ },
|
|
|
|
+ // 判断是否需要重试
|
|
|
|
+ _shouldRetry(errorMsg) {
|
|
|
|
+ const retryableErrors = [
|
|
|
|
+ 'timeout',
|
|
|
|
+ 'request:fail',
|
|
|
|
+ 'Network Error'
|
|
|
|
+ ];
|
|
|
|
+ return this.currentRetry < this.retryCount && retryableErrors.some(e => errorMsg.includes(e));
|
|
|
|
+ },
|
|
|
|
+ // 获取指数退避延迟时间
|
|
|
|
+ _getRetryDelay() {
|
|
|
|
+ return Math.min(1000 * Math.pow(2, this.currentRetry), 10000);
|
|
|
|
+ },
|
|
|
|
+ sendQuestion(){
|
|
|
|
+ if(!this.question) return this.$showToast('请输入您的问题');
|
|
|
|
+ if(!this.isLogin()) return
|
|
|
|
+ let qa = {
|
|
|
|
+ question:JSON.parse(JSON.stringify(this.question)),
|
|
|
|
+ answer:'',
|
|
|
|
+ copy:false,
|
|
|
|
+ upvote:false,
|
|
|
|
+ comment:'',
|
|
|
|
+ share:false,
|
|
|
|
+ think:true
|
|
|
|
+ }
|
|
|
|
+ this.dialogList = [...this.dialogList,...[qa]];
|
|
|
|
+ this.$nextTick(()=>{
|
|
|
|
+ this.scrollToBottom();
|
|
|
|
+ this.sendRequestWithRetry();
|
|
|
|
+ this.question = '';
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ // 滚动到底部
|
|
|
|
+ scrollToBottom() {
|
|
|
|
+ this.$nextTick(()=>{
|
|
|
|
+ this.$nextTick(()=>{
|
|
|
|
+ uni.pageScrollTo({
|
|
|
|
+ scrollTop:99999,
|
|
|
|
+ duration:300
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ toCopy(item,index){
|
|
|
|
+ uni.setClipboardData({
|
|
|
|
+ data:item.answer,
|
|
|
|
+ success: (res) => {
|
|
|
|
+ this.$showToast('复制成功');
|
|
|
|
+ },
|
|
|
|
+ fail: (err) => {
|
|
|
|
+ this.$showToast('复制失败');
|
|
|
|
+ }
|
|
|
|
+ })
|
|
|
|
+ },
|
|
|
|
+ toUpvote(item,index){
|
|
|
|
+ this.$set(this.dialogList[index],'upvote',!this.dialogList[index].upvote);
|
|
|
|
+ },
|
|
|
|
+ toComment(item,index){
|
|
|
|
+ this.cindex = index;
|
|
|
|
+ this.commentShow = true;
|
|
|
|
+ },
|
|
|
|
+ toShare(item,index){
|
|
|
|
+ this.$set(this.dialogList[index],'share',!this.dialogList[index].share);
|
|
|
|
+ },
|
|
|
|
+ commentConfirm(){
|
|
|
|
+ this.$set(this.dialogList[this.cindex],'comment',this.content);
|
|
|
|
+ this.commentShow = false;
|
|
|
|
+ },
|
|
|
|
+ commentCancel(){
|
|
|
|
+ this.content = '';
|
|
|
|
+ this.commentShow = false;
|
|
|
|
+ },
|
|
|
|
+ changeChzq(){
|
|
|
|
+ this.chzq = !this.chzq;
|
|
|
|
+ },
|
|
|
|
+ changeLwss(){
|
|
|
|
+ this.lwss = !this.lwss;
|
|
|
|
+ },
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+</script>
|
|
|
|
+
|
|
|
|
+<style scoped lang="scss">
|
|
|
|
+ ::v-deep .u-textarea{
|
|
|
|
+ border: none !important;
|
|
|
|
+ padding: 0 !important;
|
|
|
|
+ }
|
|
|
|
+ ::v-deep .u-textarea textarea{
|
|
|
|
+ min-height: 64rpx !important;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .page{
|
|
|
|
+ background: linear-gradient( 227deg, #EEEFF8 0%, #F6ECF4 100%, #F6ECF4 100%);
|
|
|
|
+ padding: 0 30rpx 200rpx;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+
|
|
|
|
+ .welcome{
|
|
|
|
+ margin-top: 259rpx;
|
|
|
|
+ padding: 0 34rpx;
|
|
|
|
+ image{
|
|
|
|
+ width: 88rpx;
|
|
|
|
+ height: 87rpx;
|
|
|
|
+ margin-left: 20rpx;
|
|
|
|
+ }
|
|
|
|
+ p{
|
|
|
|
+ font-family: PingFang-SC, PingFang-SC;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ font-size: 36rpx;
|
|
|
|
+ color: #252525;
|
|
|
|
+ line-height: 36rpx;
|
|
|
|
+ margin-top: 36rpx;
|
|
|
|
+ &.tip{
|
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
|
+ font-weight: 400;
|
|
|
|
+ font-size: 26rpx;
|
|
|
|
+ color: #646464;
|
|
|
|
+ line-height: 40rpx;
|
|
|
|
+ margin-top: 20rpx;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .dialogs{
|
|
|
|
+ width: 100%;
|
|
|
|
+ padding-top: 34rpx;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ overflow-y: auto;
|
|
|
|
+ .d_answer{
|
|
|
|
+ margin-top: 40rpx;
|
|
|
|
+ &.init{
|
|
|
|
+ margin-top: 0;
|
|
|
|
+ }
|
|
|
|
+ .da_top{
|
|
|
|
+ image{
|
|
|
|
+ width: 48rpx;
|
|
|
|
+ height: 48rpx;
|
|
|
|
+ }
|
|
|
|
+ text{
|
|
|
|
+ font-family: PingFang-SC, PingFang-SC;
|
|
|
|
+ font-weight: bold;
|
|
|
|
+ font-size: 30rpx;
|
|
|
|
+ color: #505050;
|
|
|
|
+ line-height: 48rpx;
|
|
|
|
+ margin-left: 20rpx;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .da_content{
|
|
|
|
+ padding: 30rpx 32rpx;
|
|
|
|
+ margin-top: 20rpx;
|
|
|
|
+ background: #FFFFFF;
|
|
|
|
+ border-radius: 4rpx 24rpx 24rpx 24rpx;
|
|
|
|
+ .dac_think{
|
|
|
|
+ image{
|
|
|
|
+ width: 40rpx;
|
|
|
|
+ height: 40rpx;
|
|
|
|
+ }
|
|
|
|
+ text{
|
|
|
|
+ font-size: 30rpx;
|
|
|
|
+ margin-left: 10rpx;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .dc_btns{
|
|
|
|
+ margin-top: 44rpx;
|
|
|
|
+ image{
|
|
|
|
+ width: 48rpx;
|
|
|
|
+ height: 48rpx;
|
|
|
|
+ }
|
|
|
|
+ .db_l{
|
|
|
|
+ image{
|
|
|
|
+ margin-right: 40rpx;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .d_question{
|
|
|
|
+ margin-top: 40rpx;
|
|
|
|
+ display: flex;
|
|
|
|
+ justify-content: flex-end;
|
|
|
|
+ .dq_text{
|
|
|
|
+ background: #833478;
|
|
|
|
+ border-radius: 24rpx 4rpx 24rpx 24rpx;
|
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
|
+ font-weight: 400;
|
|
|
|
+ font-size: 30rpx;
|
|
|
|
+ color: #FFFFFF;
|
|
|
|
+ line-height: 48rpx;
|
|
|
|
+ // text-align: right;
|
|
|
|
+ padding: 26rpx 30rpx;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ .ask_box{
|
|
|
|
+ width: 100%;
|
|
|
|
+ min-height: 176rpx;
|
|
|
|
+ background: linear-gradient( 227deg, #EEEFF8 0%, #F6ECF4 100%, #F6ECF4 100%);
|
|
|
|
+ padding: 0 30rpx 60rpx;
|
|
|
|
+ position: fixed;
|
|
|
|
+ left: 0;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+
|
|
|
|
+ .ask_memo{
|
|
|
|
+ font-family: PingFangSC, PingFang SC;
|
|
|
|
+ font-weight: 400;
|
|
|
|
+ font-size: 24rpx;
|
|
|
|
+ color: #b1b1b1;
|
|
|
|
+ line-height: 34rpx;
|
|
|
|
+ text-align: center;
|
|
|
|
+ margin-top: 16rpx;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ .ask{
|
|
|
|
+ min-height: 116rpx;
|
|
|
|
+ background: #FFFFFF;
|
|
|
|
+ border-radius: 24rpx;
|
|
|
|
+ border: 2rpx solid #F0F2F8;
|
|
|
|
+ padding: 24rpx;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ .a_inp{
|
|
|
|
+ display: flex;
|
|
|
|
+ align-items: flex-end;
|
|
|
|
+ max-height: 300rpx;
|
|
|
|
+ overflow-y: auto;
|
|
|
|
+ .ai_l{
|
|
|
|
+ width: calc(100% - 64rpx);
|
|
|
|
+ padding-right: 20rpx;
|
|
|
|
+ box-sizing: border-box;
|
|
|
|
+ }
|
|
|
|
+ .ai_r{
|
|
|
|
+ width: 64rpx;
|
|
|
|
+ image{
|
|
|
|
+ width: 64rpx;
|
|
|
|
+ height: 64rpx;
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+ }
|
|
|
|
+</style>
|